From 8d685de609fcb68ea52a84b229493817b8cd3878 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 24 Sep 2014 19:56:38 +0100 Subject: [PATCH] Reorganise 3rdparty, include breakpad with sln, drop mhook. Closes #84 --- breakpad/breakpad.sln | 73 - breakpad/client/minidump_file_writer-inl.h | 97 - breakpad/client/minidump_file_writer.cc | 284 - breakpad/client/minidump_file_writer.h | 272 - .../client/minidump_file_writer_unittest.cc | 179 - .../client/windows/common.vcxproj.filters | 39 - breakpad/common/basictypes.h | 41 - breakpad/common/byte_cursor.h | 265 - breakpad/common/byte_cursor_unittest.cc | 776 --- breakpad/common/convert_UTF.c | 533 -- breakpad/common/convert_UTF.h | 143 - breakpad/common/dwarf_cfi_to_module.cc | 258 - breakpad/common/dwarf_cfi_to_module.h | 196 - .../common/dwarf_cfi_to_module_unittest.cc | 306 -- breakpad/common/dwarf_cu_to_module.cc | 1054 ---- breakpad/common/dwarf_cu_to_module.h | 315 -- .../common/dwarf_cu_to_module_unittest.cc | 1780 ------- breakpad/common/dwarf_line_to_module.cc | 143 - breakpad/common/dwarf_line_to_module.h | 188 - .../common/dwarf_line_to_module_unittest.cc | 391 -- breakpad/common/language.cc | 83 - breakpad/common/language.h | 88 - breakpad/common/md5.cc | 251 - breakpad/common/md5.h | 27 - breakpad/common/memory.h | 201 - breakpad/common/memory_range.h | 145 - breakpad/common/memory_range_unittest.cc | 193 - breakpad/common/memory_unittest.cc | 97 - breakpad/common/module.cc | 294 -- breakpad/common/module.h | 324 -- breakpad/common/module_unittest.cc | 490 -- breakpad/common/simple_string_dictionary.cc | 45 - breakpad/common/simple_string_dictionary.h | 263 - .../simple_string_dictionary_unittest.cc | 320 -- breakpad/common/stabs_reader.cc | 315 -- breakpad/common/stabs_reader.h | 326 -- breakpad/common/stabs_reader_unittest.cc | 611 --- breakpad/common/stabs_to_module.cc | 200 - breakpad/common/stabs_to_module.h | 143 - breakpad/common/stabs_to_module_unittest.cc | 258 - breakpad/common/string_conversion.cc | 155 - breakpad/common/string_conversion.h | 68 - breakpad/common/symbol_data.h | 42 - breakpad/common/test_assembler.cc | 359 -- breakpad/common/test_assembler.h | 484 -- breakpad/common/test_assembler_unittest.cc | 1662 ------ breakpad/common/using_std_string.h | 65 - breakpad/common/windows/dia_util.cc | 92 - breakpad/common/windows/dia_util.h | 59 - breakpad/common/windows/omap.cc | 694 --- breakpad/common/windows/omap.h | 72 - breakpad/common/windows/omap_internal.h | 137 - breakpad/common/windows/omap_unittest.cc | 330 -- .../common/windows/pdb_source_line_writer.cc | 1066 ---- .../common/windows/pdb_source_line_writer.h | 243 - .../google_breakpad/common/minidump_cpu_arm.h | 151 - .../google_breakpad/common/minidump_cpu_ppc.h | 163 - .../common/minidump_cpu_ppc64.h | 129 - .../common/minidump_cpu_sparc.h | 158 - .../common/minidump_exception_linux.h | 87 - .../common/minidump_exception_mac.h | 205 - .../common/minidump_exception_ps3.h | 67 - .../common/minidump_exception_solaris.h | 94 - .../google_breakpad/common/minidump_size.h | 107 - breakpad/v100/lib32/breakpad_common.lib | Bin 319738 -> 0 bytes .../v100/lib32/crash_generation_client.lib | Bin 45336 -> 0 bytes .../v100/lib32/crash_generation_server.lib | Bin 263738 -> 0 bytes breakpad/v100/lib32/exception_handler.lib | Bin 181754 -> 0 bytes breakpad/v100/lib64/breakpad_common.lib | Bin 432522 -> 0 bytes .../v100/lib64/crash_generation_client.lib | Bin 65476 -> 0 bytes .../v100/lib64/crash_generation_server.lib | Bin 362608 -> 0 bytes breakpad/v100/lib64/exception_handler.lib | Bin 232418 -> 0 bytes breakpad/v110/lib32/breakpad_common.lib | Bin 452634 -> 0 bytes .../v110/lib32/crash_generation_client.lib | Bin 111730 -> 0 bytes .../v110/lib32/crash_generation_server.lib | Bin 458966 -> 0 bytes breakpad/v110/lib32/exception_handler.lib | Bin 268502 -> 0 bytes breakpad/v110/lib64/breakpad_common.lib | Bin 545188 -> 0 bytes .../v110/lib64/crash_generation_client.lib | Bin 132058 -> 0 bytes .../v110/lib64/crash_generation_server.lib | Bin 572186 -> 0 bytes breakpad/v110/lib64/exception_handler.lib | Bin 321206 -> 0 bytes breakpad/v120/lib32/breakpad_common.lib | Bin 345960 -> 0 bytes .../v120/lib32/crash_generation_client.lib | Bin 75902 -> 0 bytes .../v120/lib32/crash_generation_server.lib | Bin 379226 -> 0 bytes breakpad/v120/lib32/exception_handler.lib | Bin 237150 -> 0 bytes breakpad/v120/lib64/breakpad_common.lib | Bin 436476 -> 0 bytes .../v120/lib64/crash_generation_client.lib | Bin 96216 -> 0 bytes .../v120/lib64/crash_generation_server.lib | Bin 493710 -> 0 bytes breakpad/v120/lib64/exception_handler.lib | Bin 292640 -> 0 bytes renderdoc.sln | 47 + .../3rdparty/breakpad}/LICENSE | 0 .../3rdparty/breakpad}/README | 3 + .../breakpad}/client/windows/common.vcxproj | 167 +- .../client/windows/common.vcxproj.filters | 42 + .../windows/common/auto_critical_section.h | 0 .../client/windows/common/ipc_protocol.h | 4 +- .../windows/crash_generation/ReadMe.txt | 0 .../windows/crash_generation/client_info.cc | 4 +- .../windows/crash_generation/client_info.h | 6 +- .../crash_generation/crash_generation.sln | 0 .../crash_generation_client.cc | 4 +- .../crash_generation_client.h | 4 +- .../crash_generation_client.vcxproj | 159 +- .../crash_generation_client.vcxproj.filters | 4 - .../crash_generation_server.cc | 8 +- .../crash_generation_server.h | 6 +- .../crash_generation_server.vcxproj | 159 +- .../crash_generation_server.vcxproj.filters | 4 - .../crash_generation/minidump_generator.cc | 6 +- .../crash_generation/minidump_generator.h | 4 +- .../windows/handler/exception_handler.cc | 8 +- .../windows/handler/exception_handler.h | 8 +- .../windows/handler/exception_handler.sln | 0 .../windows/handler/exception_handler.vcxproj | 158 +- .../3rdparty/breakpad}/common/scoped_ptr.h | 0 .../breakpad}/common/windows/guid_string.cc | 4 +- .../breakpad}/common/windows/guid_string.h | 0 .../breakpad}/common/windows/http_upload.cc | 4 +- .../breakpad}/common/windows/http_upload.h | 0 .../common/windows/string_utils-inl.h | 0 .../breakpad}/common/windows/string_utils.cc | 2 +- .../3rdparty/breakpad}/dump_syms.exe | Bin .../3rdparty/breakpad}/getmssym.sh | 0 .../google_breakpad/common/breakpad_types.h | 0 .../common/minidump_cpu_amd64.h | 0 .../google_breakpad/common/minidump_cpu_x86.h | 0 .../common/minidump_exception_win32.h | 2 +- .../google_breakpad/common/minidump_format.h | 18 +- .../3rdparty/breakpad}/makesym.sh | 0 .../3rdparty/breakpad}/symup.sh | 0 renderdoc/3rdparty/mhook/COPYING | 20 - renderdoc/3rdparty/mhook/disasm-lib/cpu.c | 93 - renderdoc/3rdparty/mhook/disasm-lib/cpu.h | 279 - renderdoc/3rdparty/mhook/disasm-lib/disasm.c | 122 - renderdoc/3rdparty/mhook/disasm-lib/disasm.h | 583 --- .../3rdparty/mhook/disasm-lib/disasm_x86.c | 4664 ----------------- .../3rdparty/mhook/disasm-lib/disasm_x86.h | 839 --- .../mhook/disasm-lib/disasm_x86_tables.h | 3656 ------------- renderdoc/3rdparty/mhook/disasm-lib/misc.c | 185 - renderdoc/3rdparty/mhook/disasm-lib/misc.h | 52 - renderdoc/3rdparty/mhook/mhook-lib/mhook.cpp | 936 ---- renderdoc/3rdparty/mhook/mhook-lib/mhook.h | 40 - .../3rdparty/miniz}/miniz.c | 0 .../3rdparty/miniz}/miniz.h | 0 renderdoc/core/crash_handler.h | 4 +- renderdoc/core/replay_proxy.cpp | 2 +- renderdoc/data/resource.h | 2 +- renderdoc/driver/d3d11/d3d11_device.cpp | 2 +- renderdoc/driver/gl/gl_driver.cpp | 2 +- renderdoc/hooks/d3d11_hooks.cpp | 48 - renderdoc/hooks/dxgi_hooks.cpp | 5 - renderdoc/hooks/gl_win32_hooks.cpp | 8 - renderdoc/hooks/hooks.h | 29 +- renderdoc/os/win32/win32_process.cpp | 14 - renderdoc/os/win32/win32_shellext.cpp | 2 +- renderdoc/os/win32_specific.h | 5 - renderdoc/renderdoc.vcxproj | 41 +- renderdoc/renderdoc.vcxproj.filters | 110 +- renderdoc/replay/replay_renderer.cpp | 8 +- renderdoccmd/renderdoccmd.vcxproj | 50 +- renderdoccmd/renderdoccmd.vcxproj.filters | 11 +- renderdoccmd/renderdoccmd_win32.cpp | 22 +- 161 files changed, 378 insertions(+), 30987 deletions(-) delete mode 100644 breakpad/breakpad.sln delete mode 100644 breakpad/client/minidump_file_writer-inl.h delete mode 100644 breakpad/client/minidump_file_writer.cc delete mode 100644 breakpad/client/minidump_file_writer.h delete mode 100644 breakpad/client/minidump_file_writer_unittest.cc delete mode 100644 breakpad/client/windows/common.vcxproj.filters delete mode 100644 breakpad/common/basictypes.h delete mode 100644 breakpad/common/byte_cursor.h delete mode 100644 breakpad/common/byte_cursor_unittest.cc delete mode 100644 breakpad/common/convert_UTF.c delete mode 100644 breakpad/common/convert_UTF.h delete mode 100644 breakpad/common/dwarf_cfi_to_module.cc delete mode 100644 breakpad/common/dwarf_cfi_to_module.h delete mode 100644 breakpad/common/dwarf_cfi_to_module_unittest.cc delete mode 100644 breakpad/common/dwarf_cu_to_module.cc delete mode 100644 breakpad/common/dwarf_cu_to_module.h delete mode 100644 breakpad/common/dwarf_cu_to_module_unittest.cc delete mode 100644 breakpad/common/dwarf_line_to_module.cc delete mode 100644 breakpad/common/dwarf_line_to_module.h delete mode 100644 breakpad/common/dwarf_line_to_module_unittest.cc delete mode 100644 breakpad/common/language.cc delete mode 100644 breakpad/common/language.h delete mode 100644 breakpad/common/md5.cc delete mode 100644 breakpad/common/md5.h delete mode 100644 breakpad/common/memory.h delete mode 100644 breakpad/common/memory_range.h delete mode 100644 breakpad/common/memory_range_unittest.cc delete mode 100644 breakpad/common/memory_unittest.cc delete mode 100644 breakpad/common/module.cc delete mode 100644 breakpad/common/module.h delete mode 100644 breakpad/common/module_unittest.cc delete mode 100644 breakpad/common/simple_string_dictionary.cc delete mode 100644 breakpad/common/simple_string_dictionary.h delete mode 100644 breakpad/common/simple_string_dictionary_unittest.cc delete mode 100644 breakpad/common/stabs_reader.cc delete mode 100644 breakpad/common/stabs_reader.h delete mode 100644 breakpad/common/stabs_reader_unittest.cc delete mode 100644 breakpad/common/stabs_to_module.cc delete mode 100644 breakpad/common/stabs_to_module.h delete mode 100644 breakpad/common/stabs_to_module_unittest.cc delete mode 100644 breakpad/common/string_conversion.cc delete mode 100644 breakpad/common/string_conversion.h delete mode 100644 breakpad/common/symbol_data.h delete mode 100644 breakpad/common/test_assembler.cc delete mode 100644 breakpad/common/test_assembler.h delete mode 100644 breakpad/common/test_assembler_unittest.cc delete mode 100644 breakpad/common/using_std_string.h delete mode 100644 breakpad/common/windows/dia_util.cc delete mode 100644 breakpad/common/windows/dia_util.h delete mode 100644 breakpad/common/windows/omap.cc delete mode 100644 breakpad/common/windows/omap.h delete mode 100644 breakpad/common/windows/omap_internal.h delete mode 100644 breakpad/common/windows/omap_unittest.cc delete mode 100644 breakpad/common/windows/pdb_source_line_writer.cc delete mode 100644 breakpad/common/windows/pdb_source_line_writer.h delete mode 100644 breakpad/google_breakpad/common/minidump_cpu_arm.h delete mode 100644 breakpad/google_breakpad/common/minidump_cpu_ppc.h delete mode 100644 breakpad/google_breakpad/common/minidump_cpu_ppc64.h delete mode 100644 breakpad/google_breakpad/common/minidump_cpu_sparc.h delete mode 100644 breakpad/google_breakpad/common/minidump_exception_linux.h delete mode 100644 breakpad/google_breakpad/common/minidump_exception_mac.h delete mode 100644 breakpad/google_breakpad/common/minidump_exception_ps3.h delete mode 100644 breakpad/google_breakpad/common/minidump_exception_solaris.h delete mode 100644 breakpad/google_breakpad/common/minidump_size.h delete mode 100644 breakpad/v100/lib32/breakpad_common.lib delete mode 100644 breakpad/v100/lib32/crash_generation_client.lib delete mode 100644 breakpad/v100/lib32/crash_generation_server.lib delete mode 100644 breakpad/v100/lib32/exception_handler.lib delete mode 100644 breakpad/v100/lib64/breakpad_common.lib delete mode 100644 breakpad/v100/lib64/crash_generation_client.lib delete mode 100644 breakpad/v100/lib64/crash_generation_server.lib delete mode 100644 breakpad/v100/lib64/exception_handler.lib delete mode 100644 breakpad/v110/lib32/breakpad_common.lib delete mode 100644 breakpad/v110/lib32/crash_generation_client.lib delete mode 100644 breakpad/v110/lib32/crash_generation_server.lib delete mode 100644 breakpad/v110/lib32/exception_handler.lib delete mode 100644 breakpad/v110/lib64/breakpad_common.lib delete mode 100644 breakpad/v110/lib64/crash_generation_client.lib delete mode 100644 breakpad/v110/lib64/crash_generation_server.lib delete mode 100644 breakpad/v110/lib64/exception_handler.lib delete mode 100644 breakpad/v120/lib32/breakpad_common.lib delete mode 100644 breakpad/v120/lib32/crash_generation_client.lib delete mode 100644 breakpad/v120/lib32/crash_generation_server.lib delete mode 100644 breakpad/v120/lib32/exception_handler.lib delete mode 100644 breakpad/v120/lib64/breakpad_common.lib delete mode 100644 breakpad/v120/lib64/crash_generation_client.lib delete mode 100644 breakpad/v120/lib64/crash_generation_server.lib delete mode 100644 breakpad/v120/lib64/exception_handler.lib rename {breakpad => renderdoc/3rdparty/breakpad}/LICENSE (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/README (88%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/common.vcxproj (65%) create mode 100644 renderdoc/3rdparty/breakpad/client/windows/common.vcxproj.filters rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/common/auto_critical_section.h (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/common/ipc_protocol.h (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/ReadMe.txt (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/client_info.cc (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/client_info.h (97%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation.sln (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation_client.cc (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation_client.h (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation_client.vcxproj (64%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation_client.vcxproj.filters (70%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation_server.cc (99%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation_server.h (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation_server.vcxproj (64%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/crash_generation_server.vcxproj.filters (79%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/minidump_generator.cc (99%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/crash_generation/minidump_generator.h (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/handler/exception_handler.cc (99%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/handler/exception_handler.h (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/handler/exception_handler.sln (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/client/windows/handler/exception_handler.vcxproj (64%) rename {breakpad => renderdoc/3rdparty/breakpad}/common/scoped_ptr.h (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/common/windows/guid_string.cc (96%) rename {breakpad => renderdoc/3rdparty/breakpad}/common/windows/guid_string.h (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/common/windows/http_upload.cc (99%) rename {breakpad => renderdoc/3rdparty/breakpad}/common/windows/http_upload.h (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/common/windows/string_utils-inl.h (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/common/windows/string_utils.cc (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/dump_syms.exe (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/getmssym.sh (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/google_breakpad/common/breakpad_types.h (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/google_breakpad/common/minidump_cpu_amd64.h (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/google_breakpad/common/minidump_cpu_x86.h (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/google_breakpad/common/minidump_exception_win32.h (98%) rename {breakpad => renderdoc/3rdparty/breakpad}/google_breakpad/common/minidump_format.h (99%) rename {breakpad => renderdoc/3rdparty/breakpad}/makesym.sh (100%) rename {breakpad => renderdoc/3rdparty/breakpad}/symup.sh (100%) delete mode 100644 renderdoc/3rdparty/mhook/COPYING delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/cpu.c delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/cpu.h delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/disasm.c delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/disasm.h delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/disasm_x86.c delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/disasm_x86.h delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/disasm_x86_tables.h delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/misc.c delete mode 100644 renderdoc/3rdparty/mhook/disasm-lib/misc.h delete mode 100644 renderdoc/3rdparty/mhook/mhook-lib/mhook.cpp delete mode 100644 renderdoc/3rdparty/mhook/mhook-lib/mhook.h rename {renderdoccmd => renderdoc/3rdparty/miniz}/miniz.c (100%) rename {renderdoccmd => renderdoc/3rdparty/miniz}/miniz.h (100%) diff --git a/breakpad/breakpad.sln b/breakpad/breakpad.sln deleted file mode 100644 index 06dc919b1..000000000 --- a/breakpad/breakpad.sln +++ /dev/null @@ -1,73 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "breakpad_common", "client\windows\common.vcxproj", "{EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_generation_client", "client\windows\crash_generation\crash_generation_client.vcxproj", "{EC847717-119A-2391-0477-212E1140082C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_generation_server", "client\windows\crash_generation\crash_generation_server.vcxproj", "{7893E300-3ED0-7F4C-158F-67EA63934C57}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exception_handler", "client\windows\handler\exception_handler.vcxproj", "{B7399F39-300F-450E-F471-9490F959D2A7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Purify|Win32 = Purify|Win32 - Purify|x64 = Purify|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Debug|Win32.ActiveCfg = Debug|Win32 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Debug|Win32.Build.0 = Debug|Win32 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Debug|x64.ActiveCfg = Debug|x64 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Debug|x64.Build.0 = Debug|x64 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Purify|Win32.ActiveCfg = Purify|Win32 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Purify|Win32.Build.0 = Purify|Win32 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Purify|x64.ActiveCfg = Purify|x64 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Purify|x64.Build.0 = Purify|x64 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Release|Win32.ActiveCfg = Release|Win32 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Release|Win32.Build.0 = Release|Win32 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Release|x64.ActiveCfg = Release|x64 - {EA1242CF-BB42-B1AC-9B6A-A508D96D1CB7}.Release|x64.Build.0 = Release|x64 - {EC847717-119A-2391-0477-212E1140082C}.Debug|Win32.ActiveCfg = Debug|Win32 - {EC847717-119A-2391-0477-212E1140082C}.Debug|Win32.Build.0 = Debug|Win32 - {EC847717-119A-2391-0477-212E1140082C}.Debug|x64.ActiveCfg = Debug|x64 - {EC847717-119A-2391-0477-212E1140082C}.Debug|x64.Build.0 = Debug|x64 - {EC847717-119A-2391-0477-212E1140082C}.Purify|Win32.ActiveCfg = Purify|Win32 - {EC847717-119A-2391-0477-212E1140082C}.Purify|Win32.Build.0 = Purify|Win32 - {EC847717-119A-2391-0477-212E1140082C}.Purify|x64.ActiveCfg = Purify|x64 - {EC847717-119A-2391-0477-212E1140082C}.Purify|x64.Build.0 = Purify|x64 - {EC847717-119A-2391-0477-212E1140082C}.Release|Win32.ActiveCfg = Release|Win32 - {EC847717-119A-2391-0477-212E1140082C}.Release|Win32.Build.0 = Release|Win32 - {EC847717-119A-2391-0477-212E1140082C}.Release|x64.ActiveCfg = Release|x64 - {EC847717-119A-2391-0477-212E1140082C}.Release|x64.Build.0 = Release|x64 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Debug|Win32.ActiveCfg = Debug|Win32 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Debug|Win32.Build.0 = Debug|Win32 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Debug|x64.ActiveCfg = Debug|x64 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Debug|x64.Build.0 = Debug|x64 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Purify|Win32.ActiveCfg = Purify|Win32 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Purify|Win32.Build.0 = Purify|Win32 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Purify|x64.ActiveCfg = Purify|x64 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Purify|x64.Build.0 = Purify|x64 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Release|Win32.ActiveCfg = Release|Win32 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Release|Win32.Build.0 = Release|Win32 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Release|x64.ActiveCfg = Release|x64 - {7893E300-3ED0-7F4C-158F-67EA63934C57}.Release|x64.Build.0 = Release|x64 - {B7399F39-300F-450E-F471-9490F959D2A7}.Debug|Win32.ActiveCfg = Debug|Win32 - {B7399F39-300F-450E-F471-9490F959D2A7}.Debug|Win32.Build.0 = Debug|Win32 - {B7399F39-300F-450E-F471-9490F959D2A7}.Debug|x64.ActiveCfg = Debug|x64 - {B7399F39-300F-450E-F471-9490F959D2A7}.Debug|x64.Build.0 = Debug|x64 - {B7399F39-300F-450E-F471-9490F959D2A7}.Purify|Win32.ActiveCfg = Purify|Win32 - {B7399F39-300F-450E-F471-9490F959D2A7}.Purify|Win32.Build.0 = Purify|Win32 - {B7399F39-300F-450E-F471-9490F959D2A7}.Purify|x64.ActiveCfg = Purify|x64 - {B7399F39-300F-450E-F471-9490F959D2A7}.Purify|x64.Build.0 = Purify|x64 - {B7399F39-300F-450E-F471-9490F959D2A7}.Release|Win32.ActiveCfg = Release|Win32 - {B7399F39-300F-450E-F471-9490F959D2A7}.Release|Win32.Build.0 = Release|Win32 - {B7399F39-300F-450E-F471-9490F959D2A7}.Release|x64.ActiveCfg = Release|x64 - {B7399F39-300F-450E-F471-9490F959D2A7}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/breakpad/client/minidump_file_writer-inl.h b/breakpad/client/minidump_file_writer-inl.h deleted file mode 100644 index 0e12e00b6..000000000 --- a/breakpad/client/minidump_file_writer-inl.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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/breakpad/client/minidump_file_writer.cc b/breakpad/client/minidump_file_writer.cc deleted file mode 100644 index 1e18d24ba..000000000 --- a/breakpad/client/minidump_file_writer.cc +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright (c) 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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 __linux__ -#include "third_party/lss/linux_syscall_support.h" -#endif - -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 __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; -} - -bool MinidumpFileWriter::Close() { - bool result = true; - - if (file_ != -1) { - if (-1 == ftruncate(file_, position_)) { - return false; - } -#if __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); - 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 __linux__ - if (sys_lseek(file_, position, SEEK_SET) == static_cast(position)) { - if (sys_write(file_, src, size) == size) { -#else - if (lseek(file_, position, SEEK_SET) == static_cast(position)) { - if (write(file_, src, size) == size) { -#endif - return true; - } - } - - 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/breakpad/client/minidump_file_writer.h b/breakpad/client/minidump_file_writer.h deleted file mode 100644 index 538e85453..000000000 --- a/breakpad/client/minidump_file_writer.h +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright (c) 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. Any existing file - // will be overwritten. - // 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/breakpad/client/minidump_file_writer_unittest.cc b/breakpad/client/minidump_file_writer_unittest.cc deleted file mode 100644 index 60c364e68..000000000 --- a/breakpad/client/minidump_file_writer_unittest.cc +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright (c) 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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.c \ - ../common/string_conversion.cc \ - minidump_file_writer.cc \ - minidump_file_writer_unittest.cc \ - -o minidump_file_writer_unittest - */ - -#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, *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/breakpad/client/windows/common.vcxproj.filters b/breakpad/client/windows/common.vcxproj.filters deleted file mode 100644 index d6285c77a..000000000 --- a/breakpad/client/windows/common.vcxproj.filters +++ /dev/null @@ -1,39 +0,0 @@ - - - - - {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} - - - {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} - - - {2F5FD094-EF52-77F7-7AA8-4327A01BF747} - - - {C1450D01-C033-76F3-3763-6DE88AF48A77} - - - - - - - - ..\..\common\windows - - - ..\..\common\windows - - - ..\..\common\windows - - - - - ..\..\common\windows - - - ..\..\common\windows - - - \ No newline at end of file diff --git a/breakpad/common/basictypes.h b/breakpad/common/basictypes.h deleted file mode 100644 index 84668b79d..000000000 --- a/breakpad/common/basictypes.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2011 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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_ - -// A macro to disallow the copy constructor and operator= functions -// This should be used in the private: declarations for a class -#ifndef DISALLOW_COPY_AND_ASSIGN -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) -#endif // DISALLOW_COPY_AND_ASSIGN - -#endif // COMMON_BASICTYPES_H_ diff --git a/breakpad/common/byte_cursor.h b/breakpad/common/byte_cursor.h deleted file mode 100644 index accd54e0a..000000000 --- a/breakpad/common/byte_cursor.h +++ /dev/null @@ -1,265 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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, *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/breakpad/common/byte_cursor_unittest.cc b/breakpad/common/byte_cursor_unittest.cc deleted file mode 100644 index 06bfd89d7..000000000 --- a/breakpad/common/byte_cursor_unittest.cc +++ /dev/null @@ -1,776 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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/breakpad/common/convert_UTF.c b/breakpad/common/convert_UTF.c deleted file mode 100644 index 80178d35e..000000000 --- a/breakpad/common/convert_UTF.c +++ /dev/null @@ -1,533 +0,0 @@ -/* - * Copyright 2001-2004 Unicode, Inc. - * - * Disclaimer - * - * This source code is provided as is by Unicode, Inc. No claims are - * made as to fitness for any particular purpose. No warranties of any - * kind are expressed or implied. The recipient agrees to determine - * applicability of information provided. If this file has been - * purchased on magnetic or optical media from Unicode, Inc., the - * sole remedy for any claim will be exchange of defective media - * within 90 days of receipt. - * - * Limitations on Rights to Redistribute This Code - * - * Unicode, Inc. hereby grants the right to freely use the information - * supplied in this file in the creation of products supporting the - * Unicode Standard, and to make copies of this file in any form - * for internal or external distribution as long as this notice - * remains attached. - */ - -/* --------------------------------------------------------------------- - -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. - ------------------------------------------------------------------------- */ - - -#include "convert_UTF.h" -#ifdef CVTUTF_DEBUG -#include -#endif - -static const int halfShift = 10; /* used for shifting by 10 bits */ - -static const UTF32 halfBase = 0x0010000UL; -static const UTF32 halfMask = 0x3FFUL; - -#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 -#define false 0 -#define true 1 - -/* --------------------------------------------------------------------- */ - -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; -} - -/* --------------------------------------------------------------------- */ - -/* - * 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. - */ -static 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. - */ -static 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. - */ -static 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. -*/ - -/* --------------------------------------------------------------------- */ - -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; - case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); - } - target += bytesToWrite; - } -*sourceStart = source; -*targetStart = target; -return result; -} - -/* --------------------------------------------------------------------- */ - -/* - * 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. - */ - -static 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; - case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; - 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; - } - - case 1: if (*source >= 0x80 && *source < 0xC2) return false; - } - if (*source > 0xF4) return false; - return true; -} - -/* --------------------------------------------------------------------- */ - -/* - * 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) { - case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ - case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ - case 3: ch += *source++; ch <<= 6; - case 2: ch += *source++; ch <<= 6; - case 1: ch += *source++; ch <<= 6; - 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; - case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - 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; - case 4: ch += *source++; ch <<= 6; - case 3: ch += *source++; ch <<= 6; - case 2: ch += *source++; ch <<= 6; - case 1: ch += *source++; ch <<= 6; - 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. - ---------------------------------------------------------------------- */ diff --git a/breakpad/common/convert_UTF.h b/breakpad/common/convert_UTF.h deleted file mode 100644 index b1556de81..000000000 --- a/breakpad/common/convert_UTF.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2001-2004 Unicode, Inc. - * - * Disclaimer - * - * This source code is provided as is by Unicode, Inc. No claims are - * made as to fitness for any particular purpose. No warranties of any - * kind are expressed or implied. The recipient agrees to determine - * applicability of information provided. If this file has been - * purchased on magnetic or optical media from Unicode, Inc., the - * sole remedy for any claim will be exchange of defective media - * within 90 days of receipt. - * - * Limitations on Rights to Redistribute This Code - * - * Unicode, Inc. hereby grants the right to freely use the information - * supplied in this file in the creation of products supporting the - * Unicode Standard, and to make copies of this file in any form - * for internal or external distribution as long as this notice - * remains attached. - */ - -/* --------------------------------------------------------------------- - -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. ------------------------------------------------------------------------- */ - -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; - -/* This is for C++ and does no harm in C */ -#ifdef __cplusplus -extern "C" { -#endif - -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); - -#ifdef __cplusplus -} -#endif - -/* --------------------------------------------------------------------- */ diff --git a/breakpad/common/dwarf_cfi_to_module.cc b/breakpad/common/dwarf_cfi_to_module.cc deleted file mode 100644 index 15904d759..000000000 --- a/breakpad/common/dwarf_cfi_to_module.cc +++ /dev/null @@ -1,258 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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])); -} - -bool DwarfCFIToModule::Entry(size_t offset, uint64 address, uint64 length, - uint8 version, const string &augmentation, - unsigned return_address) { - assert(!entry_); - - // If dwarf2reader::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_ = new Module::StackFrameEntry; - 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); - char buf[30]; - sprintf(buf, "unnamed_register%u", reg); - return buf; -} - -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 std::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 address, int reg) { - reporter_->UndefinedNotSupported(entry_offset_, RegisterName(reg)); - // Treat this as a non-fatal error. - return true; -} - -bool DwarfCFIToModule::SameValueRule(uint64 address, int reg) { - ostringstream s; - s << RegisterName(reg); - Record(address, reg, s.str()); - return true; -} - -bool DwarfCFIToModule::OffsetRule(uint64 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 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 address, int reg, - int base_register) { - ostringstream s; - s << RegisterName(base_register); - Record(address, reg, s.str()); - return true; -} - -bool DwarfCFIToModule::ExpressionRule(uint64 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 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(entry_); - entry_ = NULL; - return true; -} - -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 ®) { - 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 ®) { - 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/breakpad/common/dwarf_cfi_to_module.h b/breakpad/common/dwarf_cfi_to_module.h deleted file mode 100644 index 7db552a68..000000000 --- a/breakpad/common/dwarf_cfi_to_module.h +++ /dev/null @@ -1,196 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 "common/module.h" -#include "common/dwarf/dwarf2reader.h" -#include "common/using_std_string.h" - -namespace google_breakpad { - -using dwarf2reader::CallFrameInfo; -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 §ion) - : 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 ®); - - // 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 ®); - - 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(); - - 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 dwarf2reader::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 ®ister_names, - Reporter *reporter) - : module_(module), register_names_(register_names), reporter_(reporter), - entry_(NULL), return_address_(-1), cfa_name_(".cfa"), ra_name_(".ra") { - } - virtual ~DwarfCFIToModule() { delete entry_; } - - virtual bool Entry(size_t offset, uint64 address, uint64 length, - uint8 version, const string &augmentation, - unsigned return_address); - virtual bool UndefinedRule(uint64 address, int reg); - virtual bool SameValueRule(uint64 address, int reg); - virtual bool OffsetRule(uint64 address, int reg, - int base_register, long offset); - virtual bool ValOffsetRule(uint64 address, int reg, - int base_register, long offset); - virtual bool RegisterRule(uint64 address, int reg, int base_register); - virtual bool ExpressionRule(uint64 address, int reg, - const string &expression); - virtual bool ValExpressionRule(uint64 address, int reg, - const string &expression); - virtual bool End(); - - 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 ®ister_names_; - - // The reporter to use to report problems. - Reporter *reporter_; - - // The current entry we're constructing. - Module::StackFrameEntry *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 std::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 std::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/breakpad/common/dwarf_cfi_to_module_unittest.cc b/breakpad/common/dwarf_cfi_to_module_unittest.cc deleted file mode 100644 index 807d1b20c..000000000 --- a/breakpad/common/dwarf_cfi_to_module_unittest.cc +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright (c) 2010, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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 §ion) - : Reporter(file, section) { } - MOCK_METHOD2(UnnamedRegister, void(size_t offset, int reg)); - MOCK_METHOD2(UndefinedNotSupported, void(size_t offset, const string ®)); - MOCK_METHOD2(ExpressionsNotSupported, void(size_t offset, const string ®)); -}; - -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 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]); -} diff --git a/breakpad/common/dwarf_cu_to_module.cc b/breakpad/common/dwarf_cu_to_module.cc deleted file mode 100644 index 8246daf9c..000000000 --- a/breakpad/common/dwarf_cu_to_module.cc +++ /dev/null @@ -1,1054 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 */ - -#include "common/dwarf_cu_to_module.h" - -#include -#if !defined(__ANDROID__) -#include -#endif -#include -#include - -#include -#include -#include - -#include "common/dwarf_line_to_module.h" - -namespace google_breakpad { - -using std::map; -using std::pair; -using std::set; -using std::sort; -using std::vector; - -// 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. - string qualified_name; - - // The name of the enclosing scope, or the empty string if there is none. - string enclosing_name; - - // The name for the specification DIE itself, without any enclosing - // name components. - string unqualified_name; -}; - -// An abstract origin -- base definition of an inline function. -struct AbstractOrigin { - AbstractOrigin() : name() {} - explicit AbstractOrigin(const string& name) : name(name) {} - - string name; -}; - -typedef map AbstractOriginByOffset; - -// Data global to the DWARF-bearing file that is private to the -// DWARF-to-Module process. -struct DwarfCUToModule::FilePrivate { - // A set of strings used in this CU. Before storing a string in one of - // our data structures, insert it into this set, and then use the string - // from the set. - // - // In some STL implementations, strings are reference-counted internally, - // meaning that 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. GNU's libstdc++ uses - // reference counts, and I believe MSVC did as well, at some point. - // However, C++ '11 implementations are moving away from reference - // counting. - // - // In other implementations, string assignments copy the string's text, - // so this set will actually hold yet another copy of the string (although - // everything will still work). To improve memory consumption portably, - // we will probably need to use pointers to strings held in this set. - set common_strings; - - // 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; -}; - -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() { -} - -void DwarfCUToModule::FileContext::AddSectionToSectionMap( - const string& name, const char* contents, uint64 length) { - section_map_[name] = std::make_pair(contents, length); -} - -void DwarfCUToModule::FileContext::ClearSectionMapForTest() { - section_map_.clear(); -} - -const dwarf2reader::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 offset, uint64 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) - : file_context(file_context_arg), - reporter(reporter_arg), - language(Language::CPlusPlus) {} - - ~CUContext() { - for (vector::iterator it = functions.begin(); - it != functions.end(); ++it) { - delete *it; - } - }; - - // The DWARF-bearing file into which this CU was incorporated. - FileContext *file_context; - - // For printing error messages. - WarningReporter *reporter; - - // The source language of this compilation unit. - const Language *language; - - // 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; -}; - -// 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 "". - string name; -}; - -// An abstract base class for all the dumper's DIE handlers. -class DwarfCUToModule::GenericDIEHandler: public dwarf2reader::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 offset) - : cu_context_(cu_context), - parent_context_(parent_context), - offset_(offset), - declaration_(false), - specification_(NULL) { } - - // 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 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 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. - string ComputeQualifiedName(); - - CUContext *cu_context_; - DIEContext *parent_context_; - uint64 offset_; - - // Place the name in the global set of strings. Even though this looks - // like a copy, all the major std::string implementations use reference - // counting internally, so the effect is to have all the data structures - // share copies of strings whenever possible. - // FIXME: Should this return something like a string_ref to avoid the - // assumption about how strings are implemented? - string AddStringToPool(const string &str); - - // 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_; - - // The value of the DW_AT_name attribute, or the empty string if the - // DIE has no such attribute. - string 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. - string demangled_name_; -}; - -void DwarfCUToModule::GenericDIEHandler::ProcessAttributeUnsigned( - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - switch (attr) { - case dwarf2reader::DW_AT_declaration: declaration_ = (data != 0); break; - default: break; - } -} - -void DwarfCUToModule::GenericDIEHandler::ProcessAttributeReference( - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - switch (attr) { - case dwarf2reader::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 { - // Technically, there's no reason a DW_AT_specification - // couldn't be a forward reference, but supporting that would - // be a lot of work (changing to a two-pass structure), and I - // don't think any producers we care about ever emit such - // things. - cu_context_->reporter->UnknownSpecification(offset_, data); - } - break; - } - default: break; - } -} - -string DwarfCUToModule::GenericDIEHandler::AddStringToPool(const string &str) { - pair::iterator, bool> result = - cu_context_->file_context->file_private_->common_strings.insert(str); - return *result.first; -} - -void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString( - enum DwarfAttribute attr, - enum DwarfForm form, - const string &data) { - switch (attr) { - case dwarf2reader::DW_AT_name: - name_attribute_ = AddStringToPool(data); - break; - case dwarf2reader::DW_AT_MIPS_linkage_name: { - char* demangled = NULL; -#if !defined(__ANDROID__) - demangled = abi::__cxa_demangle(data.c_str(), NULL, NULL, NULL); -#endif - if (demangled) { - demangled_name_ = AddStringToPool(demangled); - free(reinterpret_cast(demangled)); - } - break; - } - default: break; - } -} - -string DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() { - // Use the demangled name, if one is available. Demangled names are - // preferable to those inferred from the DWARF structure because they - // include argument types. - const string *qualified_name = NULL; - 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; - } - - const string *unqualified_name; - const string *enclosing_name; - if (!qualified_name) { - // Find our unqualified name. If the DIE has its own DW_AT_name - // attribute, then use that; otherwise, check our specification. - if (name_attribute_.empty() && specification_) - unqualified_name = &specification_->unqualified_name; - else - unqualified_name = &name_attribute_; - - // Find the name of our enclosing context. If we have 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 - enclosing_name = &parent_context_->name; - } - - // If this DIE was marked as a declaration, record its names in the - // specification table. - if (declaration_) { - 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; - } - - if (qualified_name) - return *qualified_name; - - // Combine the enclosing name and unqualified name to produce our - // own fully-qualified name. - return cu_context_->language->MakeQualifiedName(*enclosing_name, - *unqualified_name); -} - -// A handler class for DW_TAG_subprogram DIEs. -class DwarfCUToModule::FuncHandler: public GenericDIEHandler { - public: - FuncHandler(CUContext *cu_context, DIEContext *parent_context, - uint64 offset) - : GenericDIEHandler(cu_context, parent_context, offset), - low_pc_(0), high_pc_(0), high_pc_form_(dwarf2reader::DW_FORM_addr), - abstract_origin_(NULL), inline_(false) { } - void ProcessAttributeUnsigned(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - void ProcessAttributeSigned(enum DwarfAttribute attr, - enum DwarfForm form, - int64 data); - void ProcessAttributeReference(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - - bool EndAttributes(); - void Finish(); - - private: - // The fully-qualified name, as derived from name_attribute_, - // specification_, parent_context_. Computed in EndAttributes. - string name_; - uint64 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. - const AbstractOrigin* abstract_origin_; - bool inline_; -}; - -void DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned( - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 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 dwarf2reader::DW_AT_inline: inline_ = true; break; - - case dwarf2reader::DW_AT_low_pc: low_pc_ = data; break; - case dwarf2reader::DW_AT_high_pc: - high_pc_form_ = form; - high_pc_ = data; - break; - - default: - GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data); - break; - } -} - -void DwarfCUToModule::FuncHandler::ProcessAttributeSigned( - enum DwarfAttribute attr, - enum DwarfForm form, - int64 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 dwarf2reader::DW_AT_inline: inline_ = true; break; - - default: - break; - } -} - -void DwarfCUToModule::FuncHandler::ProcessAttributeReference( - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - switch (attr) { - case dwarf2reader::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 { - cu_context_->reporter->UnknownAbstractOrigin(offset_, data); - } - break; - } - default: - GenericDIEHandler::ProcessAttributeReference(attr, form, data); - break; - } -} - -bool DwarfCUToModule::FuncHandler::EndAttributes() { - // Compute our name, and record a specification, if appropriate. - name_ = ComputeQualifiedName(); - if (name_.empty() && abstract_origin_) { - name_ = abstract_origin_->name; - } - return true; -} - -void DwarfCUToModule::FuncHandler::Finish() { - // Make high_pc_ an address, if it isn't already. - if (high_pc_form_ != dwarf2reader::DW_FORM_addr) { - high_pc_ += low_pc_; - } - - // Did we collect the information we need? Not all DWARF function - // entries have low and high addresses (for example, inlined - // functions that were never used), but all the ones we're - // interested in cover a non-empty range of bytes. - if (low_pc_ < high_pc_) { - // Create a Module::Function based on the data we've gathered, and - // add it to the functions_ list. - Module::Function *func = new Module::Function; - // Malformed DWARF may omit the name, but all Module::Functions must - // have names. - if (!name_.empty()) { - func->name = name_; - } else { - cu_context_->reporter->UnnamedFunction(offset_); - func->name = ""; - } - func->address = low_pc_; - func->size = high_pc_ - low_pc_; - func->parameter_size = 0; - 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); - } - } else if (inline_) { - AbstractOrigin origin(name_); - cu_context_->file_context->file_private_->origins[offset_] = origin; - } -} - -// 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 offset) - : GenericDIEHandler(cu_context, parent_context, offset) { } - bool EndAttributes(); - DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag); - - private: - DIEContext child_context_; // A context for our children. -}; - -bool DwarfCUToModule::NamedScopeHandler::EndAttributes() { - child_context_.name = ComputeQualifiedName(); - return true; -} - -dwarf2reader::DIEHandler *DwarfCUToModule::NamedScopeHandler::FindChildHandler( - uint64 offset, - enum DwarfTag tag) { - switch (tag) { - case dwarf2reader::DW_TAG_subprogram: - return new FuncHandler(cu_context_, &child_context_, offset); - case dwarf2reader::DW_TAG_namespace: - case dwarf2reader::DW_TAG_class_type: - case dwarf2reader::DW_TAG_structure_type: - case dwarf2reader::DW_TAG_union_type: - return new NamedScopeHandler(cu_context_, &child_context_, offset); - default: - return NULL; - } -} - -void DwarfCUToModule::WarningReporter::CUHeading() { - if (printed_cu_header_) - return; - fprintf(stderr, "%s: in compilation unit '%s' (offset 0x%llx):\n", - filename_.c_str(), cu_name_.c_str(), cu_offset_); - printed_cu_header_ = true; -} - -void DwarfCUToModule::WarningReporter::UnknownSpecification(uint64 offset, - uint64 target) { - CUHeading(); - fprintf(stderr, "%s: the DIE at offset 0x%llx has a DW_AT_specification" - " attribute referring to the die at offset 0x%llx, which either" - " was not marked as a declaration, or comes later in the file\n", - filename_.c_str(), offset, target); -} - -void DwarfCUToModule::WarningReporter::UnknownAbstractOrigin(uint64 offset, - uint64 target) { - CUHeading(); - fprintf(stderr, "%s: the DIE at offset 0x%llx has a DW_AT_abstract_origin" - " attribute referring to the die at offset 0x%llx, which either" - " was not marked as an inline, or comes later in the file\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 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", - function.size == 0 ? " (zero-length)" : "", - function.name.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 offset) { - CUHeading(); - fprintf(stderr, "%s: warning: function at offset 0x%llx has no name\n", - filename_.c_str(), offset); -} - -void DwarfCUToModule::WarningReporter::UnhandledInterCUReference( - uint64 offset, uint64 target) { - CUHeading(); - fprintf(stderr, "%s: warning: the DIE at offset 0x%llx has a " - "DW_FORM_ref_addr attribute with an inter-CU reference to " - "0x%llx, but inter-CU reference handling is turned off.\n", - filename_.c_str(), offset, target); -} - -DwarfCUToModule::DwarfCUToModule(FileContext *file_context, - LineToModuleHandler *line_reader, - WarningReporter *reporter) - : line_reader_(line_reader), - cu_context_(new CUContext(file_context, reporter)), - child_context_(new DIEContext()), - has_source_line_info_(false) { -} - -DwarfCUToModule::~DwarfCUToModule() { -} - -void DwarfCUToModule::ProcessAttributeSigned(enum DwarfAttribute attr, - enum DwarfForm form, - int64 data) { - switch (attr) { - case dwarf2reader::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 data) { - switch (attr) { - case dwarf2reader::DW_AT_stmt_list: // Line number information. - has_source_line_info_ = true; - source_line_offset_ = data; - break; - case dwarf2reader::DW_AT_language: // source language of this CU - SetLanguage(static_cast(data)); - break; - default: - break; - } -} - -void DwarfCUToModule::ProcessAttributeString(enum DwarfAttribute attr, - enum DwarfForm form, - const string &data) { - switch (attr) { - case dwarf2reader::DW_AT_name: - cu_context_->reporter->SetCUName(data); - break; - case dwarf2reader::DW_AT_comp_dir: - line_reader_->StartCompilationUnit(data); - break; - default: - break; - } -} - -bool DwarfCUToModule::EndAttributes() { - return true; -} - -dwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler( - uint64 offset, - enum DwarfTag tag) { - switch (tag) { - case dwarf2reader::DW_TAG_subprogram: - return new FuncHandler(cu_context_.get(), child_context_.get(), offset); - case dwarf2reader::DW_TAG_namespace: - case dwarf2reader::DW_TAG_class_type: - case dwarf2reader::DW_TAG_structure_type: - case dwarf2reader::DW_TAG_union_type: - return new NamedScopeHandler(cu_context_.get(), child_context_.get(), - offset); - default: - return NULL; - } -} - -void DwarfCUToModule::SetLanguage(DwarfLanguage language) { - switch (language) { - case dwarf2reader::DW_LANG_Java: - cu_context_->language = Language::Java; - break; - - // DWARF has no generic language code for assembly language; this is - // what the GNU toolchain uses. - case dwarf2reader::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 dwarf2reader::DW_LANG_ObjC: - case dwarf2reader::DW_LANG_ObjC_plus_plus: - case dwarf2reader::DW_LANG_C: - case dwarf2reader::DW_LANG_C89: - case dwarf2reader::DW_LANG_C99: - case dwarf2reader::DW_LANG_C_plus_plus: - cu_context_->language = Language::CPlusPlus; - break; - } -} - -void DwarfCUToModule::ReadSourceLines(uint64 offset) { - const dwarf2reader::SectionMap §ion_map - = cu_context_->file_context->section_map(); - dwarf2reader::SectionMap::const_iterator map_entry - = section_map.find(".debug_line"); - // Mac OS X puts DWARF data in sections whose names begin with "__" - // instead of ".". - if (map_entry == section_map.end()) - map_entry = section_map.find("__debug_line"); - if (map_entry == section_map.end()) { - cu_context_->reporter->MissingSection(".debug_line"); - return; - } - const char *section_start = map_entry->second.first; - uint64 section_length = map_entry->second.second; - if (offset >= section_length) { - cu_context_->reporter->BadLineInfoOffset(offset); - return; - } - line_reader_->ReadProgram(section_start + offset, section_length - offset, - cu_context_->file_context->module_, &lines_); -} - -namespace { -// 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; - - // Make a single pass through both vectors from lower to higher - // addresses, populating each Function's lines vector with lines - // from our lines_ vector that fall within the function's address - // range. - vector::iterator func_it = functions->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. - Module::Function *func; - const Module::Line *line; - - // Start current at the beginning of the first line or function, - // whichever is earlier. - if (func_it != functions->end() && line_it != lines_.end()) { - func = *func_it; - line = &*line_it; - current = std::min(func->address, line->address); - } else if (line_it != lines_.end()) { - func = NULL; - line = &*line_it; - current = line->address; - } else if (func_it != functions->end()) { - func = *func_it; - line = NULL; - current = (*func_it)->address; - } else { - return; - } - - while (func || 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 - // function 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 function, 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 function 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 function - // iterator. So neither iterator moves. - - // Assert the first invariant (see above). - assert(!func || current < func->address || within(*func, 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 (func && current >= func->address) { - if (line && current >= line->address) { - // Covered by both a line and a function. - Module::Address func_left = func->size - (current - func->address); - Module::Address line_left = line->size - (current - line->address); - // This may overflow, but things work out. - next_transition = current + std::min(func_left, line_left); - Module::Line l = *line; - l.address = current; - l.size = next_transition - current; - func->lines.push_back(l); - last_line_used = line; - } else { - // Covered by a function, but no line. - if (func != last_function_cited) { - reporter->UncoveredFunction(*func); - last_function_cited = func; - } - if (line && within(*func, line->address)) - next_transition = line->address; - else - // If this overflows, we'll catch it below. - next_transition = func->address + func->size; - } - } else { - if (line && current >= line->address) { - // Covered by a line, but no function. - // - // 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 - && !(func - && line == last_line_used - && func->address - line->address == line->size)) { - reporter->UncoveredLine(*line); - last_line_cited = line; - } - if (func && within(*line, func->address)) - next_transition = func->address; - else - // If this overflows, we'll catch it below. - next_transition = line->address + line->size; - } else { - // Covered by neither a function nor a line. By the invariant, - // both func and line begin after CURRENT. The next transition - // is the start of the next function or next line, whichever - // is earliest. - assert(func || line); - if (func && line) - next_transition = std::min(func->address, line->address); - else if (func) - next_transition = func->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. - if (!next_transition) - 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 (func_it != functions->end() - && next_transition >= (*func_it)->address - && !within(**func_it, next_transition)) - func_it++; - func = (func_it != functions->end()) ? *func_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::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(); - - // Add our functions, which now have source lines assigned to them, - // to module_. - cu_context_->file_context->module_->AddFunctions(functions->begin(), - functions->end()); - - // Ownership of the function objects has shifted from cu_context to - // the Module. - functions->clear(); - - cu_context_->file_context->ClearSpecifications(); -} - -bool DwarfCUToModule::StartCompilationUnit(uint64 offset, - uint8 address_size, - uint8 offset_size, - uint64 cu_length, - uint8 dwarf_version) { - return dwarf_version >= 2; -} - -bool DwarfCUToModule::StartRootDIE(uint64 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 == dwarf2reader::DW_TAG_compile_unit; -} - -} // namespace google_breakpad diff --git a/breakpad/common/dwarf_cu_to_module.h b/breakpad/common/dwarf_cu_to_module.h deleted file mode 100644 index ab95485fc..000000000 --- a/breakpad/common/dwarf_cu_to_module.h +++ /dev/null @@ -1,315 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 "common/language.h" -#include "common/module.h" -#include "common/dwarf/bytereader.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 { - -using dwarf2reader::DwarfAttribute; -using dwarf2reader::DwarfForm; -using dwarf2reader::DwarfLanguage; -using dwarf2reader::DwarfTag; - -// Populate a google_breakpad::Module with DWARF debugging information. -// -// An instance of this class can be provided as a handler to a -// dwarf2reader::DIEDispatcher, which can in turn be a handler for a -// dwarf2reader::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 dwarf2reader::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 char* contents, - uint64 length); - - // Clear the section map for testing. - void ClearSectionMapForTest(); - - const dwarf2reader::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 offset, - uint64 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. - dwarf2reader::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_; - }; - - // An abstract base class for handlers that handle DWARF line data - // for DwarfCUToModule. DwarfCUToModule could certainly just use - // dwarf2reader::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 char *program, uint64 length, - Module *module, vector *lines) = 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 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 offset, uint64 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 offset, uint64 target); - - // We were unable to find the DWARF section named SECTION_NAME. - virtual void MissingSection(const string §ion_name); - - // The CU's DW_AT_stmt_list offset OFFSET is bogus. - virtual void BadLineInfoOffset(uint64 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 offset); - - // 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 offset, uint64 target); - - uint64 cu_offset() const { - return cu_offset_; - } - - protected: - const string filename_; - const uint64 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 - // dwarf2reader::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, - WarningReporter *reporter); - ~DwarfCUToModule(); - - void ProcessAttributeSigned(enum DwarfAttribute attr, - enum DwarfForm form, - int64 data); - void ProcessAttributeUnsigned(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - void ProcessAttributeString(enum DwarfAttribute attr, - enum DwarfForm form, - const string &data); - bool EndAttributes(); - DIEHandler *FindChildHandler(uint64 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 offset, uint8 address_size, - uint8 offset_size, uint64 cu_length, - uint8 dwarf_version); - bool StartRootDIE(uint64 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 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 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(); - - // 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 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_; -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_DWARF_CU_TO_MODULE_H__ diff --git a/breakpad/common/dwarf_cu_to_module_unittest.cc b/breakpad/common/dwarf_cu_to_module_unittest.cc deleted file mode 100644 index 5f61a58e9..000000000 --- a/breakpad/common/dwarf_cu_to_module_unittest.cc +++ /dev/null @@ -1,1780 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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 dwarf2reader::DIEHandler; -using dwarf2reader::DwarfTag; -using dwarf2reader::DwarfAttribute; -using dwarf2reader::DwarfForm; -using dwarf2reader::DwarfInline; -using dwarf2reader::RootDIEHandler; -using google_breakpad::DwarfCUToModule; -using google_breakpad::Module; - -using ::testing::_; -using ::testing::AtMost; -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_METHOD4(ReadProgram, void(const char* program, uint64 length, - Module *module, vector *lines)); -}; - -class MockWarningReporter: public DwarfCUToModule::WarningReporter { - public: - MockWarningReporter(const string &filename, uint64 cu_offset) - : DwarfCUToModule::WarningReporter(filename, cu_offset) { } - MOCK_METHOD1(SetCUName, void(const string &name)); - MOCK_METHOD2(UnknownSpecification, void(uint64 offset, uint64 target)); - MOCK_METHOD2(UnknownAbstractOrigin, void(uint64 offset, uint64 target)); - MOCK_METHOD1(MissingSection, void(const string §ion_name)); - MOCK_METHOD1(BadLineInfoOffset, void(uint64 offset)); - MOCK_METHOD1(UncoveredFunction, void(const Module::Function &function)); - MOCK_METHOD1(UncoveredLine, void(const Module::Line &line)); - MOCK_METHOD1(UnnamedFunction, void(uint64 offset)); - MOCK_METHOD2(UnhandledInterCUReference, void(uint64 offset, uint64 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 char *program, uint64 length, - Module *module, vector *lines) { - 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_(dwarf2reader::DW_LANG_none), - language_signed_(false), - appender_(&lines_), - reporter_("dwarf-filename", 0xcf8f9bb6443d29b5LL), - root_handler_(&file_context_, &line_reader_, &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(dwarf2reader::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(dwarf2reader::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 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 = dwarf2reader::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 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 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 offset, - DwarfInline type, uint64 specification, - const string &name, - DwarfForm form = dwarf2reader::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 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 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. - dwarf2reader::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 char 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 char 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, - dwarf2reader::DW_TAG_compile_unit)); - } - root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::DW_FORM_strp, - "compilation-unit-name"); - if (!compilation_dir_.empty()) - root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_comp_dir, - dwarf2reader::DW_FORM_strp, - compilation_dir_); - if (!lines_.empty()) - root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_stmt_list, - dwarf2reader::DW_FORM_ref4, - 0); - if (language_ != dwarf2reader::DW_LANG_none) { - if (language_signed_) - root_handler_.ProcessAttributeSigned(dwarf2reader::DW_AT_language, - dwarf2reader::DW_FORM_sdata, - language_); - else - root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_language, - dwarf2reader::DW_FORM_udata, - language_); - } - ASSERT_TRUE(root_handler_.EndAttributes()); -} - -void CUFixtureBase::ProcessStrangeAttributes( - dwarf2reader::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 char 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) { - dwarf2reader::DIEHandler *handler - = parent->FindChildHandler(0x8f4c783c0467c989ULL, tag); - if (!handler) - return NULL; - handler->ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::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 specification, - const char *name) { - dwarf2reader::DIEHandler *handler - = parent->FindChildHandler(0x8f4c783c0467c989ULL, tag); - if (!handler) - return NULL; - if (name) - handler->ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::DW_FORM_strp, - name); - handler->ProcessAttributeReference(dwarf2reader::DW_AT_specification, - dwarf2reader::DW_FORM_ref4, - specification); - if (!handler->EndAttributes()) { - handler->Finish(); - delete handler; - return NULL; - } - - return handler; -} - -void CUFixtureBase::DefineFunction(dwarf2reader::DIEHandler *parent, - const string &name, Module::Address address, - Module::Address size, - const char* mangled_name, - DwarfForm high_pc_form) { - dwarf2reader::DIEHandler *func - = parent->FindChildHandler(0xe34797c7e68590a8LL, - dwarf2reader::DW_TAG_subprogram); - ASSERT_TRUE(func != NULL); - func->ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::DW_FORM_strp, - name); - func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc, - dwarf2reader::DW_FORM_addr, - address); - - Module::Address high_pc = size; - if (high_pc_form == dwarf2reader::DW_FORM_addr) { - high_pc += address; - } - func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc, - high_pc_form, - high_pc); - - if (mangled_name) - func->ProcessAttributeString(dwarf2reader::DW_AT_MIPS_linkage_name, - dwarf2reader::DW_FORM_strp, - mangled_name); - - ProcessStrangeAttributes(func); - EXPECT_TRUE(func->EndAttributes()); - func->Finish(); - delete func; -} - -void CUFixtureBase::DeclarationDIE(DIEHandler *parent, uint64 offset, - DwarfTag tag, - const string &name, - const string &mangled_name) { - dwarf2reader::DIEHandler *die = parent->FindChildHandler(offset, tag); - ASSERT_TRUE(die != NULL); - if (!name.empty()) - die->ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::DW_FORM_strp, - name); - if (!mangled_name.empty()) - die->ProcessAttributeString(dwarf2reader::DW_AT_MIPS_linkage_name, - dwarf2reader::DW_FORM_strp, - mangled_name); - - die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_declaration, - dwarf2reader::DW_FORM_flag, - 1); - EXPECT_TRUE(die->EndAttributes()); - die->Finish(); - delete die; -} - -void CUFixtureBase::DefinitionDIE(DIEHandler *parent, - DwarfTag tag, - uint64 specification, - const string &name, - Module::Address address, - Module::Address size) { - dwarf2reader::DIEHandler *die - = parent->FindChildHandler(0x6ccfea031a9e6cc9ULL, tag); - ASSERT_TRUE(die != NULL); - die->ProcessAttributeReference(dwarf2reader::DW_AT_specification, - dwarf2reader::DW_FORM_ref4, - specification); - if (!name.empty()) - die->ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::DW_FORM_strp, - name); - if (size) { - die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc, - dwarf2reader::DW_FORM_addr, - address); - die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc, - dwarf2reader::DW_FORM_addr, - address + size); - } - EXPECT_TRUE(die->EndAttributes()); - die->Finish(); - delete die; -} - -void CUFixtureBase::AbstractInstanceDIE(DIEHandler *parent, - uint64 offset, - DwarfInline type, - uint64 specification, - const string &name, - DwarfForm form) { - dwarf2reader::DIEHandler *die - = parent->FindChildHandler(offset, dwarf2reader::DW_TAG_subprogram); - ASSERT_TRUE(die != NULL); - if (specification != 0ULL) - die->ProcessAttributeReference(dwarf2reader::DW_AT_specification, - dwarf2reader::DW_FORM_ref4, - specification); - if (form == dwarf2reader::DW_FORM_sdata) { - die->ProcessAttributeSigned(dwarf2reader::DW_AT_inline, form, type); - } else { - die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_inline, form, type); - } - if (!name.empty()) - die->ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::DW_FORM_strp, - name); - - EXPECT_TRUE(die->EndAttributes()); - die->Finish(); - delete die; -} - -void CUFixtureBase::DefineInlineInstanceDIE(DIEHandler *parent, - const string &name, - uint64 origin, - Module::Address address, - Module::Address size) { - dwarf2reader::DIEHandler *func - = parent->FindChildHandler(0x11c70f94c6e87ccdLL, - dwarf2reader::DW_TAG_subprogram); - ASSERT_TRUE(func != NULL); - if (!name.empty()) { - func->ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::DW_FORM_strp, - name); - } - func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc, - dwarf2reader::DW_FORM_addr, - address); - func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc, - dwarf2reader::DW_FORM_addr, - address + size); - func->ProcessAttributeReference(dwarf2reader::DW_AT_abstract_origin, - dwarf2reader::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->size); - EXPECT_EQ(0U, function->parameter_size); -} - -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, - dwarf2reader::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, - dwarf2reader::DW_TAG_lexical_block)); -} - -TEST_F(SimpleCU, IrrelevantNamedScopeChildren) { - StartCU(); - DIEHandler *class_A_handler - = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, "class_A"); - EXPECT_TRUE(class_A_handler != NULL); - EXPECT_FALSE(class_A_handler - ->FindChildHandler(0x02e55999b865e4e9ULL, - dwarf2reader::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, - dwarf2reader::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, - dwarf2reader::DW_INL_inlined, 0, "inline-name", - dwarf2reader::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, - dwarf2reader::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) { - EXPECT_CALL(reporter_, UnknownAbstractOrigin(_, 1ULL)).WillOnce(Return()); - EXPECT_CALL(reporter_, UnnamedFunction(0x11c70f94c6e87ccdLL)) - .WillOnce(Return()); - PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118); - - StartCU(); - AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL, - dwarf2reader::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) { - EXPECT_CALL(reporter_, UnnamedFunction(0xe34797c7e68590a8LL)) - .WillOnce(Return()); - 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_CASE_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_CASE_P(VersusEnclosures, CXXQualifiedNames, - Values(dwarf2reader::DW_TAG_class_type, - dwarf2reader::DW_TAG_structure_type, - dwarf2reader::DW_TAG_union_type, - dwarf2reader::DW_TAG_namespace)); - -TEST_P(CXXQualifiedNames, TwoFunctions) { - DwarfTag tag = GetParam(); - - SetLanguage(dwarf2reader::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(dwarf2reader::DW_LANG_C_plus_plus); - PushLine(10, 1, "line-file", 69819327); - - StartCU(); - DIEHandler *namespace_handler - = StartNamedDIE(&root_handler_, dwarf2reader::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(dwarf2reader::DW_LANG_C_plus_plus); - PushLine(10, 1, "filename1", 69819327); - - StartCU(); - DIEHandler *namespace_handler - = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace, - "namespace_A"); - EXPECT_TRUE(namespace_handler != NULL); - DIEHandler *struct_handler - = StartNamedDIE(namespace_handler, dwarf2reader::DW_TAG_structure_type, - "struct_B"); - EXPECT_TRUE(struct_handler != NULL); - DIEHandler *class_handler - = StartNamedDIE(struct_handler, dwarf2reader::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 { - dwarf2reader::DwarfLanguage language; - const char *name; -}; - -const LanguageAndQualifiedName LanguageAndQualifiedNameCases[] = { - { dwarf2reader::DW_LANG_none, "class_A::function_B" }, - { dwarf2reader::DW_LANG_C, "class_A::function_B" }, - { dwarf2reader::DW_LANG_C89, "class_A::function_B" }, - { dwarf2reader::DW_LANG_C99, "class_A::function_B" }, - { dwarf2reader::DW_LANG_C_plus_plus, "class_A::function_B" }, - { dwarf2reader::DW_LANG_Java, "class_A.function_B" }, - { dwarf2reader::DW_LANG_Cobol74, "class_A::function_B" }, - { dwarf2reader::DW_LANG_Mips_Assembler, NULL } -}; - -class QualifiedForLanguage - : public CUFixtureBase, - public TestWithParam { }; - -INSTANTIATE_TEST_CASE_P(LanguageAndQualifiedName, QualifiedForLanguage, - ValuesIn(LanguageAndQualifiedNameCases)); - -TEST_P(QualifiedForLanguage, MemberFunction) { - const LanguageAndQualifiedName ¶m = GetParam(); - - PushLine(10, 1, "line-file", 212966758); - SetLanguage(param.language); - - StartCU(); - DIEHandler *class_handler - = StartNamedDIE(&root_handler_, dwarf2reader::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 ¶m = GetParam(); - - PushLine(10, 1, "line-file", 212966758); - SetLanguage(param.language); - SetLanguageSigned(true); - - StartCU(); - DIEHandler *class_handler - = StartNamedDIE(&root_handler_, dwarf2reader::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, - dwarf2reader::DW_TAG_subprogram, "declaration-name", ""); - DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram, - 0xcd3c51b946fb1eeeLL, "", - 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); - root_handler_.Finish(); - - TestFunctionCount(1); - TestFunction(0, "declaration-name", - 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); -} - -TEST_F(Specifications, MangledName) { - PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661); - - StartCU(); - DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL, - dwarf2reader::DW_TAG_subprogram, "declaration-name", - "_ZN1C1fEi"); - DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram, - 0xcd3c51b946fb1eeeLL, "", - 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); - root_handler_.Finish(); - - TestFunctionCount(1); - TestFunction(0, "C::f(int)", - 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); -} - -TEST_F(Specifications, MemberFunction) { - PushLine(0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL, "line-file", 18116691); - - StartCU(); - DIEHandler *class_handler - = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, "class_A"); - DeclarationDIE(class_handler, 0x7d83028c431406e8ULL, - dwarf2reader::DW_TAG_subprogram, "declaration-name", ""); - class_handler->Finish(); - delete class_handler; - DefinitionDIE(&root_handler_, dwarf2reader::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_, dwarf2reader::DW_TAG_class_type, - "class_A"); - ASSERT_TRUE(class_handler != NULL); - DeclarationDIE(class_handler, 0x0e0e877c8404544aULL, - dwarf2reader::DW_TAG_subprogram, "declaration-name", ""); - class_handler->Finish(); - delete class_handler; - } - - DefinitionDIE(&root_handler_, dwarf2reader::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_, dwarf2reader::DW_TAG_namespace, - "space_A"); - ASSERT_TRUE(space_handler != NULL); - DeclarationDIE(space_handler, 0x419bb1d12f9a73a2ULL, - dwarf2reader::DW_TAG_class_type, "class-declaration-name", - ""); - space_handler->Finish(); - delete space_handler; - } - - { - DIEHandler *class_handler - = StartSpecifiedDIE(&root_handler_, dwarf2reader::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, - dwarf2reader::DW_TAG_subprogram, "inline-name", ""); - AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL, - dwarf2reader::DW_INL_inlined, 0xcd3c51b946fb1eeeLL, ""); - DefineInlineInstanceDIE(&root_handler_, "", 0x1e8dac5d507ed7abULL, - 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); - root_handler_.Finish(); - - TestFunctionCount(1); - TestFunction(0, "inline-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(dwarf2reader::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_, dwarf2reader::DW_TAG_namespace, - "space_A"); - DeclarationDIE(space_A_handler, 0x2e111126496596e2ULL, - dwarf2reader::DW_TAG_namespace, "space_B", ""); - space_A_handler->Finish(); - delete space_A_handler; - } - - { - DIEHandler *space_B_handler - = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace, - 0x2e111126496596e2ULL); - DIEHandler *struct_C_handler - = StartNamedDIE(space_B_handler, dwarf2reader::DW_TAG_structure_type, - "struct_C"); - DeclarationDIE(struct_C_handler, 0x20cd423bf2a25a4cULL, - dwarf2reader::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_, dwarf2reader::DW_TAG_structure_type, - 0x20cd423bf2a25a4cULL); - DIEHandler *union_E_handler - = StartNamedDIE(struct_D_handler, dwarf2reader::DW_TAG_union_type, - "union_E"); - DeclarationDIE(union_E_handler, 0xe25c84805aa58c32ULL, - dwarf2reader::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_, dwarf2reader::DW_TAG_union_type, - 0xe25c84805aa58c32ULL); - DIEHandler *class_G_handler - = StartNamedDIE(union_F_handler, dwarf2reader::DW_TAG_class_type, - "class_G"); - DeclarationDIE(class_G_handler, 0xb70d960dcc173b6eULL, - dwarf2reader::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_, dwarf2reader::DW_TAG_class_type, - 0xb70d960dcc173b6eULL); - DeclarationDIE(class_H_handler, 0x27ff829e3bf69f37ULL, - dwarf2reader::DW_TAG_subprogram, "func_I", ""); - class_H_handler->Finish(); - delete class_H_handler; - } - - DefinitionDIE(&root_handler_, dwarf2reader::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, &reporter_); - ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3)); - ASSERT_TRUE(root1_handler.StartRootDIE(1, - dwarf2reader::DW_TAG_compile_unit)); - ProcessStrangeAttributes(&root1_handler); - ASSERT_TRUE(root1_handler.EndAttributes()); - DeclarationDIE(&root1_handler, 0xb8fbfdd5f0b26fceULL, - dwarf2reader::DW_TAG_class_type, "class_A", ""); - root1_handler.Finish(); - } - - // Second CU. Defines class_A, declares member_func_B. - { - DwarfCUToModule root2_handler(&fc, &lr, &reporter_); - ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3)); - ASSERT_TRUE(root2_handler.StartRootDIE(1, - dwarf2reader::DW_TAG_compile_unit)); - ASSERT_TRUE(root2_handler.EndAttributes()); - DIEHandler *class_A_handler - = StartSpecifiedDIE(&root2_handler, dwarf2reader::DW_TAG_class_type, - 0xb8fbfdd5f0b26fceULL); - DeclarationDIE(class_A_handler, 0xb01fef8b380bd1a2ULL, - dwarf2reader::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, &reporter_); - ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3)); - ASSERT_TRUE(root3_handler.StartRootDIE(1, - dwarf2reader::DW_TAG_compile_unit)); - ASSERT_TRUE(root3_handler.EndAttributes()); - DefinitionDIE(&root3_handler, dwarf2reader::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.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, &reporter_); - ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3)); - ASSERT_TRUE(root1_handler.StartRootDIE(1, - dwarf2reader::DW_TAG_compile_unit)); - ProcessStrangeAttributes(&root1_handler); - ASSERT_TRUE(root1_handler.EndAttributes()); - DeclarationDIE(&root1_handler, 0xb8fbfdd5f0b26fceULL, - dwarf2reader::DW_TAG_class_type, "class_A", ""); - root1_handler.Finish(); - } - - // Second CU. Defines class_A, declares member_func_B. - { - DwarfCUToModule root2_handler(&fc, &lr, &reporter_); - ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3)); - ASSERT_TRUE(root2_handler.StartRootDIE(1, - dwarf2reader::DW_TAG_compile_unit)); - ASSERT_TRUE(root2_handler.EndAttributes()); - EXPECT_CALL(reporter_, UnhandledInterCUReference(_, _)).Times(1); - DIEHandler *class_A_handler - = StartSpecifiedDIE(&root2_handler, dwarf2reader::DW_TAG_class_type, - 0xb8fbfdd5f0b26fceULL); - DeclarationDIE(class_A_handler, 0xb01fef8b380bd1a2ULL, - dwarf2reader::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, &reporter_); - ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3)); - ASSERT_TRUE(root3_handler.StartRootDIE(1, - dwarf2reader::DW_TAG_compile_unit)); - ASSERT_TRUE(root3_handler.EndAttributes()); - EXPECT_CALL(reporter_, UnhandledInterCUReference(_, _)).Times(1); - EXPECT_CALL(reporter_, UnnamedFunction(_)).Times(1); - DefinitionDIE(&root3_handler, dwarf2reader::DW_TAG_subprogram, - 0xb01fef8b380bd1a2ULL, "", - 0x2618f00a1a711e53ULL, 0x4fd94b76d7c2caf5ULL); - root3_handler.Finish(); - } -} - -TEST_F(Specifications, BadOffset) { - PushLine(0xa0277efd7ce83771ULL, 0x149554a184c730c1ULL, "line-file", 56636272); - EXPECT_CALL(reporter_, UnknownSpecification(_, 0x2be953efa6f9a996ULL)) - .WillOnce(Return()); - - StartCU(); - DeclarationDIE(&root_handler_, 0xefd7f7752c27b7e4ULL, - dwarf2reader::DW_TAG_subprogram, "", ""); - DefinitionDIE(&root_handler_, dwarf2reader::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, - dwarf2reader::DW_TAG_subprogram, "declaration-name", ""); - DefinitionDIE(&root_handler_, dwarf2reader::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, - dwarf2reader::DW_TAG_class_type, "class-declaration-name", ""); - - dwarf2reader::DIEHandler *class_definition - = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, - 0xd0fe467ec2f1a58cULL, "class-definition-name"); - ASSERT_TRUE(class_definition); - DeclarationDIE(class_definition, 0x6d028229c15623dbULL, - dwarf2reader::DW_TAG_subprogram, - "function-declaration-name", ""); - class_definition->Finish(); - delete class_definition; - - DefinitionDIE(&root_handler_, dwarf2reader::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(); - { - dwarf2reader::DIEHandler *declaration_class_handler = - StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, - "declaration-class"); - DeclarationDIE(declaration_class_handler, 0x9ddb35517455ef7aULL, - dwarf2reader::DW_TAG_subprogram, "function-declaration", - ""); - declaration_class_handler->Finish(); - delete declaration_class_handler; - } - { - dwarf2reader::DIEHandler *definition_class_handler - = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, - "definition-class"); - DefinitionDIE(definition_class_handler, dwarf2reader::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, - dwarf2reader::DW_TAG_compile_unit)); - root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_name, - dwarf2reader::DW_FORM_strp, - "compilation-unit-name"); - root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_stmt_list, - dwarf2reader::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, - dwarf2reader::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) { - reporter.SetCUName("compilation-unit-name"); - - function.name = "function name"; - function.address = 0x19c45c30770c1eb0ULL; - function.size = 0x89808a5bdfa0a6a3ULL; - function.parameter_size = 0x6a329f18683dcd51ULL; - - file.name = "source file name"; - - 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/breakpad/common/dwarf_line_to_module.cc b/breakpad/common/dwarf_line_to_module.cc deleted file mode 100644 index 258b0b603..000000000 --- a/breakpad/common/dwarf_line_to_module.cc +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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 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 file_num, - uint32 dir_num, uint64 mod_time, - uint64 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 address, uint64 length, - uint32 file_num, uint32 line_num, - uint32 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/breakpad/common/dwarf_line_to_module.h b/breakpad/common/dwarf_line_to_module.h deleted file mode 100644 index 1fdd4cb71..000000000 --- a/breakpad/common/dwarf_line_to_module.h +++ /dev/null @@ -1,188 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 -// dwarf2reader::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 dwarf2reader::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) - : module_(module), - compilation_dir_(compilation_dir), - lines_(lines), - 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 dir_num); - void DefineFile(const string &name, int32 file_num, - uint32 dir_num, uint64 mod_time, - uint64 length); - void AddLine(uint64 address, uint64 length, - uint32 file_num, uint32 line_num, uint32 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 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 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/breakpad/common/dwarf_line_to_module_unittest.cc b/breakpad/common/dwarf_line_to_module_unittest.cc deleted file mode 100644 index 7c0fcfd35..000000000 --- a/breakpad/common/dwarf_line_to_module_unittest.cc +++ /dev/null @@ -1,391 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "src/build", &lines); - - 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; - DwarfLineToModule h(&m, "src/build", &lines); - - 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; - DwarfLineToModule h(&m, "src/build", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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; - DwarfLineToModule h(&m, "/", &lines); - - 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/breakpad/common/language.cc b/breakpad/common/language.cc deleted file mode 100644 index c2fd81f64..000000000 --- a/breakpad/common/language.cc +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#include "common/language.h" - -namespace google_breakpad { - -// C++ language-specific operations. -class CPPLanguage: public Language { - public: - CPPLanguage() {} - string MakeQualifiedName(const string &parent_name, - const string &name) const { - if (parent_name.empty()) - return name; - else - return parent_name + "::" + name; - } -}; - -CPPLanguage CPPLanguageSingleton; - -// Java language-specific operations. -class JavaLanguage: public Language { - public: - string MakeQualifiedName(const string &parent_name, - const string &name) const { - if (parent_name.empty()) - return name; - else - return parent_name + "." + name; - } -}; - -JavaLanguage JavaLanguageSingleton; - -// Assembler language-specific operations. -class AssemblerLanguage: public Language { - 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::Assembler = &AssemblerLanguageSingleton; - -} // namespace google_breakpad diff --git a/breakpad/common/language.h b/breakpad/common/language.h deleted file mode 100644 index bbe303347..000000000 --- a/breakpad/common/language.h +++ /dev/null @@ -1,88 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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; - - // Instances for specific languages. - static const Language * const CPlusPlus, - * const Java, - * const Assembler; -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_LANGUAGE_H__ diff --git a/breakpad/common/md5.cc b/breakpad/common/md5.cc deleted file mode 100644 index bccf61c60..000000000 --- a/breakpad/common/md5.cc +++ /dev/null @@ -1,251 +0,0 @@ -/* - * 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. - */ - -#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, unsigned 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 */ - ((u32 *) ctx->in)[14] = ctx->bits[0]; - ((u32 *) ctx->in)[15] = ctx->bits[1]; - - 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]) -{ - register 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/breakpad/common/md5.h b/breakpad/common/md5.h deleted file mode 100644 index e96521eed..000000000 --- a/breakpad/common/md5.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2007 Google Inc. All Rights Reserved. -// Author: liuli@google.com (Liu Li) -#ifndef COMMON_MD5_H__ -#define COMMON_MD5_H__ - -#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, unsigned len); - -void MD5Final(unsigned char digest[16], struct MD5Context *ctx); - -} // namespace google_breakpad - -#endif // COMMON_MD5_H__ diff --git a/breakpad/common/memory.h b/breakpad/common/memory.h deleted file mode 100644 index 5f9444527..000000000 --- a/breakpad/common/memory.h +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright (c) 2009, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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_H_ -#define GOOGLE_BREAKPAD_COMMON_MEMORY_H_ - -#include -#include -#include -#include - -#include -#include - -#ifdef __APPLE__ -#define sys_mmap mmap -#define sys_mmap2 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) { - } - - ~PageAllocator() { - FreeAll(); - } - - void *Alloc(unsigned 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 unsigned 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; - } - - private: - uint8_t *GetNPages(unsigned num_pages) { -#ifdef __x86_64 - void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -#else - void *a = sys_mmap2(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -#endif - if (a == MAP_FAILED) - return NULL; - - struct PageHeader *header = reinterpret_cast(a); - header->next = last_; - header->num_pages = num_pages; - last_ = header; - - 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. - unsigned num_pages; // the number of pages in this set. - }; - - const unsigned page_size_; - PageHeader *last_; - uint8_t *current_page_; - unsigned page_offset_; -}; - -// Wrapper to use with STL containers -template -struct PageStdAllocator : public std::allocator { - typedef typename std::allocator::pointer pointer; - typedef typename std::allocator::size_type size_type; - - explicit PageStdAllocator(PageAllocator& allocator): allocator_(allocator) {} - template PageStdAllocator(const PageStdAllocator& other) - : allocator_(other.allocator_) {} - - inline pointer allocate(size_type n, const void* = 0) { - return static_cast(allocator_.Alloc(sizeof(T) * n)); - } - - 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_; -}; - -// 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); - } -}; - -} // namespace google_breakpad - -inline void* operator new(size_t nbytes, - google_breakpad::PageAllocator& allocator) { - return allocator.Alloc(nbytes); -} - -#endif // GOOGLE_BREAKPAD_COMMON_MEMORY_H_ diff --git a/breakpad/common/memory_range.h b/breakpad/common/memory_range.h deleted file mode 100644 index 41dd2da62..000000000 --- a/breakpad/common/memory_range.h +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) 2011, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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/breakpad/common/memory_range_unittest.cc b/breakpad/common/memory_range_unittest.cc deleted file mode 100644 index f6cf8c8b2..000000000 --- a/breakpad/common/memory_range_unittest.cc +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright (c) 2011, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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/breakpad/common/memory_unittest.cc b/breakpad/common/memory_unittest.cc deleted file mode 100644 index 1e511ca56..000000000 --- a/breakpad/common/memory_unittest.cc +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2009, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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_googletest_includes.h" -#include "common/memory.h" - -using namespace google_breakpad; - -namespace { -typedef testing::Test PageAllocatorTest; -} - -TEST(PageAllocatorTest, Setup) { - PageAllocator allocator; -} - -TEST(PageAllocatorTest, SmallObjects) { - PageAllocator allocator; - - 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; - - uint8_t *p = reinterpret_cast(allocator.Alloc(10000)); - ASSERT_FALSE(p == NULL); - 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_; - 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); - for (unsigned i = 0; i < 256; ++i) - ASSERT_EQ(v[i], i); -} - -TEST(WastefulVectorTest, UsesPageAllocator) { - PageAllocator allocator_; - wasteful_vector v(&allocator_); - - v.push_back(1); - ASSERT_TRUE(allocator_.OwnsPointer(&v[0])); -} diff --git a/breakpad/common/module.cc b/breakpad/common/module.cc deleted file mode 100644 index 2d2e4efc4..000000000 --- a/breakpad/common/module.cc +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright (c) 2011 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#include "common/module.h" - -#include -#include -#include -#include - -#include -#include - -namespace google_breakpad { - -using std::dec; -using std::endl; -using std::hex; - - -Module::Module(const string &name, const string &os, - const string &architecture, const string &id) : - name_(name), - os_(os), - architecture_(architecture), - id_(id), - load_address_(0) { } - -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; - } - for (vector::iterator it = stack_frame_entries_.begin(); - it != stack_frame_entries_.end(); ++it) { - delete *it; - } - for (ExternSet::iterator it = externs_.begin(); it != externs_.end(); ++it) - delete *it; -} - -void Module::SetLoadAddress(Address address) { - load_address_ = address; -} - -void 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()); - std::pair ret = functions_.insert(function); - if (!ret.second) { - // Free the duplicate that was not inserted because this Module - // now owns it. - delete function; - } -} - -void Module::AddFunctions(vector::iterator begin, - vector::iterator end) { - for (vector::iterator it = begin; it != end; ++it) - AddFunction(*it); -} - -void Module::AddStackFrameEntry(StackFrameEntry *stack_frame_entry) { - stack_frame_entries_.push_back(stack_frame_entry); -} - -void Module::AddExtern(Extern *ext) { - std::pair ret = externs_.insert(ext); - if (!ret.second) { - // Free the duplicate that was not inserted because this Module - // now owns it. - delete ext; - } -} - -void Module::GetFunctions(vector *vec, - vector::iterator i) { - vec->insert(i, functions_.begin(), functions_.end()); -} - -void Module::GetExterns(vector *vec, - vector::iterator i) { - vec->insert(i, externs_.begin(), externs_.end()); -} - -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; - file->name = 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) { - *vec = stack_frame_entries_; -} - -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; - } - - // 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++; - } -} - -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::Write(std::ostream &stream, SymbolData symbol_data) { - stream << "MODULE " << os_ << " " << architecture_ << " " - << id_ << " " << name_ << endl; - if (!stream.good()) - return ReportError(); - - if (symbol_data != ONLY_CFI) { - 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 << endl; - if (!stream.good()) - return ReportError(); - } - } - - // Write out functions and their lines. - for (FunctionSet::const_iterator func_it = functions_.begin(); - func_it != functions_.end(); ++func_it) { - Function *func = *func_it; - stream << "FUNC " << hex - << (func->address - load_address_) << " " - << func->size << " " - << func->parameter_size << " " - << func->name << dec << endl; - if (!stream.good()) - return ReportError(); - - for (vector::iterator line_it = func->lines.begin(); - line_it != func->lines.end(); ++line_it) { - stream << hex - << (line_it->address - load_address_) << " " - << line_it->size << " " - << dec - << line_it->number << " " - << line_it->file->source_id << endl; - if (!stream.good()) - return ReportError(); - } - } - - // Write out 'PUBLIC' records. - for (ExternSet::const_iterator extern_it = externs_.begin(); - extern_it != externs_.end(); ++extern_it) { - Extern *ext = *extern_it; - stream << "PUBLIC " << hex - << (ext->address - load_address_) << " 0 " - << ext->name << dec << endl; - } - } - - if (symbol_data != NO_CFI) { - // Write out 'STACK CFI INIT' and 'STACK CFI' records. - vector::const_iterator frame_it; - for (frame_it = stack_frame_entries_.begin(); - frame_it != stack_frame_entries_.end(); ++frame_it) { - StackFrameEntry *entry = *frame_it; - stream << "STACK CFI INIT " << hex - << (entry->address - load_address_) << " " - << entry->size << " " << dec; - if (!stream.good() - || !WriteRuleMap(entry->initial_rules, stream)) - return ReportError(); - - stream << endl; - - // 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 << endl; - } - } - } - - return true; -} - -} // namespace google_breakpad diff --git a/breakpad/common/module.h b/breakpad/common/module.h deleted file mode 100644 index 398bc3157..000000000 --- a/breakpad/common/module.h +++ /dev/null @@ -1,324 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 "common/symbol_data.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; - struct File; - struct Function; - 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 { - // The name of the source file. - 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; - }; - - // A function. - struct Function { - // 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. - string name; - - // The start address and length of the function's code. - Address address, size; - - // The function's parameter size. - Address parameter_size; - - // Source lines belonging to this function, sorted by increasing - // address. - vector lines; - }; - - // 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 { - Address address; - string name; - }; - - // 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 ExternCompare { - bool operator() (const Extern *lhs, - const Extern *rhs) const { - return lhs->address < rhs->address; - } - }; - - // Create a new module with the given name, operating system, - // architecture, and ID string. - Module(const string &name, const string &os, const string &architecture, - const string &id); - ~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); - - // 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. - void AddFunction(Function *function); - - // Add all the functions in [BEGIN,END) to the module. - // This module owns all Function objects added with this function: - // destroying the module destroys them as well. - void AddFunctions(vector::iterator begin, - vector::iterator end); - - // 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(StackFrameEntry *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(Extern *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); - - // 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(); - - // 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 ONLY_CFI then: - // - the source files added via FindFile, - // - the functions added via AddFunctions, each with its lines, - // - all public records, - // If symbol_data is not NO_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); - - 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); - - // Module header entries. - string name_, os_, architecture_, 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_; - - // 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 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. - - // 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_; -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_MODULE_H__ diff --git a/breakpad/common/module_unittest.cc b/breakpad/common/module_unittest.cc deleted file mode 100644 index 5c0c69757..000000000 --- a/breakpad/common/module_unittest.cc +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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 std::stringstream; -using std::vector; -using testing::ContainerEq; - -static Module::Function *generate_duplicate_function(const string &name) { - const Module::Address DUP_ADDRESS = 0xd35402aac7a7ad5cLL; - const Module::Address DUP_SIZE = 0x200b26e605f99071LL; - const Module::Address DUP_PARAMETER_SIZE = 0xf14ac4fed48c4a99LL; - - Module::Function *function = new(Module::Function); - function->name = name; - function->address = DUP_ADDRESS; - function->size = DUP_SIZE; - 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" - -TEST(Write, Header) { - 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(Write, OneLineFunc) { - 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 = "function_name"; - function->address = 0xe165bf8023b9d9abLL; - function->size = 0x1e4bb0eb1cbf5b09LL; - function->parameter_size = 0x772beee89114358aLL; - Module::Line line = { 0xe165bf8023b9d9abLL, 0x1e4bb0eb1cbf5b09LL, - 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(Write, RelativeLoadAddress) { - 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); - function->name = "A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)"; - function->address = 0xbec774ea5dd935f3LL; - function->size = 0x2922088f98d3f6fcLL; - function->parameter_size = 0xe5e9aa008bd5f0d0LL; - - // Some source lines. The module should not sort these. - Module::Line line1 = { 0xbec774ea5dd935f3LL, 0x1c2be6d6c5af2611LL, - file1, 41676901 }; - Module::Line line2 = { 0xdaf35bc123885c04LL, 0xcf621b8d324d0ebLL, - file2, 67519080 }; - function->lines.push_back(line2); - function->lines.push_back(line1); - - m.AddFunction(function); - - // Some stack information. - Module::StackFrameEntry *entry = new Module::StackFrameEntry(); - 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(entry); - - // Set the load address. Doing this after adding all the data to - // the module must work fine. - m.SetLoadAddress(0x2ab698b0b6407073LL); - - 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(Write, OmitUnusedFiles) { - 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 = "function_name"; - function->address = 0x9b926d464f0b9384LL; - function->size = 0x4f524a4ba795e6a6LL; - function->parameter_size = 0xbbe8133a6641c9b7LL; - - // Source files that refer to some files, but not others. - Module::Line line1 = { 0x595fa44ebacc1086LL, 0x1e1e0191b066c5b3LL, - file1, 137850127 }; - Module::Line line2 = { 0x401ce8c8a12d25e3LL, 0x895751c41b8d2ce2LL, - 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" - "595fa44ebacc1086 1e1e0191b066c5b3 137850127 0\n" - "401ce8c8a12d25e3 895751c41b8d2ce2 28113549 1\n", - contents.c_str()); -} - -TEST(Write, NoCFI) { - 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); - function->name = "A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)"; - function->address = 0xbec774ea5dd935f3LL; - function->size = 0x2922088f98d3f6fcLL; - function->parameter_size = 0xe5e9aa008bd5f0d0LL; - - // Some source lines. The module should not sort these. - Module::Line line1 = { 0xbec774ea5dd935f3LL, 0x1c2be6d6c5af2611LL, - file1, 41676901 }; - function->lines.push_back(line1); - - m.AddFunction(function); - - // Some stack information. - Module::StackFrameEntry *entry = new Module::StackFrameEntry(); - 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(entry); - - // Set the load address. Doing this after adding all the data to - // the module must work fine. - m.SetLoadAddress(0x2ab698b0b6407073LL); - - m.Write(s, NO_CFI); - 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(Construct, AddFunctions) { - stringstream s; - Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); - - // Two functions. - Module::Function *function1 = new(Module::Function); - function1->name = "_without_form"; - function1->address = 0xd35024aa7ca7da5cLL; - function1->size = 0x200b26e605f99071LL; - function1->parameter_size = 0xf14ac4fed48c4a99LL; - - Module::Function *function2 = new(Module::Function); - function2->name = "_and_void"; - function2->address = 0x2987743d0b35b13fLL; - function2->size = 0xb369db048deb3010LL; - function2->parameter_size = 0x938e556cb5a79988LL; - - // Put them in a vector. - vector vec; - vec.push_back(function1); - vec.push_back(function2); - - m.AddFunctions(vec.begin(), vec.end()); - - 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(Construct, AddFrames) { - stringstream s; - Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); - - // First STACK CFI entry, with no initial rules or deltas. - Module::StackFrameEntry *entry1 = new Module::StackFrameEntry(); - entry1->address = 0xddb5f41285aa7757ULL; - entry1->size = 0x1486493370dc5073ULL; - m.AddStackFrameEntry(entry1); - - // Second STACK CFI entry, with initial rules but no deltas. - Module::StackFrameEntry *entry2 = new Module::StackFrameEntry(); - 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(entry2); - - // Third STACK CFI entry, with initial rules and deltas. - Module::StackFrameEntry *entry3 = new Module::StackFrameEntry(); - 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(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(Construct, UniqueFiles) { - 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(Construct, DuplicateFunctions) { - 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); - 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" - " _without_form\n", - contents.c_str()); -} - -TEST(Construct, FunctionsWithSameAddress) { - 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()); -} - -// Externs should be written out as PUBLIC records, sorted by -// address. -TEST(Construct, Externs) { - stringstream s; - Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); - - // Two externs. - Module::Extern *extern1 = new(Module::Extern); - extern1->address = 0xffff; - extern1->name = "_abc"; - Module::Extern *extern2 = new(Module::Extern); - extern2->address = 0xaaaa; - extern2->name = "_xyz"; - - m.AddExtern(extern1); - m.AddExtern(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(Construct, DuplicateExterns) { - stringstream s; - Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); - - // Two externs. - Module::Extern *extern1 = new(Module::Extern); - extern1->address = 0xffff; - extern1->name = "_xyz"; - Module::Extern *extern2 = new(Module::Extern); - extern2->address = 0xffff; - extern2->name = "_abc"; - - m.AddExtern(extern1); - m.AddExtern(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()); -} diff --git a/breakpad/common/simple_string_dictionary.cc b/breakpad/common/simple_string_dictionary.cc deleted file mode 100644 index e0a74ceeb..000000000 --- a/breakpad/common/simple_string_dictionary.cc +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 "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/breakpad/common/simple_string_dictionary.h b/breakpad/common/simple_string_dictionary.h deleted file mode 100644 index e241aff54..000000000 --- a/breakpad/common/simple_string_dictionary.h +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (c) 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 - -#include "common/basictypes.h" - -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) { - } - - // 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 NULL; - } - - private: - const NonAllocatingMap& map_; - size_t current_; - - DISALLOW_COPY_AND_ASSIGN(Iterator); - }; - - 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; - - const Entry* entry = GetConstEntryForKey(key); - if (!entry) - return NULL; - - return entry->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. - void SetKeyValue(const char* key, const char* value) { - if (!value) { - RemoveKey(key); - return; - } - - assert(key); - if (!key) - return; - - // Key must not be an empty string. - assert(key[0] != '\0'); - if (key[0] == '\0') - return; - - Entry* entry = GetEntryForKey(key); - - // If it does not yet exist, attempt to insert it. - if (!entry) { - for (size_t i = 0; i < num_entries; ++i) { - if (!entries_[i].is_active()) { - entry = &entries_[i]; - - assert(strlen(key) < key_size); - - 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) - return; - -#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 - - assert(strlen(value) < value_size); - 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. - void RemoveKey(const char* key) { - assert(key); - if (!key) - return; - - Entry* entry = GetEntryForKey(key); - if (entry) { - entry->key[0] = '\0'; - entry->value[0] = '\0'; - } - -#ifndef NDEBUG - assert(GetEntryForKey(key) == NULL); -#endif - } - - // 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: - const Entry* GetConstEntryForKey(const char* key) const { - for (size_t i = 0; i < num_entries; ++i) { - if (strncmp(key, entries_[i].key, key_size) == 0) { - return &entries_[i]; - } - } - return NULL; - } - - Entry* GetEntryForKey(const char* key) { - return const_cast(GetConstEntryForKey(key)); - } - - 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/breakpad/common/simple_string_dictionary_unittest.cc b/breakpad/common/simple_string_dictionary_unittest.cc deleted file mode 100644 index 5fbc481c5..000000000 --- a/breakpad/common/simple_string_dictionary_unittest.cc +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright (c) 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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_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")); -} - -#ifndef NDEBUG - -TEST(NonAllocatingMapTest, KeyTooLong) { - NonAllocatingMap<3, 10, 12> map; - map.SetKeyValue("ab", "cdefghi"); - ASSERT_DEATH(map.SetKeyValue("abcdef", "1"), ""); -} - -TEST(NonAllocatingMapTest, ValueTooLong) { - NonAllocatingMap<9, 3, 8> map; - map.SetKeyValue("abcd", "ab"); - ASSERT_DEATH(map.SetKeyValue("abcd", "abc"), ""); -} - -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/breakpad/common/stabs_reader.cc b/breakpad/common/stabs_reader.cc deleted file mode 100644 index 6019fc7ee..000000000 --- a/breakpad/common/stabs_reader.cc +++ /dev/null @@ -1,315 +0,0 @@ -// Copyright (c) 2010 Google Inc. All Rights Reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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/breakpad/common/stabs_reader.h b/breakpad/common/stabs_reader.h deleted file mode 100644 index d89afc001..000000000 --- a/breakpad/common/stabs_reader.h +++ /dev/null @@ -1,326 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 Google Inc. All Rights Reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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_CONFIG_H -#include -#endif - -#ifdef HAVE_A_OUT_H -#include -#endif -#ifdef HAVE_MACH_O_NLIST_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/breakpad/common/stabs_reader_unittest.cc b/breakpad/common/stabs_reader_unittest.cc deleted file mode 100644 index a84da1c4c..000000000 --- a/breakpad/common/stabs_reader_unittest.cc +++ /dev/null @@ -1,611 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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/breakpad/common/stabs_to_module.cc b/breakpad/common/stabs_to_module.cc deleted file mode 100644 index e59aebdba..000000000 --- a/breakpad/common/stabs_to_module.cc +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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; - f->name = Demangle(name); - f->address = address; - f->size = 0; // We compute this in StabsToModule::Finalize(). - 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) { - Module::Extern *ext = new Module::Extern; - // 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; - } - ext->address = address; - module_->AddExtern(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->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->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->address + f->size) - last_line->address; - } - } - // Now that everything has a size, add our functions to the module, and - // dispose of our private list. - module_->AddFunctions(functions_.begin(), functions_.end()); - functions_.clear(); -} - -} // namespace google_breakpad diff --git a/breakpad/common/stabs_to_module.h b/breakpad/common/stabs_to_module.h deleted file mode 100644 index 5e04fa792..000000000 --- a/breakpad/common/stabs_to_module.h +++ /dev/null @@ -1,143 +0,0 @@ -// -*- mode: C++ -*- - -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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/breakpad/common/stabs_to_module_unittest.cc b/breakpad/common/stabs_to_module_unittest.cc deleted file mode 100644 index d445d1d64..000000000 --- a/breakpad/common/stabs_to_module_unittest.cc +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (c) 2010 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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.c_str()); - EXPECT_EQ(0xfde4abbed390c394LL, function->address); - EXPECT_EQ(0x10U, function->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->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.c_str()); - EXPECT_EQ(0xb4513962eff94e92LL, function->address); - EXPECT_EQ(0x1000100000000ULL, function->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_STREQ("std::vector >::" - "push_back(unsigned long long const&)", - function->name.c_str()); - EXPECT_EQ(0xf2cfda63cef7f46dLL, function->address); - EXPECT_LT(0U, function->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/breakpad/common/string_conversion.cc b/breakpad/common/string_conversion.cc deleted file mode 100644 index 9b06e86b4..000000000 --- a/breakpad/common/string_conversion.cc +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 "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() * sizeof(uint16_t); - 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 + sizeof(char); - uint16_t *target_ptr = out; - uint16_t *target_end_ptr = target_ptr + 2 * sizeof(uint16_t); - 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() * sizeof(uint16_t); - 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 * sizeof(uint16_t); - 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_ptr 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/breakpad/common/string_conversion.h b/breakpad/common/string_conversion.h deleted file mode 100644 index b9ba96a2e..000000000 --- a/breakpad/common/string_conversion.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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/breakpad/common/symbol_data.h b/breakpad/common/symbol_data.h deleted file mode 100644 index 2cf15a855..000000000 --- a/breakpad/common/symbol_data.h +++ /dev/null @@ -1,42 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2013 Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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_ - -// Control what data is used from the symbol file. -enum SymbolData { - ALL_SYMBOL_DATA, - NO_CFI, - ONLY_CFI -}; - -#endif // COMMON_SYMBOL_DATA_H_ diff --git a/breakpad/common/test_assembler.cc b/breakpad/common/test_assembler.cc deleted file mode 100644 index 1e783b45c..000000000 --- a/breakpad/common/test_assembler.cc +++ /dev/null @@ -1,359 +0,0 @@ -// Copyright (c) 2010, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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 §ion) { - 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/breakpad/common/test_assembler.h b/breakpad/common/test_assembler.h deleted file mode 100644 index 373dbebac..000000000 --- a/breakpad/common/test_assembler.h +++ /dev/null @@ -1,484 +0,0 @@ -// -*- mode: C++ -*- - -// Copyright (c) 2010, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 §ion); - - // 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/breakpad/common/test_assembler_unittest.cc b/breakpad/common/test_assembler_unittest.cc deleted file mode 100644 index 94b5a5ce5..000000000 --- a/breakpad/common/test_assembler_unittest.cc +++ /dev/null @@ -1,1662 +0,0 @@ -// Copyright (c) 2010, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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/breakpad/common/using_std_string.h b/breakpad/common/using_std_string.h deleted file mode 100644 index 13c1da59c..000000000 --- a/breakpad/common/using_std_string.h +++ /dev/null @@ -1,65 +0,0 @@ -// -*- mode: C++ -*- - -// Copyright (c) 2012, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 - 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/breakpad/common/windows/dia_util.cc b/breakpad/common/windows/dia_util.cc deleted file mode 100644 index 5322997d8..000000000 --- a/breakpad/common/windows/dia_util.cc +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2013 Google Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 "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 diff --git a/breakpad/common/windows/dia_util.h b/breakpad/common/windows/dia_util.h deleted file mode 100644 index 3c0926095..000000000 --- a/breakpad/common/windows/dia_util.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2013 Google Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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 diff --git a/breakpad/common/windows/omap.cc b/breakpad/common/windows/omap.cc deleted file mode 100644 index 39e4722b3..000000000 --- a/breakpad/common/windows/omap.cc +++ /dev/null @@ -1,694 +0,0 @@ -// Copyright 2013 Google Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#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"); - 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); - } -} - -// 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); -} - -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/breakpad/common/windows/omap.h b/breakpad/common/windows/omap.h deleted file mode 100644 index 1e023d117..000000000 --- a/breakpad/common/windows/omap.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2013 Google Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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/breakpad/common/windows/omap_internal.h b/breakpad/common/windows/omap_internal.h deleted file mode 100644 index 6c37d7f87..000000000 --- a/breakpad/common/windows/omap_internal.h +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2013 Google Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 - -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; -}; - -} // namespace google_breakpad - -#endif // COMMON_WINDOWS_OMAP_INTERNAL_H__ diff --git a/breakpad/common/windows/omap_unittest.cc b/breakpad/common/windows/omap_unittest.cc deleted file mode 100644 index c1a2c512e..000000000 --- a/breakpad/common/windows/omap_unittest.cc +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2013 Google Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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. - -#include "common/windows/omap.h" - -#include "gmock/gmock.h" -#include "gtest/gtest.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/breakpad/common/windows/pdb_source_line_writer.cc b/breakpad/common/windows/pdb_source_line_writer.cc deleted file mode 100644 index dba2ea764..000000000 --- a/breakpad/common/windows/pdb_source_line_writer.cc +++ /dev/null @@ -1,1066 +0,0 @@ -// Copyright (c) 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 "common/windows/pdb_source_line_writer.h" - -#include -#include -#include -#include -#include -#include - -#include "common/windows/dia_util.h" -#include "common/windows/guid_string.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::vector; - -// 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 - -PDBSourceLineWriter::PDBSourceLineWriter() : output_(NULL) { -} - -PDBSourceLineWriter::~PDBSourceLineWriter() { -} - -bool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) { - Close(); - - if (FAILED(CoInitialize(NULL))) { - fprintf(stderr, "CoInitialize failed\n"); - return false; - } - - CComPtr data_source; - if (FAILED(data_source.CoCreateInstance(CLSID_DiaSource))) { - const int kGuidSize = 64; - wchar_t classid[kGuidSize] = {0}; - StringFromGUID2(CLSID_DiaSource, classid, kGuidSize); - // vc80 uses bce36434-2c24-499e-bf49-8bd99b0eeb68. - // vc90 uses 4C41678E-887B-4365-A09E-925D28DB33C2. - fprintf(stderr, "CoCreateInstance CLSID_DiaSource %S failed " - "(msdia*.dll unregistered?)\n", classid); - return false; - } - - switch (format) { - case PDB_FILE: - if (FAILED(data_source->loadDataFromPdb(file.c_str()))) { - fprintf(stderr, "loadDataFromPdb failed for %ws\n", file.c_str()); - return false; - } - break; - case EXE_FILE: - if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) { - fprintf(stderr, "loadDataForExe failed for %ws\n", file.c_str()); - return false; - } - code_file_ = file; - break; - case ANY_FILE: - if (FAILED(data_source->loadDataFromPdb(file.c_str()))) { - if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) { - fprintf(stderr, "loadDataForPdb and loadDataFromExe failed for %ws\n", file.c_str()); - 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::PrintLines(IDiaEnumLineNumbers *lines) { - // The line number format is: - // - CComPtr line; - ULONG count; - - while (SUCCEEDED(lines->Next(1, &line, &count)) && count == 1) { - DWORD rva; - if (FAILED(line->get_relativeVirtualAddress(&rva))) { - fprintf(stderr, "failed to get line rva\n"); - return false; - } - - DWORD length; - if (FAILED(line->get_length(&length))) { - fprintf(stderr, "failed to get line code length\n"); - return false; - } - - DWORD dia_source_id; - if (FAILED(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 - DWORD source_id = GetRealFileID(dia_source_id); - - DWORD line_num; - if (FAILED(line->get_lineNumber(&line_num))) { - fprintf(stderr, "failed to get line number\n"); - return false; - } - - AddressRangeVector ranges; - MapAddressRange(image_map_, AddressRange(rva, length), &ranges); - for (size_t i = 0; i < ranges.size(); ++i) { - fprintf(output_, "%x %x %d %d\n", ranges[i].rva, ranges[i].length, - line_num, source_id); - } - line.Release(); - } - return true; -} - -bool PDBSourceLineWriter::PrintFunction(IDiaSymbol *function, - IDiaSymbol *block) { - // 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) { - fprintf(output_, "FUNC %x %x %x %ws\n", - ranges[i].rva, ranges[i].length, stack_param_size, name); - } - - CComPtr lines; - if (FAILED(session_->findLinesByRVA(rva, DWORD(length), &lines))) { - return false; - } - - if (!PrintLines(lines)) { - return false; - } - 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; - } - - 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 %s\n", file_id, file_name); - } 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() { - CComPtr symbols; - if (FAILED(session_->getSymbolsByAddr(&symbols))) { - fprintf(stderr, "failed to get symbol enumerator\n"); - return false; - } - - CComPtr symbol; - if (FAILED(symbols->symbolByAddr(1, 0, &symbol))) { - fprintf(stderr, "failed to enumerate symbols\n"); - return false; - } - - DWORD rva_last = 0; - if (FAILED(symbol->get_relativeVirtualAddress(&rva_last))) { - fprintf(stderr, "failed to get symbol rva\n"); - return false; - } - - ULONG count; - do { - DWORD tag; - if (FAILED(symbol->get_symTag(&tag))) { - fprintf(stderr, "failed to get symbol tag\n"); - return false; - } - - // For a given function, DIA seems to give either a symbol with - // SymTagFunction or SymTagPublicSymbol, but not both. This means - // that PDBSourceLineWriter will output either a FUNC or PUBLIC line, - // but not both. - if (tag == SymTagFunction) { - if (!PrintFunction(symbol, symbol)) { - return false; - } - } else if (tag == SymTagPublicSymbol) { - if (!PrintCodePublicSymbol(symbol)) { - return false; - } - } - symbol.Release(); - } while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1); - - // 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 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 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)) { - return false; - } - } - } - } - parent.Release(); - block.Release(); - } - blocks.Release(); - compiland.Release(); - } - - return true; -} - -bool PDBSourceLineWriter::PrintFrameData() { - // 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 = -1; - DWORD last_rva = -1; - DWORD last_code_size = 0; - DWORD last_prolog_size = -1; - - 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 %x %x %x %x %x %x %x %x %x %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); - } 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::PrintCodePublicSymbol(IDiaSymbol *symbol) { - 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) { - fprintf(output_, "PUBLIC %x %x %ws\n", ranges[i].rva, - stack_param_size > 0 ? stack_param_size : 0, name); - } - 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 (int 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; - const DWORD undecorate_options = 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; - - // Use get_undecoratedNameEx to get readable C++ names with arguments. - if (function->get_undecoratedNameEx(undecorate_options, name) != S_OK) { - if (function->get_name(name) != S_OK) { - fprintf(stderr, "failed to get function name\n"); - return false; - } - // 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 { - // 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; - } - - 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::WriteMap(FILE *map_file) { - output_ = map_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(); - - output_ = NULL; - return ret; -} - -void PDBSourceLineWriter::Close() { - 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 - switch (machine_type) { - case IMAGE_FILE_MACHINE_I386: - info->cpu = L"x86"; - break; - case IMAGE_FILE_MACHINE_AMD64: - info->cpu = L"x86_64"; - break; - default: - info->cpu = L"unknown"; - break; - } - } 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; - } - - // 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'; - - info->debug_identifier = GUIDString::GUIDToSymbolServerWString(&guid); - info->debug_identifier.append(age_string); - } else { - DWORD signature; - if (FAILED(global->get_signature(&signature))) { - return false; - } - - // 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'; - - info->debug_identifier = identifier_string; - } - - 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; - } - - // Convert wchar to native charset because ImageLoad only takes - // a PSTR as input. - string code_file; - if (!WindowsStringUtils::safe_wcstombs(code_file_, &code_file)) { - return false; - } - - AutoImage img(ImageLoad((PSTR)code_file.c_str(), NULL)); - if (!img) { - fprintf(stderr, "Failed to open PE file: %s\n", code_file.c_str()); - return false; - } - - info->code_file = WindowsStringUtils::GetBaseName(code_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 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/breakpad/common/windows/pdb_source_line_writer.h b/breakpad/common/windows/pdb_source_line_writer.h deleted file mode 100644 index be6121c3f..000000000 --- a/breakpad/common/windows/pdb_source_line_writer.h +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 _PDB_SOURCE_LINE_WRITER_H__ -#define _PDB_SOURCE_LINE_WRITER_H__ - -#include - -#include -#include - -#include "common/windows/omap.h" - -struct IDiaEnumLineNumbers; -struct IDiaSession; -struct IDiaSymbol; - -namespace google_breakpad { - -using std::wstring; -using stdext::hash_map; - -// A structure that carries information that identifies a pdb file. -struct PDBModuleInfo { - public: - // The basename of the pdb file from which information was loaded. - wstring debug_file; - - // The pdb's identifier. For recent pdb files, the identifier consists - // of the pdb's guid, in uppercase hexadecimal form without any dashes - // or separators, followed immediately by the pdb's age, also in - // uppercase hexadecimal form. For older pdb files which have no guid, - // the identifier is the pdb's 32-bit signature value, in zero-padded - // hexadecimal form, followed immediately by the pdb's age, in lowercase - // hexadecimal form. - wstring debug_identifier; - - // A string identifying the cpu that the 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; -}; - -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(); - ~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); - - // Locates the pdb file for the given executable (exe or dll) file, - // and opens it. If there is already a pdb file open, it is automatically - // closed. Returns true on success. - bool OpenExecutable(const wstring &exe_file); - - // Writes a map file from the current pdb file to the given file stream. - // Returns true on success. - bool WriteMap(FILE *map_file); - - // Closes the current pdb file and its associated resources. - void Close(); - - // 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: - // Outputs the line/address pairs for each line in the enumerator. - // Returns true on success. - bool PrintLines(IDiaEnumLineNumbers *lines); - - // 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. - // Returns true on success. - bool PrintFunction(IDiaSymbol *function, IDiaSymbol *block); - - // 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(); - - // 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. - bool PrintCodePublicSymbol(IDiaSymbol *symbol); - - // 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) { - hash_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) { - hash_map::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. - hash_map file_ids_; - // This maps unique filenames to file IDs. - hash_map unique_files_; - - // This is used for calculating post-transform symbol addresses and lengths. - ImageMap image_map_; - - // Disallow copy ctor and operator= - PDBSourceLineWriter(const PDBSourceLineWriter&); - void operator=(const PDBSourceLineWriter&); -}; - -} // namespace google_breakpad - -#endif // _PDB_SOURCE_LINE_WRITER_H__ diff --git a/breakpad/google_breakpad/common/minidump_cpu_arm.h b/breakpad/google_breakpad/common/minidump_cpu_arm.h deleted file mode 100644 index 6a7113833..000000000 --- a/breakpad/google_breakpad/common/minidump_cpu_arm.h +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright (c) 2009, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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/breakpad/google_breakpad/common/minidump_cpu_ppc.h b/breakpad/google_breakpad/common/minidump_cpu_ppc.h deleted file mode 100644 index 02ac32202..000000000 --- a/breakpad/google_breakpad/common/minidump_cpu_ppc.h +++ /dev/null @@ -1,163 +0,0 @@ -/* Copyright (c) 2006, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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 */ - -#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/breakpad/google_breakpad/common/minidump_cpu_ppc64.h b/breakpad/google_breakpad/common/minidump_cpu_ppc64.h deleted file mode 100644 index 3a883230a..000000000 --- a/breakpad/google_breakpad/common/minidump_cpu_ppc64.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright (c) 2008, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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 */ - -/* 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/breakpad/google_breakpad/common/minidump_cpu_sparc.h b/breakpad/google_breakpad/common/minidump_cpu_sparc.h deleted file mode 100644 index ddc4c7590..000000000 --- a/breakpad/google_breakpad/common/minidump_cpu_sparc.h +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (c) 2006, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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 */ - -/* 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/breakpad/google_breakpad/common/minidump_exception_linux.h b/breakpad/google_breakpad/common/minidump_exception_linux.h deleted file mode 100644 index 9e7e4f1e1..000000000 --- a/breakpad/google_breakpad/common/minidump_exception_linux.h +++ /dev/null @@ -1,87 +0,0 @@ -/* Copyright (c) 2006, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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; - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */ diff --git a/breakpad/google_breakpad/common/minidump_exception_mac.h b/breakpad/google_breakpad/common/minidump_exception_mac.h deleted file mode 100644 index 91c1c0974..000000000 --- a/breakpad/google_breakpad/common/minidump_exception_mac.h +++ /dev/null @@ -1,205 +0,0 @@ -/* Copyright (c) 2006, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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_RPC_ALERT */ -} 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 */ - - /* 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/breakpad/google_breakpad/common/minidump_exception_ps3.h b/breakpad/google_breakpad/common/minidump_exception_ps3.h deleted file mode 100644 index adff5a6bb..000000000 --- a/breakpad/google_breakpad/common/minidump_exception_ps3.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (c) 2013, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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/breakpad/google_breakpad/common/minidump_exception_solaris.h b/breakpad/google_breakpad/common/minidump_exception_solaris.h deleted file mode 100644 index f18ddf424..000000000 --- a/breakpad/google_breakpad/common/minidump_exception_solaris.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (c) 2006, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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/breakpad/google_breakpad/common/minidump_size.h b/breakpad/google_breakpad/common/minidump_size.h deleted file mode 100644 index 918544b66..000000000 --- a/breakpad/google_breakpad/common/minidump_size.h +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (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 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/breakpad/v100/lib32/breakpad_common.lib b/breakpad/v100/lib32/breakpad_common.lib deleted file mode 100644 index 71d71adfda726fd43ef1ed5b72710ef73736e401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319738 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 diff --git a/breakpad/v100/lib32/crash_generation_server.lib b/breakpad/v100/lib32/crash_generation_server.lib deleted file mode 100644 index 91457a75c28837085b6cd922fb46a707cc9ac7b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263738 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

#Z#i&lGVqZ;cLQ^=#HEwpb->)3 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%0D4O#!CDgtOy24VXnHTr9o}@GSx6 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 diff --git a/breakpad/v100/lib64/crash_generation_client.lib b/breakpad/v100/lib64/crash_generation_client.lib deleted file mode 100644 index 83cee0e4c2246bc0aa50d60f008dc84fbdcb9ddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65476 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 diff --git a/breakpad/v100/lib64/exception_handler.lib b/breakpad/v100/lib64/exception_handler.lib deleted file mode 100644 index fc74515bd884c21d578f65bde7f8898853978d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232418 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 diff --git a/breakpad/v110/lib32/breakpad_common.lib b/breakpad/v110/lib32/breakpad_common.lib deleted file mode 100644 index cd0cfb59eaaff6e97c4d0c930e7e405dd2c15f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 452634 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 J&XtPF{{eUE$pQcX diff --git a/breakpad/v110/lib32/crash_generation_client.lib b/breakpad/v110/lib32/crash_generation_client.lib deleted file mode 100644 index 62e68d9460da2a17f77d6fb899ffb8a9c80bac66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111730 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 diff --git a/breakpad/v110/lib64/breakpad_common.lib b/breakpad/v110/lib64/breakpad_common.lib deleted file mode 100644 index d6f868e75fc88effaf605f031cc27f88e1df49c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545188 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

Tv2*H5B$~xvuCfw9fhwjeis7wPr&@*T8WE_ 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

H4@2nyNEe4J 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 diff --git a/breakpad/v110/lib64/crash_generation_server.lib b/breakpad/v110/lib64/crash_generation_server.lib deleted file mode 100644 index 3a72962cae559152d1ba63b51583c7d1f45f734b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572186 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 z z!!;aCOmV5=NA5~6>oRbyz^zvdMB)7E0l60qIM%C|4Y=dM?FZNXCJ|&HRXTEU`$)w| z(m$VD<7O`dt}VDz!41q1F6(^>m^m3Z+N%b0MFx)cehKE$3>?e-X~jSk&aXV!Pd;nN zy-$Vxu^lhaK{^PY?m_)xjBa1TtjZ5Ar~{`mKbtZ7;-BO zxm5<-5ajc<;9gQ}y8hsGFyCh2`odn|wm_gSF1l3qy5ino#Rw2De(mD~_@4uAQ3iYL zua<$iHv`A|_o!kZ3g;It*9$Lz`#6KW3&8yg%!uDhTdC4J5x2*HxnFUdFZhMacK$M$ z-5KnWdk@Th1MV9zS+_$0E>-+!uLGE4GH_g1oTwPuqw`Bg4*dIq8<@c!xe_pu3>?>u z$78dPgLy%5sp3a&3z*#o+^tHYVFD~bo z4z`DOcex;le%v|m?+9)RF1l3Z#(rbrU6{k*qDz%8tk1XKMIzz+!Xa7@RChTP|d+_wfC+j-z_z9gJq{*lWu-2+VQ!K!8ifod#y20e2~w>kYX3z-;s5@|Vt#vBAD6 zg!jShH{hDVw7XYow!oW{FCKe6z!VyAL&1zzoR-fXdlSG+^XF#T=?Fo%6wKv{^Tbc% zehub!1MbgY8vQssP`n?D>kTjm6{n@c#a)jZ--C(YCq3C-ocwcf=YTr^=B)drC)4F{ zuICl`@ZSyQkm9o3oKzLB4S4PPKp=1rE;{ztjy>TcUq<2WD=8yYmnwcMaqpjCW<5*_&$)2<#jgtfjbM5|LMnB8i{su| zV74eORsM0F{ZBCeR$Qv`Jp=9P@v(Vjv3VS6|3&Gvu}# za=Q&Umd9HL+!kaBb(fOs9>&s;Z9PPyoIL^CnGT>NW?g00gVq4&|U;N0u1m>>>+-G2ZFyL~V z0)d{m=vv@P748{etPI@A(4PY4ml?P-!Tk=*8yUC(;P!$!_9X~#sp7|Qi@;o%fn&Jy z!90+GW4M0-b1(zP`Dymc=woov1#$W1Uw_;<8cg{nfu)?c_r&en!Mv!rROy`td%M95 z-~a~4e%&wJ6Tn>#=Ju@uOF6#v1h*Z`m#;{U_14c`9{fjd!`cxSU8?x?g}oJE{`9Kk z*w6XdWB%;{^SR=n=F6Rl8{dK{dR^K}6~9)veVt+?>2I$$Zmu=pn6K*%IQAQj1{~*q zI}AAP=j=7$*bjYUz;PUGHsCl&!*dcgSA8rb7L z!*X!9X0X=-+`V8nX5bj^t6<(R;Qj&Tp9b7PFozAe7CSJu;-X8JFI~VKYrypa(!cJTkLVjv2aio4r@D};qd3^>;Nw+uMO?*jvl`vspHa09{pXuzQ> z4Gh=`78hNr{5u=>j@gBEEiSrL{prKFHxEoVE=1r`*&Bg-XMnjvajEQG0&Xps?-iG- zUabX}{RY++xad-G*|>LyVg!g6zk0xSbPu?PGT1u?+!F@&*v_{baO|)48*r>I2MxLZ z7;p@?)th*6Ilp{ixa|zNBMmr)d%OY1aC;eYrx|c8-ysGZ!!0%B&Nbke-U|)5>EJ5B zZBT5gcEo+#_raXg~3)~N2dhUS$m&zXZF;Cfp z@%ICP>GN^VI({mcm5NK%kFz{(RE)IfpI&me7;?Wi;Mm^oGUV_NE!ys{&V>!Cn`Ha|4+By_`?{UIw$%%X#9*{`3Ht zW-sSs@3@cfdxPz>$SrLs30Tulahtf$u-+PfXxgBk2Gewz*L zZ3p+RfxYhx?FB!<*+X1(PConOU!h_onL7XagBxmK?;=BcmEaa-u*dqh#?aoq;MQfZ z$M*Z0p}qIO?aN?~<=gt7cFxK7RP`?e?ij_UDi7Ab!G`wAz>UpdkNZ9gz+9ua7WkYh zez$?S-)qnFJD&y6e;Ldd8i((Jd+JplxOSi7#pOh}9**`3!Hrj}6F(2fdN3QzGR1Lx z^Rq{8HJDp7aA9!wg84{sEJr_ktS|ldV%)+-=fuya|C9{FXML=n41jjJqYH> z4E7km-HKuS=u(yMN8k=*u*djy*oQS7E;=V2KIt6_X0(^{DYq&x%e|bBz1zUt@8vx9 znBJGcyy@k9?0pTU*~|IZJMJ^AKXB2dOYdkf6TO_r9@}rNVuV4wq$-cAz%^vB$MSd> z%!^*mC%x~1+2`dv@ninA-jDGY7hSsao(`tO%X#eOz($2)gh9NdO7CoNH3s&sH?(&v zxcdz3H5uC52JS5bd*2w^`w?85&t%E*${MLba&dYhy%lh(;Vlu_=18`qtu*dq+?rYnUd{33$qrjb@*i`vP zdnJbU%E3*_V2|ao7|a^QrCSf)3uc|yp3i#vH89_3od0_Ih=2R!i>Evafb<79S+P$1 zJRIx60x)%oOShhG0CRT+E)07QgW0b*)(cT?o^aVdioe0S5f_~kKcD(n0p?Q0r7GVp zuu%`@b_08V2J?IddyL<^iedcdQq{lx;0|T5$M|*q7UKdgIwu`I=^Y7XyqELjAMGsy zv)aq~*t-|ZIxpw3$Mn7i<~=XxWA8s;S|4I6T8jGrYLy(v|O7U?N`5V~_1-wqk@q zyrfF+0&vR=?A>Z;?{0998ra)rXm2;T_YLg*XlSqHclf>zE;=Wlee$obVkDV5{|15^ zp21!|j7$TwT5;+6t6Ra`=e6h4-#3BTuh~oP?^&;!!Gyk-sc^#eq?i5u31CJmt|dPE z^}9^Raxiy$?fKOEC&6q`oRiN!>3APZ>;Jgpmz)mP=VQQ}ptw}yOgC_+f+4RQW?=7DLwomu`*Q|+>|eHn`N+%pYO%lX)QAIt$S=VPzKkN8~(Ty&|@%kmwl7y;rXRsS~} z+_?t!<{8>s3T|}Bf>*R}%y;H#q_HrJ3c`!2( z%wokk{f3XdIGCHg_I%p;lVIM{>?OBzw%;$ov}yLF!xO(jxP20s3dOa?XTSc6{l8%bHPnE zu(#CE-fD2yXRyb5zYa{3m-DGtAAtG7%X!L!`PVKO3><@t&dC=adxOE0c{z_gF)k=Z z7{p7eeq#Z+Wf|--ezzLhdl1}{8SJtC?KZUcF1Sw(?6u^fE|*J{-VWfpE7r+pPyR7} z0}bsB1vff_J=T{hFv}H}t{=J{%U=7f*T_zfRyzRBWnw z3Aw&thG*akz?FlkRa~lh7~^+8n5Pw&E?>5Rc}sEW%IzD)z_f6w>cNlT+GKm$nWqPky48x^MRUWs3yDx)1rnd>qTVBp5e&2uz zw$7a19$@-WBFbK?l#3T^i>Utvg|Uii<8){8%2RDMo;JNfo~maOD~7F@BdC z+N%M#!fS7OO^qE7zBB*5Ze<|1v5%+z6#=>(wq8^ATH$jz7xmAFYtuOx7>tW96~}bc zDn@{K@w3+v{>u$G#xD-;xeVd90e8s2-jUz}N60i#r1Og(!#xt*2*svKFZa2xPO^u; zbEbctPW(PgJ-F)?E8APR(T}?g%)JKOqhOx&a-Mp?^6#z_B0t+JNKwvUQit<<=Qo4+D<%;4}lS9k`JOTw8GC47hA?Q#Prz;ASg#%d_k?0qeGd2W;a&i<$$;Ad=4}J+ zLolBiaQ_DLgNMt@%j-L$Bod8`D36RUFF9|xb!N|s^6|qf&MzBx)@cKaihBCokDOOF zuH?LP$5oV;4Vy5sB3gESS@bMFa$N2FSk=7BXw~%UY1K>5Dle@lT{?f-ys8=FD(6;C ztEq(X(y|dH6QbuuBg4+@Ij`oj84Igp@U5CZV{Yxt$}@*njI5krSzR@wV!`xFDrdyP zL-Q-js;d`NtIsuID_j$s84mY5-yti-{Tb6@m9rOAFAet#m$>ak7SzP5E2qsfFzBG^ zEskGW6RR|_r@*w8y+ z2DyT?RL!3qE}bwmf5x0?)fKVoX;rbBaH-4`VAJN#U4X2BPAPIidb?lyonJ&?Zlx!m zw0KlZG>u5bL{CgACi+ALo(6Go*NpP<=c6Hcs>`|2(sN46%f|Q2V=uyksJG*)2n5+^ z1H;dp5}UVhN_FM@nU&Qu7tEM49mRg>!f7+7sLD5G$r%Htpju6tQ9Z3@PQ`3iv}v)b z1@kMA*_TyTPnlOWziMXfyoL6y1=W3k2hI!(=@gufpP3RrsyhpZ&KVxx%d2KoFQ{2C zE0$L#Cw>12m3LmiZX9d zW*)DwmTk{o;({ws0i z;c^0_GL^(Tg%B>p$d!^F_`qq2P^1vFeQZU+yHlA5YA7zDMh$-8kR}quKAhtM=OQFl z;_8K~uDQASU0kO_W;8@~fb9VYC+mmi=GT5|ZVm*~-i4O0V@ypQ3p!}$OYpH^6aM#W zY_jU7OL=u#2cgWT~_>^{>_oPt<7cq8?E?`Nc@%hEAsR9G8Aj`@NO&}tA1Io z72k%tv+9fGop_TKpOPQ8>Ru|UXgUeZ5mb5k8daQyD4(v5I&Kfp&NVxV}5s9roD*_C*iwJfyBs&7p{G9VAmYmO|TANGr z3y|&2jMfEK{oMSik@&%A{3|Q|UH^CCmuGD*QE8o&JFC7s_&jE|6(5z07Jh5A>SIJ{RE52PMU{z!6D676A*Q#65EvLGr z6>q&i%ZhKFRe$USD$67BzuNGuy0ZhZ&Q{$vWJ)+-H8;(w8**`=_S+~k+o7P&tiQmD zBN5F1l8Y-YZhG}9M7Focf%uWnCpbz`hUU1i=+R=j+S z%;>t8@-AxPrddZ>dUc-{pgOGHis;vU*Sxr`q*gc9wr=hUD)1^oE@)y?h@)m_2abdE zu#gatQa#CfX86($pPYWN})z%{9slTb7j;T|9Or2mogTkX*K~o*9ELB0g zG5UpLrnh4zENZ(}1;UZ|J2D>e!&W`Y+G?pl$CRyGW4u{KnY z73v)f6^zae^^W9*3Wn!}dY9zka}hol;d2Jj1$%P(_s1suEU>i#^OlQ78{XYK6`w8x8Wj{9L<8QHZj+_TSZC z=E_=@%dbRf90RF^)IqtFhMtP%TQcD+KhCB=Na3g*c5Sb1IncDLBmS}uf zjurnK`UGkA*0bE5Ubb0YCDEFcci z`T$x80%Y;+7Fj$PQcL7`wir?#k&VR(9^pn%7vnpv!gtUipv_C`Rzr5Nuqe&3ey{m& zRYOme=67q7uU26v>zTp7{%8>XceD3Xhi+;_XO$ zt5x{7MC`Jf7_Z4qTsNwC#Y=J#=|*eAo|aZt5aUfJSZRvJH}>DP50n@#TZ<|wt%{T* ze`U&12zJVC+g!U!+y6(5^v4*82x(W{=Yyj0vE3qd-=mj~#@p=AiXx#%Nu(jW#P;n( z-0h;`=xUm>f9T(cnQ8xBR(;T_FG26B25ttgI-kT4`SUeY_vHJA8IT?5h9-VM z&sJa3jnUOV>Dv0ewb&B)7bH%Vo}76QdBPE8HafwH8_Pnvs;VGWKj1^_@1A zl)TI^{d2wEi@!ei53$BGipVm_04Zv+6c< z>#s%z&IK?zfd68oZZYJ=n32RdE!iwb^wSW6oZmV5i8$45$U|1{!L=9HL0pHOfqN>P-j6-NeqXT?#Hs0!%aFp=9lGKYa##i3Xa_OnHy z9;Iwu-BpX&W)=6SJt${q@sKD^k-`B`lD5xrq(pU#x8b^~v#`PXlO?;*;aDVcCY6}G zuUwiFh;@{8vyIh!BIELP6VrcVqDHF7Bj&Igq{VQL43 z3oo^oBGy87rQ!Gy{B~n7)>1EtHsEFT>JCY35vphXf4inydguadQ`L z_TLqi#f9)n8-`(y8OzUW-hu72do1kAjpA(XRWp3=j2+0t=wAdSO)f= zY{k1-#Ur}KeqqHe3>MwR8(M7rC=9h*WW8@bCy$e+;?1=it@sG+r=3%PZBgt3eAv>e z+n6h$XnaIL$!76jpk#A6n;SMjA@X!dpoAk){G4uLy)uXU0r55w^e@tW9Ff%Wp&v5d z$rMgwe=BO`BuC;--Up&kS3|m0+~qp-W8rr_`ibMKV+`SpnZ-pOsy=B>Lfz(0xz3uoN zcBF17Ps#Omq=ArH%1zRS>y`i&eVWy99jl8iUtr5Q5acd7H@&2k=SZ9e$Q6Rsur$oU zI=)@CM-)z=b}T-#@fA6qxq;eFo<_}yK@BcjbM?2eE>81)-EQ8)(PCl9icf}MqiBO@ z7K6leO)QvXk5z~WN{QQ$2Sw)bVU}zbV<5>n5jrdswOuxK%W?v> z7h0In@>vt6-B;ufvJ2clqY4Qt1by8gYxNhdGJnk}b99k37@rKm4oxO9%rd{&Rpwk- z$~-om*3RY+ zOX4LtCB-G}V`s#-L@*D`!meriEs^@1l6VBW;q-_{x8#)6TRA1oB{|Qar3J8g5~&Z^ zVpFIGt)+Avbz6y!g2P({nrT*GCZuUXn&U`wAlJ5mjj!qLCNd%tQPN-X& zn}z2swXHdst{;XPe0evk;lggn`Y3nVTwV8i`>BMOXJGfOa0{N%`9GDwT|^u8Zz2TD z@auCoBk3Hgumyo(2{opo>2!F=M-=Bnl8-3Z4?KbdW(V~3C#s36HQ@>4@pSdPk_jc} zmtb6cB>w?C+Q!g$0kkk&>=i?!Ye-xj#w4-?+mYC-M61B*rD**5E%1xR@7sYlE57<| zzSWmCTJa|j3ZL5#w>&p(8t@^h1h|OgT zF;Kt!-|^Lrkl??0buNTpVD`w(tGhtrB*khdJ80Ff?uL&qvMQrpTULVr`4}-etG*ml zt&(Sc5^Q-35h;4)w4ibW%*lwBul_i+>Kaf8JvNQ8iQ;K4=8#jx*l7>|#+>PGW^557Vo@p(xr;|kCGj^S@mJY6<}~kK-53ttgmzqh%YICF;f40ihbbHO zWJhJ;Mzav7vb*r?Id&9gupAKzH(r0Ydja=jxRgd{gTd!xdZ2rFkml3bZ1 zEr2vY+?|Jb$sL|$kmL;R2}j!ENbf^(=5ibf#QZG>LRi@GbX#-tzeAsO7`L72ysOVD zJ5b7Y$u4UqyR3!L_&#LoV%DNL5LTcj-f6{GvmrxVgRbmOi0Ihvmli+eq**Ki-p90g zJEr^gxsck{{odWj<2mu$*MN!tXXkc-wg@%`{n^iwx%>EEJr}4nr)+u?W4ehE$qV0>@+oAX= z6(MnA%A+zXf!ar4%KC4Gsb}G%<|k2{3#dDcZub``MXT=hW>(vC8ITWosC#3!-=#6MAYjXZ+We=5zQABh|QB%FT2X0|d;A zSTK+Z;$;i)mRE{KG_@4IGdXB4jKp6P85nx%ZM3(M=!Ij)!pin&@t)WbuAD~SAULM% zc=l_g)3|q$FK9r?W>`X){5rX;7E5u zl1;A#YGi+*dom)j&ubi*&Oe1q(>n+jj$2X5seTFs=I8N4br=a!c2OJ z6Hz(A&<_QQDzGYl3qG(8z`v15Zw#Bbhx(w#PgICi`Hv|TREkyk z52z0Xkne)bx*gO&6RI$;HF8SoiX* zMmgs0?{T-Qi$u7rEb^g`JyOrS>al(lsb`EEmTx1Or zb8=>aIG2RQ*7sK3c06@y{^>G|+TZU#JsL0R#&Zul_gT+8{E&3kp--)ypJBuNvLmg{ zo8_EzvsJhuTHLredsM>^oQXI$ScWo21|2Pqx^)m~W*?Wx(Y5=#Fz2SS*cMutP|b-# zT4G^c-h+ECxjfo;1dsOZre8aZ?dTI!{o-v@AGsxi2Uk(-#MCcC)j+kVYtF64y#F7Y zvildThc zlPT1`i<({)HpcTTSpkj*TJejf$^-2^ z&JIk2BxAZ9l01gySGrg~xGTB4d|OA>v(VsHM2f$Y1$|ojg6~?KSqns`!H2v!T*k%`+?1UgXxfzBDWJLwdG3roMzH_ZS@rG5h}{-> zQV)&2B=o`#Y`9?cEgPABNUj^gk+V=d)E6Bp#ydOje0=x_Dsl0A7>0m6^<-5XfUNue zr^~#j{?OZq&7J;VSj8J_(B@0zR`vdxGR!R|;iO=0&3KL@7>#f^p!ly=XxLYnIOSIN z;$$Wqjh}}3Lazm$2v|RO<_0dkS{nVQYU^obkd=TYVLJ57>U>&l$S#CUFW#1jiZWiM|_gEegqduGG%R;J!B&!yir(Lz2ls{uPJo|a(4*x9R zPQtgIEU0A`Ohy*u)J#x`U6dOs{%cfbK~D8aa$hXoJHjkze=b^%6@OC}rkbOPBt_Xv z+Jon?`T;c}XPitxzSbQ^YeFW7p;ctIClh)iaWWGMAjwP^2I(X*;IDurGl7$MnF%aP z9`%kE2Gw{{xFJ&9Skn;a=;yKJ5$i+;$^8OJ^7NGK0?iKI+O9GHh5(`N_^bm8?cUJ9+oy=)pZuJQ)(IP8;8s~@X>198M zC6X#d-nC~K_?pS4>>il!I}b2UMG&%ea+A`|?4-a>mGjPCT43!kLr)o=Tw^cGi;`w@;_K3`U8&em?7buf#~Vcez0W(`tjDX?g{0^P>yZ$qo@hi9Z=NRgG8trQC$1j)jRc7U~i92!UM9-llNr}A_ZGKJ{q{U-@sHs?XCRI08t46(2~gc|ai*d5~2 zaM`G8yp3uRo04c$c6$nA;)2>F+LO#)wkMgre5fh?IEj&diy_JEWu~Ix&Q;%oQ_H{0 z(P!Xw!k)J=U@v3c_I3X zeZNKw#4eV%lj9PgcyrB3VmT6jOZG14wy;BUC8kzrR-)U=t;SAhyZt>yw`J8YMX6w2 zh^baEeC?q9IQ6q(6Mh#F#e+_(Io2MhvidmdX6{|teU;4oP1%D`v~#&=P1N2ZW@<%K zZ^TsgQC#uMK5C5P$A`z#uLjaaG1#w$By*f=f0^TVLy`;71CV5eUg>iXQ+;1S^b2i3 z%C9LL>qx4+>;w5?=4p3T7pksG)R#n8H5{FiECVYGwHMtKmf-M7R6VftP-66}1|eugg!$};MX8ee)Xvb)I> z5I#5Yh`SyVuZGa2pEOvKPRS`>)fP8CDvC|7G?MBSZM%EA6*pR%ZA%MsfJMgu+v zdJgz~RK|C}U_TV?XMU!E{=aKJmm`Tsixt*QkYq{S21%CG6Od$w#h(I}B^7$A#kE|l zf1bmyEn=wd%Kdh%R?v+$Vy>$;*|{;w9r@7HEij)!T^~Z_4uI9XQMya zD9%+U?g~7yH$ZEJ!YURY*a&I*zp`u+v7>Q$3OoJ|A0~LtUUR!zW{gJVU_mHL4h;@% zLVnjmg2*J%y3s)FW#<1q9}YBPcqxf*DG?8I7k*@qr@h{xTMx#D?G zwB+L<$dA3$EhP0NXg*FEJl3a& zv(poD(!(}cfbe8WD08VJZ6D#-)-z7brPJpf_RGX`H*BzHVQwxuQXD>YCyW_YDzLQ#Vo{ERRDD=R~jvG_D+iKc{f$Yy8@Xb`L*Q(TE=)DZy7p z@hx`XO^K}(i1MLa^NRoJt<8;myZ}S?QwGhv2+r;%i~7HdjuKBH;E^YLN_;g>K9od% z$)8tIr&>Z~JFe|9=x7|lz>lcl2UJ!LIT}gBaWCYhDq}wXMkgR1f%7?$>`1xM*(g@p zoX@(x5L?80_cs)6UI`y?pKNU&CIiM9&1>-!7wn4zr43>99BO@pz(kMd8fnn~^#Zn4 z1kf)L0HhC8Em9-G|J9`aLxkm*R8C7VkZ)*G-!kM;N7-7PJLm+|O^&XrDZ8rI^CEHX z3b!fAXS?)aICk0QS@FSQZyV3@Mxs)yRgV748$9E>0~7VMXI!KB2@bYr=a)CQ)h>^< z4uK?}vJ8VHr&0F!#ScDSb}?7x+X$1fFa*xw3$VPxlF&aAM>@d{7e@<9f^ zq2eiYWdeKi;KA>5G{R`5kO_EPFdid}^wh^?Fm^2zYAVoDeuKjD0wx;-D0 zJ@jzcN-N1NkAEo_sCXI`x_S)`z(vF`KNIJjieCy{y&OL5qR^S*bY~RO)bjXYbb`^s z@1w;(V)c3;Quq>b?`;YZd>v zxYiC=hGc(I+Y$)3GbRqxK=L3rE2`p5c<*pVv6^S~nienyt#08GXh`z2P)dtQ!p#Z%fL=<={qUBoJ;ikiDn z(fUi>8wO}nm@J`5;h4g(`u208aWoN5AH=|3GUeinChK3>d$k&Ak&C(|kYsOkkK^}% zmuXtAlJVt=84B!Bk=)t1#??m_Y6S}WM z?6e|_M>;T#GNWV+)k4MX|%+ zOklVHRrpgR>nF?a3548=F3`84L#tTu5yTFIkZQzu262RZ2JxxS7HTazKyFFQ<59EZ zZZS>tS$7kiEw{AAb~b7_!d53Q$k^L~vP~u)U7(hW0zg$)v*SdOu_7NMhNs^`l2z;X zkYv@`4oOz{HzCOipQzH~QIX}{Ns#1Se(6$H{l7ca9N%70Ro^{%u-A}_dttfNEtZGh z-V+lq96!NfL_0aCqQ{7oh$p>jH!}~Bk-wNHHbQWex~t!kNi01IcZl7A6QLqc)}~j% zbVcwz6MQ|6GIHIkpXIc;e!#elv!xir@yjQ1EK9eP7jB8-NXL*!*4q&r({IDyMA`QU zY~j#;Xw|(GSl14VeZU>45vqG?$i~l9jL6w{6^NP@`1PM?;g0f#W3lSz$pKDVBE{Qk zMn)QjHAjk@ybbK!hA!PBm}ddR2}&^y5a$K5`|rZI%M${-(AKbTEg#*l#dmcPUrdcQ zM6;UI@14N2qm{MIsy_!~IS+22&Ww?h?Wu^A?2>MQB%dAM0ZEql>yYGGf{!4n!&{!y zs9{mE`l*U5MXlphPo1i84sv0ViCK{IBKM@k29;~pDz{9qQo?_^SA;{0U`TntG(+MY}F#rs$UB}R}LJ_7v*wbDhsD2 z@vR&oN`7n0PVUmh;o z`PqJ2+E$2dmoZL+p9n$P&BNUSrNK8pyU)v1y7Gm4DYk3tq*6*uN0Zb@kuU8W4JlD$ ztME&eFOp-5q{MuY8uU9Jm+ky)Zu_=ylyOhEUxjpE(U?wc}|u6*H^itXAv zsgx2^`L5Jxn;mF7pjDu4zg7!L7uqU#@8D=jiCP~>E#~GhiJt7z2ss*3qQ<9bH99#O zQliEeQp1%NuEuQF+0l>^HNH;L;1^kKcZ8!MC2D*pHM-;ky3E9NUh6;?p%#ap?>XzW?z@)QI4jRsM!)HYO(^Nm8$&X7j13V-O-Q| zHQGrHPdRP1Rq%d{qa`J3brM?Lk8c_1HoeQ9&I>zD%`Hl(^Sl>dv?Z$+c=EN8Mx>=;$pn$_*g7UH(t_;hdEf~|85 zJcMJe%Ccje6J=K_Z;MwM0?SBB)afg7rhB`rK)YeB$FyQl%F&Lr$ap3!x@)G43oS~C z7Ec!zgQvC%oO&L5kO6I+USt&R+ODTlkEBG+Vxf6_%NBu_Xg_qe2JcFav62#FB{fJ* z#brA`+a(FxALj_WQx%@dw$vc?OGWa{&-O@Z8+Y9?VXjD84?)_c&D(L=&d+YSW0#bj z7pd&Zyr9i3wo$zM*&Q$J21Vb|+9@4QeQbAvQ#w*&3MM6Ta3*fU*&4hnIhKx;SUOUJ zl)KLO*{;x1YTIQ>6X7R9kalTv5-!{M*{zf*b&X3rKx?}bom5JR>9{nl#z~Hbl&G;t zYH(Z{C+B1X?Evsz;AlvR8jBMeY8KbarP15bkPJu6&E#2C2D{y5svm0`cntCWwN8^-CuIdris750Dprm<2Mtr4 zdmY3LS-B3965}W(reDS)&yflosmPHSV;P_H>!3v0je&;kWC(15QbMK#CWxHLybelO z4BO`LF5^OrQliDl!eS6Z@)=moxYt4BU7F`P^+-z8oF+8INP)Eqovp!7l4E&EiMb~= zNLAsoouBR53EQ~s)<|VrYS8Xl+c4h!Y|oRnao25^xgu#j1ZkHxAHZchKf5)KT~c;l zq_QjXf;M;CM)B@v7r%;(dYEnoHaKM{hoOPd$lMjcYui3_{#{U!H0Xrhx!DKQ<_r`4F`Xh?|~H%krI z{@g@YtS)pkq(qI|lQgEgG$uP5QlbVXZY(j*C_a=ZkGR@yilZSVYCI@3y7z4x=#IbA z)!|^fJ#BWhZfv;_bA+N6V{AUbQd`xNQoh=6C`_m7btLa zbHd%C-q}x6;~AmB@SYQryZ*@}CW zr=2&Og$BcWMM!p~P?04c?U;%T!8?ozx(8GA`Ts*?uQs z8|w$RMk?DHx@8G%?7dwN`)#vsq{yZ9BhcsB&V(g{F za*`5bC8az^DsZGCM{+-P?FC=kRXI5%C5F*Wq|&Y7e(rXOqah_~{6cE@?7UoH2ZZ-a z9Ze}wGhb?Y)=kVC+s$>fq(rTgU0Uq|ZL3>NCH)#-l$+;hNr_rTLQC#pv=yAK!Ml=U z$w`TMEHy~2Ql$b>-DhbhY@Z=*^ERAqS7#C-NV~Mj-vYFqyszsFaiz2^Q@W6Jm92vJ z`A$lu#Iy{PT0Z5$@1NOjp`$4!YFbj$wd--FjpM!A(U1}~&Pl5gb2Owx4QxH3jkxPq zfh&w!M?*@~xKLCFYIg%phc2Z(WZrSa9*EdNyy28T7aHAr`P?5&|r8U2#G!0r$VxOMf)8$g!A^g9}7CH?%Hp5 zuY0&9TNoYf*n2K})n{=7FYaEqMrbfKQexbs#JEX&d5)C6*G=RcHEbtsur)}DVSOf2 z5geNn7>m}}HHN20*q5`P9Idrg@qUey?^2@nL80CK7de4n#M%YAqeRs>y2n=JJXMw` zQ}Kh~dGB7nD0iJ>SxU70tss9+i8c!j=2{C(!m`BbJV!`&N!ssrxZVr zy#LC{YbjBqlhknSQT29dG&mYkqQ+54VRUwBtZ_7?M2+K;G){17T<>T|i5e$J4KW_I z4TP%YnKAbo_&1K0l&IBPYKgHgaVB7%E36wFEh$k88(}D^PI)g=w}5-fwZVq(rUreYM+~&oGIe`Pd=%5m!lyiYVZ-H+S^sJVokK& z-HwKosByW_$h@ZcrQm4k1=}3n|KM1Z5-qM2WV*h%Kv`fNr$)WdV1M^3A+a|9Mo4yT zw%>6>IBN2uquv@phxyUv?7sMGtsUem;xW9t?YjHo-A?XXhvk(KBRolF!y8pO2G#J`q0Q84Knu>{B&!*1xu+ zbK_tTo`uBpDJohU46KwseP&i8j+a$3e1@DA++@!#WR&pQXJ+N}+S&PHROijC;3LjG zTj*0gb6RYg{KUmeR?tqzZ;M)E@6w@1)W?MJkEqxUPkSrqr6Cw8-dM z=$le%U9Ggp=vv&2PsC7ScDf!=T4Z!Bb|eWcJvUxeT4Z!BtVmp160^gy53iBYwa|J} zY8|Btgp97$PSet3h+m)(j*PC=K8==r@Q;kH#ep?dZp2ksWOOZY*u|+)xGf0z{*=-p zqicoWlNGdUT;=S)JVQddx0DtcU5nj)LMy(d%|i*T&Ptt(uGL9sDWd^B5Bn)CGP)L* zK8di_4|)ry&FvUos01>)))AVP9>Xh@78zYjEJK{!IO~Egw9;shX}HSy-@ zYZ6))DJ?R(7Jnotp{3W2RZ5GDu64AgrRV&kN{fuH#bYOlu=E(drL@TCT71Bj&^l1? z#LFb4%Tkq^jIMQ@rlsd$AEiY`*ZPH~b@sY`cO}BQP-&6TwfL35L=5#BwMuD`(Y5k4 zt>UL9eUS)@zY$EAhfCKw9zKb%241oemCMeJ-Aap$uGLd$0d+ZB>nEi}M%Ow4K8djA zzrp%oYw=he9T{CKA3lkmjZ8wTTxpTfwN8XjBCNkZ&;|pD9oA(^i;S+-OViS8@9&is z8C{D@fkar(j6DKfrXAJ>rA0>9D$um>0nXO?RB4gXwYb5M2y5ZJy--zct&SX8;mGJ( zC&MS9wP!^6poCVj(jud46>3^*Ke-gyY=<>NX_3*jIHyR2)!6Vm%ouI0Un?y#y4IIz3j z*E$P6iLmrhZ-mk!qidb5Y3X^$N8@y4bgiNANra`3UpFc(GP+h+)6&PUMx{kY*DBGp z^bz(8rA0>98YZ;-$FC#N8_N4DuYi# zOK)G-C@nI&)(A~Yuf5zPq9dbgjf79Cu=pE#bYyfb3qGm(s6$GNjII?CTG@D|(_`3! ziy=5Ny4EQ8Bw~1e?u-jaNH98mnnt zcW%z|gw};hi;S){PH5RN#0NM#td&ZOjIK2vK8aG++wucSi;S*yo~EV8@KvQnM%S7k zwCot_dH9vmBBN`auZ5-O;n5v%6ON3oH4#3Ebm=iXTWOKewNS-fT6#;FskF%GT9Y&_ zz2B%)T4Z#s3pFjh9^R$2$mm*=g_fO%_yA{@a--5BqiaopPa-$;UUaY0BBN_vq-p8x zt93`*gd?MCT@0T@SbB{*L1~fEwJOqRjZ|7>bgikH)}g)D106zQ z!_Fbxgd?MC&4N!NhGY_2gOwH;U28Uc5_zc4H>N8sGP>3rO>5ENM}{TBx<+Y{(Y2~H zt%WNdy(yvfC#6M3*SbX0`g_HtCnmIZDJ?R()}@-3UN;UaEi$^+Tun=#NA=9bO*k^T z);#zm^6J@1w@$bTM@HAGflne2^*x7SN{fuH z71Ojfw2WVw2y3p=BBN{7YFhUVEJs@G9^e+GMMl@UOw;=5^2x4J-l(+5=vs?~mVZD0 zFQr9B*IJ@!=_BmXopBS6jIOm5K8ZZkOSw#Gkk3UvFXi=0i;S*?X_G5mdMSUTw8-dMs0uDEy_7>o;3gayU26q=5_zbX@?fP!M%P*? zv~uv8aCVKVR9Y)>OV_#zK8diTrmgjW(jud4T`jcyYt(y6i;S*Smqx2a7uG{WOS`xrqPk*|zM%SuOqqR+G zk5U;FGGndMhn5x>iFPt#YMBM%Vgv8m(%jMMl?J zBed+6a!25yS4l`Ge;yr&WsaJ*?}~Xtg*}S|Our{U(jpaY~Df zu608ituvJt8C~nfG+L9D78zaZrZietC@nI&)^F2j-Kn(5=vp_Y(P~s$WOS`t(rA68 zw8-dMw+b!0XVXW$AC(pvUF&ygw2nUtH{r3jRR?XER*PJqFCZ8uM)Jl7A)J`Ga7_ZV@!I$nKTv@^Xc%_|3UZ1cdnR!?+FDRy};s$qED$b7x zCQmWnpVGJN;iNb}Di{tqOxLmlRTm_O^(VpXRm|?gbr_nwdALq6cDeT%R*3G<%RFYl z{8=#5_=+p{@k^dbw)4LPa~fV5=augs_-itQY(*ZXXPyvDE4xu#2oA#%1Co6b7UK!_GZh3ZXGJ~XoK|u;PCGW+XlbQ8`X|0&+PP=(w zGV`op+TxXAJ$}buo=axng|Jvx$xI*jw`Ix9Uj&oh&hrL#SW6RqLPL*d(bT;8^P*tv zp6#hGqcf73MgwMp0khG7X%b8+UYS2Xw*U7B$?Y&>6HNMk;~xgh z`v%M&0|wm$$|8MyJ~UuH5=;SJ+5eo_@8hqM>*~h_%qN0LKVJOPfceyb;S3=wm_Dq1 zg0cI{o!Pjb3G6HG_E(#?CkBIWBVA9vsZw#1k4VXg)%wYrOI|Jr>0|wO&d6+)! zKNv7S3T6mi*-k(B?z791>*`N}vD@+|k3Q5rnQ0bGUuEaM$zR`^%rJ%S_QX)PGGcZT)U^6KM~!^$yW+88ix4VZR< z;oO++r3HN_B*%w8MOa}v|qhL;h4caL#&%PwtPDn6z{n_=#6&M`6 zWsxhGaj?NVchv12pUiX;Om7v|!uwuB!}Z$fESMt|Gw1CWFnD^IBLuS;4BOa>rYlD! zmuVNlOvimxoWK{WPivpdbQMfH+=md@_}ZJ8Dtf~@(tzQ&3bKOf?Q}C>_#M|ozfpV7 zG%GniM++wX9P${!oP#tmHRI>>z+}gpF8=IjqAl+ld?GpVSEI^6522a@A_iUD(~0n^8T;U79l z>|Ojg<)LtLe2N5P&;1?=-_#|UIn99SXTb0W!4vCl|F8xK#%??7Z@3hTV{f^iZor(O zg*E--zaO1!XP{v0b}{t+*wx9*AOmKwV9-&D{;+Q7x5JX{@aMU+f<3`7HE%ufCv1jM za*w&ig5lWBI}>-WZb)YMohmuLr)JJFV9rj*G-8Fd(>*f;kovguoNO zo_?k)e+a-?g5l4iu}+`ZF@}XNX?M9t1j8TtW4y08{_k(P7`1OaN-+7j&oONE;*+;W zf*hgUc18;Zl}3Eoxu`RLKoedX6BP^welZ7la_I)ld%aA#V9FJ9!jNy?OJ*2bxmO7+ z&}Dq(Q_0M^g841(vmZbCy{T)GnK6P{iTiDE&Aa~b70Jw4!BpWs%k-LSE0GQG($Y0f zFmd=Ye{$zuv?Q4sFBp5idiI?|9!oB-^8~}6Qsq4R)dMr1cG*#7F+nhPdp~i+g?~CP zsVvSH41cbccHZ06c1yCIiGt~d`%G8S?LW>rKgrGog1H>`Ap}B0f`4+^fe+mz!7$x) z{(DUq3T6TB)6Pc^elayU?UMz=dP?T19YxnMrnL2_}91%oYsm58YkE zul?8+mh=qF(U`G+?0Rl8Qze)}Xg~5!VLK*sO7lNHNoFoJVCD*jc|+$v zSD$CV%r{^b7%&S3W9PH~bC5-XK?4@$e#ed{KS)k{wP1EDX5inx^jQ%%_H|?Q`V`6O0!llXQ@wXE_w;wo|m~yV|pyDd?lG#EEs$Klk@PC*CsPd z449>YvCGtd-g~)VIKI(cbIpoplfznOz+9m*ZSEO`{?MED z5R9EJ|L0#T1=CrY39P8UdvLOytF*9gtDEv_GIOYTF*9)nQhTR8f+&JW-@$3t;cVi4NDZU`FtW_4w0BQmJfj;F&1+Y zVI}|uzIdt@54+lqSxA_~>l^6;B-Vn%z$~VFn6_$N60C$u9gXA`H$)a69ps zFNWB){!JJxcT92chcC~yV@`2_In@OQXODfe5^J6A0&@mo_K-0@`}iv%d(3AN1}3tU zt_w<^yw{F7i!gBTPnaDdc`(I^E%&osXr1FiYq1Nha|xs7W6sB4=Me^vKyeH^XxV<% z_L$En%uX_0&c|pM5C&%y*l+fKchoa>KNk`PS4(J~uw+Lly4d`=h%h_BU#w@loO=5* zJLY1-WXpKY?>~RI9dij`@JJuE3ikQcXUAMhn8f*W8Da1!732AK;Zm5Z$Hsg)Vc?*G zwsYH0%C%#zAPlx;+_pIJiE(z!m4s2_&O3W7o@&QjMVQ2G`D((b`A_l2Coi%4xrQ)m zePiw$2iMy%*Agai-*O#c)cEB*?p#k8tY5e-s42eEuJs?nU|Hcd?#&UO*fBS_z}!ff z#Qo}jjd(^~vfj^jt(yp=j$ya^`mrQywwHf zHW!%NU108Tfw|KK<}Si`Ax$_(9JGBDvMM(1cN1nk*pJ)Cuhcf#G4~jl>t8(hDm&(0 z!t5#Bc)nYi)o91uN0`KQ^?pO^j)jXI*7P1A3?7@}_VMxCcH6ZcB+Li_@jS5oX=QfI z62d$V7|fps_oz9;j(LbM`@??Bx!vb{kY~p%CCv5GPu0VJykf^JBg|Oo=anrFe!-4; zm@qQ|17AGfpM2?#cFZG$IaOlbK4vL|6n43<^gXy^qEf(M)ezSU4EX!eB(*NsCrm`!F{#%c%CvaXT8zB z(vErBh1N5MA7`y+4UDtab1t-=H~ctjyYs0Z>DLeJX@AM^^UAZE!AaoQ zy797sagOH|!Xz%Q{}HAU${gEH@sKx~?OLxA2G`;cbHFn1)^^NmF8sVs7#vUGi>Ko7 z*Br+8Hwd$-#Ecv|gU4}*sXt|Wx!uplgy{o+v7SBkpZd`jj67ysNtkTdk7+;h z(zYW$wjDEmLKv0L&TBHCy1;y9V4TbAbHb>0v3<#2vn(+~gt&d-0`sMTah^wgMHtoI zm;C$1AM9FRGX}oI>BGMv47NYq_L#VZ!@B6VE->E_1{yGxX?N~*f7;{uo-jDR!xvA< z^0r&-m>&o;8201VxQRLkjlYJg>98l8O5Ee|+ALLu1)fkjHylMSZi;mB8jT3%<%Msm_|Ia~IXmdR{sl9mp(Tp}%Dwmcv$9@s=#ylJy!smTjt z@R?n>{meD0L|SgoQYk%DTFz$6`O@+}Qm;9LAWr(sDRk?v$2KnYAMx7{S(>rP6h|wEV%CucT!|#*D}Y3Tzi; zDb|_U_}k;TBuiPo$cCS=U7V#XB|DPA^AKAWOUn|rd?78Lvt`sy9@<`H%R*^sWXr44 zGMz2E>`Wxjp=_BgEnRGRTv|?G%T_sp^>4P|**e@#%TlShSz4B}<$Y=Snk}2`0uj6^^;FBTi>v8<3^c$4kpwY?&u5ud?Ms zY1x7;8}8wuZ8Td(ON&td)KPt=#H_=t)1>8Xwmcv$ud!wDo*vrnV#{IDvL#zCm6kDV zd0JXTJl{IT^NYlM$}Hbr9@>6~8YN0_skMf*BujbTF^?dgHnv}xfGPWEmElb(*y0pB{mN6qew5?#vh0^jKTTU1yFjuo> zn|+1lUbfsQE!VLnYd?Ycf-Tk3@)BDvmzEFN@`JQ|#Fnzr9@;)&%LURBV9WQ?(#)2z zV~7Oj#8r(tTUsJ)`BYkFv&FZ+V9jUC8`5$jTZR-0%qeU+Qd&-D%Tv{28wb!>T1TB_MnQYa$?U@zK-cD^btYcVEkoM3IrmOZ4!&z57PrIIZ# zNXr3i+0*Z#t%fZf(()^-UnMQSu;qJcxr13pl?gxRuw||B!txAT4w9DV*|Na|f%$E=xQm~F<%idMOvV#4*Aua1O z=HP09IfyM=A0R9<+47pSOkvCUH3HMZmU*?p@&RkDT_-HF7;~AlY`~U&^#ap}EkS7+ z$d(7BlTKckO;2{FDF4c4tf|BrN%C`B_@FXUn2#0+Yj*ou&)RJhpr&Eg!PhGcyEcH^xj33rj9ro|Tq; z*it%EV76n+{nD~CTZYXNn2%U%P>Znqi!t9x%V4(5Z55bZ+46_9kwb;$O1AtaEmyJS*oeSf!Ilj=h2?X$93w4zW~p)K zEom9bmN8Mm+JP+>O3PHX^yw0q_t^90(sDUlevy_h*fM>#VC}_z?w6KfY&m3(z${}{ z>0Du1$(H@%n-&*la`Tec~Dx0vt`Sp1?xWcbD6Zf!FPS9X<5pa)1+kyTedk?uwG)zSJLtjTZ$G4%e%eBTxr;5^|4UeIV9U5}VY!1XZ%fPj zY&rU5fw`0|FH6g1Y{^RZURthaOWwZ)<^i_UOUrF+IZaybVN2gr1nVuf43U;c z*>ZujyvUYcrR5#A3_ex(d5SF;NXu(%`BPe6Varyh3)Y)#$vQ(=Ze>fcwA{p&m!#!> zwj6k-V7<+j52fXCwrp{>z!YVv+H$G16tgAw9D%u=S#uT(%Z+S#@LXYenk{YT3CkmF zxk*}HV9Wc`@+4b!KVPt3Wy>Mb@-kbtyFg&xV9T}AaxYu9yii~sW6S5#@+@24zer%7 zVapL03(J4N(wDx@xI|bE&Qg|rFBQ)_Z(_^2V5tUJh%LW?1-AuRiZ%8!GI&<9T+0cSWagGHT$k(QkD%AraL&!hGCfF&~Z)kQJA4BU2Mri7B=ukg~=NU znb-$@2@CAZOI4u zePRD)j46=Cqb*pdW8t%mF)C)Z48;<>9zIJIhVzFl1-TG2UJvrV!W87nnAwsy0tyVT z2U(#oc_U;dvSp;IQSUKEF zu| zC*@Zb_I!Y{48>I76uO2j3d9x~_4WnKISP}f`UGvk5D{}GV^sdIMTP8H0XWJ-O8SBD zYYMU8i{~9#d&R5?%4>x3BQRKdRo(bN`N3h3wmwQ-H8{^eWuY++Yr?y1QK?{ysy?2F z8KbiPMz$!elaz%@8KaD{MPal>rD9{oV3WgmKPC%?fBki$<*v-axgVxfB|~5^H&h*a zMEMzp<&IOkW7*GV($50rhsPa(0Y5ap9|f%Al^^Q;z@RNWM_Q;b+?G#O7L`37wopQM z20vK}qcTHVcy{p|;HV}HlbxssC!nHksFcEVQ({zk;k1=71Us=?^=($l@m~}5%hRoG(-Te_tP(K0V z@@roE{yVx#5P+U7a2SG(FrFbDn)MU0)`xw4;j?1z!@tn1T_uY!9;?>RhStWn1&;oK zwT4L+VGONb46Ulo|2s*uN+pXhhSsmd+Dt~c=V#|$pjma2MHoZtH$&@x`yBDRW`!h+ zFoxFe#2P5IE?@QYmzp(OvIt{n{b6WrbJ=D2nsuUN5ysH^lUM^l3pXsUn>h~`OBP`a ztyPBBi94TvrDnY#S%fjP@bsLn8(3afu-1B5k#R$ep_N6f^P07+QUZ zWi2nwIzqAtV`%j?w958*C0DcVkSxL&TK$M+EicXbTCxaZXsu;vefs4MAW<4xfgfX->G_*BVY?KJCl$s&xQwHdLnec^WXF;!n&!dhG5fD9X946V%#t;)l9JVCP#lPtm*T3ZlH zwJ)rP53$zkl0_IpYfD3`$~W#*%^HqFD{O=@v<5K?_hb87!djy3oBs^*7mFgUpzZUzusT7 z{wrC8F<3hg3u`Y7WS)kO>98KPmXPrDze9W>jKRt_SPwtfFiW$VB#STxYe!;v!70|N z1x0Uvt657Vi!cUjCt_iphcBMlmw6jBYb%^`!bTXQymls*8Y{Pa>VG$A)_ln#jG>i7 zEX)nmT5$UPPiodjl0_IpYZpTc>%3-F+=cN$okonIwJWhyTi$u{j7JXToWE7F2xDmN zW@zp5_Q7{)*7|n~Ey5UDgNcRd!g{!Nzsfx|t68!LV`%MeXzj7;!F4t30m&kap|yvh zRT_No7|j}VkBE>khSr{jR{gvE@7Jt|WD&;D+KX72hnTKMH(zg zxNZ!+4{dNvgBU|Ak6D--NACUnj+%9{WD&;D$|shp8@q4u^gf!kLb3>BXcZV*_YZjb z3(Xph2TZUL#?Tr{ELC2oEk9wgW}PKjgfX;+8CpMWaOjC zz6V+BEXg8_p|zi()qLQ9Q#9)>$s&xQHQLa^IotlMm9s=dNEky4S8w}fslNC5Sz8rq zR<&di#?acIS?ITG`f-!~$6AL=7GVsnLS|79aP>2%Yu1;NMHoZNODt74FkSnx*3^ek z-{T>Sq2)8QFkPB;mShpe&?+*tu)JPnt;Z#cFossKp*8w{i*M1aF-t{+gfX;A3@uF8 zXx6$(vIt{nl^R-@F3tK#vIt{njb#=_gXQ%aYi+YkL`WDzYaFvwd1=-n$s&xQhJ%W@%QrWD&;Dsx8VXw7<4vIt{nO(d3@AL6mzfvh#= zF%cnQ46R9q)|R(CxsGOCCRv0rv>J$It@9hPR{zI^7GVsn$%Yn|mu5|tEW#LC2iml@ zWv%Nai!g@PL59}tp)|%F>tBuMvDQqB4Am-R3gR!vmfX5faAG znr>)il^k}9X5B4WgfX;c5KFZ$?B|!UR`#<(i!g>(*wC8!#7Tzt371NETrXtyV(|=c1am z_VYrEFosqev9^WX7~!xhA|o~HP{|^Uq1A3^P1x?kzMA!xWD&;D>fm&t)=4)7hHF;Y z3nD_o7+QxKS`~)`Kh~_~fScEaO<}nLP`THjucGj#vC5teI)?v&- zzq4;1cUOS58vZA=2xDj+&Meewcx~>lnst|C5ysFuf>>BL;EU(=;&qN|X00t>6JTC3EoU0)Ms!WgXi ztOZ|atx~g2k}Sd)tYe6UwO6fGYS#ObMHqv1tii&yO3f;IT|`J2gSCKIUf7K_xG41A zXwAAzvIt|ajw2TKhwz2gDmCj*$s&wVUdIzl9WOun-LCbTHRBC%1RG%ttrLiaxq(`^ zR;gLfOBP`atrHC`JSNht{oX_+7z+_&Xq`kX)z25L^X7*Uu7_7h7GVsng@)EH-(UNN zW_jKcT7)sQ{zWWI7uLh^Gq0`Itb-(rFossQq1960J5ICik}Sd)S|=M?pIrOvSk2n} zZ4n`146Q|m){OTLKToqFl0_Ip>)*t}Jj8U(e{G8~n)R$?5ysFu#n9U2s5zT!)?V+3 z2nl0oooZ-3zWtw#nzc}}2xDlSW@v47>x>^Y>m$h`jG=WpvoIQ5t2~kGM)A8MLc$nY zXD|zM1J^1w>mtb_jG=WVu~gl_wMxzUS+WRYXq{zf9n*dPV$G_1Pee!LW?kl)?#9*u@dKpr*Iz5kSxL&TIU*CxK^oI4@wqc z46XBQTBozt<|{;mgfXxzJ8js8GH zNEk!wBAeD`taZC&5ysHE*wA_u)(>I&b#wFmuQae$_J<-u!WdeY8d?pD zP939J{XP;b!WdeY5i19F!xztqo9`pvXn^>SC5teI*5!uQVGXZcDc*yCtfxN4zi^EU zVvIS!6~w|h0BYTK==O(e)=evs15Z^FEX$QnR}xE&de_}nvZ-dB^NC;)#z@yythE+E za$jDxRI`rzRImtRu&ySS%8hUK?E9j4PXyv;eI{6hF>>P?VyO}KnYG70tXUg;E?9&y za^qT#5WaY3ZE?9bvSv6k>Ey5VA>xqRkJ?sys?7Gj- zn)SP65yoKshgg^{+;HAo&h_w;FNKvbMsD1|EY!kth?@0-WD&;Dx{+DvH}Ad=`c$!2 z*;hh~FoxEDnT1;UEoa}XSzCTBScEaOZX%ZI=kNS+?@rD7K(Yv9Xx(gR&3++grDomw zjnE>Dp>>O)waq#8g_?Ejw}M3&L+e&UD{$sxQ#I>=?*xl5hSqJwQe(<_BRdb!tnBXv zi!g@P?S|F?N7oM1tgj@CFoxD0hSu9BJTySF9{53M5ysHE)6hD3@re60YtfH_MHoZt zE@mMD>tO}gjVV6~7GVsnyP1V`1J7}2)=iQ{7(?qGW}#o4Z%kmVzCQ~s!WdfjG7Gi- z(=z%<&8n9y!Wdfj5lhv>pC@H^YSvYfMHoZtenV^K?4lnu>leu)jG^@au~gmgo-pfS z%_{#zq>C_y)`N!D)KjWFnsu>c5ysG3Lac0X3ST@Ew)ofG;>|~>@~vbM#?X4m(3{-wPr{bVGOOu3@yBBQM0a+EW#LCj}r@P6mED1VJ+5LAz6emw4N}uI#(_` zL9;gdQ}`l`q4gxQ5P?0wrmR&WS%fjPo?;f3^1{VuU8PxFl0_Ip>uF}8R-pLP@BOTG zrDPGt(0YbhsP$3J7+SB} zv^47v$s&xQ^@gE^ebfp*%Xtaj>I55M46Qc}Ej-JqSrhT*C)fyMXuU-&tn={2Q}x!% zXHDUBt%o<6!A2NE>up18!>>MiShHT1EW#M0!#l*n(E)4Jt(TV#(5#Er7FvWcB7B!v zs%IO0=D7ARw z(aq3}XaA^KuSgbQ4AuvnF8D(0hnjWSdP0jZM$UgoEHx5MY@GdzW*xDl2%nW_>7GgfX-} zHM9yoS?kz=tW~y=&?1bX^_iiCqq%0?C|QItv_2=68XfMu?Scn2YZJVA4mQFVT3;Ai zr`>Ys*_t(1vIt{neMu}eI*d7{@&wI#Te1jaXnkd99W->ACBhQCoenm_7+PO53-{w_ z{x0X?b&^FGL+cx6VO#dycxjzx6>K832xDk{%PiD7;=PM5dYHBDl`O&-THi4XwL0(H z)2CS<;!T{e5ysH^o>;2RW8JuswKm*bun1#l{a|Qe-O#K#l0_Ip>qlZ)>xO2%BUywo zw0<(Qux@Bp*%l%~!WddV6U$mRH0xH$B8;K+i=lPU_9NcZtnIcGT7)sQekGPQ4^QGe zJW;X;V`%+mXki{|*4L6n7(?rKVp;Q0vl<482nl0o{b6Wf9%|N7$s&xQ^(V2cd8k=? zZ6&k_V`!~1v@j1f>ukv)jG={toxcAIXDLz6L(kSii!g>(7O_-6ztzEeKdo79l0_Ip ztB;|D{rtwP^@d~-#?b0(XdO9k)JK}N2|nHcHo_QM{fLD}ZICUV53lk0KV~hzWD&;D zTFcPFdn+{S1j!~loEbGicvzAE~VT=gZCYE*Ppjmyl73m_3!5Tm;>&!v3$|Q?0 z25TLIg);}uI#IF+W3blcbm7dQV)V)5HS0;qB8l zOVucxIcU~o$s&xQwE?FKq&)w*?ZI~+;ZnXzvIt{nZD?qHbKCrVH0#jqMTCSgv^FBv zwxEOQy1pW7`LV3E-wuLB7(;8Iq1FEG(j3h?O0o!J)ToV#Wvx+~wM4QAV??+Kv8**p zv)0NM5fa8=ZAvU_jnb@Y$s&xw+RR{Kjnb?$B#STxYjaK))~G#S-s~vNdQ-9pW3aa1 zbg3GpSv&41(nS~}=eH!5wMJ=HRI&(TXbmEk8dI=8Jf2JWQOP2Vp|zEvb=iW~@7ApT zJBbJhV`yz{XkmZ2khMxBi!g@PHij1Vhnh8CvIt{nZEI*@x=v-SdnAi6hSqk57M|DB ztREzcFoxFlHmxky+Gl5x8-y{mb}+Q?x=PKuSh5IXXk{}CDwJpWe;z&eIX-sSFh^(+ z#?ac4S@6X(`~I&!(X3g!2o_-st(};KT6mrLm8`XVSHU8Tp|vx!P;2JxUrx}hhTQ~< zFosqRu~cvK#St?B!pk~b(EVKw?^ftQ^3ws-EUt@l#`d9-no$ zW<4NTgfVhs4`Qhv0B3rdHDynsMHoYCPiCPOmhu&x^S?+IVGOOkm<3-vc!h~(oxGRO zB8;K6H?dT2lXvt-oZOe%7oZ!-N)L46QN5!nqChHn@IxJ!>5@T(AgZXzg!k zo%Qe$%QUNKgkTZI=tT>Og}o?z@l?EAx}j$6GE%SzV?^jBmUYgiS?i4wEW#KpAF-@+ zHqH7;vIt|aiVPOc*);2oeT5cb3|29*FkLuj8@2MIhcxSv{RE3J2CIbArRHp!b^U0; zB8-vqrNmM_HXa3N*2QB4i!g@PSY|XiYG*UfO?H zwPu~_6D-0QTIIHM-OF0<6bTk#46O=73)7`p^~Hik7|)Q#&Q2-__)|$NtQYp}31A_Q zFtqz^=|@SF&yJMW&m{{neT;Tmoq#oGRJrf@d&@PVPeI|m zB?~botAVCe@}cp8X> zIWG{%Ri(U}WFf|6O-{gSlPtuTtOFCU?vyOV0LxOJ4`LR^CN>q}?~;WWlQks)>+rE6 zt%w1Z@R2B)` zpPj3shgxjVk1BW{UjqP1+&7tN*E&&yq8*GXu!GuFi!-kDY25O6j zriUU)P_6CFT`lcNK$yy;fp>O z4Rl85wZ!u?X{abB~;r5p)1hv&xe?T7tP5;E0=Ic;67p-8wX&=PJ9M?1YG*4ok> zo{qM-AoL|LdAW&EvnqqFp^D(#@=)9K=nQXhS7)@nwXAJgdudxVGS54`y?uI1D9{)Q z1!r{xv9_Y?SrdaTT`98?BrY(?P3jnxIC%!Fb5^)x4(3##ti7|*>z6u{h6cvAMyIs| zr+0eusA#&Ng*J9gbA#;Y2t}H({U-O?Iir0JHFbB;j`na{)TP^wb~njt2~Bh3FcO|V z!wn9?3q_#saS9Un4=!1%_bu!dG&6U4+)krzRS~M*fZb`wJ zQ$@16YYe(eYQP_iG^4gtF~;Odn-iw0Bh&^hSY_R8?DGMKUBL86uqDvc-Ue9<{Z(K> zPOi_ZvTp(;xxLG=EMh!ju{c!mSX4)c3sf}H)#li+V!Q<^+nZo8bEOQ}NT{PF*yJY6 z#&BB@2F&E?Nl*n#RUYDuFkaPCAgo%Aq3KSFwV}|g=5R#T`S=q7tE;B2NOD)9Hpgae z>Lp0vSZe~IlYx?G4TK^QFV@p8n3sjyVT#66H=Q6|JZQie+xns6dGot*8Ww&g-Do>$J1Ay)6`#jn-*@g49f~rbf=xvH3W;iH2L_h7hl?m4D2L zRyb}6P7l#+&&hwVg}QjBUBbQ7h+-9JgM5e=e1bd(sB%bHZ5frgObu8fQ5AS%QH4q( zYKK8S#2k24$f8c{%8F_Y&JD!R`B-FVZU^K)P5Tolqfdo&Do?{}xQ(%i)6;4}Ci5Dv zs;aqs;{36q66a4WQl;9Sl6Xj`lo(h`s*`xNAd`7bFh8oa&W~_xPmImAb}sRl1KD1t-Nr9I3PPt%YVe+b;x%%gXh*|e@f;g=B#loP| zG}ihY_FGo@9QIn*_ndZHSN0tCTi5g)c3W5ToOZ{q=J7E4H5aT~rin zC9$sM(K@b0K-Cf}hAN3{ys>zrt906FG}U+jZlTEl(1aWz*7leT5XXmQLDP~Sn7-KR z2#1Z9nY~!_28^Xj#zD~Wrdm;sgR$1VI1t-Hu@lacoS5C1B;DlWEa9qp;Ig-HJQEP; zfa9PhnA3R*3-i5`ebuGDhQI{xf$*~cem3B5_!S6*TRY%S8`SG?bD$#_fpuJ1n+vqT z65_OW_%9NQc17AG5Z=|<+CDoZe-+aa@YrxmXp*u(9~SZl+nQSxrVQ3Y#lm`V1inE; zwV|eHxLtXK_2E#&c~^NTI6LILt0dF{Q9AFd2?d+0BkfHv-K_|1U~`U)ZT#y_Rcu)9+)Km0A3Uo=5=a}U?+BvE;xY+BB&&U1|P=dQ%P`4tURS4 z(^?WIsf>a|mWWSLN!(;6Ks!dvcnr7%;-xSGzUKB0SXe59Iu?w!N2uqJ)1m`Peb@?$ zuoV;rpen#RR9t8gw4b8-Krujq;WlU<*h}Sl^Sup7h8EBgXcN6WwKPg!U;@S<8dzbV z0oL0B&>Y*F6s`fdyjNr_u2Hl{7yz1v3s?>dv`-5}f^E~~Nk3}HBCUnFg*oIO6RJ-0 zU?M5T=8)Wn^~n*2J%TKcWKfO70j3isOwLY=p!Q=1IiXZbndlIX$N;QQP>?Zzd@q(4 zCN?k$MroO)F(8_@2``)jmPEN{>XaH8=-z=PS1q~Vmaj69k_*dRc&ZjUYHvNHz7{%e zIHiUQ6MR-LCdq+{c^y$&j!TJ)iKcqp6FRjNqFaNe%=hBq3xzIHf^A5}AHM)CX|mUb zJgN=Ydd0aUna(uG75NH%7;CahCb|GjDI2naJD{tHaV!v>gU=a_ae7G%IN#tZ#FooG!@UWicB?USYx zvN!EjoT}Tf^f+np2jd^jV0z^YM%};!N@}2#PCfVD8y0Y2T%>&t3`4#27N~@YQ6)Jn zYwHZdS*tX-R4qGD7jDKGU@v2Az#u8a2ADSV)?bkiCn7LGfoVmWd`%C*6bbsmCRkCQ z4ij+E$xZfQ7eX@}y(f=mC!O;;qoG!9rA{#czA!h&jqXJ;EroebyX*B_Xj-tVB`PLc zc>1v!4ouqHyv`&X2vpPz&4(*MuvdX47Z{Im)ioYDQ0ccM+v31A-%5x2D5VQWIw>Ad z3T?j<8M$I;#F;J5DP!^$^8$wXhBAzzFi@HlBbGfR3{U3D953?uF~_;2oe-7;s0yJ* zO$Ap)pv%#kYlzD9j{0 zWWYjjz`#@%ib%8BPNo3P#jCRTEU>M%^D%(P!-QDJOiap1OD-l+v1DUXq>+y)pmPIIpRp@;Q56#) z9WyZrzV}(!9CGg06Qv0wjo-f)<|XD@iX>s`%+5BMPcFPpSmkPhL;f}#q~yW_E+UCb zW+Gj*js|14JhX+wezop|;{YTJ=Ib;b8cPEjqr#8B+cJ_E2f$8>w44HqMRFdGOC8XY z#R-pcL}4xSR42y{(^-Z&E+eQEivHMX9RUzxAtB`~b|px4nPbFK5ywvjsfort_%stJ z3LDQ*sls+mwA6r9I9M%Ws+|~{Wty?nQ}72BUR4F7mZjhV*IASgOLcPXLDezqqJ`s1 zOKjH59CWwTVkcABSZqCWKm&eY5|_Kn^^d@$*y5wPhG;KpY6mHcTh4*v8Mp{3SKn|o zN-XJ6`6pQCaVZRoxJ8K;UpOB{dxDulYU@9)!br9PWC=p$zj0s}m=v=HqzJKjZ>$1Y zdR*J0QqMf5F}R!@m`d@X#n70EV~@ha)g?GqF+2x+bQU8JnH_sT+9Qbu;T-x$I@*a{ zUh9!h(bc9i2do7@IgL4+DZg-}0Tmj0t{~jUK-Y8jzV@3-jTv>W)-lr_Jmrg=17*f} zX7a^$LNFu6sZLL(+qo=G$0gYwHE>xK6Rh<1&MmEg>dV5@mLIUTiY*>GyW9*)P$kcl ze;6Otd;*SpI-`NGJbml6>~S$UgGqO;h0${_bjAa&kq_GzNPAQV=;%PDu;)?XxSp<# zH;p0DDX=t*+m@-V(>akIUgTD2W6i4Y*SAiVgWgxaO#o6r01M^=#^(^f$HWk-jUk7Qpa@^ zOLyAqu9-5?>5N#9lAHLXSPxt#Ixp69cZInXa1VcTS8E3?`qQ;Kwwt4Ay&6aH-WC~V zabccYMI2Bj!9{u@MewRGNn#CD;*#Zr32>>KuRc)PP+VGFS5{RSsIDrjtShal^?Gqf zMM+I?4jkEqB6zk9?+y2Q>wO&^;vzlzo$rMksw>JW%S!4issnYCt4qCbi6oHIk`rrc z+J<8>ua1cmGf-8DD8dq``NgnG)EI1<<)(TS`}|n9pheW{ic#zHPY9G%R@c{w z+U2mfs=khPWA?xbQAy+U8KIVr3Vdcn$c;7}0^mu~dVg7EZJn>OxHJ&((s4gH|179*9jH zQc=^<6p0Q^PmYL-f$O`%%_(Hbc+B6xxcagZFD%Z8sNh^EoHxLVf>#z-2jOuNstP6O zhp@2H*Hske`nsa+G1nK{pJG8BH6@{@t~^j&Q&v|7IUcAjEf!@a`d|01Favx|a8Uu= z!s?numv7X-sUp0>DK!>md|mq_v3TpnU-GMMNUFutNxdD8jKao?IK`FXbrHBVx+EBd zCkps-=N9Bn%N>y)3Q~<17q1rPxdax&U7T>nOrXhQa-tZ#C^X&j^vESUk9rukAaCG4 zW3Nk>mj24pSh1RW3h@&4(z#8c4jc)K@p6j9PK!m=#*-Xz$5*-{s3z3Z9%&ZN;Er`@ zNFdOe)H@E`4Y}|~+#q0_53CRPCf1A%_e3q7Az987V7l z8O~Hfww+6IIs==!L%Dnp)hzB=z0{prVx`U;>z<{=GpE$UYGAaB%thDJ#$u^YnF>x- zT{=@sU5r`^q#vEu%i`nqJC1!$pfWT!O8u2;pS|>43s*eS3{v@X(HZ8`v68${AW$6% z&0f7Cs+fnFq7syj42oMwDK`02G5Prbjyx{7&^`Hs)l``cbzkl1jK1Os-ebtM6&d9Y=*O^m^b1K<3BX` zKz&=&j8N08P;=lfNe4VTPReDfI06;HSs^+h4r508ONFi)R&6;GX@I^`bQBJ!kJ40Y zab%TeV>6LKwp*GrC(_Z?IRoxAhn4b7lr@|hg&`>JJQ%Z4T~3q!B>Kd9qNof1;EL7+ z%dU8bbtZC1+?OZMkY-MxtgR_y&4n*#priGPur>=f=cs|n#U1Qcnt4zHzUUzgX}*D6 zhS*!JWb;yaJGdNUF_p6^Z@eYOWKzM*JHc?ek^;Ob*b!{P$Hu#3sr3~YJG(kz;Orq? zO?%u0Dkd^A^NsF6+LG59W4`iNs~W?y8*w$z_BP2lo=P7MBdXlvD)X?v=ZlWqB!Szu z>^y66U6zI0Gtfd_lmjU za>WCxx}YsJo*YwMl4zw#-fHiLBCj0M3)K3sz@d$n<5@D*Lg`29OW5_XPdGAeDM@jK zCl6Mj@zNtPH|u$1a)q-*dHOqZp$MNn5O=CeYXGIIL!8tB;r%ca(#X{zBxtF|0|iE{ zhC#v2bH>8h-&@sEY;Un^jT!1AET`*J3@}q2LWUEXN}JDcC}y+fo+jg}Fs+8ZgdSB= z$el@sRpa&-f3Yr~2Q=nm=@@NSmzJbgH(}D1sg)FY=&6oZDF1Z#n*O|%y&=yU(yzcN zg1LU;DM9gHkgeDk$2-Yv&Py_u6K3xO?M5wP2P2W-Jbm|7qEN9-z||A-qP;{&d8Zzp ziic|3J1M+JC~@||A%c|XwV22zxUnvgCY{!;SEm7bt(iQ5kcIeAHlD9%sFr~L-V~MS zGAD~g-`+UNU^;W*Zb5aAcut|;^*tVNoI_oTOkIy}vdNVxGt_z7LUQv{S(#=xknwf8cWRT`3s`B#9w&@H{8k&d2WBeujLpv zotiW?m5=Qhr=xb5A*G%kn17AO@>36h!+BqNV>gZm;YPjIjv&3JE4?asa!R*Hc-!V2 zcn=x&b3JZg)Jj!b6?Ll@-mq4}6P9GH%qbiNp~;0T%Y&Gx7-aWA`G!}d#CxVJS5WAR za3G--B$=y5zn*%nfQPxju;sdz_fie(H;B>v#Ztd}?N!w5bX92CxO3zUtd{PhSAoKy z-@7V`eG=9!Xu)ZSDbG@uGCq5!nlAg)lrD46)EYx34^?Dhsj|DA!~X^0aNVKS2k)zG z!#gf<2#p&f)Yz5`TwB$EwKt~9ISg@xPy;soNY4UzUg9*X{&k`_YvT}@+@nG><`Tx4 zSz{`JFE>a$lSrc?O(ewA*5R2!X*m(>L4)x)2IQZO8oXo*nPLNmvy?5LhrIA7$m+^$Hm5WU~r&*r$?XfrNA##G^Jv#96 zG$||Ig#uyH%UE!w!V*5dRR%+WNpFG#@RXRlC7A*XJvI$J_86NCB~IxeL9mdTPAa6J zhZmWX*A(e=(19F2?y!_y>Tx8<_|%I?pD1q6&2&1%DU~{3!bfjv=Gwz!Gu8K4ZdS?UVQ_9H&xPnNk+TU~ zcDxgKm~=WTmUy6oobJgv5e^1l%Y*N6Y|%;2WDZjolPuZTIV(|G`b3<-Yp!emX`Ll?U9fP>0aB;DI5t8Y@eiJ7Rv!K zGHM+>M=k#+T*ab#NpB5`+aQt8wL#u}n|PT>4WAjfu@UQ_a_?ev#wAjkMBoEn`WGx@+)%HA@KlE zskgYL+_t12Q0Y~&n7Y57HF=rD0@?WS=o}ulSeVn+)e3KWkJ7z^c(*XT z%^gqq@$hZCXd<jclwj5!XC358y;;wl!`mszP>T3m#a6Hrr|zvL)` zS^~7b_Nzm`7-pg2eXm#o*p}u^;o_U&vC%cx3ggU>YyyD0sIwyIeM@>s`hjmKmM2yWM z;8>=ZR#i1iwa8kKi6^6$H{kN6%Rd{1Je7~-L40xQh`KP z$}_S7n$48x152z3_(@@Y;^LT4w=3|SO4d=roM#NZ&7c$`v7a2!iAva5q4X_P&+%Y0 zY6NgSu#;PgnG zH0a*=w#F^bNB&c%T-JQ*$ppj7@9{%{tWMV4`8uRBr>kvFxUD&7PHU*Osbiier=uC( zprU_Tc6WxN*4^~8X+|*ImXk|(%YKVNAo5}n7K4;1q#Ka&5*9dZ92FNmtEC#cv>ER@ z6StnpH?+%Gdq7l@{LaB-qVlb_N-<@g%BRAVnW8*$b5dujoKKx8H1m3(sWR4~Eai!D zDoR?!f%{wFWIrtUs9a5rq@)7ydZ(5^n^<(9i-pKLUPho@Ck823@_di^jusg=cH~h1 z%!u6+93!hATPP5mhj*huBr%CTIh$p8r3hx)Jr|DBgup=kk?xT@;nQ%KJ*w)+< zilA$lRHQktEzV)~kY?xMj(p1Uv^!SSSsbb+ST#(2c*HkR%Ow}pA~URFCPtibNNYjR z`jMHKjH#%^IKCu1_0r%sWUKJg?w9A>Y4^-?^0a#vG3P_G8V5^1y+5@Po6DK-EMhLm zSj?I5EMgv-v6wUAnH!+f3)WL_fa>k)-2T$+R%9`bYiV{YT3-eni->Ws%t*u;aLiRg zKFYdRlWp;gYpxDybg9FP1lxMssl|qwK9?%Y5WKA!ZjcMXGv;INC!~u^>hVeEm3}-n zl)Ky8n&FWJ?QL)crFFXBOE)SUyt$HY&xF}ZXnK2Oo>*R~7mFYbWfn;{Q02BY)Y%!F z9`eS!$CJ}aH~ICfX64g^YE_l`3l&u&Aw!a+k5-amGtoUq331x^22)pGoALGt@mvNpX%k-!z-S>X~stl|=P)lh|%V-B6sM3dK^)mX?0UDrBqx3G>If z_}x;JjN@XiIs+k>VPnobq(X6!iMw{IR7J0wRJ&(>R6w>R+a8^Wq;*U2ut?SSrr&Xz zLl!r3cX!_(UWk=e0xsvf1KL8L-F zFIUx@jB2Qa*v)@9F7N4;|0GxV^vbuY=1DKV>4l2Jr7;Pv zChE12nWO|4;q+Qb%)$yq-epoqCCTwplpZA`_G%P3nc#4hOD|oEsTQ`03^*5=pCRWw zNz7d2Ffq)8a}jyG3w3%~pnTYoxya*Pu9KF?Gvu6`r_;qMJqp~_6+yl8EGkO8Yj=9* zThx=x_|~0Drg9tml=S=NO5$`iPY<#?_Tn43NG1*IL(;1b*5R6-Gz6PguPWHW+zNPM zNpn|ghrD$d-V`^zy?uI1D9{)Q1!r{xo8=o+apkMGYiX9L{9iB3NzQYdWaErnDkLSf zrrvsPDaSQAiEDZ>!Xq5`l=GTej+91yl)pwNGj_pYjZUmS!e674xjOej##yk{u@ppr zt9R=cG5!;pu84H?Zg(O^)o8|rq9u*fXM|chD%zX7;2FU#CUJ1x06jU{UshRL=c_C( z4FtT_YqQeo(-J7PpAwjeyAE==&kv6gXqb>YX=tFLtg@`6zM?u%H@Ui$X6*IaR@zWp zT3uIGRT(I&99vaW;luB-p!(XqwR+m)6lFO)hnD!@D=3v~i*ePs<8b2ct9GmU^HP$~>KG$g9KCE+6cP7sK;L!|)Q6T6m!>-U;n|3WU0>n!55paZOoW85{`(YD!hJJ8!nnA-Ipj@Td5YoL3Q%q0R~^`Cy@)hp z{&fPH+9S;(=&BAJyP2JOx3Rn9(~FbTc>T``T4nV={q-z7p#Sp|q7O*^ z`DuwgnEB_Yh_BiIhd*53lQYA7{^vhFJ^B#!pI^&Vw`^Qz{|_%AhkGLA4FqdM!c>vz z@xQTaUi?W%>Qj^SOiEUVpsZQd67GzqJ(r9Hjl!IaX>dZ|LGl?B5y#4f_)wXQY4CbQ zMpZ;g;2Qais_@!HMpZ;w;JW#Ys;COq(bYL4fUm!X>)kU^2^!$?@c73^db#Xxk3(gM zdNfBSGJ_sDDULghySB@rs|u()q3K6wxU~Z=wU5s02qicQwH{f*UDD9=3+E2ETc=6F zvNH028C4pniu2NK@xWA7rJ7no!APdsmt{oCxDI#b8CT*CJ>yE;sb^e?JNAq#sfwrW zyvjshW<8UXaUHIB8CT+pmvJSoco|pXikEREu6Si_O`YMx@F7bXse8r}ec&$F z*=#s%2)eZE*h1nPM!jbL}df`Nsvb9&}vAeik zLoYq5Ai<4#lGW^_BVHMt*)*Sn)l)jl%jX8T)V3T5sd-KcOcs?-6mUazeriApOeKmd zyYx=$P;(#{i3I2A{uQpYh`)RSFAE6Gjmm4S5+ThuJ^od4oV*-*?J6%%q<`&$-kJdZ zdy|P`;x^ew<6LhXWiXw&@FYC*LFSNVeDqlcHUB@%TU~Jr{jML-0oQ6!R>>OFHHPjpy?f=By_1{LL9e58GXBvL`kgJ&F38$}2XY*a_Kc5|*A&ttJ7fTHOo> z_c`JW@@f&8G0$5)gHu`eH|3Xn#Ye7qvvscZI_%XbBArR{A+9)T%P004bD|WU;!8tL z8lF|<^T~Ip}ul3j*u5=Vn)lY-x)i|}faA7?X4x6G_7voReGqf$H0!gyQ1AaQlWN8W{JzSPa`QAIWRj&SRkY6z z!8FiUf*&=%RKLYDEyU`6A!Mlwu*G$KtMU!qhns^|di(_i5-Z$mSC+7REiLV^Iui04 z$qnFr2PKxX&yd_?NGGT2$>NjoQ6BhS9QrSg-}qoB*Qs1GFZwZgxBwxf!p(&n6p#YP z2XW#~#akL9v1Cdy9Fqp{5(a%>syifOs7pszB-#b$Nx(PJxm8)RIv&QM>r8*7Z~#wb z7gKcqmtS!%q%iW!Qo-bfor%XA=p(3lW#G!h6x(bb_TlyUFfmFvDKG}eH8zRX<70I} z^_o|Z_Ji&*I64L)qNmj)SMVsXC zs6J2&4|)hj0v*u^pMMKPgVSL(!<=aM(vc;k`ZjpTb~GGpfor9j1AIURlZ6tT#7~L@ zI|AYkRhXUX8&1uOD)ih|9-P5SjvIDtvQ~p&ELrn^Q{rS(;`%@(+_CSn&i-F^rXf2m z)l)PU(PT?XjI|1Ey}2;aci9MY-FG~HooGim)D)T%h8y8&`7qMe6!mcb1J@`__Y@We zMuZ{}SpLJ+n(6J4dEzj9c#)U(1?X`;;if81doskHx=f< zE%N9B_f~m}#*Qx@>x0KlbhXWDYoF6rIE)-JYDA!{y)z0=8f#6aG_t&WTya%-dAT<% z8SDh5ipF`XeI-TZ#r_Hn7$#iXMQi7EMng#@hmZA-t@8OR%DtV0mx7!(?Ts_x!WvkA z3zSk;ir?@Q4w0An6B!wki}_xkr%uL>jbVcdX zSiGw!5T>S*TK(lZz{b@bF%{d|(pk zxX^cfdf!C|RAuvuCV0n9@Qtf1feMA?Jsbao@J|H)gz?Wb{-$>n!kf~4zGnQ>!hi4! zHwN(RpHMv3KW;*acOo>EY2i?$6mlGw;X`n(R(n^ZiTo)>UQwyHw5X`MWL)`piluNA zIwbWj)*v;DdMobfz(4rWzRJ8vUS;WKhA_>T$mDzG|7(`RL5*Ft@18TRgTJo|0VU_lDcx za@lZmA$Bm~w&{h#I@&v7CfMF)GJM|gV=K$5%Ax;Lz-W7W;jor=;DCQsI=Mw9-YW21 zR8=~`D;Dz$b4n`e;7?WIusD<=Z$;I(sv^H{tQW7+k532$%36cdLq%|&#}f#2hMKzI zv1s#PXlS1m4naSpx_Z%n?PTy8N+z0oNlsfcdsXH+GuaxQG=2*&K*^TLZ zh#$va)t_-J`{a!*$hK^GL-TTn4$U7rbfm=yU-NQvhYuf~ojqdsu#vg6YwEhqC!C%2 z+!Y(wZPw=T3|h-W+mPl640N+Y;+MzsXdjQ~xI*KLf zo?@MT{N|05-hM7{s5`)hbJktQhI3Bu1}<;|KzCys&TGqOjBhI&&N;rVZ8+!nws(o! z$t7-Am$*G#;)b}y<-5cUcZu8AC2oHgI4rj!8_v1hifuUOavSFYhq@DNIA`5*8_rp` z+64}E>ufk@-Fh3&S$DDv9O@oy!#V37V#7J>HoCx}?lc?DS$Db(=d3%+1#W%NZI8uy z?EMCg3x~(z;`Eb8yTmPUi969HuG=N<6qmR&T;k4gi96pV?qZj?%U$BGc8R;*CGNj2 zaksj}-RTl{uS?v6E^*6T;+DI_J?R36?fh9A&fd-u_nZqHj{DEsaL(=bH5<;}Z=mj5 zHk@;OZ@a|3;}Z9-OWb=daqqjtt#FC^z$NZOm$;8y;y!kXTj>(_i3=R|_n+Eu_WDA{ z3odcry2SnH68Ec1+@CISeM%tFmMz|KK!2CGbzR`Fy=`d2Ik&fsT;c}0#BJ;nw}}f} zKS;->Hk@;P+0q3L^JNw>&!UYa>N7``q_|V^I8_uqa{>IpF zc7KTTxxk@rsSW3>JJyD?>!QE$Hk`A+2{xRwzbYHf*8b53uEOI*|?Zmvt*5iW38U*_9z&gFZI4dxNBYFZg7da*#!>k%k4ItbA7qPhI6hj_qfD8;1ajgCGJs| zxF=lVo^gqL!6oh$m$=tm;@)4?Gu9bli@c7re90B%sJu=IidvIkaAjm7l?`(6?wkj}UbU}vsN+!&X*@h)(EL3ff% z+<`7}2fM&wzD#w2+YoTgE^!eTIMki*5_g;n+-UH365t+|Sgb!z^A>imfEkwrw*dSd0GO8~Zf*GO z6yJJa-`el->;fO$;>Cx!eE_qs3tS0cs$AeE1Ex6%4%<moY%i)7tB7a`MOiO~prhAygkVE*x`Ij@V zN!hTSKM1%do&3e%-T};KE^w;=v)*{2V5B3)-wuG;Q{s&J7lRuH7@sq)S*2qm_%Z=7 z2TELwu7PU<%#ki|rvc^?C!7+6|2KxuZ4#r*oX^St|6_SP0=RW22&0kS7~E!nnVbZN z^|VQ16x~U8G3=ZNxQ)vN3fq+v?o+Uj0?f`8iE(>E;1d8dyHeo#$MJU!*lz*MfmH%$ zl!q|U-#y@O8(6((0zSB{ z1s|t;83guMBnEM~IpI*}OBcAu0QW86?x{gf@pZ?*zRx9wfbhpjcO$Ux&R5L{WIWtR z7r4pbVjSQuk=S_Uwh7>F1I(i?aIXXA^CUQ|2c9~QXAk(`7Ec#(`vYc165LKu4~_uL zMfK#)vkv^{lrPy}{~0iYCJJ0U-F?8{UVu4hlEB5QFW4RyNsK@`>mvUQm$=0)aNB~v z3juex#Kvn!0|2)SFi*O`y$qPQlHk1H?_sl*@-Hz(Z2V6S$8 z8v(eW3*6&?TMW1$R&3bf#kW7~I~p+eOI*Bqfcf`4U|y5Bc=?R|!3v3iue3R(7jYlE zz-Hk^U=~YUymG^ITn3oyT;Og4%zZ9!j{@eIB)C06_f^33odREAix(f_ zHUP}XBsiS!76GO#32tk^)dHq932rCA%>m50NpM)NE|(biN}E&t!+gF5a5p9Khvj*X z3x9~a-w8L@yk2xOz%7Zv(RovPnhNZc8_tVg0^GY2i~b20;}6sEr%QkR5B7LAfe&tp z{N+lFKuTSQ_(lS*#D%{`m;Pn~Zng`5XS(!v0pPB2;qOtG{+q-1!`Tp$E-};BZ zxDOxP;*|&X8^a}rfbb_?eHjb5nk4?PzI3?sHy3cnCGm&#^fH(JZUo#tN&F20f3E`O zYl*{gFkX851w5XC@WGAqFXsB}!LV-#U?v(kIBylxj=%O>&pdGJ)Zx-2RDw- zq5UqI3Tp%K!Hx6JAswGig+2y8xFzzpNzmij9zM9m^M~<`mKXxUpLpe44!DLS{xJV$ z1Lj|`IEVCJ1DM-laSrKy0WcrM;vD?-YlQj-AKVh9cL-qikHtCon*x{_vACG{F#k>f z%-OLx2Y>mv00PHGZ;R&alSajHx@88vACG{ zFufgsnIDUD@OKelu8YOR_``Pdn8aXwxW!BFbAWr(g}+~2`s>pS*Dk>ax4!UkYQGrY zUJ`>i+~UPI6mVV_{tj{JZyMktN&I1bIn|}V3jlXb5`UQ9M_u}R25_&t@b|Mzf1VKZ zsqn!qQF-hkF#;LCJn{jze-eL~e^Xrgn*q3}3xB7(^mh^9u1n&N+J{Sj&jIdD7yf>A z>95Z;Xdm#wEm3*wB{2dSzdVKl&g;V8Aujz*16;&~zf)cMTMW1>T=-k+(%%z+d&Pyn z?_K))9dHAti(F1r9=l3Rvho-LxP6oO!}ihO(qA*+I+FOq@#x=xxhxjvFn%ln%u}(r znDGPseF~UAV{s1tww(dvAbfC3lz(F-Mj+$Y=SsjGn8Y8>pXUPR)L5KDd^ZB-o>-hi zdS3<1=dm~kf9r-lo-N>mTfFpQ{tX3;KNjcUZyI1CvACG{aDH$qU@nQpIrw`3Fi*td z9Q>^W%+Ikn2Y*}4gf)El;1(~vSRP)$G{oW@{LKc;v9Y+A_y&N#OC$z$af>%UxCU^y zCGm&t?FE0hUMXHh&=Ky2Zt;GhjPEU1}=7PW5FV?7YqiS6ow<(@-qW z7K!8gdjPl8Oow-f1MVrnyyOD+Hefz-f%_UTKfA#7X@m30@WD-%n-^}y-)F3^th{V& zMOkfyuddj??@ob=+Ty^((wZ@OBXV~|z1M3@^E7$7@0Swq9jlX&G`f!|har{+J zm6&LGP>)$NDrzS}LyD;`Rplj>zKYV?owEBujs6BcXTzt#lZ7V*J;nP@iMDo3iG+JfPTRL;x{HgOQl~VG0O|K`DjPkED40)hy^GT zF}q-=*s|fjT=;n5GauI3h_xa703#O-{6qqh(GO;~^*4qcIzdq$(@bKVeSZd24hJK#y z;M;5T&ENgdGXL=}MEjR@d;AOge3#(IQW%BkA96r$p>H632HAg+Pr!I;p~~MvF7sx1mt`fv;Hm$8qdm$FaXb_JtcmZd!9WS5!s7}Uk{7y?Ox{-+yx#zFUGN`jDF4EUDkosY!m;2CsxUP zSYF(Le1G?Zx%ORi<*o+Y)nDZtWU%pbhWXPks{)i0)&&X=JC;EB4|H3Ib(4ty$pl68Y44Q=P-`D+f zS@$>o?oU@e3w3ku`u^@GSH0rz`_`&w=Y8+*o|2R6?{3L~rWnofVsQtc*=zvG_fWB8 zqw&F?el$!yBI;+%{^BJ2OJnyhr{;$mR0~!?)gR#T$5{IS2&}5962($!)&=&DX6tl< z{E{5ZM4wBXVm`YT1 zUFes+3m2ROeo6}-hk>Nvao?f?ve+ebBTJ$;IP5weLMooI(OFUq4{D#JY$$_oPtdn8 ze0!X}9mn4=BdF3s6bED%yy5TuMP(F)nG2Z@H5=+Id`99I7&WY=umL0ws`OOIeQ#hH zL_cy2j_Y$)c0YC(cEH#w8vH-K=U@I1Oo&$bH}XCN>6N`e)nI@3*Z%z;i^{%x;he$f zp}cz>?5M+bQq|D?^}=zvSP!cG4}H|Hy!#nbAF2ro=n(v)q5!4exJQ&EgtjjPBPs^= z&@WLwEQD{O!@P(0da(&ZZa^_ZUQl9Yi!uZ!m;q37Ejd#ms}}7AH4-!Ap$`Z6M@{x` zbo^rQq7n+}9$5~5a?2NWWZi|UWMw~nWG4S>EX-YfizcpuEIIy#x!Z5FgV(d_iD?VB znzr!V`RHrWLL|=n?6bc9?(ZNs{N<3QT>pO0=p6I=yT^IUMWemPOQiL^{)gTh;O|@I zm-Plnn5h7r1l>**HLL3K?x$^8iK&CWNtUL+`&m&?qgq6kik+OLAy5+;c`bYs8F?3c zI}ASkJkP@4<&@3e!8eih8^KJjfI25Vz(R}2^)D~U$pw^01l+v~f&Cm2@wd zkH7E2i6H#;LM0gr|Br_MbK!qT6V7PLA(4wV^ZM_4`YEyb_bkuxmOb?TfbzbzeyoGt zPx$Ye^T5Sh@AFnpfB!?D^hMjAPxznz#NYRcvPGw(2$Lg%&BK7l5$A>ApgQT z9DT}j2GmZRR#HXLNEDuea~gKzh*{sqr&D?!l*ub3;*)v$o6+H_wV^o`F>00^c%lube4ZnRaR-ik2rPN`u|mT zCh$>J*B_rDEMbop6%;XQTv1HIB8ZyF1`|la8WydNlVpG~%fy)p0ap|kFj8$@ySdh- zT5Bz>TeVdY5XHLhOSNhR_pKHAtNhP7_uPBmnKv6G>HqV;A2NA!-tT+Pxy!rnzBg|O zt-1%(@Ti6ucHw>5N5jm~*XHj$vtS91S*Y@V;`{kmo-sTx3K{$e2lVr38(7`Bp{n!m zYMjyTTz}_4dJ9Xp>eXZYtIvQM#_}Nfyl75U=UW?kkHuD+SbB2c;!?QD-m;IeJOZ=;AmcY__$0PAQ6RsfiqHT5MGJP_HPC04a zW@_j;=me%GaB>nHCs-kqvERM;9Q)kZO;nr94m6pLF_}(+t$NBdXfizuwq}scPpjM2 zvnYahL+?D#x(&T|^T3MhQJRVJX|;i!3thZ&`wvTp@IpcjpUp6dLDMxC6psDGKl#xZ zG<9hnOi^8AP63xUat&A}NOj-b=>{F7hu4=wxBzj9k%^kAI2eAS&r{*^y?qpFi$ zB35@6_A1PO&@o(T->M@<;bc7VqdnmAsvSmT7&;AnL06CPts0FJOCb&ozyE?A>O=)g zA3VNtVI9%igIDUW(Wu5&`HHsMVN3NSwhH$oT)T~@s-g2f)t%mta;iHYsha#ubQHxi zCJ^OStr>(1)up^Fr6!H`_IG-r72$dXTiEdyrt>^%)T+*H(5P^T9bs`?mfptfkdf+Vqt_KbywXoy-DXg_|aGx9vi%#k6_q735xh2|C(WAsyjC-Z+O_l#6)vh4$ft8 zU`~V%H_LjsREFL!RK0%~WU6`$uklrn%`~=o#)co)d`|s&0c@#}&Zte( zw$xFv;uueRF02x_g2f|mE|94|nAJT6JbS1uT(dxb#hoJ^y9r0n39t%;lhSso7#vs7 z2>!{RN6X0s@A~_5U^zJX?@M7`P$E@(|LD(a;B3;sZO~Lwp6EhVQr#1W#~PQcmX^VctybxOYH>LMtXv9Td?c+67zAm%Jg@>rlyY7li@(;lT~{^eb!oC4x`yw z7d-d}(y3*C*isjBhr^b-Agh3@o7K|*fwRlxX}RsW6_a|2%Xygpyj7jARKWEaT({)! zm^mD7fxyz&pW8m9bKoQ({s1@T@S@CI^O%JFop6A`Ae+41b&%sC<53s}9pm|UhZEi& z5DHItGJiZK;RGm+*s8PDEDb9QHE3ae@vj*K0nv4Q@U%67$E~xG za18aHoDc+0Q|b`L)08@dFM}=oPnF^J7Ea}pW~G|Hpgu!QeI9`pIuzomn&380UJ4kKL+yrYjB8o{6j0BS+(E9z2k%ZE1%rq-?47Rv3o;= zY8*^_NdSkK51SXdJFpIyxoTYD(&jz7yvGSnO*l0E3*q$C`5G)&^Go3j+J3lyW0?xP zx-4&1FOFNW#s__(=6CF58cS-%)$j23`X>~i*am>Dp=!mX$6Jq9br8i$R#lv*U~vHp ziya3+Ql3HZ!$ZW;q3=-se3Vibf9SG&r7XHW`E+64ADR$OnDJcICad>zoMdo>s!K4M z;CX2XSMymyDq*M@U$o&Gt}or+T?aR09`L~qt`y!|P#1Qn8GxE|SAY$5{*_x-Jb;&J ztQ}>wa5mQWhpEnL(t%M8|GdL;J;NH|XKp{wuyK7o!;16TfTZv4;%_XoA-5bj*z{H| zY+Xb)Z{J>?zQw%?QHAF@UFH}h-epRM6QC}2hEQ8bT%MMgZwR%8#LpGs z$m&=f0DdnpgxW&lIu}voAQl=zZ6R^9B2u&)eg{*R6Ai7lkiJ9FL;HG$Hum!jg%%%L zJdj!(zip|@NrqHgNZzeTNBbSG1xCg(3tji+fRc)bH9C$gN1NvM(0>=>+ zn7^suUM%_asy=N(+h!s#-qW;&Q{5}H1ykz|6zktQwEm6zuz=Wnc7@UK$7w^~&ymLh z*m{w+e6Zy#6X6ZcCACTS`gv~+?L`iAYQ+sGSHO?X5#QtK26M!j9&?!hKUjvq4>+KL zOPU%Mwx{skV^(fNcBs>E-DI#}5`w;9jM}tkf1}r3h4=0zbMW^ZkkS{a!BlJ%#0| zd@BM~xG>cvneVTZZ;&`Mk#)1#E5GRT*V-xkPUiPp;}?axEmHYaZGk=?M>&^des_>x zFU=kOOz-TY5%?V@1x8X^*hYQeZH`CvPG8b$0{1E%_Kw=Z-cbaqoMR@L?}5rUD6we2 zGQN$V{G!i=q*pJ={O(46y^eX6o;YBt$<$J9VLkRrOSBk5Z6UF*BJjL4Tb(WOyWG08 z8bWO$aiAsm{EF)@T_T21TSy$H2ZwrDmRiq}2rO zRXUt`)E3S>ia^zK@S{sI->a2xJZCrVjBoV&p>_oe+8Pc% zejr;udL!MTu(5+|XxiDbyNNY~w(uy#J0xCuTrqVl{(GPv{==X7^tkTM1}FUplffP) zgFUmzK>wXkkKV{ve-5+@sqAl38EI14*Q7Fvw(>D)+OiEFqrV?Ywb3v5G@E05WWBdLCZk{SMjDbz>`=M0@hmXW{YYgH>LXD*G%xyD-H&8TH%oJ)Q1?LJ!hS$v>G1F2fFohaP;k^f2FPY)l zOrb_nbZ3H|T83R*bcVlS3N@0#k5+8GWXnIp6lx@eGo{UN)6~`~&r%~9M~$TL3eQq1h%F_@#zRb@M#kDpP{-d@e7&s~eol=AHIl+}r;YW^7XNLQ`j#ow zND6P3TMFJlVXV=*nyDddyQ zIimIli;X4Q@K~l$BV!#PDA|UmFohaP9Y~bUP`2TPOrb_n1tOLlhj%fB8c7`_sA1RT zZAXPFFEE7~N#Q*h+sjI=ssCXLHIl-Wt!=~O77Y8Pja7grNhqk1)S+Op)M?v(S7xay zrcfiP!-&H9AIsR@Z~abf;cFXHq!DX?!(p$D)ppLESK3(W<1_eQDnTP-;gx}<-Uu{7 zgXz||n`5CyQb!0%j*XX@LXD)36x8H<7Jg!5d2z`A1vQcy0~VX%KR;i1fu%+>g&Ij6 zC8&)hvtbRV>ouP#)JUpOP!|vX=nG4o%M@xPg`YOr3@^|9_eM+I$rNfNRV*mEN_mzk z)JSTqptcv@yv4@)hAGrYYMh|nxUD}dwRCIj58GH!BdPIVvGsbSPv_Z|n$8qzB!!=d zSnB4ZYv6>hV|6fv8c7{3s2@&0(b3B{FohaPO%#-D`KOpdjie?CO1AtLOrb_n#|TQc z{9d`R6AEf1H5n|nHDt?|GKCsR;U}J!k}coF6lx@OoSE-sNmYO)74;5NsF74<8Y%}bHK3qIQd7W^D%QbFp+-_u(@-@` zp+-{vG*k;ysF74v8mf~i)JSSt8tQhYP$Q}7X{aZdLXD)V(@ALbHIka0hI)`G)JSSh8tPT1 zP$Q|iX{hZ?p+-`5X{db$!A>Zsk<>h}*!d7Os8Hp2rcfiP`Cv&!1(-sOq!y&1&SMHS zl3GZVo_pmi`YWbTBdHV8P!BVO8cCg)hWaN{sFBo<(@=c}!%iruk<>|Gu}6xm*I`Vd zMp7perN_Ly4={@<)JQ5ID0$Bz!W3#GbqZ0*TmE*YP$Q{e8tO%+P$Q}OG}QM@p+-^- zX{dvTz)mQrkyImC?C6!PF^4JCNGc>K+45&Hg&IjMA}V;TuZ}T}*sF75dsN@-r911(3phi-sg2l#?cY8{iLXD)F1SRkGG&6-7Ni`Ft zGlVx#bZcD06lx^Z0v3CGA!Dh(GKCsRwSvXgOWr+rmnqapDngXbP#(*J;feqYY9!SL z78^@mWfwDr8cCfdD0yAEkSWwiDoRxH49{f>HIj;nSVy1wC^*n9e+N^jkyJcQte2QV zjilN|tkxIsb2J@G{of++w}D*LQV|Q@K+)78yQ%l6k+C|!Vq0F$0Dh)WBdKMAl2@EmJ8~>SwDg!QD^vDrcfiP(*-4Go2QvVjik;HRNGAlkF>EqV+u8rI+Lhec*Sz9 z=l0E(8o9f&qDE3@fyK7r+f!;LTI$D4p+-_?3+l4>n+hy-K2xZX)H#BBc+D@`EOi%C zsFBnPL9N(l{5zIRdq;oqs6|1l?b~e*`}O;!Nbr8{EubuBdOJ3v6RfPmMPRo>S963b7copsF75spyc`MI;Kz~ zsY?VU>-7XvsFBnfLCJc3#uREK^%FtKdhM|X?1X|ENnHvS+lKONKA9=hNa`}8;FRDf zx|f4Yp+-_a1&fU(+wfwhP$Q|I2}+(T|Hu?-Bz3uc;DRf3Z1jrmNWMp9P`3f@4`Ex&>()JW*f|BF# z38qjZsb2_6_Sa`jp+-`_6x4v?mq4QHRj?QAgn}AL{R%90?nRBIPGAZ(lKM4RQc)|J zLXD)ZB}&iOvJHR76lx@OouJ?i6kV@pnL>@Et_Mr1{@TVAY9w_7QTnKqXQI)=VJ8&S z0Oj~=wl{($$9o9b;p=`Q-i37gW9d%mb{aBF@;n!)gjWz$i)e|2kahCMmn z^qO0;(A-Lz9C*btrff7!0Es!@277Y6={3L2LUTK5(%1bC(!lbLO3T_l$GP+QT^5=< zNs~U-@3YX{MVe#b6-UE6-+s8%ozEXg(+^&;TwHW@n_F`??8)(_*Zh$*gU|_-_5c3) zI=7#-uqVfhs|Czw>DD6_s4eFh`x9wk@KMQK_eh7^&!0(y?TmizIV-xaTXRnqntQX* z+?R#se$v3wjml$@qw3uGJV2Tvc*UG2*YrNst@#USa2<}C376j(b!#5XLh}%5R>CXx zS;M#Ms@?4jhb8pIKzPMik3RJxOj?P@&fl`oJe-B*kt{Til17jD_8WtKcRnzrG9Js1 zkw%Zzam#jp*6n9KY4{}Mxnj2(X!69mZy?RV@QQopKYsx%wGuTOv(P-Ag=SM0nkPt8 z39ncd9`ec$j(qqpu|5fVa=ds9Vy3IE&OgDe*_?&usVp>qHyRv2Yp=gQNvx;SYZ_rU z{I8yv^H6xjoG<(AJXlJYb}m>>8tB4|n&;AKU>}y};U`DmO7Q&XA46f7VD`@W=LOPW zJL8@imwj39*1RY*zCV4@?$*3S8a>8JtM-G-g2Y%alLl8@IPQmBRkqcwd4)6|vgW!^ za#y)EuaX9zuI>w4pAMb}b9iE`*GO|4ykhI#cjI2m-I~`)b2z*rz4;f9!vIh8^9E_k z;1&JcaOI_8x8_aK;P)%BUiF8*1HFi9YG?lIu5Xd%Jb3K`KPN4J^NTlW%h?zIAkA=i z#d3Z5s`ngzl+p7x{I+YPWcHNk&>>O3yMisb|N$?>Mw zY#|NyDaLww(@PehTh8XU`5ejZs>=+=A+dvd(!1IyGmj)qDk_QhwgCzIxL(u{;xNXfJB z=a0jMU80{aNR!K&BX+z69hj*3G7HUDr19Y^{0tuzhp>r$z9!8;c*XL;OLH3Bnt#I{ zJCA*E!N??I^*^LJ8l6D->!_brx&3?tdvd&+@D+akcKB?#6i&=%8)=S*SKM=0$9u4Z zNz{Bx8r?q6&m57YPq&i>=L0O;4!-9$x1axkJ@!~muKA8M`=Apjo3@O9)$Qkd*kk+s z&6|FaY9EA^^=iq-~P3>Gh=JiH*&Ny4Sw3}H=;3G;o@+5`1iyt}*dB1L*AEa#_~0w)|i$A-3!=mV4Q9r?Gsx0GnNzCa)+_3XUp5hGIf-q?lP9k+46v~yv~*njb-9~iu%}Ce#(}QjAaX3 zwi(N@`HK3+SboZu!Cu{`Z?eT>EJyC|q4K7o&Sc9!jAavB-Z7TFae{&JPh)9e%lpRi z5L^CbEd38u)Ca~=$Chu6uKVat6+^CDXwF_y2{^0l!XU!Y?B$5_s0%fF4~ zezrVjEN`=Ald<$ZNcq9JCG72$qes5B;_pLQGt{edp30U_ji0mFa=)>xWlNr+US`W@ zMzcF!phH=2EXS|~t?C#&*=0G8Eq^xD?QH4e)fv9R7O%0CAA&w%EoG=Cwrnt#YuKV% zW4ENOv7R;e80u5D^!4iK`yNW6;Qy%6mep+eo1y;5mW{^pHd|Em;Yp(pfpa33dkr<7 zE&aSYRy|vCjAb)hzB1G(yj+0tu(4FK<#A&w9F`5tA@*86*EhflwtFf$N%T31eTejS2 zESuT#Bv@dmK-q7s^7D+bMA@?0ST?fdSz{SFPEk)8OAA|`GnT)y<#w>BSz;?&ZZVem zba?cH@h%+l-|gEEPb#WvCljV=dl^t!rONL>X#Z)#1^L>NE4AiA=E*>ea48w|f~U#tMjY-52|Et<&9Vf;)03H=X6 z@4#=W=>(mjv5e)R>Um#l$gn%S`FvFoi$z z!ss25z87qtb47?oGFWt_%d)fO%ByrwN$;>p!DH5R;LrMgo-hX8S- zrgXQnWsKu5Q|<;-j&~R+v0PN%@bwdP7YyIM$~7a6XN=?TUhYoRAkg5fxO($hK}&tl z6lpxpSU(~v7hOZS>9$wD{@ldM=Nw5RVht0q8ViPvw$wbPNF!qHA!0o{Y5mZxCRQg? zq!F?96tS*7`<^A1dWb2~h**2MVr?<8K4pqDBGzzMEK7|)Mzs-XM63}a7PjGCCe|5D zkw(PYTf{1!QvaN#o@RX+*4i5v%r${V%lC zM@*4M#M+-IJ?3#7ZZol_AE#0vjfjQkC-tcr9$zy`r(R~MTbUw_h;^W$(CE!E)z6BN>jSfd5?*fR^7EcJqq zAo~A_pfwz^jvxwmnoSj8gNL2sROpQX-XiZmkDSW_C*08^w9u}X=;nFb4< zzy4*~@IIzUBVv__So0=ad%UFvRViPj5wXf$u|6=d0!)!c#Hw(`vea6pNF!oZidZWf zhCKKm6RYnul_6Q(ui17MJ!yiZ8EX0WQsH*mS4nrwrNC(r5<65 zG$K}&p|B3^i_f3$HJ?a-%oJ%vtZ9a#8Q|8x|IAW>>8dqIBVtW=)oX*P*RxEKM#QQX zv9Mm2>RYX1kw(O-5wWnpdYO71!xU*mtXdK4*q5*Qqosb&6lp}P86p<;*G5yX{cBW) zq!F=Zida}LOU-ABG$Ph4L!n>nFZ(I+B}|b<#F}j=-Cvgafhp36SaS@8v2cC(m8n;x z7H#nP9%@9axrV}6pFH~O!z{IlDbk2obwufT1KaR%6YGE(6v{&y5o?}^g>7i5c}$T; z#G3DlwbsO1%@k=wtOX+0NtevM(o)lAstidZVl8yVddS2YFiTOS5wT7Xu_m4Or#CG% zi7C>ESSPw-y>4PHW{NZ-){jLjyoR;ZV@#1o#5&0p>kShtA8#~4A&rQ2vWRur`umzJ z6=sSwB33}e!ejYm6YFlKNF!pMB4SnC75dInA2LN65i975^@53Yz#LUC(ui2~A{O4? zu+&PXNF!o3xMIC%V!g{0X+*3>S1d~%GFN3t8WAgGC{(O$Sn%~LCf2D;kw(N?WGFnA z54yf|q@`|WiZmkDVxsig=J1bhz1dP*nIesdwM4|~JL~ChEOmIDsuyWQtgwi6;a}qK zSgMIB(ui26ide7x?CKjW^*g3WBVsiXrRS)x8n65ERnvx_Fhv>>t69X_UhvlsEH!4H zsuyWQtQMm1dKp{(#b4ihi=|qbB8`aEDq{WXkk9V6)E}54jffQ?O83`e-+y<2rM_f} zG$K};i1p^`O~+Vj+~FVnszPf8R%{Ep;DLq!F=VMCo;J zQNy(>Ew!B~(ui1b5o^X>z3#Bou?tkaNF!pki&z7mx-ZvKXEQ|_5o@W4_4(X8Z?M$E zOp!*!>L5ywjpDW!7Fnv-LX{zDM66{Z*6Bk!{%ENRrbr`VEhkEkc|0$_X2$%5Op!*! zI$gw?^xbXCE%g{vq!F>sFcj7S*BiNJ&E`Ep)r&MD)|rOFBgJ#}$lq8h#1v^ntg{S- z5XS0nVm;0jX+*5E4W(mQYT}9L2@*h!h;2fHhim>D7=s2F5dwKyOoA^=lxizh!XeE&LcmCu)D94z^nE;iYe5{?`^G2 zLmk5uY9w_&QM!Fbf7g7QjTK-DHIll3s3DwP@k=jFw$xcnp+-^{5|zAOH!+18NnJ!# ze~$H`=ZYI`tW8XzMpCPY+LNh@NIQd^ipjigo+l{~}YCn;yBk<`UR_2XF64tZ+4 zjdd(jr~#@m7!R_plPGL?*x;gjc_CA%k<=w=sOyk>h4U(wi3hD;ZetY&lod6S`YBO(mcep;;8zz~s-7v- z098JFZoz_bS}FXDC}+!en)&Avrbr{G%U#qZhT6;&X#{nJi&|r-!KYB#9?}TvN*DDL zLsc_H8bMv@1jTLTo)*cSU1GT~0 z)Dm3S1)JgT%A}UTj9MRQZ*7G2Ut%pN7uX+K7HoiZOF|v>-f*a4{P;YSM!L}4#5yiIQ4opl! z_p(z%oy^B{qF$T|lI;{na4La0a5D+u$Vw`49;TTDDSSkOjp1cUy(bPQSpPZ?3_WNZ zLn?)W7S4Lyq|i9WP6~-@fF#p7s*|uAyDafISBLhlAMGwa#W9~+mvH2#7A86VlZ#_b z;kFK1cUMJX_2!ac{c9@gu+ZVz79>}0f90|z-%jqS#roF8# z6m7sunXIBZC#2*KV@o0()PI@%p|mXmqaw@L&e<+`aHz3!+$I;Pu-SA7xO2{t$=x-F z7G+a`Xn66GY;+hiapFxL7#c1Vg;P)#t(SDBPVTia)R2usJF6#m6Y!>ya zk3^b-&23A9S!e@u;*H@*7Q$fTsc==cC>(0W`&OB{(<||$l&ETJ%OYZ$;S!kd953-`du!68G9hfBHqsD< zzp0q?43?lxHB?Mw90lMo8ft3}He~NH*@c$ySs!lY+j&rB0s{hf1~t;E%2P@c3$n>zQx_E^TmW zL>Hcg^T&lFxWB(u`#NNdeWTB;fZgEL||OvUEXUx_{<`Qrs%^o!~pc6KI1t z4RGt#Q&Lh4BBg;HB_(4ugR(%lr7Zy8Ol*lP4e`5hrm9;~ zSW-a#gK==d?J=vewA2T2N*Y7F4=b5eh69${B9qiA@hUq8cMOs{ErZ^`;K@|FPQUB{X7!px8%41S%Vt4~tT6(gYD5z{-nh0Y{~>Cv8nd17`2Q(W;JC$d=a)hhLYh5inQdhfrqtCsa95v%D=%r;eRsvC`OWyM&j)q*g|_GihpkAKqi6 z)KyJzuGRUc?m$PK+@qn0MneE5I(1#d_3ValWu+yhm}{m%R!oN%))lG)pB=}jZoUd& zlgvB`)r7%JLzM=pp0`Shy6y|R&&*L>ObjNod9Vz|#)n^l=|y+|cC&M=yPAi4z%k|< zimH1a-P0B-)$aC5CqJG|yOgJ%HXJifxA+T`t5a&1oR#9Th^iW>jNo0Fu6x4{4orBKEGxRn z*WyqsJx9|3S80o3!Kfy=g{3%!&fHoK*?Oek~G(>eL9wMKT?>1)Sy=RACk+fy#^;buWx%ct3$#ysXrZEpGZV znZi*4Js|X1Q_FQ1*nV`jnx<5hWGV?{s(f6s)Jf@vHGO5O>TFrPD2EFtRf(2hn;z$Q zyyN)Ln)zWk9$;Y~NTMkzDTFRk#|yWHuC8qiY~oh9a`&Z`)5*8JAuGNFfuWdD=p2(fAuhz5mga&U8rqDH?=O9&V1g@7B$syH0`mbPojXN8;RGSlZU6Zrk8PS8m2!AD0wnyc=k= zF?d*l=A*0-xCSm$*&wH;@0|o8xn}(2CQTin)#jDMDt`&hra?TT&k04B!pGi4zUlDc zYfV*cRYhIR%)s1*Gb?>Qki(rKJPFnXDi@Sj&YW8{qc$*eMpfF=tYNf4>WpK}^ zsSZB1YOamUguA?O6Tp|rDc)Nuu}=B+T_yYvw&*l7u9m=6@By`YA|xXbsKtnI9j-E~ zT-FeR2m82z(r1e+mUKOV!`L{Uy991?HdZxeNQiyXDtTt4tsS4^HNBaEEroorGMckP zHA@hZ%{CU@WiVnIO=@X`6*iAbW{68pT;osqnPYANs|PL9x`HcxbuoaqGh%T6Gz7OS zqtW1UpFI@ZGl<*5w=+r|ls+1|?iafz8iJVwE>^mjBi@{I)%B=EM4WEee#YO>rZ6MkXj~hVu z!2Nmbr3x5D8Sn9#MI_e2$zrb-G{RIJjVvdpyX1||(*?oCMi|yHcz%-a-P6ZIm?nLi z0cn=vrw1^RNdcbhSrQ0T;`N@on26M$8d6VIRMNGFdLJ{-Bh53)gv$=N)#t;{Uuet* z0#mx*C1h#Vq?yw+(u{c;Ww$wnOnG6K*=6z-pu07@(_sNTh}i*;2*46Vjb<9Ec<01D zPE!qk{$K>In)tJ{gqzglQeE1@0uwwZ?5A~6rlX?Ug3!T&13k=NvVzZ4Ih;3+s zM}2W+76`+qlJq&)E??X_YOU&CJg*QBKYI9B93Tm)1mUQVhwqk1XZg;GQvs!8O)Ot@Jkv$wmR;H)c#36$dcyS>t@I5dbI}}tBmom?vadpz_A$;-S-HX84lg((x%yMPnX#=yU(Rg zvy0Dj>D0RFMyG>!-s#>wtX3Qk(m5aA(jl{vYPbKrXM=Qh|HX*9lF%TjKH#8RyD1tm zdqxK`bu*tnB=0kN&ZKLPTDh9@zYtPa6WcRGIQx`~PITuW9m=$5@=sK_`+A~1dpw}7 zVz)o4q+7iE9qW{_FVnV9^6t+TF=76nKIx-7;Q#BBO7;VTte#jh)y+<=d)Gda)P2u6 z=~Q~ew>$A&dzQ+bw2$uPzj2>6&^0Qq!u^#j9s=&@aL*~kH z7hLEx^kZe_sjsw;WZ|c@^f;PMVOMc;QMRiN%*EHPI#3zFeTZFkpfc!!gTyYd4+`yC zAM7-5t}}HL?6e2f25>>S%N|_au!}i3`eCO%s2t$-&MwzNwL@1ts2t#SO&4?MiU*a$ z_%7$r6%Q(hqr03#S3KwgbC;f0)idL+!8&vgK2oX^?8y-6t6>k&oqEtT^&^|PN}_?wX>1@O%gbb)(k_{yeCE1yzYI^Eaa+SD59Xe}8}QH|>8^jF@FNE558 zr<^CEg7|%ji&@`8Bj*t_k_@~S$_19GUV)QLe z4rtmY^MjN6iPeOrh9@WSTe$j*U77tDX;MdAo6K&KSDUi=KYiv9{s$W8BaiDcebc7YR?Vn}QLcsYNTg(Z za|9T5I3x@i`2XJZ*H5Aa_+WKq(&w1rKiGjsl`E5sm7RAW#>h_N;l@M+{vYfA+T*FV O9a87<-x@O}m;VJ^$)~db diff --git a/breakpad/v110/lib64/exception_handler.lib b/breakpad/v110/lib64/exception_handler.lib deleted file mode 100644 index e64127372aa65406baed97dc538be235a4860bf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321206 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

eQQ`Zn~Xo)wqL>pzu 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 z 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 diff --git a/breakpad/v120/lib32/crash_generation_client.lib b/breakpad/v120/lib32/crash_generation_client.lib deleted file mode 100644 index aace8f85aba00985b125749704bbdbfd99b98ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75902 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 diff --git a/breakpad/v120/lib32/exception_handler.lib b/breakpad/v120/lib32/exception_handler.lib deleted file mode 100644 index e7f187b2a2afb645d41c7bb4e8cef5a3827731c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237150 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 diff --git a/breakpad/v120/lib64/crash_generation_client.lib b/breakpad/v120/lib64/crash_generation_client.lib deleted file mode 100644 index ecc4820a2d4326d86169669a37f6ff3a6f30e894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96216 zcmeHw34B!L)%S$3ghdii5fmX{R78Y?1PF^}CJRg;2>}uk6&yk`fsv4jlL?zvQCvtz zTH9)?t+lpq7i;^qRDG?jT~HK6tqZlZYOD6GwJO@GZLQi?zW+JTa_=*9XXa+>`}@8h z7iQ*}bN~Ny&U2pqx%W<{ENY50Z@gf{tX%UbC@RP=nlrDcpxBh>%dZ9b#l`bEy>5iZ zomkp7ojzAN+>Rnxu z$BCwBIHGI`w^mg6e2rk(x$IjqwF!E9uOSePG=-v_DZE?dYea_Pyf2`PruH|`AmV@+ zr3i$IX+k7y^u$=$PTHfYl-a^zL%LPt7!svg_~{T608~)oZMFnaIl|kyZlsEZtjP(X zko7rEP0C6j>UJ`QV-5}L4jC-h`AhT%neSa0C-}*ltgNZ98zq{CvGm==P3a zr?)(=-LVTI4^}mSgQan}0&h<(1sV($Dhp|C0hnlPOH-T3P-t^Uo6bvuu11QTEgFtA z(-W!)Ud?mey{4z6Fk@9m*+vW}tg}jmaT8AuaWZrT8sd~G^M*DEG!$+xYYPS2qe&PTUm6>V0@al@mF4x-wSl?|Yb(6y zMN8|;x;mrb&4SD(RTb=+`qDr{5B1kZ!qISZxUCvfhNca{B#t)}$@6th8_+tIIT`WM zOa=ez0~L*B6}5Gh%WDF)%PVW@DpszdO#14p%U3pS^>uazBNQplCbe{@%oE%!10IVS z=gkvE?apmcmH{pu)Y)Jp5{?9Dj%C-{M7x$v1NTIh-)*wXn&m9cs;#qdqP!Ds;FS3ERlNMAr=HumWUmgqC{-4xR~YxzAr+p>~Y7p_USYvx$yyC$}wwvD{m_cxl;UA6)5b z-_#!7+8(cWNy=iO3PV+*lB+~uN$TQBK&L3Cc&t-#8JMzgdwZ}sS{JSjbp*XG+aYFd z>_3K`K*O?SlnbqARWPz880o1dYSiUj9c>}%TFI5Vuo%hEOE+U&ajS2Y44eKUT4(B}xZJ!7T+-myM4`wOqX6n!Nv>nnI3D86@k{bJ@ddv&s2f40|$ zLRb=vVhw1mX?d08?bAZH)K}u8RdTvT-)vs&_1FVf3*dA#3fHQ=nWmyYt#%emK6yY#hFL*u3eqIy_^)+(PopklWJ*_U%)PJry=<2;|az~4LgtVQl zy>jB}3kBT`J-%*o+oCHoaSE)>HQUx3HNzB0rCT={iS6vf)TOVL!AD!Vs|(Nou!6-$ zU|9jX+`r0IKibs)YEuQH7geT5@#u?wJqS3*q|d73;^MGNE3S#)>Ymt;)qdEas_qFa zT?oRektzsp0moOqUN~**#P!ac9O1$k!)0?UMJ-L(6BARC1XkRJS}LlTSlja}TO}_= z%c)&b%@v_+PDESL0W{Dc-w+|eXbHOMIub@@TBk^x?ldSjRJ6p^S4S@#`=4Y6EwHjc zT@axy-K|YsZBeyjs&~8s&cm$SaidA6+Thfb*_er=UbO_BHO9?)Txi1bJA`QvZO11g zi+wv=b(2oGqT07yQe|=uE$(~s*-1=K-Qb&8yigmA<%GbW>C3of4W85A- zU6oAe913{75^6yyw0CU|baX}e+T;4B=1qYRR_BpuAcSotzIg!`nEJ4|7OhULBJ=4k zj4vIos?N-TYxPTd5|t9ARPt7Rydzqfx`t_7ZZtY)3IkO&`z;!Lb<@mR zYK_Vnkv}JuK!}|mTe$jAKOJ*z=<9KPv#FHV4U=u2*!$_;wldi%Z&s#~t%L`{R{C+Q zuel0up_b&>I%ystUTO}qIT5Yu6Hi$Z=OFD(n}go8r9-^{HBf<08(iCkHFGCjeW=Bq;)1T8N^(s~F|1%((G^s)3S*k;rzo1I6Xv6Y*|@zU9QAD79NgU8 zv7JAuXg$5Si*?RCbr)*}Ze#tRj&Ei4WE}t3hX@!qTgoBe`2CpZil{fjtdu@zDu8|~ z$&I3^$H2Hz_4xgm5wGgT)wCcXCIB42AJh5fV>5PYjfzT&6I@Ge_l-hipS~$-Pe_gv zMWx7H`3bkon=ExdBO92}&P=E>cKm+KOA~u*)iCCwP-;a6xeoVgo^!WXl?w&EggppQed~yHy{g`-6g938=e$155 zU(ifV-cx$~eoXOj4|e!bYw&*jeoR!3!14Pr`MGS{GtTN($R6Gidi;J&bA8#sB#@5iKPX~kZXc&AHp>Pkz%)$N>W6G`#qEo-#k?wtbLtvqT0aQuEu{1kyKr^L&~ za*3&Lpmeymvlp8%TAjl^ls#>8sdV+;HFIPWH3;uM`=lK1Yj-jD8DPHPch~xKTiXS34em`bCuh{I{w0aj;+(^~mw@&hd zbp5TAmg0^&`_lCszaR7X{g}3;tDbQlzaLYr>eXycUARxY#S@6*_haJTIIc&C#PRzv z^)n&I@5dA!$^XCiW5)fgXu4k&onNGWZFJp;x&>>Zn>*G-g6%EANK3eRjrswpH7kQ{ zK|CR{X4~ANHP|9q(@Yn50{nCX|B6(gnSVwqnS3TVo>}ULOx5q1Ci%V7g8clsbLZyf z&MPX)7tXC4(Q^HgjHNG+saqZKc&Z2Ewox22@w1W5QQU(nj{}1|o*9MeoBSM+16*)@ z*M_`R>damw-kYPoiBGR5r*vjCxGkEuxm}$(8;P&Y^>_~9MF-S-a&v0e#pB52?|{jf zN2ugDayw6A7>G9~eT19l0yhe{87^_fE^*~9akVaSYh23zfqUCtuAppT;e|A z61USOZkG!j)r0F@;y&pDHyZjrxBz3L!q7@;7FDa@_W3*Fc5D}`JjG$q6^$G;3m7kjRWp17r3*4TLj#C ziA`4T3AY89+g;%H0&~O#?oD8F&WBxUWlWGXHj=K|BmhMX866WH_?h49sSUOV*CEfZGbp zRcUaCfa?ZkWf`0GBD3Y=kj`;gkCOr59!jH++R@7{^bJBF zhE$-hTr8{(#)nmI+k_DB*Wfh^m>)=7vhtk>eSZMv*b+fartc=4KHHDFg%=&k^o_^4 zHzbCEc(eSo>NDXoXz;fkPB`*sf=k@#E^r5-Zwhd)OKh@y90u;xr5?{)c+rszN6mK9 zGKT0kr+g6ZVi!2-Uv71Y`<6@G{Vs8jy1+HUzvqCPQ6;iF2p>-QT?@Gvm@lWnjRo!p z!0dN{`!z6cxWN4znC$A*{*m1?fSHp9HyyZ2U^>&_ih#QTmE}6br)W6hvJVh&nzGU@&0dTFr+__TV zlG&Y#(;opdQSK-tv%3WP@`2fkCtT@BW_KvgeOqD}h&QMF(tPOqE^yS|?stJBe;##- zd)x(XBJ@2C+);@|_8s#v8S=jab5cDLIFjLL9GnEqSuSw-z!bZ{l>)QW1+EU5HED2O z_}2=|Hzh9FxH=NJM`WTo+4Gc@# zF294*wZQyS;*#m3;duf&)c|#@IFhvwD&J0EE|<7u_25+Cu9FzjM~74VPJ{d_E^t)u zf9wKB<@R$IIMVmH3moZt+69jEz2E{z`d)T{qd33m0!RAZbAekA+`oYf&;|jHWc7fC zgHHhScp4n(dmWgiG~vdPOkWPpZ3JeU#3idQCjxg3Ft?<^QCz+P%(qND2^7dXnt%fS69ja`cCyDsz*?r$z|G#>o}xR2A=Jr%gDi#?vH zc+rup+(zKs3}EKQ!^DlkNk4FP5=;4FoP)lIOMN?l zyWWMque;RuUEm&Yq3?)GeJ=s`rVD*pYgFXKXR`R^05?%$Q^jwAOMRul)ws~t=2Bl2 zxSeVAorEmj;Zol{!2K+ZKI(^l>r&razW7^45$x z9QvzPU?LKitbED8n}GSc3w;j&^GF(f{dc3XK-jbEaO~BorMjw^OkAZnA9_QfSTflq} zkBjq<;x`VHwzKe}L&wEIUpX+f@whmB)Na}(h85y1S$?+wcZ~~uce>Pf7jXBv(0ACS zz88Rd&4s?f%_^tjGg*E|0XJS^b)4hkNA+c{OMRul)uho!<2qFmTTE$yX&tWyPuePQ%H;8?Y9|iw^ByTsxT>hpIchWw)=S^541xX04yBmZ6l=A(F=Lw?7Ha19+VI#T7g6qwcVI0t=E zV0Omi;>wrudj~Mzi^nJ{mdq|ry^`+`e-uL1X78hsSMoHo4Kj%4v04_uza zrYet8m-?0hw>phJieD6%-SIew`tnU+?up06)j!hr3^1?8;~ex2+KlxeUUVeOFV*K6 z62m~eC5zu8;QVRyjRL>brM?JoSEkX&_0Ofgy}jXtU`FSykAKfwJtjXs(mjB3Z5 z?MN2CJmB&rHd%R4ersInTMt~j3w<{Nb7wrxp}zbKn8)LBarKYt%j>{=5RY@vH!h5Q zbiC+DmR~9luf#Brz9-us2d>VAzKBbGJAk|1g}$%5)c0NB9*EbszOz&1i#}=o6MyXV zNT?GWgp`0(anp6Gxp1tyXPM{)k1#0ZVf`bOjA{Vs6%z&!%o-y}Af zf5U;xzf4&apHBIp`y%JNz>(eMz+EM=$?OgT?!g3onD3g~yB>ZgA3Jkk*DWrt9^^pT2hyg}>lA0|ud*TvAwC&bwz4j-u}oj7 zC;xJRnQcD6=6{{<%&UZqt>}rpOHV3Oh>myB(?dMmQ2gfq?Y-od1%5>7Vg8Rm%BKxBTb+q>C+1h9CbMf7`{Z8P%&+ zqvFR^m*rLEHNNVKRa0{ZqqV$?*VpiB@nnp_hi71)Pg~$wG$vy`=7OHFu$8$DyB_kh zI@BBqcZOS|xzkpjle@eF4Is1wf3Q2ZEWEiR)E1-$=->6$w8DM<>kdUv@$dTZ*wzuR zL+J5ex36p1v6CtJq<_~V)Ap0fIcWKVJ*Oj8&nb&~hW~+M;<(Dc@Ug8Y_%jbVtC^(L zoMWkpJ+$9Xuj>v+hgQZs{_a72N&QSTx z==No?_uXsqvKq*H7$ffqTX@Ldy$tA){_a(|NKWfsmQTScE5^$UK`ma5c&)>0BVHZl z-DQ6No@Lt#5Bna-!hEhW_Mvv^x?|B{**U|q$ABJNlb27~4(z9E`|pZcLoWEc+wxEl z(Y*2OOyS$g7ijW#hv3XPzSukPv336Rt|8^IM~{xBU}R7BiZINdQK|yly$L>Vn%2FE ze1=cTZ{=Heryu8$g-yu9CS+j~vaqQmxxcZtJa`_>^9s+G>FDmZ@(?S}o7O$1yxTXJ zYZSibmv>hpTU52m!SD7V!sU4|?VCmkZ*~sKw>%Gi_`H;8%pT**#}_|+fmgm-E~~>7 z_%YopplSsIv|>D7$lr=-KoA_7S9tM);uXyB?->HOJbqEuG`Aj)E@-ePQ9dP!e0mc3 z$t>?4gPP5CN7PsUuI=MQw4JO?t-sZdp?1#pct1KR|H8+!Z{COAuQba)-4Mpx$EjQz9s?U(VE<% zXT1M#Ms$d-xg2DgRSTCUXpjHjV*2--0M9*d&>IE#MJ|&pq~>ud{`~LKoPRmtylf%- zVJpKCFp+OoekVv_ddOS>(Vd#V`-;3=-)i);XzRY*!ehSJ8x_=_y@!D{I@I62J@@Da zKRUwN*vnQ2Pptfk!b2EXe6b_`*i+Cq?O=IcE=5Jw`&}O#>zXFg=l==ft_eSW27Nfd zLJ0N4j_u#|&p}uG0M#D-FFJ{~yhiHJ*7;*skA zPlzvtFZ$JBI2DLz*kTn@7jO!9RLaIk0YX2Bkz#d&2xdj$`~KLQ{@A;|*h{T9Rbl*) z@%k}2g&@G}H1aYoYOxRe6u23#0(X}mBh69t{!bhu4>|;iGDPK2wWlhtqbl~OKlW>6 zvm7o=qqkg@QGa#?IFv&KA0cm3ArD-#zXE&_^g5(O&_hUxpm!rx#v%AVQj0i+GMw+L z&AvtV2D`S`BA?Gkv-W1luv4Xx#qj|Z2LcU=JQ;fiVV7s0&c6RQ!b?VE-!Eq*G$(tK zt%);i!~7y7A6$37HlyVu@T_+oa>lH%-! zL){f$_wQNKM(q67?5nC@!CO_{y6kf*p2=?5hc6fk@m{gh-(9g6$PS7t2DXX^@MT;1 zp0Y-yF`h4(=HF9)C(@5mb$-g}#(k%KWuEqnG1-ceD%dH$}s6vv41B zQnjbLgZ>#aE}vEz`@`D(XT!g8oEYpm zfK&;msPfQ*AA>zrv4;x}bLUALAdj&OJqSzCElCMEBqx4Ug(_peL9un6FdIQd2~lkc z?8lTshRVNZ`L=G9-gPfVJ02jlH)ZE!`uBA2MAE^$JMsNa zeBX=jd+~iAzVE~LXYl#$iMCw^i-HVi%Tt2F0GQ(HDbtgoz7wj!$j6ZgJ-d>3PS3g2$1N#dPqqI@h{%-VP z^j3_QA7zYMnw^7|k0ffZzx(FAn?S(FK70_6D#DF=sfOaD&sBt#W!k*@ea{MO0>yakrD+>`BiOl1v(vHzL+B9qd&m(s8MJ` z50HgY-StTR#ZbGfR!O7iHp?1m%>uV_sR`vmu+F!~Kgjo^TNhAn(03{{W+g%et!_#= z$Y&zu7iH^WWttTocGF8xw-lLBCk*d6` zRkAlP_EUTP80*GLp6dH!ANhAZo$cRs?BgvMbUr#drz++{OL)xx>>K_EzH_%Y{Qvlq z|JgS&aoRG@fAAo&{jr1ob04Z&xNqy=rF#}-pzdbSIDy&Wsl1{+fy=%MHmpVMO-E0X z{d1H$YmAFk7$LX$uX{f_*^k*{4h?%J(y;eSl8vm29jJ^wB`Oi0){{%jcB{Gz{oR)% zhn+caJ|~h{8GGr#;6j=O7yB*=TypXLs}V7=dj2$0V)gtuQtxmSpGQi}lQ~HBVtI!0 zs@~}DuHJ|uJN8g?T-@qhO@zBE&=n4W1~QkscK?&CV-+cx#$)B$bs|IBW14bPvEozB z*9#99iUs>kXW)eJbS6^5)A>kcVlW@=RmA>5<$RX8{g9)!AL7gWl!`*s79N%pianR2 z#Iqf%*hf|E89dis?zTmRS?F0@=vcWg>ZEq#3y5<60-_|M`31+iN?Yzz z&Ab^~D?O|OHt+SaOV)wHeOP>1wP2R^8y$o6y8@}RxE9cLFyS|ip`sRuWg*tAwCu__ zFgVAv|G?le9!xQK&G!(-7Bmc;Dm>KMJ*pO6)5GFL1Et)M_=q~PT_1hCWwe~~i{9u- zOrg=Z+Vb+TO|bCcPBcbe4mZW4k&0{gMH|7%>0C*3lwyDEvK;@yBmV5t_b}tjiJVDu zL~m8Bz-q-un5s&Zn!T4>u511R1_&u0o5R=2Sf-KKI0q#IE8-A zj6jqka1kPq)mbO=dRb28!Xs580$Gu>ICB2jIo0ULMlDB$_Q!rDIsqY7;oDl*z_JlQ6aWUrk}yBLwd zsE??H*m_L-nq{7~e?^te;VN5+bw%v?YY#`y5elYK9Yp0QsKzo3?LbsD%o1gs>7?p> zyD!fK`4$7IW-z5mjqY z7dzFoX)XHPT%<&wOEv^M&)%IrvlTtfsIks^s38kIH06xf^S|l^Duq}V^SVs-o;z|X zW3Tga?D@)tA9Tj`p_S);P_^*s%Iwk)(F(feFWobE7*>`!@i4B(*k~7$JzBq?16}W zmBtJ2?&729RUSH!;W>&P_6Z=Oqx^eLnpqV)D74X}iz+eA%Q9(RhT)|ctw-8A{|H5}7Wh}zC;r`5J z7}1{EQlLO0_x^L=sm9DW_Djr6DPX*c<8GP8BX*^7*9Q(mY1#P7h5I^lt72tTRH|$# z;89UVWmHB!^k7|YR$)_?`{4-)diidIdw-lEeBV#|y{36cxd<^*AJpAavJ&K>MC#?S zlnP}d7s^hgM4`}_AqwRyNQpwp07evw46t!Y!5`~MgYYihGYSo2nL~rXtPqzxYzqSJ zN0-{#1-az62JwX-Bo5z|t+IPMKc*mwdo1=c6(nN$_`}lJ}#46kP>C`C8R`|+=rAH z<%j4pY2D?}Qq=V;uAj91DlS{m4wOixYAQ{#sqiG-YAQ?7FgSk0v7XIAf9|8^Qp8f- zS?K2CfA(Vpg&Pg+dzdZ8DnzU%6AN(}n$Ba6P3H=+c<@uvE#{_UD>^iuk$fpmR&s4~ zKV9&kwwrK57A~znO6(0NN!cbeAu6uDTwJtWA&QH(zC>|-A1P5>r|9C!zJJi}jQ!a^ z90X6rq}?|EiTSeNBHrY_aO`=S;KW^s$c9$Y91T4-&K=7`!mf2(5d>KugmlF{o0N zD;A|mlgarj96D9HhDa;IY@MHnP&uZ-p2!KMX^JRxpQv@qT|K^jy*-CVz|^su%Clv) z`W()^;flmSl{3s5gGHcfF@9CaKvkk1TY*Z_5bg1z@n5)43nLMlok*n*4U{7^Cn7YM zXkbraa4pRWC?vFf7kh|AEBL!(h{SFXU*{54dFOmjS7sqDGs-LI{$u-g;_^b*KlZoo zGERALrghgMA8uM;@P2Euoc{a4eYA`PMXhGBpDdeYe&LH~m{{FHAa}+62bYLVD74S+ z0J?3y*8~?&p4mOQ_|)hLeD&qn{+)|Xg`ZW_TA!A^2)6dA{$iIUuzx(_DH<;AR!!oS z1ir2(X3qNe{xvbvjXIc1f`9IR%sl09}NoZ{bP6ctUMp(Ua?Nj_Pbucuu7^dAtX$nb?rTQvsaHLaGd#Q<)w+gZdk z6fu?y2G&J`O9hU`33a@$86riD`jm_hG()6_adCoIivFgb2}%w={=(j!gj9^NbcTM>Q60myR*@pD*RgEskk3tEA0dH&4?0Un zF29T4iXqvjm_hbF!zt>pzQ`%s0VlBfRHoG@ouh-=kdl!#df8>9`)1adhtwB14` ze3>INVPvLfWa+Tlp=3%Pq(^8ZKP`>+nkjrCjUq)F|BE$doHx{SUL9&?(QsWmm*T8C zhBJzoB1Oz^vuw(cL7pLKKXfPtofSCpN~Fju!64K+ywoAio4UVm>3%hf^{$ifWV!`| zP_zl64kz9JEp!87_r$a>c;vm%OFC~?O7ZEW_d%_ffGQTr^nRPsr1K!b<>93FAx36! z-!V*=&S{E*PgE|{RI(&e6r+Q}8!jChi98;~ptAx;`4cHB9l;>f`FN?rN%t>=ZV6F( zP5YJwp_g;0mS@CD(c72E%uBV+#)+CCQpEVT#c;^WNtz*2#K=THkLKsd2vP^<1|a8 zh?Ol^Ng{BHW{4CqP8JMXjiIX!>X@JzB1MeTQZi1{43Q$nlmxFTl>vNC)C`d##@Pvs zSvJP$njuoeI8QK=%w*`!33W`?Y>^^%pMv=k-o>zWJ*bh!#MLF1GMX)7t zCL?fEIwD1-BN#L<@#3WpC*7Yja%!K+SoSRoLa!GJ*D9s>bkcj9$f>Pgwa;W`>0F8w z1UmPW@FCPITk6()6;?(R~Gi&fq9xGQpEa|V2#c4 zjIBGtGqz}yXKZBjE2BC_t|N2L(wjVrHCv>J{i0yoN^+xu<8!`dh!in?FBlVtdnQH; zJQG{;Jrj#&VT_*P$*C38UADn;fz}{Wq~T9O!^v5mlcOhiPHq|HIk|46=j6zkSBP() zBQ4Zyks|in%;tJgG=d14L1zVy>V-&Ay$}r2OP7t*;iUVoLbrq{PpHSU>{}LuUeftp zrBowL&W9q$6lFO>UvFdJ!8+7NVu%#wG+^Su< zO}p|%PUXVo_`r8=?~DdFQ)cu*Pu2l%JLs7@Q!2RirnXQE z<%Z-P;m%Mr6jpm|Lg5SSicPuaw+WJ$SmJHQ^Sd)cEt%VXj~Ok`gj<76(V6-AH)VKs z3W@!%Op=G083$0G&BOi|Ch25m#$FSEZ}z_$i3SD?wJJitKj9CkSd_A3kbPjN9nqQZ zK2`rrB4!9<2ua8N?^ZP@Vrcxz%t(zH#u)0k=s5k2*KqA4-XCfOnHi}u!(Cvg-%O`x zqzeprl1>k;OfoYl+H}k;J@>PT`QlYd8ca6W>GV+FkPbr+v8Th(EG-@8M8>2pQ(DKS zD|gy^&di_)(6Ra6A=n~|FZXdclMZu=3k>y`>GaT5@N_=Y)vI(EnnkC>Omu-coiU5> zPA&iUAHKOIF+Oz9O(y@@C&E1Y+RX@Hd<^OOS!M=Bn~p1U?{#R)xj19h=STm3+x|p7 zQy4=tWU}?Zfm}3hO4<93sf^i+ck<%*gC2IkoWYn2@lMB%OX%07;(gA;naqsYjKFa%AYk!&&T@gFo-myr8p+dP&S8w0nc=r|!n5iV{h7`fx~@k) zFRUJXX(Hxa#?Ty$Fo&PJ;?+dV493vfgWBQyzw`Vmu`JGG4E1KD=iy)c>W)M`GhJZF zlgy0Ndh%UhDA!iI==xfdKhYm5@pSzUjY^prG-}XMv~4V=`tjvXyP%mF)O*lz^O$N3 zAn}+vIFp${HH6MI{PMaziI}-AFtmT3PET=4jQA^z^BF@U3;DDA3%OWuSw0KQ0vDKt zDKX+NFH*0PnL#59S-9yh*W6~eB{1lY(_-lAT5>(&uhW$<=DYNcS6xT(Wr=mw%b1N4 z6IeliQHg4;y>Ia`28GRk%j&`#CVnRoQ_2|C2EV%SLA0-UJ!Ooc)hzk*yXVKQPQ;Wm zhSqb0S$)fWwL;+ z6~vj=(d5sOFa8uN<1v+tp;-_eJ15URl89M~Gnw==Gpy$ezskd49!u4w~ABtGOb|@?Q@f!_RoI5 zGf~fS#@vK=(lfaEYr|?1^wctjMtM5!EZhC6U5}`TD{v+=Lt$2Y^JFNd+Hdz~C1c1J zI-L8cRXCHbAFE@`LA;aCH!nYDSE4Ocap*ZLF`i$}{x}hXstF9WL^?jb_K{d3rU7Rx z%;fFC#}hG)jG^{U#|<}J_2WbgjmV-cC&zHB;eLZK!@suldx?53HuN}SXynSwAg`zd zUOnaGuP5qR%NTkm%!16nU7d)zgfU|!rs?m0Hu^D9?g1B=buKVXE->pEGac{b^V5fp z1QUI3W(MPUy&kqOCbb@@MhsKyX=M!E2}J$EQ-`j?WH8>=2FB##oz8q| z=uQlJ@fhxzGiE^#)#t)lANdk7A)Lv~plfwx>%H!WKb?rVlrdBBP8NQB-}mlK#B5>= zUAZG$r$=8v^^f zZ|A*{sHX#GGBZ+RE@R9@yd!I#)8BdQ=0rUa#?XwNFsBu6`eh;pT_kL&F=fWFm;RWD ziMqgaxxj33f!WF!FTLY6eo_=!j4z9Aj2Ve{I{tKI6&gW2W;@Pgil15|%yknT`nnyA zp&1t)Kb!QK%0xYv<4k78A$rH_=hIhyE)jDDV`%n5UYxV_)q+IKCm8b`ddF+|Bmc&D z8t?O!jG=bJL@Vn5%InGvhQycsy61 zxx}A{xrQ;S9{%pXzUa^&?qZB8i(6g{zn-Y)S{Hh*bD`&Y7kX}Rp=UQ^D28lZ;tU?|7BXd=VXOe0ibTK@ZPfkXo_di(-k#+{l>Jda#^; zo*cYWTduzRd58Y+Q;a!LVv38_Kykb+(4dF%PI{c{&rL2cpK*ctEMrvtnN&VwQ=&g; zPVgr+23=cPpKoCdl>;5qSC4x?(bng2###?LW4^!`>gOpw-^|bWVxpc~8AI)hFtPl* z9p+kSDzG&|V#*J;-y`%uz_U~O^muZ)e8l|)rsQ<-RbrZ=!EGVxhWSvebCm#}RL;24 z#P8xwNR}l?Xhx+DfuXTY9YR8_S{*_{u~UbT+^4?cQ%Ignko-PD@=k(;p4n4}&@&-H zQkWpAN|4a~_v#qr*|@zUtOE804@GS2=HTY$4jLEmd;eOpIlLuElG|89sV!1ZftGYj z$!sm5%La5@ttAgjNkmKN4skj@r6p&H?0Gh8Nu8AJ)RHTt(UMoBr!&MmK4d!-E=LvLP}b- z}O15dq z%TlsKOD3NnG;i0Ei=?DbORkoZVlDZGlu$1k%D6H^^+H0Ict0dDw`kVuQWDmZNuve! z94)DnlFw_&HYw@Ql6$43NK0On64EBx;IRbB8FF!Ore-aZl22>Nb}9L!mb@w@=V{3( znh4;Sqb2jDL_}jxhVnt+#Cxm6oTXWxmXe#aB zGn}k{Ut-SItRqtL87;{iD{S4UC7Y#WtCsv+N@i)vYf>^#OUBY9h!3h8w`Vx{bAiN6 z)U35qvPDa7l#-y9JRl|4Y01k{a)Xu>o+NCaswEqwq*+Vul9H&Fyd@>Ov}D@JLeF?D zStlhIX~|cmzNlBiTjF8i~GqmI(DVeGzQzi*pQ?z8K zl+4hQd!(dHOWu-_N-bGH3w<1ZE!iO@OSI&5DOs!~7vwU@Q=uiFlMg%~ekT}UAI`~~jQ#K|f_|GD@p&{~2x7Zl5I zXgzbu<%4+D;l;U_OFq+~C56hLHIRyk(fP4>U7{o^gq8&U3Cy|#jFuEATRRj+2|Scw zTXQHrbbJyo5$AmVF7AC57&ZoJOky=Tf?A?5mW0mJ zt65`It<#bsRqiw-u;xNpp*$!gX=^q>3s9yZEh&^)wIs74Spv)^jhQV2WJxG?i}AWr zW0Z9*DWZsd2d_^kOpz)=E#X@CU7W8`n1W&`nh5Jc0$MLbYzb z^ib=WOa2_js~#_o#ynM~TB2L!T7}UyDxf6FWy}FoRFUAC*`y>Iqa|}x@G`j~05Au@WWGww5XhlW54G z9-Uc=WJwr9VH=!)5fb~~4*eqO;$251JpXmq^MAXQugB203n>gZ7~`2~`%7V8f>hi` zM1K6?yvyIVSRu(`jK^;4c4lSaoer`U(YCfp7Gn%sUk28)b;B87`i8~2N3s}W*t&yR zc3YQeTSp~}F@~+L7`9sSPCD0OO*s!IaWKZPbtj}&44<9fRTZ<)& zF@~*g7`A3FUVqqPeNnO)W7zs;g01P=*4vWB7{k`L3|oI#wV~2toj(gFaWKZPbr+L)G!`5=&lAA16M6wuT*!rGk zA>ldm7Z;v+xwiES$zqIQ>-(BTb$;TSH-Z*xy6k)zW7yiutnqjsgx6JH{nr6;hY7xT zu9qyv7`A?ZvsMfbjavDt#rmCOF~(#6+kE#hYZ|@d^=SRjE{jztCmf71JiM1#xp=4J zn$g35W3g_OEXEkD`+&{NAX}8LGotTYV6l!$7Gn(7e>00}Zw6kC9UCwk9D)=brA6YC zF$U{?oDg-MSdTo@xXEIDMY0%UuztuaFW#wE?J9lgJ&W}($zqJbdVpCuc&B`A`I@)U zV%5)q2nS<~^7;{^R(YNB1i!p|+pD>H^MaLNzZhW*(NB%F8#TdiZPl2`ab>>TJAFx<{Il?o>u=O)$QNE}i z4jWu^uEn}jvKV97`nh3i`mvvnuvi~S7Gn%s``A$+-+;3|spRTQxsgw$oy*mn_B@wjMET9V!}; zVX=N9S&T7kJ!;sx_v-s6Sgdgia1sY&3|j{v6{Sq)cTO7e=QX-+bVwFs3|j{^i=y#~ z^PZhzu^y8w#u&C9W0oqfbH@E*mc^R95GQdk#;|n=QmYo5GfS1% zXAWL}tHpX&vKV97dcv@E+shTBEY|czIEjNXhOH+dHRn;6=os#jEXEkNe!;9!^p4l+ zxp!P(v3@OCj4^CIm0)X~wl)2HoW#Kx!`9P~S}`PB7VApMVvJ$y8D>!rO2@9|(LdRt zZ9OYlj4^CI3#?_U<)W-lTdWBeuquA~G1IVhm|4me&Dn~zt#y*c7{k^t4O`D{nowe~ zZj>y>7`C3%Eb^vn!?g{c)V6*oS&T7k{YtZ_ybgTpsn1%h=_RBI&wS!#=IaPajCIN! zZR>W)VvJ$y*UVCNgYspuo|P=d82S2*VT;Nurfm)J;v^2n7`C2=)GDtK$x!TrSUYx|i7{k_!kXp7VUlwbsk4YZJ82S3GW)XtQ>qc#>L9!TQ z*!rDjsq(T|ha`(JhOL)0i)_*SaI3bppp;}D4`U2lFGFhO>+OfXe2&GsS+W>o*m{Lo z_BuaL+j?8F7-QJ_yLiOXhOIv^OVz_0*4~g| zv35%qV+>obCfI7$wjPu$#u&E#m|)9d4KBw?9E>q+y#}e3FX}fYXR8Kb1l}_C5thJt=AK5ovUsAQ?eLi*m}dT^-;&_T#Hpxfs;5GW7v8VQgf{r(zfoD zEXEkNjxtN-E2DhJJr*l#Fe50wDB# zlEoOq)?b;WV))Fg<~y4Jy}v;!)?efyt@SL{2FYTK5skkyD;Mu{&|1%8 z?UyXZ7_9e!HP?C;>&&IB%EK6g^$%v9g!c@*Xsu_lu97Uq7_1Kr7OnLx*2|K`7=!g8 zv%GkxT2&hS{UVE1vJ4^|j4@arK`QDzmDd)m^(@wxB#SXddHs`Fs=N;T^{je}HKYnB zaWKZP^)E<8TP9ny*0WgclEoOq*1wshY|)rvv9L_%gE5A!kC~MtPJ2p+|Mrjdy3YHm zg_tphtz*nmw$A+9w_mhaUzRM!7`CWzMZTyWF1_^IwHE6G$zqIQD}!0eR$HO(T8o8n z^1&Fx7F|8EY`yXAj}}|3dnAi7hOJD))?XfarNm-oFBi5LW7rzZEQ%rJYv=Rh&bL@? zlEoOq))2$i;7KpuW3diN7Gn%sLk(MpCVjl#Vx3hhJY5ZN#GH-umMSk=>shSomBK^D7`9F@Z2f74_hXCoZOLMcVQVzA?BiEJ$8g9h zVT&<_t!%>|#;`TP zuyx1uOTKTh_DU9G3|pr%i^_|laowkK|7fw^l`O^>woWr_opxaUL5o$?Ao9f+!xmjb zwff$3Ui#}-E!I}aVvJ$ybi>xE-)r+*tRG7jV+>o9m_==wj%70r%=GIR{#&vbW7wK( z*t+GBEB0HgibkP}F@~*N%_0QV!zJ3*jgrL}!`2kdqR7*=0E;!~LSc(BhOMd0Qtj)% ze?7I-r)_POEXEkN&M<6Uv*m}6TdX6J#Tdg@9<%Iq-m7gDT_ikYjA83c!`A2rM`v2B zt0apthOM)hHC`z7{MWnh|F&G)IwV<)F>IY}*xJ**|8k3U^2I_KV+>oIUr*E!8nBTPr+d zjA3h*Ve0_)zAV`O#~F@~+# z3AP4n)_logjA5(LuysdWDSmoO+1emkjPcA|-`Odh;9u0j)8*=`@p&^?P%1Ed<}RtH zh-?|_xH)V+AE=>Phthh#WD#bN!J3Dj-SW7&F6vIqlKOH;H-;x1qoMIH%x zs8W7cvIt|cN>Z?j*9kR*Fj+#E!IEAp2h zuWU&;Q@0U8XwfIg{^D??x~nZ3>SzltUw>(^IjZyp#FKpXILqkTVx3Q+Zwt0>h;HiUgt&Xzla{8oZs+7O!`eFR-k(q7+|&Yz}v9Pl|)~K!bb(UKA@8V9yv$ot>c# z?MXR}J~HD|9y$76Zn$2a#B+^;&*kD(TAtMF6lh0}HJ%(Uhri^8DCv?w{jU$X2qKrj4sD<3zv@OsX+L1(QDJl{fcS5O3x7xuSt1J=3IKXT#l`Um9&=6_r zkRgo&aWxiNbOdafa?iAKY6Q@|0$WsVQERTd(M)=-^A4Zg-l4@6F5i3D-qV);D!(|C1M>El-KH zp@3^c039i!V&$_R%$52|d=%z%m25UQFUl*j6KW2KpD6W~gKO_wWqXXvCMq*mRj#D6 zwU?9>^j#MfpYEgj=omV))djP?6nuOHmK9I~>}TbachL_IfMW7D7(r!24e6g)2v_@C zCy&gsH|>+3s@t&jIQ^n8P$nh=eNyJ5=^tk`P!aCzdy&Y=WMD}oytVJz0yTkUff}kY zfy(yIP)k45nLv$d*@3!H3r(i_96vb8E;eG?&{ut>JQ2YJ1=EUt(j|WgJ3!O$4dKXk z(aBxtqb`JJIM$g0?moqjMO#wt6jR_!^5fK4y(sm3B?V5W>#ey^YZKOPI^9g9_ON@zU_pG*^aGgg^RSS6$-pmO)NLsB)dAdL~Z1VL3y z3$)kC9)R-$mGYPG-NY~@)-i}_8T}H)G*)b3Op7$)*aLKa0QDKa+wUffDUgmqOoQ)x z2wQ^A{d%fAk*CS~_mYCtTw9T(%$?cUrqgK^p0T7?+cSDaYb;6S@)k>fJC2s0YG1~- z0Coo3u(p|_6V_pZsbP)_d*zepA!&n&`d|Cf9|#vqdsB~&ge_}H7i@`CTYimD_CSR_ zzP6aT)}R7uUn@H<@Dsh~iIck}dLo&#PUA%H6!16`Xdnf4&$$>(_f_zW#X#>=VbF(3DvbE8gWl;Q z*PPekz0%i%4TQev=P0DwMCh|}p0Yb_B=kjdioJxsspT~`Z%D;2>w2Nr*5aLZD0-za zVRN{zO+odhj{6k7a542(MQ;^SEpptg=#|2>8y3CPs{0hjO^aSBZ6seg_fGp3y-=BI z>!SDSO7eXj9o50j*tn={Zw-4lgu@%K(Y_wn;Wl+N;rf`Kc9i7fdR{c#9B!+Y%dNg+ z8;Yc^x~2`@0`IbhqCjCJP0VGPlLp#i z7H+JjzmtazB;1405pKsN57%1c#$kPYmnK$am7S_#1YOrgbU5&ga;AerF?a8h2n~mM z8CU96xJ{s`jkCn}SNPgn=!S@%XcP|N;vAwAjdV3fsRP8tdMbr-Oq7x?-Q*QKYnejr z*3LyfOY&OKW+UP4th86!s4ih$+|m-kkP>cHS9bZn8FG_vZHRN9ZjK;Vun0(z0ktYg z$bpR>pNC#+jL(KL&iP=2kg&CYk8X-Ul{K?Ux1gxZT97z343dfhfePB}7CWh7zAuKN zQNg?4;(I4{?RmvHd$mT!?YZJQr5R!=9{Z6yM)Zcu*$tntz!?8IshsMqHQ{a*|6l0D_i%i zEvepwChKl`>XbwWo3F8otWXR72BGF9sIY410-7U_eFPsC$Fo0YpA^?PyL~aybih%+xjX`_x$cvsi+sk z6ei^`!m9@Jw$l{mQjnA>*=HrW`;uqR;;t%X#y!Eog!`E>&D?mW$H8uIv?yo#@h&^% zS%0e3ZpQDz_q=zei#yuIep090bKcqSxsNm%ioY*V`8=RD1}Gy~XU5f9bz8czFWu`v zS^8B5`uhe#OchiC420@|a+@wx43yujTRGmZQzz|mKWlC7=-9@CS^v%=Jb9h;cuPHx zo7GJndHt z4zLw7GXu56F*7q@R#avjFYoodH1xGS<$k~G#Ul!#_B^Wl{e1hh^mrgN3!i5Xn9l>D zS@>KyU_K9oX5n+ufcZQSnso#0-#hJf`|D@5BE&SV^|NBJ93BA0!eeUI1LE-jDArZN z>8698_Q~Ro16>{ZQKjW(zdeUxx!Hdzm7BOa-IpgHlxuxequim(G-)1lP$u0#mD>N@ zUG&Pk|DZ*cNdzR>)iA!GVt-adx!EI*GNkjSFI7308Q+l|caNp(hAJLPP=5X=O{#2C zY|`Y=x*uFQ+B1?erL*UJ`ArtzK*V#v4XP~m`%V2S;{C5!xlCo5GCt15@0Oy>IBw>u zYiV@Zi?2N;+lRHTcO{`Xm`S>Kt5jIG7NoS@J3Y#wge}`%T}r@pTXEC0st^6GR=XR& zecL;CQ*8+MUZZl-dB3(-dV9Vt+<#^UE<0RX%(mpXJKUGN*lehbIBw(i#fFiE0n$Ez z&Zpff?ptiq?-ut;zkJ|b^)!wf#(h$pX3w}!x?OD>_sK%ao#Q@fw(ajG+dS?s{j_p* z`gw#t=})tT+$Y_tm8RX_?SmD*`9oFvfj4AkDa9^t|7K|*4XG?S?$7or8}2rh`>5L5 zCUV+W?xS+Cxs_~dxsS?)=gIbf`>0%aK0wNa=gD@0`^EDCQZ77CwjbOto)3_6-8`Lk zLwn`8dPqw3nvVOdebX$$oosWsZ@N=&Joinv@H^QSao==XeMoHN8 zRF5jTeJ*GPKSE{OVd=dB-M98$h3-OouR?f%c}DM52rv4i!YYnFJ<6!+Lm!`rRJRNd zz_W_j>~wtM)^=Z8|34s^%BYI`z&z`y3S@w^E9dn?gS~#DQaRcWnv_$jLG|GoP32X8 zs8Vj}9QN%2OXXUBsnfk-e<{>`V}B{sbISfwC_Ka@wZ9aqBJQteUsW0Rn?B_r9=7zQ zew0(0c7b$Ks;)B0XGpDwKb`a@1$Tsk&B3i9{Pb|MdIZ>`FNOu0A{*$z&v{N)rstM= z`CQ7Y7mtK#CIx3R6Nw3B^+w4uK z1&`^qcWuU>GKhN1@dW7lrshq75FW3OL<9JP1QGtpb(Z(~C!ocpQ}uXqK0OlMMnCq6 zU>N547p+{`@A0xKg$ts}mioL)7uQrSuR@&_zjIwOCmIfy%xMd^Z!l|IrMGNxZB?mn zx!)UV$1j?NT1u$Gg@BvW5$@z4Ty?H8d7*Zk1!G4rl9&7m?%KKZkamSbUFo?3qmJ~H G{(k{pGBlU~ diff --git a/breakpad/v120/lib64/crash_generation_server.lib b/breakpad/v120/lib64/crash_generation_server.lib deleted file mode 100644 index 864024a112c4a1ec00518114af3cb64e03d5ee2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493710 zcmeFa3t-$;l|Mdd3#8@IfS?5*6o^t5fjrvMS}-%or1?%Wd5|=1vEVdKrtNH#Oq@*m z5Fcejg*aw`RaRYfMb}+jbrlo^bj3iB@=!p0f%sfqUtNDb_NRjT*Zx1}+e7{sYn=BRRZ;NHV?Ga5A7PvrSiGKOnxGo+8mw84@aY$TIvT!MzTYL`D~7EHb%w$D`TndSbHlT zZy%h<45cRWxy;y3AT;STMWYST-u70Id`$!_q+%kKbTqCK=xvY1Q=RnJ4M7^IWM(3t z8p{r+K_#}SZ6uQ(%O}QmWTQK?*_|Wl)b?C@aQFBivViAX1Wg;|GDtK;nVW&ehNzn% zC9NxCNG!FPac0h1C-*a-5Z4tUtVUJFwomR4&6lHS!h~QK0JtDN%Md{$F*VTC7;VtW zj40T|*hD&)kLpBdsUJb9&Tq!IKx{&JCdY<$rH6K>hf_n@F(^|epU$zGn}|JwBT-XI z6PeL*=v99IczPm~MZ35MQVB^pg}Rb%h(h-pwdBD992_3br6(q`JDfEmX4VS}P+p;O zJ-1bj@~AW*N32z5^>FYNSVNtO2SP<6n;IcQmvlnw7Uz>{XlON*y6TaLtD=J&Rn1w4 za+5=>zHz~3oa*!D+~9bMZK%_jN;@a=PE~RX1dsn_T+W{#S<5I(I^|PPCf{LC9NhKC zwje{U=WGjt`8DfKiFR5@Z-C?8HA2%PCXT}45n>{O~}AQkIN>j)V~Y@rZAg5)h5LLvGqE-RYQlPre?1ypc7N% zWghfgC-JJW{THRQI+AH#=~bYq&B8jN*$Xhus+lY@J+|n@&719^tJlFb*=DP4NL@0X z<>Tbj!#n_>D!Mz(;WYX@S$5OQYv)Ca;UZ&I1CMq+IEH5qOK8W7sFz{dgvkxijIwFk zjJZt_${?p~u1)Y|P*EAR%ByT5Zsjh6&^+bIQ=`gY&sKKFSVLT-^MRHz$mCT+EH=ds z=7Wu%O@V{ac4Jx@oAb}$UzExPi``vFWjC2cO3IWh%cEK`Tj}7IXYytwPdO_>zLgXJ zt2q=Y?8xT!4(5hsPe?X5SH^^w;Oxsfp_OT(N}&uY#Um9?#*`FP67GiILWd3{2tg8| zP^fFnp#g0u4{>sdMe7@4)<_hMB5968Ir{AAtOsjsk)0-uqLHf7$jH{n%)-16W>(JP z{Eh%xZZMCZs-o2&6`@K;g&(>cxBwxE|}`J_`AE3i`Pm={CLF zV^j5y4bk`&*HO?EGzw+3q4R8zDzl60h1*dDGUS#vN^)qx)>LEABQi zP7|ZbxM`-8+U!V5xg8>vfV9{Nb0?-G)^DGsa&XUWxmy~Z(VUz(<7v-kM9rl9qLiU_ z-VRD=N*)<<7obz9ek^+sQi+?MwVI}L$jy4H=Y;u0u1sV;L{+BvG0COD(q)Tp2TEny zG4~$_clIR&Qu`cA9;eAqt8&7t5tIAy2^_RaSw~=zb1`29iYlY?KQC?8mx-b5IOe3s z^SNlSw_dc+feX;3Ush4t>2_ttGQ*Rj;~nWSIp3`h zD=Thl2Z@IP@N;D;+l)#r_g+z?N8azPbDH0c0gYCe88f=5P z>LAxp>v2<*m!@sum1$epE;Zv8EjiiJz(3ch+In;b16t+!LFH?#@#6oAc0ZWg61j0} zpWEEDRi^x{w5Y_{*09pJ$d*|d1oh&`jY2cyM_Y7gLEu{0vs+ZBIrk=G^W7_Mm7~|; zEVUn9S;b;4G4jq0uCYfwag6Cx>RcFR;`3b?K6#%1WbL_4T^eZCSGPtnt_e_}O*c^i z23=vitf73?7ELv*UT>`Li5XqV=mfiWE%j(uhy{9hX}m4j+TE4xj_xG)J~QNax+aWI-3ZC$^iZG8;9Pmb*#%kCX>)9ncIL#Ts84Pt_;SE{4fL>3t)ca%Uiq2}05 zKUiIg&;e@W#(Jrb0}~s1-DD=0j%xcuTd3B@hKGgxqMCjY>JZv_S7RoY?zW-#l1~eA z#^BiS2v${VQ&r8qtu&i>eA(UC5^1%MVF7kK^{D#uNK`)^EXt*Pb9|1P7#&RyXFy|Q ze@Rp}uT1o|i9W1gL9Q*fC~w}C9_!ES92*=-4_Ae>>^rC9=;xP0P`uaSmMlhb9G#hx zJ0Vo3L^%u6D5)WIh}-vN@}+P`9;>}w76mK`XUE1c=#U;Ruaq4`U}UO6B|Fxae%&Ni zij|Z{(mBCRJcCXY=c+=6NDIngg}V0+U9ifrf(j)vml%Ty$3Rh8byAS%OAijmvt#K> zX+XNMq1{!WQVEI87&%KZK@vY zRvJ5r-duWoFqiI2kC$SiOKed3(j#ds!YHx%>`PCKqvN_UD}=0@yMRU%+J;xFG@DKG zRZ`t#TT-#%?07!velN)!)uW+K9wbQN-L+k)V!Tp8^>v=};XE_}WlV%LamR&nM7e38 zwS33M0-JKPL-CrM@ERqRXj^uCKeFU#qe~xf#Q2auxsscFQaF=hdv>BK{BdqQh?UD7 z(_5cQr;j~7Cts&5MK|;0sJHVz>|GhZYUU%m{jcG~QT1d8BPD)MV9$1FfYGVLYfA zX;Tcj?B2>vOsYH8nd;^m)Zsy}EHh)HnHU?I$h;fj6)-cu&6K)`5ER zV!qxQxd^YVeq&;yx^@ljPV<}BM?oT_Q0T{sW`EuW5S!>VUy;TyZ>mddFQ5`V z23EB33_}^VOCWY1}fB9z&T|)GKZka{wtXT4huPlU#1FdaQZSDxWpE=93&o-;RrC z>nkd_PV_R2xxL?GZ*t>Taib29I`lauJZUut}B_jhq?84pzR%GFZ1s zK_*ZJ5s&;^?5hk*@@7^iXcwnchIZJp%?Ef)hzjSgE8aJ_H^z~$V30TF;?C;e!~`a} zDy@?-@@8lgAex@QSE{p-rCeR&s<%^Ro{6l~3QvB^sJUVC@K}~DHaoxznxaQ%=FtvS zx*)Lh9;Do_ZF_oWh6-{18yZ_NY4UrX{H7H2>wo^WsCl z89uqvcBC}z{j`cBEW`hNjmN+q^Q>mFP~y2fBJw8?Wqb zkFsC$9CR+{xjlp|GZ@0bwyIIT!W2t|lxCoDlS-i#)&Ay)sfc1o6YnHpa=pTSo9PqD zIn8PlrKZZ0W*I(%7O$1jwX-|_?!nP<+m7yNf?Q4OdMS%H_fXbRnLDvadS{xZF)Mis zhWk>^^;b07lc9mEvB}ZY_+&mxFD!2#9NLY(ndqX~wy~{X;6qL^aud+Bse!hD9-#`3 zIaWvVJe8-Fe#!b9zyi$D&ipPv_l(|h5#1V3oN68WV+_Pk$aHjYUrNr*>5h6}(NHH9 zhfdTo+IX9%pgfpTQdGGNh-*0vrq|<CXueMKmig7oMf&pjUGB_ar&rO_!1eI6SeO-DmZ zhuQ%$(E=SRU?)68MhZNR_Aspf&Sr01EO{@rYcoEHaRO>#A=>O( zkRQz89WI2%_lsi+Xp4Dz1wUYNM%5gv<;N;CjFMAD&?Rm*FXl-gWRBt1mrKX9nRRm7 zFV^Qck`_b!SmsJPhZ0EHJNl`;IIBdjI*B1CUerufR8>sl^^-EGh*eyUCa%;4x2my` zey4+01n~&@rO^*(Z zj*IW{{rpY!n9g@;S>tfXRKfFJGm<|ZO&|x!Z?&X~geA}7opnCAM%}eeq;V*ag5lpPPunnc4;?6>+8uvEs7pe`uu=YkO_3L6{NkwQ+d zdmt6t)VDrm#Jc0j_Eb-AdtXd!JOiT~c2H1o+~O00RP`**glqcylBU+&Ci*hKh zFG^^bGW^`SmXdki+*O_Lx(^4G+ORge5!T@VIV~z z>-ppqCWm;C+u+ncFDP3bvlk}WaUrOIR5y-b!Uz)%Aj8^E^C+fNesCvH!mOm?V#oay zR=Z#urJ$C=F(9Dyf~RwEa8=-nd=>LKN)%gAg-O9WPs_h1$c}<9pgdzzoujjSnX;>f z@0nTtv4v6Uh4#SliN<9?UJ0KvNT|@ixO65`D(+D+5^UOnOqEhw;yDPeCo85+ASOy?p?raC8XVzG{{!rZs2cCo>Gae|Fr~yawZP-(L*GKD!4p^kRD8dY z!BSYTwNFAAs_X;P7X#4ntmvpoE^)m6_{)5v`MVeokw?%wFUIc z@u(4(yDLJ?r2AV5p?S;M6wp1d!_hIo!nB zO!GX}fZ3q{`|mhCPA20aNclt+oBvU7wxnP{F(0LsF^3rEIj!(KIJIlu27Y)^Bq^}1 zH7~&$yN$W34mN7RzJVi~mAP_EO1MetR2Af_lJN#v6EOkpvtml_yFl_A!3w5ouU;|> zXHV$dt4)q#XXuT&!J%|~Fh3Y=i8bt7y=G`|s5!kO8npq77vL7HbY?UyEvwj#B|B-J zK=oWWovfNB2lKGjOq3Q~wpk`&@dLSY=(rR5iU7H~k9Eo~lULX1d3cuyJISn1yzD7uD=S ziT#HBS}3lt=E+eWPE~bTp)ndgR_0M2FfE!)Jhz&nFD#4C=UQylH5`zD*z>c6RJ1zX z89u$tMpb(99;#omkIy>~@%wbluZ-^~lCo%ujaysHGsQf3t!6d#IZ|xiQObkdACFb4t0DR9{Np$DhNwf3}kM)z>XG5lz{ z&ZyDZw%+IfaqQ)h*^$9{Vc1{;`@7_El*~kSGB=cVB$A9K;+^rBfl+GF%~Bzofpr=Fv@oFtzX$UpORk15&c*%HB1 zi?>9SP9%)Cb;Xz-=VLn&;6npwEgT-ZMZwks69O7>WkD+C*-gOxaTF9oQHZuS=L>G@teiY~;tJ zesmaH`@W&{IK80WMlTWvmrt8eegB#T8T0PBcs(SW8y3WR#>prn0h|cKTg3Sd^tHvX z3lL7XRzz4dN*X#PO`|lT>UVY$Deu}(54<+J9f*yOcVQcY+tl8mTln&6TQVzE>JZU3GHOAodT|$(MEK)jFVXRPI{ZFF3eFV0 zTE+8hSDO3o(u-D9Manq0ZC*5un=q6n_un<%w~>WP>^qJmnTJ`KGFdav6yq#8m7Z_e zRDK>r8g}+q>C2MEOs%v|X71#0l{0_1S>l|27`y5(D3w3=(D%Nbte6$KhS*vWZR`^VK%9LZu zwqd=m8kOE{qzZhr#pgcwtjgIbxsfoH$HRnH$(`W(Juo&ofvpjS2FC}7GI=_yB)mph zd+Mt5%);X&u*n}+T$}at?YEZFh}jlTT25cd;uaRx#+wXcq_a$BNQuj3V|-jxtjas- z(#+fX(S!3vTpgcPb^7KUUiDdL(z5KU&Nuo@yq94W$6P#$Q=R^0-y>O#``C9qR@_jR z8?}7C8wqu|SLG@!S^_z+}gyma;1mNFP~rdlggj;g#4LEC-WSGS<|}EB3>! zt<{2V67L&0Sd#ZV<)#K1>?0jzHV#AfbHu9Lo{Hmo?5_0uH72DGehG`>b2d~3?Mbrl~Q>s{b)hR!Jfwt!;`Jy{=G@PmDfb!CJUPNd+&0@Yx z01baqm9QmM1@|zB>U_L2UwoiR>6S=LIoRY-eQov-i%xr|qK#)WV>r7=jBT4ga@gX1 zB6zTa8$5QHe48qGUjt&xn4;4ZeB+eY`=yC5Uy{^s%caLh@M;ojOXUuhbSkNqS7rJR z!*(`W4trXX$Hu4e&O=5qZz=mjV&%mAB*9$^o_@@kLui$km7E{}Nsp5Q%9vDn#YU|KI>jrZitmtH&Q{1=)?<4S z*-5u;aw4A{rBy%eWBJ_vVp_#_OzQ5q>Sbp$RbEU~w1SJ{Q#;qv5PTAi$b`>PvW?Ns z;zddr2%*JKG#=u)`jH+uxf7end##Bg(^qN zP#yxQ*)kQte9FN7#nc@@^);~gl0q;x)HGmP+R8~VHJ))c!E%WiX#i-5nC416ei%lL z7rOZtvSdyW*|-a9FNYK1haNFaUcg68nYAMHuq5nwU8E&q6d-{ecg2>lAw+299!Uf9 zPm?2X#mS0aYR*+;L&`Gk=22*98Of9fcHbo+WW*YwwvMk z#KwkOG3B&-U@V^*>CX0|AC(!~8Az1WoBP-nQOQv|4!a?u;n7pwRN_1B2OgDYG{uyJ zC4EthUW6@4mtZvod3RKi2({g|^Eb=mAEI;^I62SmP20^!krD8=9-M+Zu5i~U26v=W zdxs{5u*u=(%-C>t?}YHf2A~cT#pJNBC)lOap3RY0I_-#0KXa#0#2qV+BOZpCa4=A5 z5tm%D+<7&wY;0J$>e7{sYn=BR)VcV(y=gt zD~n@#B67Nrzx}Bz8iW&Jkyn+fkPkf-ca&W06h%zyiAY`i^?N4nixfpnMPH?)o~hpo zWl^_>)Ki64u@%OmZb`|`gB@=n)LlVc{8E1fMWq?)t`%2NSKsu+3cK;*iQr!8sQ4wc zmGDYmy(le!&pMBXgJGP+Yj(xawMUN!J}3_&SZ9cp-QS~wC9IRM*1#5TcGI>-pzsVE zuTonJAv}LR8J5;y*49xTJO*7sVaO%*&Qdwn&L=ZZjX>j#a}DUP&{?0K&EfU2Cn#I%#C?_@F5ibo+g5w6TVAU+7BAgz4Ny*{u30~5NJ|`TTKxttp zPOSE!<=0_yahQ%Uu$;nV+d}RY@J_jf5y0~;uuc>Y`{vW&S7>I~n5g$Joh zJR?;45>ioyR01iVU9gmW55mx}Dl;&jE6U9C)MOoKqf=v_KcNq=>pD*&qDGers}UQP z1s<&><@o%;bMQ~_{s7jK=EOMD z0`xZ}^Rs)}^C$P^tV1G>T6^&P$$jc%U1}kpKe>-jE(~!J%30iJJCaUDud=c~e{vtj z;7O)d&s{CHgD3I)$$j}@_*XV9q+<%7Ke^8o$fi<4VnO?hD`onJYZ3sMNC6Lep@jpQ*Vyq&>S27n{nB@ z=dOo3x6yp$(PYp#P^ElU!_LdLjw_JlFsz+(ZO;UXdniR)#hq)4}Zj)LW z%$mmz>Ks0)&!8jwmTyo7gSKAgUrdDztGp`9nXQ=1AS7S7sIN}p znR)Wms502Im7S*jD?!;*n^^{5p9TB%*GY#g-W3eD#cT!L5%rkUyq~U z=wYm=TB>sE9@?-N51mxC3MLe48}4(JTfj~ZW~umN}|_g#^|s$0DAvN+@*5 z{+Em)t@tdBjC95{v*25W9Etj(?CgrLC)57%-Q3RmTM?BDbRPE2FJekxVDq~Q*;b~| z-!j?*YUN0QMRoFD4Xar@-0E`FaxeC~Q28i5S^omH8QLIe`x4-$Qdi8rRAfbV%h$0h z4_m~Fi_n%|wiU;uULA#eJ2k451j7n3RKmUl=2e%hmyt@ZKAPr%bME!#1V1=-)$Q02 zjZ-5l;mKFQq?swFoP22>C8aH;hL)nPK}J7}PDxo0Bj(ctSb9*31bj=&t^q+=_a#tL zo_(qKWVSl38ygyDZSp4^#-e4qOp0=QJZI-b-n4a3;tn6)G2dpByt{)z^KLx)Ks^Y} zlr+yFD{^yr9L$}VN9!QjP(lpa!PycQZ;gOI#fKXeXV9VAWu}HzA)2Xq=EG4wP7Ts$ z$Qe&=;Ox{B+${0HDUV*LLrG*Z9_1#Vgy+|$kEq}AFgZ%Pj#8WFw8Hb?l)d%>@2FX= z{i2l7?c!P>ZJbpjN=(VuGO-CRGYK{7W-D>G1#(&iKdE>SQu(un^leKOOgURm^;$$n zxmuAcD-|uG+6CZ8EqD_FpIAz;{Fut7!LpZD_8llCc*kgC91^ncha=0v)hOA|V56}D zvG@dSkAqfOTb4$}u%(UtD$sNZqzV+3@XC1`6P1u(b>*^xI{RvjJawZ5f*ql=mcmru zQA%N8Uqi!5`SRpQ!x!aCywY7cNnF-uftHRt>4t7dSG+NvSs3oPMQM!Z@v3;x`zij! z?a{pHs^g~v4&x3WUmV*?We*<~5p=Ms&9s;z4&6;QHkr@1Thq`D7N098IZr=jcId(6T4)IA^-h!sG7$q>ZWb3)K0R^fba$& z$SYH^jT`$Ctpgj|`*8;QYO!%FY_eO|n&??mGdv0n{l83W^edOscw~fteZ+Wq)=*mic5t0Ed z3PFd>*>kHVWqbc^jcVgOhOUyquVp|8cCV<&3$gcFR6~MOBD$-Tyl*pCQo7dAe(3_x z;viru&Py0_oYR9D{Si=KVSA}JpHS*76CY>E&F!UaR2zq-dslEU8YLDhtPW za7YC%Q4HKq^4XG;%`up;w~0ZGj#p#IhYQ#(N~5syF0vXei9hw?$TE?*5}-%T3lU>^ zb`Vw&#@?RYA_K}ot$?u-%NHE^#&EJyijtKp9cpPykWMKq`R3BQw*fBopiA%4UOTU7|eQUaxZKzt7OH9=>uMWMLhbGG>v-6*9#ksA9 zbS;zVQS(Ejt(AU2Kf&x0I+fdEsgyF%Vn+GC&XhY~P^xRNQyX9b&B;|8eMgSUG1`K1 zwHTHI!dF(YdvDKpHR)nT0`t-|1C+Wna2REEYgB*&$52dEzyONEcy%x3v$kleVfA`r zeNW8jN=7GmNWY~X<2b|uJ-jsDmTc|rN_IzgrpMB`%#h>hnq;!0ttXjGMl*8S!11^> z7TvJEJJFMjbwYDt~t&fgic%!90-n9{bdVC|a zMZ3Bao!#p@<5B87(0Os2F+rE6fRl7Q+LLUJwf3}kM)&aSU^wxPXm2dunrt(=tcjh49jsc!z~2o43B3gcy7ZPqcduBwyifhz&>UIGMD2~|9r~A?q*~#2c+7TleO~gCntzEIM=)h!VxDCAIors=j>-r6C>thi1pH{OwyB+(I%#dgr2N%}Kl{?VY-5$!R0I}*KdgHz8@Tuzepj(6TNL>`G8T@v3^WA5>~v{7B1X z3*0)CLQsr~yCsVWTgT*N$&-py=606WXGYS!gZW+DlntW=lMitUSW(5cw6i)~{4YLg zm)l5cEp_FJ#UmTIqIL`<;@HdmHRRb>>(E}%iErPzD?Kval^vcONozBOs%#{>`!~kA z+uBp9D388^Sl{?iF2Axmv<7gb4cvM7H@XIGAk~%VPQ(YgdQ$`a?R}~KjeYI#O?Z7i zm@|Db?Od*o84&%J&W7T%x6zi_l55}6*4|4is#1yW^*w!EF|oSJ39|7N1jG6)xNU8n zPK+pbVTeWDx1AhZiuoX`Zyzib7FZI_j*X!yNe`E2h8;xUXjX$tc1#|*Tv8sXjtFkz z8O$?qt}0~6cKUNktWf98VXVo}3f?Mc@dN>R=5{4=?!$TE@$6W-QW}tMY-o2Cs8m8i z)bI*(Lqy8fm6A_ES8lUuoZ7HxeEZ8IO?a#_vX^$gE@4J$4hZFOLUB> zcDC;uO5?ox>{wfNI33aywuw%Hzh@6+z_QawOJ8~@n;RBZq-UJE_()(Plsd0wq4W79 zk&!gE_b9RNgQ0|REUw&`6*{L|*p`o3WKH|idD$2aKv1LTKa6D3V|nit)a;W}`v60O zBl9#pdFr~Rx+&VgST4O2!$IksP3boeX7aJI;Z~eQw0mF-2f%k{d(&7zI<_;A7oy7j zL5rxZRVSk1(No=2o@_ppEzvO@B10(2EuEcIs@@$zde9Z`8{8Y4fHy`u!a|K&Zvyb| zrf9K)lZ5q_Zgykp_tJ>=&6ajNoC~7 zcOs^eW!gn~@J$8CEm4bk%5VdU`WRX8UX%~quzTD^qZKkc6tB5S9PzHsWY*1=uc(e{ zfjDx|wrg-~XF4UShBcYxtSabFqfN5E(5(3``WAF!NaI6aFO{_x+^|uojzvgyHi(I; zR9kj*d@xVSC$r))#VVh8zJjdY!?aJ))3Qd&pV|@}iC~*`mnkcKu|L-Sas%i|uH@l4 zwv38mJUx-mWr;^Idld9;S%Q2FXi8i#)1IBEO4hiA@E}%h#+V+)97j@PqHK8mG+u3w z#Z#D&qV{NgE}cI1ngaH`oBU?YnxZjO5{z>W zj!mjTv= zpxnu3%~_=Krmavlwy_E0SnaLimairUS}sKx4`xH{W z$;|Io3Gk`dj=R$ItyHDgYUyXmR3qI%NOO+tuizr%5~R;bQzDFv*Z<(G=ea7m<<@2Xygv;7HX*4NBneD5(Lae@8H-NJ}Dhgv~>J(nH1s@2>RFZmduT`Oao|c8rBLp%cA~Zj61pz}_D&gH%(rTuyz}ookXF zi@`KX;mz4?A^!_(q&632PL>GVU|DPuirHqWm$m}4kY$L~mVKE(8ALqt@5fZIAj7x` zjvdH`lDk{tY;eO9K8_RLXE-sA}+Uou0DNp#D1PgOXaP)Trk6p%7|f}2X{`uYvjxiz>HR!i=33Q3QKf680{^R_?8|MX?vfa_z$%6cw+d9F2)fe=NY+C6>F=;2ON);8mZ ztZxNC!EABZM`;7RxC|yz8hc7VoKjKh;mD%Zo3eEV{R+`x`a1?ENAl`G2lK3jl=ln|GdUne^i^Y`nuR8@i{NnDo1%nc z3e7rOB7_q5x=8J$ouv?IIEB|LhOse1&?|*B9!FYE%|7jvk;+yU?_(d0dl*Gw_wa( zAUFM2((cFZ?xNU@eP@~ysp#++G3H~PI3rwsFT!P=CL_qZqk1G#)*&-Y-9E1_2xEV# zmU?X7m>QqV^V@;EW-Bu$hHvE?-89QvfmyW|def!`TBrm^iC5z|lIQn9w9+rxss*rs z#%d>aFY`Q9lUBx2-;!#wCruN*OTOY z`;Z=XfRpqsBS+2fMTv3{e?9Z1Gj?zCCQrQddp*}ahEZ;_E4x&qDk;Brx#lCS@R6BH zbCu<#!%cH*=4 z%r;XJugX_b{#B%iCX`K>?B?qDKc*&34DLv$_6|)9Ve_QTnX%#Q-U(632CyIEMDeEK zSRDjW(Tor`(v%`AqLsYrQ_NAQnXcHfCup%NsFb9@*PD~gp_@1DYX|)fL@C&Di`n6 zM^xCcan}RC8Y7nsP(0-&r1v4=vQx(-!XzfQCMWXQQQA5Z`|IPx_pszWG`!Rq0Oh7j z&91cmxya35Z={5pX!68I=I9ThiZZdy+_3jZN^elTaXwblt`5wu{o~nuWbbHtbZB&3 ze2?$vZ*o^S02PWXx#W`Nj;nEHW5dc-m#%DFJf%4-Q||Cp@mJ_N`ud72YAdYKT{U$QfL0St=KS_}#x4aUzvdAH|73 zTtj8T*<6(f5AkNUyyliEF1bXBN6N-eij55ot5>gHzPxee+SRL95_sE^;kUFc*zo;R zH$MJAB=Wu!B79vuoP*UxImzpR1(C?xUZZ}=?HR9O|f$5MqCx81mF8x`K&lSMDE`;77a0h|;iNr0WxE}dkg!_xO;g9X| z!_{uHfe`e=ourAY)5M*wfjbHOEYrl*YvLL-ahGZ03{BidP24t3+=wP_pC;})P25eI zxc6${NPj<~iTju)?h~50+cj}_XyWeF#C=W^_XSPdtR`+w6Ze27?ja2v*`Y6M;vUz; zeO(jxqy}z9Bog@!aEr*W;&R$&tDPa-DZs1_!JPnHRAPu8U0(L|MBMMtz!AMZ4II(C zQUgcyhBa_RZ?^`H=eg!H^g zZ!Mf<*P3wuJ*Ib#AGo}5R4=~*+|v^4S004>PhkFA1NSFjPTWB$`j;=!I|G>WLU2of zyGUY)9$jAfsKxzDfoln&N4NwqSA^imzuyYX+d^=pr+*L3mqKuTz&!@cIXe-+h2r+i z#|5~*3Ygbw;BvscCj>|JJ^2<{cY-2=>zHE_=W^Rf{{z~z@N(Q5)`iw154 zn7{MH4a?deiJSy_{{qaXG;j|9^MnTOC&2vH6SrTsdXdOdq zb9)v6Tz>62mG4u)9FaIbdJVuW9*;!U;zO4oj_gpI#4r$ltbAB<`4jGM0IuV80(G1Z z?!CCbADA<80_T*AMen0{oCap;guwabcP}1a3d|=Y&aa*MGH_o8=3RL~??w3X%Evo# z|4ozNZ;!zFrTZuzUk=QP!~ia5ex2oeIWP%{^ON%sX!HZ~S&8$@$9sVLIxtz8gfm@B zexF1_9{{HJ^~9aO{w>3^TY z&NnbQU;p6m@i+s_kq{iI=u6)iiOk?bm!JGD!n2P_3C?Br}<_%MVo-@A|JtFfVU|w;Z!1>AfC7`zjnEb(DdN<+mdx3f7TY~9P zeS59M2&A|C2)9QANA~k?f%|)j^^-H+2=wj& z?%?$zO~3MZ0*~(mX8ML;+$uc&JTSkOxCQv_m5BD-fctyk{*T1^mD|<8EqH4rlEQ~BKU^oC zO#pL`#QD{aCBQu>F+`6pFFklE?mwY{I}NyB0asHXO8)#2?hIhg*TAg0SbQKLBPaH4wP`?Aoh< zive@Z%>w6_?(um14T%v*?|hKGdRhZ_GI0N)fg^kMD-9gw@6VdJg?|UI?eZ#*PCTy# zu3uvP>M!ZR)xg{wg8K+??*XRm?IK~na$ASTn`ECvd+Ep+~qs0CPkGxA+~X!}!qUmk*-%VqnhGz+D8)Dh*rWAV|dmN%%3IBkKTIVUh>XJWIH}|`O)jZvpv9k zLE?h+?+`GLh2W?>o{|_!mo6_oI1Bf`tATqlaDULikzSqlF8r}wUg?sazDN^yt_F_M zy+{K`={9NNF4w?Ox`qah((Tg3ZPCDy9U9WWQM$V|aeFjy+d=PI;C>{retO>pT+O>9 zk#2nG^1~6m5nvt-!PNoxU%>o-66aSxUI5(j{}73si4R?VIFjFaz+9+-TLsMJ8n_N% zdO~niFRzps;*Tz``aybiwFYh&xb46_AhCXOCO!DE2EBg+?pMIQ_dN*U^0Qa%cy=2w zzYD=peiy%&C|Q?RehGK7Chk-X9LettP25?UxU)5J^%^+RzYBnClvqDKrSe>-L62~+ z*1&N;9ylW;-A2&s)1Y@2a8tm&FN7Yo`yU48b~kR{@L+xr59LL2`Mkuad(pav=*8ns z+(~#i2i#*4OZjJ<2fbfv()%57HSZIt2GKiPV#4@4AGl@>dRJ)DyArsx2E8dwdIjL# zsX^~En)JQ^+(R1leyU0DSHS&G2))x$2xtDIDhcuJr!N-)w^m~P%9q-i&6@Of0yhyt zkM#LwO?vMJ?w>>GvEFOadknazL+C97f6oGQ>idQ4$lm+O@8!TWN}MUboU>l8K>QwH z_BwFU=*6yjxg5A#BnCmgyy`E}`wVd3l~|KM7d_I0-vD#mtq9;Ed+J4xa7%AR+m8=j zez+)}U36#(B{D1~5N#<6QKp{vMGSkz@bz zIPss*N5Y3LQ!XxgR358^!4|-n&<`Fl}MUU#u&m{&y zzWns>H^BW#gWiijq$mZ`I}f-^Bz7U7UiN_a>(Zn*0NkJky*F#pyB@f=htMN^xm}aq z7l3;xgdXMhr<(MB1>FB=&^z;=LDY8nmG3#gT_mwV<`yz0UgwW&qp-JyI!2L;s-i!amRu~BSmB)F&T_UkT<3R6i{{zf<|7y>#xBncI7=iR|-&Ww^AaK(X zYx3vH2g&7qz}zlzHTcc>@W6c@n8!kJQN(`=m@_|$0Iphm{QTz(F#9FWV7lBm4|={dL%B$ z9t;7Kb<^{(r!&BO#zD{9o<0Q3&n0dV`0%oSYjFS6PofRMhprRwiPjaSAqx=p4 zla{z3IqwJNpqrkDoc{@!M;!Eu;Mh-uV(Ekp6PM z1h{n$dd1~Sa=B8IUIw_y5PFo4w`zOpnBwdg`GEqrlwapyyp~{|e0Q5*MTgp9kh^66dD}WY>NpF`NXCC*RI zE5P5MfO+|yBDa2ajqr0(XJLn&svy57NI5V75wJP(8{5bB&vxM?HEsF!wre#r25v z>iZI-a>M!X;O|$!E&QB7`PDbd$H~B)6N009c_A?U66aShiNAxu+#+#7a`{(aJ|l5{ zawfh1n#3T;mtVO(4ct#P=pFZYMJbrx$-tc{u|fP@s!6W}xXuuIR2~^%-sr}8*p2r9 z^IEmv227V5=b}gDv0Gx8 zApZE3$6ny3Lg-O`KLE^U+&B;Zz6Q+q-8dJ2MDI_)oO+MoE-1g30JF}GbI~LDT?tIa zjq~8|dSKq}#(B`Y9hiIFI1hT?2j;LF=c2a^{4M?>>?uBU1?9H|m`*p&MUU)XMq-#C z{`i&e>wtS>2t6u~_W<)rH_ju!UjgPRH_pW$mB$}|Ibjw7TtWGL`7G8c;6s;*bJ3&x z_RJE(y8QCHc^2cR_|O$Z@7h_0n1B4}O#^p}#QM>r{C-+u5ai2`-rOwa1Ms2Cj~?as zm$QVhE^lk+1JsR}x z)}(hYa9;_bNBKRhN$(H9Exb=iIjB6&kr;vWufG=nw@QOvzb3t{!0ptacTkhw3~=ub zp-1)OPGAm6+yeae)4!*I`KiR2^7HVEkDJ5#2z=-gIB&nWQ(^>Crt7jVWdF7TmzCHW z{AT_xT_`BkH5vh zy<3Cc3xWHf29DCb3%H+!q)YP{^$*~W?P7g#F7M=d+zWwgmRO-z(bFVNKdO-DeP^PKqdX+EvIj_^eoeJEv7p|>uWBr!40hI>j;~#+g zpu|e~MKAWieH@rOG;sF-^MDJteEITA*2fab#QLs8e^+c{oAIi1Q(gUSsZH&Dmp86y zXgJs7d17OGUuoZ7I7lyP!91GLf#saj}KJot}A`P&h#o8cb0hI22CL`(z>~f0^g<%t)J@9DF<%hetX! zqpN=t6yK#TJ;``?tgF5M+~tc)KDd>!fx_Dd)V^^@UMzoc52P`NaXRz zX-I3~KD^B+zq>L+x$H!CM}GN=z6+N3jH3c%UY{A;xx6hqI-VJ!&6*<7eq-vt8k(Qp zvG%OVMTNP;CmT}_9x;y0?pXVh*2zC43$eOn;o;^djOlp&@}B`8IXJuY9ka&N{S8~^ zF2c_bqq$rZ0gV;Sv&O-P@-H%`o;|X62}6y8vy&$rIfG(-88KGO5n~r}gqI=|bwyoa z-1Sj$Eiu+Txc4+;=A?vi?++Jx(>l+jb+HGn^NhQWi0jQn>tti$L*8UwW|FzUBqL;E z9E#Vk_%nzk3Qvi+Bm-lnx6U~DME-cAaH282LGAKlpc#q5)(;c9*QLAqomt)i+?X60o;CHAgMNCQfQCLN}q| zToh?RC?;4g+&gEuKa|5n0jw>U;S;rp8oZ zmNKJHC6QYEhMM@A1^H7FsPc&;v#kd%TM(K2z0f-)ol5}U$abDuw`TAXn!p{?hUmJx#CJVo5Z$6To-oFB$ z2EpXiy(>72iRtw#5;NUvlpuhp+Yz5$O9EkGe2ZZ>C8qam>6(7iHhgyBGoF|p+h-Kw z^$5J>07(PkeF)#c;p^(@9)8{=f6{IIe3$%5xAF5<`IBzr=SSpEx{aT=;cMw6*T07T@jD_dG~nH{A1Od^OJ^(&Gr=>q+tT1M&4Ud?CuO@r5YQ zh+p*X5pLFsuR8Iy3}1-8Tzst%Hygy)8u1ksUk1Jsg-1m>8HM-O6T8O2r}G=`z6l{p z5-I`#q2b7%Vidk+6dvT8$-*;-{3Qwxkn!7M6sSxK zC{r@gu~h7}sksgi5H)=aA)%Zz;OS1*kPjgw8mGGvdXVpZ1EGgF^j(C6;Wi3y?L~A0 z>hN=XqZrliHICoc-aCt@>ejdl(=f&nCixPC-p?VbWGAzMUWbrK25kmR!l~0&)Ed)Q zz%X2~44>urtUxVlz-JA@QG5)1db!%q9EaGDAXhMuiwvRCp?xX3KjL$L(&zp*zCV2` zj0Q|7H5ZFHU*zm4p}6nJ3Ocoa8H(zu9O5k&<#nh{*q}pgb;Rxi3%QlrI!FC~LClIu z2HT2ChNO*ck1^c_L$Xj9a9c!fMU4Uk@T^gQ;7~Xx7}IDE4|UX1V#d0q`Ln6cH!M9n zPDOX7(jjBr*^{XFcw!Wmac zhBI8I+=HMoy@cvnT z_H-WYvC}TxWK6xew>GyJgx3f@4t4ZGpCjZHY&LdGZ(akx3Tz8?L5TEadUJ!Zu4e_2 zv#AIe{1xZ`d{w0;Atoobpb+9pd-*?(z@+ho;MJ zx$3{4tI5}*R!L<)B#a3=;8aCLSyI18TFlZ(2yvypt!aB<+x1p9@1+Q%C z{@&Ews}S$|qWBQ{5{HPnA8_b;^WFy$5^^CoR@l`?5IT+v@f+qnW9F@E@Pn0v@^&ge z=e{-h_wbCryP`^C336hN_3eRvq`{yD%$wC`^#{O;X&A(61^hDu##u1@`{=nS- znj{6rRBJdpxd<8EEFJ4vj=C=+aweNlJJ=LSAg1 zyx2Fe7aNVec8;3-ds#w#2;I)1Yt7Kd&5%vgrl}M}CJ#+Lh%k)4bh*eu`8?Aw@zXaG z#3k)W3iaR2Js|GJ4u`~saQQiE;HPaB1=bV1(0Y$I+W*I{6& zY4+#T#u+p3s253oW%|7wl8F5G=+Oa!6ux3i-ywPn)Bj$77j7}8aP>(>;f>1*leJxi z&(7lR(z?jf3#k847~P_ZHCewciBj)J~BafRENmaYkamQ+Aq(i7`pY(QA z<%7GU+NOg?$N^IgmHH;vms=}pCWH?{byU;lCV2NVIe_ z2w5#1XS0ELc-FY~-e2Qce5Q2^s!0?<+4C#(z;IpvIDRKlL@1|s5-xVv7X0P$M^U60 zfV^cE3Us;ndHH{WnS6s$xRGRc==ulo*XFm*PM$69vDUNSMlRc&xJlNW1Zc1yH+LR> z{tf4?6QNIVNxcT4PjQHH>8dTp%+18FQAlh{&cy36Q1B4))PP%N)fdd3DVhB-G219= z6LEQ1)-38tp{OYfDwoBT?iG0YS!QJwLV~FjLV~FSce5=v3SZ4HJ9I6HL1dY0veb_lP{NX z1R6OEP%~0rA^aFZLb*u1q9^la^Io#>oqCVS@piN#8UGqtjTK>$gnKnp4SfZt$efqlDrSb0?1sLaK z;l>+)=t7UM{<^30%L`vZ2M|^2;4Ia*70IRXFByezqVkh!#g2T{D0J@Et@0CCH>q z(4jnJs?6x;7ptGmh`Aq=k=5eZv5hf8=paP@xt{Y@oyyx53^dp zJ3YLh`S(WQd*oD%tC5xKz$jM@QLE5ko?pbMS&X(e^6(4bu1()b)=1!~)_RV(Qp35A z{GtPdn7V&kYA%D2D8erwBt}!u2Bp)v!mLK<91gW3^fVX$HiSfsn-CJN!@CfYu0!Fi z;~*p&q!}w*i<<&*IznriChL9F8rd&AMOuT$sHogZqj4sq(Mzqh%DHHrYsJsQR~S>* z?2F_#kRTy^tEba|o(uXk7&lmVZ~k1P@OC!V>w4>;RTw^4ckkqH51)uyasa6v>ECyg z8CTQ*p=q{?QRGrbx6WOHxT1BZmQGZO0fdADb~8f4*&;O*5_20M(dDt~zpiuAD6+51 zE9T5#S{t@ZJ}P1y4~7nZ*~>X0Z&iLPF$kLdeGRa%!A)1$mlVkcu19S4XQ| zqyP}Amjt(%+!Sia%$-MO?!{C47ez4gJhi_L!@>Ak7RjH0ujP@+g&6q4@E4pwHAYX> z_lI27xX&TG8*7oR17D;bb;KMmdPJHNOuMK)0a_?ja?vl4F63E=@^Y?l=OR?kAzBFV zT~4DFAz|UU&Y~hmzGEd$eQ@pxh~76mgQsGLB6uzvlw<*;W@ybHneJG`%)p49CPocV zYxC$2Pu(9)A$OajFjAPKu19-My$G6ailBaD`i-hCKFdW>7}KdJ;D#<3{>tWFT`+j! zjyf1?niZ^_13vEK4AUs^w>d=4r|7BQYKFdIhMc4MWGO^7hj*2j-ddZOo`A$emwM^u z+2-HVl-0M%2XvfkwqcerS$@<>JblZdYJkIwp+c@zvDNG)=E z&5=X$6zBgf2z`=6w;&{H*@qGO556bN_SD@E;tuM_Q%eti2LTkMXrzIOG(QxZ>8()( z+D6lZORuB16-9~D<15U^>?<+i9Yk=ZbC>MrB&o0bIFw}tc`*3qp)Zxidq0lq}L3QZ(F%w9mwjBRWxpi4J|6+-))eI7cMr>A143Wq5cRUZ$DwNx5~E`eA@mu(_XC84jk=FT)%*n4HZsJ| zGJxGC=Pb7z@Va{$KwN5+r7aMYwL}M#JXqH9q(LJ!%P@vmOHSxQV;aVS#!X;pQ*+A^ zU9{^YiYTXMxE8%^Vfw*~UXnX!(&wBkH*wvn2a$Kh32k^}{N(D>@ljk`W3*9#ec_^I*LUtl(1&kK!1huBesCAsk4+f@^cn1P&!#CF4C|BaMNLor_lH$EX_C%x+M|XXJEeSY$(UFx*Rxo!C`2} z*XZ7f$-)B|DH5{e$F*1!#6K~onVfDmrmsN`C+fg_U2b8b@Vy5XHB)=F26NG`-8x4F zD0uaVYqtk%Pi=A zT9*VT2J4cphL%!>Opa+{bt#g>cOAZHR@N%N^Ke6OdND$x%-16H4(4jF}R>lOJJIYOPI=c55)VdDC8sUg+EX^zrwi! ztWK=}OS;PZMOf$ISM1A4O0~{nKPfr0XtllEYb_}{3%!;L9V|P&+Rj8lD=N`s1JXxEIF3T+sM`L-Q|8SB1jEN%TQY zt**;0f;vM%u||fJ-}$rF|L07Mrlk>UCRWRHDPmrLC#jyg?uq;bg50^JsL-IsE{sE< z3JHBwU49ZR8hvTWr?07dU=c0CpjkUsv{#y9Txp3Bb;y<0E4hB=UT#n8#IA+2zR6L! zqp_@>=83G9;OVbCc=}(H zBUlKonOGd8rjupc^Lq4pe#QgcPbJnpQ)GZHd?vZ>vBc8WXJI!c*KU|ubOIKu)VX0? z!C|Plu~_`Tq8eJDBs*9?|62%_ePEYyW3#pH(8T%Ftf5CH3+PB5{@t5keqeJ~3r`O{ z@T$mUE&7Gr)k!#(Ec30!K#G;hFEK+rvnMiv%yv`h$X{vfz~}!?EECK9PzP7Sxn6Q^?>}RFe})n;v0q_g7j`UXLt(kjsQdPehr# z2O&`=cOWEuq~pvoS^C)pH`L56y>kJ$M(LuVMMb|4FRQRmVs}E|J^_F~^V2A!JHKNJ zwRTbS>|qR3iua19E^Eb024t^XFBZXmtl_Z`@k)^z#wNS=Z4bZBxDZ*wFf{5E{8hNp z=u?orTbx9V=_+~-})oTwl&nAEZ$ zqZ89@P)#ssHXkI-9BcbI2#K|K0O3FP^=j>Y9~)AoVXS-crXrA0z5c}Z~I_5noBep z>;72OWYZwieNe!?t7Pkq{wx-Rb63}yFKS`Y^>yB)BJSguRuh!C@ELeoNRUY9Pu?(d zdJW$ElB0`eQ;b9widNVzJZcdZt#c(py-T5=Z-AT#cVY(Ms3d+2`VmXxYL?03H z=or0s35Nuw^=%r7jdm3byt;=sX==I({0?7&I<4rnV6aoxZlDaj^q^`v%`nKmuvq%Z zD_7-uRn+?fYcU@L6GWDG>Dkc;-s(JXSxsc}4|6-F9FOS9j;YIHu*(ddvtGnRkjLdP zz)FwN2drtlTUZntyv%U_j2u$oDhlgBW%g|p!txkR zul<#As8u99-CB3U0-0`nCTe@v1HzzrN1NHjuUAk~oB$P#OaP%hqN*L0tWI!RURk9U z38NDjV-PQnoCMBm4Ph2xVmMqL-0?%J+(k4~&)U8#k3!QeTPrHBi;*HJNER_Y{Jm zMWc3vu&S!h9sY-XU_eyw51Aq9Zp&HJ%N^|=DkQ``ql0(0;#EZm4MVl zS`am)O8PN<#W?-hhZ@DhQuN2B1)?p6fg#^Qs0)UGBNwygk*Pj|{2j;)Js9{`!rhrX zOwQ1qr^QT7-8?`RNi?Q_bc-#|uS#$h?$ni}J8gL^*bJFUX0xt_O zmWp*d9I8d=6#QHmvB#jcP+ixVF+_-BoL&@z8VhwDG-HSm#W+jEK)-zv=^iffThw*E z8AF69#`3@z(`F12q8P6z;))brU2ipGh!DkiWl;=TZ>6q+8AF69Mw5tfdTr$NVSF~8 z5IKG2@sZP;>c%M+y+x$188fyBQS3D$_R`}cONUR0EJe(vO($~9OKdT3G-HYo#eB7h zX_Frycuwab6$RgKH)Dwq#oEBJ&OGP1$g=IH|KPOo zQ@7Qz4vA=W_<9q^Ivt@+jHM?FY}~)gq$)y0wU?3S9{2V$5#S58fiHSW*K+(+GcNK@Iol0|v8e9UaZ7o|oY`#qwaVv6+$ZRb!FA^WukKd2$d za-O30M+h7E(9=PF-HK z4+z?T*g0|L&Ej6rC7SP5MDguK_bnz}0xDVf(G{{FnuiE3FE6@pW4bkLJ5Df5ha3rY zy~iva5h5A=o#2K`hgzaYM8%+|0!O7ILR2~;2B9v;M_pdD-{r`uqDwio(zj9&bcyB` zMbtz(_BGY`2x^6XNh!DlN z&59x0aPmsj^#L=62vLmBiWppCwUH%#!rE_FQSkjiGnNQZtbY$o=by|NB1AFnvtr1+ zblKAQkQqaSD8_?U43E70vl&B#D8{3qdHEMJmIzU-uiIi-?Oha4)b(LAmIzU-ZwGSs z5i^DeQH&pm7&eWei8gh8)QllQ6yqm>F+Og_5Fv{3UqxKebb-45&5R*J6yvvnF+O3& z5Fv{3jELdm$-GK6oj~4Z#ug!p{pX@Qt;bz;eaeg>LKI`san!a6n_`vE$5a%2-(kiQ zA&Rv`#3E@+WwuNEGiD4Cq8N1|hRy#y&z8oWW(*Oc7%$`)+^Xb--BK~=slbul5+Sl% zA_k$R@llr-?UxAJ)Z&*!o9KQ-5yrO{?Q@y-ndcoJIjir5zjk|T#HZz}UCdY__!3*m z{<|p+5u*IAU}P!2S|i7x^j30+e3i@pfA-D;K8kAn`x`@BP{fA{P-GHteWat_2ajSl{3CoHBE!?4H!i-}|0V zb~F3T_xC)f&6zW0XL(7@f7E{!TKxye3E47|}}DP1p7 zjzxYF&()l^8xMs_A_6u;8H?I3$~BXGuI6}*DtGuV@tHOMWl2Xto!BLBdC8|B4AgTl}m4bXvbbMn5=~jgK77FrvzH*HJ zLB6L6-&pJROSK|sGlK9-K5xNGr69jYYQIFOx(M?t>VkZ}uAJh3kl$kVn`o}~v~C@- zL?t-Jslj6ZTupG)I%0`hM<{6K6~#-XAm0^6N!@cbC%zLw_>IEh5y~n42l<^VO6uD4 zy60-o>Qag&D&+|Y70+vhSR%zKLc#MWXD{X6`@W!6Vu@5|u&UEO?IQaWZxh*bQv1km z{kM*6JF(plTYW5MVt^tvE}X<_I$LrvYslUbBZ*4Ow0E&Y-p^ywJt8Yw90U1}o-bns z#rp>@xyLrrs_|C^re1g~N2WHP$4hjCf1J+k3A_XokCWqQ0jUZv@`X_Da)yhQcshWpSIYAZ zx?WF2bd_)~0HRYl#S+!)Rk~g&&+dd3oYLffazu)oSwZ=|jh9r}B&O??;#6`(s?Yhn zM0q=&mxv~18vawQZN`ft>?rd)82^>$Rl3&15|vdfQ7*(%nqJ~_c$MN9!+lO>Ime}3 zi6tt_om>L+X>)M9ZtR zSFuE1UuBZERBBgu!U|5~<$rQSig#H-ZTUVgsdiWYsm*FQ67{57Ucv(Rj}^3lw6E+h znfOnB7t7DI?oHi)#1fTEEKy9cl%|*5y+Kz7*1n?4DwZhcA8~$JA&&$vg;k~1S|OH5 z@i{9xb-;13?4v}}8ZjzT2{$l9_Gjo#rdPE$u|%40n54RDSQTaYn%aY z7wJ$b&H%4hGW>sCE5#BiBiK#j_-U7R5nSAh>{8r5vdg5cBfG%EE|oieOu(!3Ces_* zgIFRDt%ZlqZ6ckEcZhWEzkQ^0%65_VvZ0?*Qv82YtHlzj+q1e$_tude`*)1AyRdad ztD{_w9r0T({ zPCK{6o~(VO{e@e}77#}$Vq2g*^<$30e?f0Dtf+JMB>{k;hUd-FsLy`m3IvCOxR0Uc(CN6Z3hAdgMvGr24%2FNM4h zRbEMVJkwFNTK=c{rBak~F3CuKqO^cSGi0}4bw+{K(U%a#_#>7mhFGG!34dvNDe<`h zr{+kZlJG%2S1eJ@E#y+Td!f7azSngvmPoNUq2dRv5KE*u*R9~T-Un8dHfV)dBE?0l z;Ijn%v52G;v{rCb%VLRYN+^iR!%L+g-%EvWi73BRD^7eTg78Z|Cn~3!G&R?-U+=!6 z*rnR2ODdMAEH_CNUzJNIc!W#wlU9f&QrsaF;!LKmHaBU7SR%!JtO%=3!BK6BC8|xK z*au7Q+6?mji0}=P5-BKA%{cL$2*NM<97UK+L4KcPzg(NRqOPt})Apj$&$^^yiAwss z$PHa<`b-=JD+R3;9FsGBZ<}=~#S)crvrxFMV)Sw;e$@)GM2f$JBH-Q9*1eu|$dkSsGjvuK>8zZpvvL|Qr6J4S zim$4zs*ca0!stZ5E1>$HFw!pym=^jifs_bxO+PqPU0$A6T3$9YQc^azu(YI@N<;RF z@~V>RlJc@hX-QS}L6Z)4KphJUt`w?Yt#|)K@(!(1@7x|g3u_iSoF+)RlGKL1eWDH-zP7tu z^~vddp})OoXPKIknCWW4>~6vAVZo$XFnd}sds#4hTQJ=$7;FYf>yW0-$?BO#xn$cZ z?b?$uG#O6D>}$c$1S&O!BGP!+J@d04{rzV@3ub?2Xmq7?R>ox&em{M%CN+gdJW7kV z`sfrtLzmlAQxf}0XC|>98sU@q$+Yl8dy`~-`ZGf#Fs1EJ8Sh90Antp6Nf!C<$S)DP|blf^=HBxUI4@??IpESRVTlWoD| zFr(%+pKShmuD?xlnW0`y+t*EpZCvVShA~5XC`u=#JrFQ&$-|mt+v#v-5^p;rESQnZ z&}c?^?)>;pnEcR8$UXnbXNGQHp?D7;9UU)d!H9VjT^LMFp%$U}O-1C%srkNn)F@_X zOQbaG^m|wPV~xfd(VrCI0u);Rt7)$Lxv4$aHNnNj8X z&pr>|>SvC&U}iEy+XbZuZaZ|7-_IlF}QTydPqnF@7 z!CS7`%p~?xYT;)NGqep-gc-+IeCdx>X2Fy*Lt`)bnfk_Q=lcCrSTM(0Fc^|hKVh+o zsfzhFKXD8~`8ngVG;EYk9SWwJ{m}7XI8&35siiI$!R{0J>410gbHVqg82d`W%(Gx< z?-TAv9GllNLq|rmEkAhP3`};MatY=*X1>5X_1AX09QmGqj5?kfDm(c(V137x$N9#n z6PS4w@3j3qyhlHbt3rCpE-${bjduFw&6-Yb22k(OnCdyC(yOM zu@*4%2i~z`k5rxX^&&sBkQoHvviHlp0Nak&&ne8@j&~~8-H%rF_A_vew%}I7()#n? z+11aS%FN4n-wCgWYw*M^U#!!ZxeV_V>yotm%l*vh%)EkkD%a6>eq_`S^$Ky(OY~@}85=^5y3oW}d-2#aeyi`ltPVFiaqp>W5UWb9{czV@9>bk?9|d zaQhK`9$AE+OX(f2#~(Zh)XV@kp2ZT^8ZV!urJ zS@>%D&;I;S4@^xt6z|l3{v!b3b#V1#=TKR3=Kn^SYa{#yLI> zW^S=yZe?aU-l={r9@lG;KhL)@^SWdrZ)E=IXJ}+jO&Nf9YWHmh>=`hZxPzIYc&Bv! z5iejsBHF!gx)YzBb0AyY@el?`FLM_&s(ym!hj%kW`*%u<7oYr3zn^=sM(n%88Elp= zrtS5Iz_B+!_gOIaGedPu>A77;jP?6@0Bf8!4L*neAT!F(6^jmk+3)8eW~Skta{Ad$ zf1=ZQ^NdXwv5t_;0jWPN^fQkzGYaq2pT}K303FKf=TT*52`4V^7u~}KE3tx8Z$JK^O{@Udd|<#=$)E!Al@ncvivP?!QjPd{b{?M?f0{enL(0yYWF4ie&#b~c#Fo; z)B8@m$j=~)DEq;9rxN#?_gRLY`GT1{=pC*l@jN|K4COSzC_E@G?JG#M)r^36Axn!34+J zXc6lt!%uLmO$HMj>t|+YOrUh%o4=xCddvO`);QM?-&(!>Uw-C41{0j0&CJZ8cf4}@ ztS$EY`IVV5l9}*)6y3y|pWm2C?B{o8I^v!B^O)n`4cMRl!Axh#4DNq;z}SK*e$qaV z>PX5^Hk`3Hc-x@|Sv&LI)vF&|=r21R;X31C=Y{7K_?c8@P`O;s7rrzBh49uP?xcht zwOxF>&lfR2Ll1FIO}PtxNFBd*`{(>jYi9B!b9Uz!&hRsBm{DUw@G%;FrP(QaFw@px zf{zQ@F{8$WoMC@H>d(*C26Mg@s6PyLVuQwh2o6 zPT3I~rMJC0S}>iMX#*b=>*n;7fB5}u#|(BPoN9k5JIT*#;&Y1TpgEDYOCg3W6}4>XtSxiO#T|FsvxQdD-jPyF=NUUdPDg3WENOXN zTP~57e{0Lr((;6&*yZON2_$G6%tM_LAH3q2@|(%ss!PFn8Kmc8V_FhE<*k(QgaWm|cGm7^{6 z)jdiD+H$?LEYlYHIsm2R+A@tcM5GtBa@n^pLikDlPximRF_a32oU;?livAmNC+@tzLl0sv}Iy<;pYTx zc}iL?)0U3=2ysa&R`v}W-+H$+J^w*ZuzJhr`TW*k+2el1+%Vufm ztu0Sv2xfw|jLsC6e`w3@{eqQCm956S@<% zXXVQH@|k4non+R}BJU^-|^wY2Q2Essk}J8gMiT6Wf!!PAAG zZrXB+v}~&_H%rUb+H&xrLbbcL^f*jd_SBXSq-8s8dH-<1wA7Zrq@}gCbU#8ct+eG~ zX{mxm^xn2d3TCdh94;-@+H#+?%+r?EF`=r_mZ{P*Ut4aKmVIFnBht1<2~`_y*``of zdT7gFY3ZabH%m)bZD~0}sCsEjrnKy$EjLTcKH9QXkx->+OIES4?5!=iabfAHE$>Uq z_S({GreJo^mQB*qQCkMh63lMeQX(x~wB=rD>8>rGOUoYG@>q%RvzN9UdW^7i)|O$j zg=HsgIkHq(cGQ*~<_ODHu!wf=RwgW0YRlH;IFAkE)!K3lEHo@!t1U0XLdjuzR|t#4 zoGUGdXw}ij3g%F4xkXxz*OnHQf?2FB#nN)Nwmc#&=W0v)D)ATxC)VfE;>6mgT0A(* z@ly*+8p1iMi8aFFs4jw~pTU&Q6*(kQ^yia(mJ5BBn+*${o|h-%;f(yiQWZyjL?TPK z(PR6o&z)1~eok2A3<-CUVijBDObgdklqDkrOEmR;R$DT$M9Hy`Yhs?li~VHCsh?x% zuUzLSrk~1CfwE*|Lbexjx6H8GVo$$+IVnB}mFSQ*l_V;PKf2jlg*W>itNr9YKx z1zw*iroSqewq%g%QoOEGOvYd|UkgMR7MLSXp)Iz-f2a5EG*3K!OIT3P8G~hYXg>of z%aq?+@#0bpq&!p7mVPQf55dX|b)Cp|c>PmZR24cF%{<{_v?W8uTBjIgh*T=e0IDBK zoADC$oX(%|%mQT@z`^k8S7pgid8W;kRoc&Q%A)(m``V&Zv;m7)6rBq9ytXLDvCw*Y zJ);@b>$Ii6>^_lP#q?8_Ny?IuiDo_kZTgb7^piz(EL1@>ja;u8)uXhfKh?$^czvOm z{**gP+M-1Km{ZZFlxJ%5*YFY+l|yaeet0L=U!$0e!SJ*j@+>ScM=H?ks2^S%QKRw8 zu+UCcSg0Qkp=w3aeg;y8UdQV;yg2$G)ymqUx6_9eqx;z7%AyJy(H6}->0`7-6*NM- z4URrowQ|0)WDJpwI^D5giPGhG2^D|D+ZoD|sWNn?vgkg)NLy5IIYnD&tE6-uUhJ8- zQ?i_;EHwOZxi&ww1qt1h}WrjrP3JA zv&2wA05GT7W-0q9r7A^$U zjrNm~DT{hKtQ?(lh!2sAlqHihgii~VMQxOkNz2Vk(f9kC7*4&P|zhWYNDje00tZI*SR4?oHKmJ=swU<;e6LH7d z$rtNQE*ZthkSb=3SUVfB7Vmwf(#_hK_ZkR54@3+Qo=f+->{bj_N(B zV#bKIs}bw9AM^Ne#)!3t5sUgpj*j)0R54@3N;6_*4xjP5qbi^s4iYm)tUZ0P3UsWS zrHUCN7R}(DI$T#UGv87DELF@HvG!)w_982h#koa4Ez_~`XgEh=#)#F;h;>a_x2}%r zcBx{6#W5nvgs;z|62=&9y zb*$A=#f%ZFrx9yh_J|7{Rd3qiA~9pc>ZMh*zWb`_-9OW@PM0cXj9B|>74`Yu4*x3d zsMbjpGe)f5tlAlh7I>X}-S01o@6h2xBx?b^W6wy85ol#P(Z>eI&$YCE=r9naIlx^F-&dsqK( zu%o(Bs+ciU>8zsOi-pLvikUbg)vk01fW(XuE6a$rqJO&-M^z(L%owqvMyv-GKHSAot(Gcgj9A%PMR{4Ud#mpr z(tV@X8Dzr)Vu>+g=|_3(9o0IiV#bIyf>kuqP@?_U zKXn}*M2E#l%owpo8nLDfy!v2Ab%9hdW5mk$#d<==S|?S^7_koV#d1`G&K5aj#)vh_ zh_$F_+b7oPSZ7HUGe)e@My%pPw>sZZy)ISE7_r6}v1ra#sbh7alLSc27_r70v0j_q zCCgFeNfk3jtZ`aJUTbEaI(4&-RUuW(7_r7{6^{V7ymFzVS|?S^7_lb!%2lpoO+J_6 z<7r347_lZAv8Y^*>MW^Z#)ws5#G>~4RmXZts+ciiO)_E~^!DZVJE}}N&4a{@5o@v$ zi`uI~$GSV#bIyRjVj3)Ly^oSRLuK2@*3#tZ7=M+RIU$B2~;7 zv8HPkd8PT``#RP}sba>6b*NTRtZ$#Ys+Xf0a{+n6Sr1~2SckDnjT=;l$Ld%&OBFLl ztiz31RELi0J*i^Gh;@V!i^izub*ycch#WFw#5&T5wfKm|DUK>zs+cii#eA`z(Xpzf ziWwu;QNCD?>Pe|$#)wsD#G*RP)v;P#D9Xi*5o?AK>(`1YX^tu;Rm>Q%ihQvq=~$0S z6*ESxVqYvrwKbj0Lt@5=6=#+ESnnkr>jQ%j?pUGzTW$-$1jd5 z{}PcyW{g;~jdEq2e8!+xb*x*ZiWwtTsS%6%yrXJ;sffjl5o?YSi~8YfI#!WXF=NCk zGh#gy-#pJzEt4u{j9BHYqP{`3ard)}hdQc#E)zLq#)ws6#M*q>+PxjsnNr1!5$jkZ zR*NN*Y8}ZrzDE^^3>5vz(->UjCR+_tBRXT=bIzf>_}#Hu!8 zz1p|vTu0S@sffjlalBl^s-9R)bx6m{jw&uy%osVG%c?Ztl#iDk)w5E?jG>yRW6`l5 z9WOhoz5gMcF=MFavx-_73w*rns7{nBW(-xWp`znuNA-bJF=MEXV^tJ!Xm6Ag|KuP? zHS`LYkeD%4$Fqv&*y?!MQ7x4!W{mbafmQ9HqMCnk<35ueRqB;6Au(gbI#HKP9WOho zQmJCbh;@Mf~a#)x&YE*Iq`r|tWn-=??atgFa|vpK{Vu@)Gyy8m?BT1Rz- zR54@3TF5H3Egy2sZQ~u)&r-#V5$hBqR%yTNQyo>o)gp(?7_k-^vA(+P*Wr%pUa4Zn zh;^zF>-%Rv&T>@STq9yJW5ha*Rn#}Al^49b<4{L+j8rjW#5&!G)pGZ>_dBZPQpJoB zYq1e)#qNL3a8%u{6**+ah;@b$>*xKZjC52BrHUCN)|pyGe(8AmVcj=AlqzP7SZ8S! z)dn3eJE|eqktbX~CB}$#Hmg+MpyOpnb&*stW5ha#Rcia%u^0F=Acli{+@=+$eI$j1lW1ts;WvHf1{25mLpB5$j^DqP{_M zQAc&TR54@3x`b6}P|$eTX{&RV=j&LnOBFLltV@kpZ|t$Av!lB4COAT3#@JV0#wyxZ zQmhX@`mvp(s=1jokq9$J4lma^Y>D+x9rUP6m46G1BFq@7rK}o^)ot+FW$t%NomhL{ zDpbrEs(-Lb%^VK9c=SKS(}RisMXH!FYU2u4sV!yG`FkyKR2jF4Sj-r;aV4u%Z5(*k zIafNWW2A~1BZpV%98xQ154iXOM|HDQF=ME%*0EYabwyI7^R%0oYTcz;LL<8F~dW{e!(%_=p6J?P@4XF94Hsba=Z-J@gCR{7#l z!!|mq6;j2Fp}Ln#&s-+Pi1m;W zYtV?Bk8@NPNfk3jD?iLC)yk(mn)Q{V`dF%%F>?3_tElF&5VQPov@1>ew`Spj-IjYm8iWx)on2tqWsg+ODHUE}WF=N!mKUt+(`O7Esx;v^K_md~w z(MpUF>v2|5%~QH?zurGwqGQdIDrSsWPZ+W0@3+I5j_Nb1V#bK|B&(=4D4m#d->MUI ztnm*BD>Fu{r;J#;&F$LSQN18l%owqrW);nQDb3pTo1HJyu?9UTtjrj(o-txkk8)H? zq>33M*0ZeI4Nhrp^V9onJ{8Z1rYK)a6*ESx=ZsjbChu47sPY~nE$*Eo#^}Azv&!9j z9o02b#f*`|7g*))y^iX4sba=ZEn}7Hy^}M(Kh{yj9u_%d#!$V;D(Z)nXa;+cuK6dV ziW#FemTMJlDRd^#QMG!6T}7BNV!fnQM4a%+)mJanvBpRhGe)cxT1By*x~}hhM|HPU zF=NE~7ptg8Q7bR$ys6!BI@Y$2!i2<(5o@Ip>x=!K&T~{Vq>34%m0xC+YUMj$YFX&0 z9+E0%j2y0FmAjQ4)z*)R95Q35UeU2=Pjuj!M;`2`W=a(^hH5pds5U5l_-Dr*7wFn} zQmU9SYU5Q_sWIx9Pg_+rM0^%|>GKV0|o*8?2Yk5a{q5$km$)@{GNx4WY{ z?{N`}86(yktfKLd`o`&7PjJQB_X(k5#)$Q%5$oLQU-orky(m@87_ru{irR}3jq@k! zI-K#Ourg!BddrAK*KQou?NY^z5$kPVtdn%C4N}F75$hcz)`uDY9Td88ki1ofNmZQ4n84-&a zBi08-ENZXbI@b7Sg^C#?)`v!{b+s4m>!@~pPNL^Z2ddU{n=6Vc}b|4 zF;ri$ipoXf{9N3@<)}KW5GrPjnqSWNF`lXa|p zR*6{57_q)JV$sOvsFq33^7Bfby?~PbX?mzZYM|HAP zF=NE~fmLenFm&PA(;d}Dsba>6wZVvWSpVl;Ih?s#ISJ|#)$Qo5$n;ScV{}Ptan5# zW{g-gTJY1^W_r@9o3am#f%YadseABq;iea<=SSQh{cQ%YX>71^+QK>lvFWe#M;ppt5(Ol zU#gffV(nzaqHk9@svo3^86(!tT191`IlvqpYyZzgxtK9xbQJd-#)#F;7ps+ywOFc{ zF=BN$V$l)3qe}Z)l#3Z7);_GFaRUpHe|)iIb{ie*QK@3ah}FZ0Mc;;VR8M~+VliVJ z`SxU0Ppqa^9bq+JB|sMMu7l>Vxlu ziWx)I+fdPwucP|xd!b^+Q0=G7MMu7uRlM`0quTI;P%&eu_SfaY0w4K0s$Vw<6*ET7 z_hFTqebJGxqw2I#sF;cLnNd|GKI7RUtfDyn)Z-^nN6hf*17V>gEbi~DrL&)OtZU5# zy(zExQbkM)qunzSsNzyZjH$|GmDp(|!t5gwV zs`|4kxLmJD6)~o20IS-{SYJmjzTS!TlT;C7ss^%ZN2x0MeLe21fQeJ*P2xW>rfLwY zf^(QFRm7O8!K|YDGAJF=W7PmB)=a4)1}f)^iIE|!qMD~|MgnATH5tlWu{x=qWSOrNqjmb;aQw4m{eQftJe#EhZJ@u?2bs^L<_jG@Z) zsSebt#Ztvgms8BzR$4Q`#JUD|YVRa8EwqOdX^&FWS(tFSUwU0GOCT@{T@jaF3`N23MVBgg0E z#HOZ;xTW#3nbosG+1MzCh1-hSP!3s%O_gtOE__pl>!v8Isw$aT7OI(+O<}Sr`;?== zybn{wl}jJm6=v}CA5&MBN9t13Az#A!}; zY!n3#qEt_w5|ABHwgRY8+a4e@N}YfT8=G2LSRt#_1M#*YyyzNm70O=el+>s|dk3ys zb=88cUR59$x1hSRq-E1Rl0 zStrZn&5O#4;*=D{s<>>?VbHnl4X}}&Q`yCU-2{#)zZj&eXq0N4x)51yY@fWpm!oNe@~MUm*ND?7{$jc1 zJZor>Gwd2;qqwNCyz;7sH;J5b#YR+?&uh51*x1;p*jVZ@vHY^ClHx|_GqJI1%Z^Pd zDW+LhgX<5O12}QED+s6jwDSC5?Kl1Dzg2f2N_>qAMmK z11m8J-|#9djt7tHiONJd4IkgLG7@WDO_H#5=3tx5r*6Eecxk){hx}!%2cSP7OGW%6|B2*Pg^U0G0>SIMLwtMhCm{l_xPC2c1U%Ax7P@*sT{P4!Jl#(0n`N14)?5dFuC8G8vO2hMcRg2kvi6|*nERwf;F%V0)yo>R zJ6GZtbJ1xVt)Bzl;m4+`ja;4Q;bus1x+ON%+k8CN5ZjBI+M#5j?TmeM-OjjJMND?i zMOU9QtQm(=v8kT3E=u4nt#RJPHOBc)oA*ey9)4ZhPS8o0dU^Dn?`~-SRO6C!8K~hN#U&#;@@rJDIIDxB4_u2P z&w;0k>QSYM&lc6!A?GmYgi*a5y3QE|o#3gL&uQe8vl(=bryed7o#v^xJ8^(JF+{NReJ^;`=y>7W5Y;eD+^a*@6~wFa=HiTz41nBt4W)6Ms~%HR z9iJ~5Q7X2m5(yJKQl^5^c)UU?P~hB}%1VS8Us+y+a{*!Y{9@mlNwZLi#d^i$vdZ|( z5*!p(PQ|6?Je8-3F5~d>$^u-PDvghuaSUotdNhS}%?^2~E-xxC9V1Up%q%a5C^iG} zW>*yAa<;x$mz6%Iq^zX4W=;j48{tcu!L*p7G;C0$?JO(9HX`laxsNMBR4pXQE1d|= zo;GR}uEJ+ej^$0u%^N={f85yE_;LATC*@5nh(>9}m|+tO=Ve#ntP*v@{Ia9VqtVIP z6%}LRb8sq^KW9d#_K%IpADcgH@|f|lNz=#YMWgK8dn%{S8#dQOY=mWjs5s&bVtOvF zugsF=N45*%mDt{*P1j^xg#~%JlPBg+njXuZG-+af&g4mXREGn_ofp^_P01}S!6v|U zM#m?av@WwBt;y_1pZg072HMQn*a4y&)TJcU6$+{gE32b*P{qcQObmTI*ug_}+|~nT zaN>l$a3II8hPaS}EH>aq@DeX>h!fhAG%z3JVpw@uydl}3t-FEQ-~pnc`H~W7QBKIQ4YFjEVn;1W~CSGMdFnBiWVc7H4#{=yRjq0W`ZCn}6on+SH z#kPgb72{~0a8ZvOnGQs@^2+KJU)C-U=W<4qH@~EAwHw%M*~P_;)&=D5FHTiuTglY! z;I%X#|RfSnBMdGN`fgE@E!c2sp40kEr@+CP7Mu9yypK@6uUsYf}U zr_PF(72rleTt~I;8@#!Mxu&x?&dFC#v-_qbuG3w7-o_Bq9YCWo`Hhv)70qO>uzs5F z92z+_&T2YYYq)nh?O6{mbQ=#fg6ni`W9F)1nR1=JZM;mW^C&^i15fGKqgH+AP=l^K z)Z4GvZ20_i*ga|W_U+2KJ_K|1jnK2`jTNwA9md$Ynmn%!+~iyxu!*y(x;%Fo9>mlI z4gOH&zJC-A;GQ>x43eIqGB!3oznTX|HA*&4fCAhoM0cmuqj!nGI6KEc^Gv|Z?Z0BT$4!#yZ5TDUg*6(mDG*ADGJwS z#BTk+Uj&*S#ByqCXW_Wj=&S$rtkt)ZaEXRj#^YOFk?K8mQ^%)Pq83WmTkQYYCZeXr zAStfY=u5f01^<`JlL>RjQh>6bEKa+$pke8CP6zpz%(GZnHX;_fT@wr|~3S?R7TaK00ud@M(`6nvvcMs$?_ zmK@-8s}KId@Affo?8)HE<3V=-VLv-Lx2CGPe2y!Zs`I)`!5ODoDWW@cVz{k{Zp=xn z5d9&zq~Zv=q6C-foSSO`qUL1tqaWxNF8+>xQamf$UxSoy-2IGOp<*R;BUG}GRMkPX zM}8{Ajc~D9d?%ufEAC8OfJ$*OAA?YR)HCVpeYkR3XElbAm^*%K9`3-i%K~;AyX}D$LjXUBpITcW8jc4 z!;UYns3}DU(Stz}E!{FeU0UhHz`(b;B`$~(BD1!!_=KE>57L0lz-yfJ? zB~aOIrr?I#V*egwy0{Z!GWvpXo2VS-FcT1`C!8bTrk$lv_CDMPJ6%4RsIQSa*Fv_8 zJW&r-wZz9-FeE%SqZW$NUWdNV)kr6QM04T$OvdTUEueyUw^on(@t!np+Flph#hNYb z7SxNfhN*7ZJf+W}XH+CRp~0hHUh`%wo34q|LmmD*!EycovH6)7S%aIm%H+8vbo96@IMAI2_vuo-sg>3CjAJ)B{d(ONhsvZAa z&N*IojuO@3s(H?$9)7toJf}YD>P8;px^qWvXZp_EG}y72K2*w+5)Cc9XGSOICf%|I zTi+jyX5b-4PPZ}ftM|93(rM<1FIm&!fF2l~nO@WPS3X~&b_oCF885PdM~2~C1$}Kk z*&L#IuFmL5z0)R5JC6!FWXiCr59&hQ3X6+z^0cb_XlmDl2QI1$gG+|W(Ouqm?hcZ) zk>qxQPM!>vO|FA*HPaJXs3dr3Eah?-8a?!$Px*jIXZBC$Z`@k0pkjQbq_UjvS*f2l z-c()nEW`4{iz%D@Y+F3KQaxaXvQH1`rL15>Pf!5$tOZ{QTyk$2>g~~63>BQq!2x0M zcd2?D{BajBds{ucq+=VPDx92=E>47ZbG2kW{E1v8XpMUNbd{I(;j$Oj!=2pQy9=6l zi*CNsB+dtS8)E~gN9nm5Rh#3yQS%k99+{;PntNxaYP483J*k?$mTC+T^b~G2L^z0N z<6}r|ehyWSe7X7}Z`k#4k&bV=xVO7lERPh0LI z3kj&Vdb?G%T@MFp7wc-6#PgB=t96sOQ~{$#Ju1`HyfkX_B&P1;oqu+2Y^n9lm&^|x z6aHUq!+I25PbT}Ro^DiT!d~Gzibg9o_19eGv5ifR_;E3GhQcU|-qX06S525*2TvOF z4#>t1DM%;=SRSI3}ac$$S z($yn3sz26e)TUL!xN^k=gvK2)a5{ zW&EwaJsMEV#{7vGOZV1SzTEe3i65bHN66rA8~EVTy8oI}o!mFL0LA#pH?`UQO&-N3 zTE<izdXh?*HJlrmUOWdzp z&u7fJoQll{chUbXo&@PHSpB=7s2R~m8mR>{#V+>mSJ|>)^{?!Hf4`cE<<6gvyUNSw z>3i1kgk9K%SK_(IqFYt=gK0#8{E$oEPLAb`gsm!GRD-8k;wMAcR#aX-yM!L2EM{uK zkLj-O-mY7EQ#sB^;nbk>N9$loYc#dF22j~A60y6w%leXj0cH-SdcZUcR5IRe5gG7)?|V-$vQUg>d|<0;oq4G_X(0hA_6c zrf}U<*`_CBsgBdw`DWiLeex3l;g#FgYaz0vdRa-PxX&PysXxyl>evFgs^u%fBXq^T{kiKCc>5ofa-b&KMY z3ua-OEQ%^jWB)$3%6_B!Et-WNy6i@MKj;UV>OLpXzs@9c+!UTgo->;)&rRW3;74J{R8iG#YNAZ8|p@7hwceC?;7Wu3?_?{5&T>X)o3=Ta@%}A?5=Xx zj1g5KQ6XWs-Y2R=dyNXD%ck#(4{kI0c*^>10h#>8d0%xlLr7Ijs?Q|hoS!IH8LgX0 zh0-+|e6PQ3zNVbBI zE|P#Sq33SZ4UuB-m#2W`kJGFAcEzrrAC)2BDcgEoG@`GL$j4l$95%jVon`MS-1=oX z(MjR@dsLYWKHXU_zjZ$~+<0MBaRSdIHYAL(B{h-vCd_=&v#brP8{mote6^O?2Pp3bE?&)oi|0LHT8suAb^Q0FE z8W1Jm1b%{R9t{p;7Ae7{f(Azt!%&u}yQU1JiWGQ~zh1@gp6ACQ4{n+Bp0;YBYv){J z6F3)@A9j7BQF0!3A)$fJ_1>%L>OAanLZjroiJXhx5_VCcQF7iy&h_RQbV|Km8MnG_ z(J;??vKe?Gpkcm64-dO~(J`oC<4@Cx51fm6ydEp|TqCjZOC+TWmiK^H$}#U%D}TIs;r| zcr%+}D!zKyIDMl*p8T1LH&W-IY&F1_nK9Y_>-kk|y@z$0vHsud4(_-O@fY588{##n z^ESkv*&xG8@DqNGxJPINe=39HE8`V~mGO!3iqcy9J-YfW4c9a6GwBJ>zMot&?ucua zSgK&Tm2pf`L_=rtw3XN-T)zld zm#u>y>KD3kG?{-@fW~{qjNUjJ)1|XjG^SVY=FphFo$a78y{hKo2Z3XELz_WeI+^%I zD(_yjA-|*|9zf^Zg}w#mOkbwh0`sOXoo<176ZM8GuUlZ=^o83kFmGxj%`2;pS2q0o zRYTnv*(sm{@%%Y+;>9IcsLK=_C)K9*&mW&#z(2&yexl-6W7LT@&S;YaP(^Uv_w3xJ zUGK+R^3XLwe66J(PBQTe4X(Mw7MZtziVMAAydG5`27lLkQ`F`bo?%tRbjQ2+aRlxO z(QfJ4&ZA86{hK)dns^l*wYsNyzKf#9j{_uw#g_!!@6-Z(Kfe1R%Sqkv6Nc4x{5L3x zYLvg_!%OuH`)^u0XR`k{EuipY-3iw5oBP8O@9u{te2enSnLx+-r-?sk>53@nc|3H>2hHbbnD3Q|xAn zs0)d2n>JI(3h|_}tmccT?>lbBn4*-pAGsN0>Jxy?7*muJ_b)eNOx0;CYN}?%W)v39 z#$Cuw-+AdV@Yqrl4yms5BwJ?YRMn~PA~$`t;TP-G34J8t)-D2x)%gmdoH+%zli>gi2qu3Oe%>*p=th8n&tYC694Ku^c? zJcQcX54MYR`kf`?seM`h{hT+q|aQeWE0krO@cEzVZ)8deiI!)U4r%0rI z+X$yV#g*6&=f=gSNaV#9k;wLC>XZE6u4AN6aePM2%x(p0&7D|yuR?ti|D%zPIen_* z^Q*hf(H>H<>hxnxF0JGEqk_0IExB_nILhex;69ZsiWLcpI|ufk!4y@BJce=KWA!{R zM^_1s%H{Z*FN}EK2d`7X+%CBkgLCSo2kZ}mSu44)xP!ob4`!cgEFgt({jlx;FmsY{ zmw;OcX2%-x7KxbobIOs1b!lLtk_(HwJ-A6=W(E3l%KI?5O37f6lT&{VNA=ost_0-2 zFs`=+R|p?{z@0Byv)!Dyt-;-8;g7fnEVwq{9<$)6zdU2X?FsG+aBb#c0m*DPryMP@ zu9IXK#9L7Pb%cEf3y#Xs-GXZeZa;7XB^#DM>i1DFGcCAd!Can%qqx_DxibkzaUTZr zK@yJo$9l+M_+Vk>PkWVl;XCsG;Bwa4CAvkqMA69tnfe;vULPQp?D%aM%m7(8Cl@kar;+9dv_fm;M-Z4z!O zxX-~Hbdrcl^M#=D(sq6*m|2nwD=%@CU=~<#XMwrgg1a8fy-7GauK1^9u*fN>99v<{ z3*cT(;*Yquz3^}oHrOiaQ}1a~-?yCoNP9N!Dvb6~zn;*a|C zCNS+5U;!zt-RKZy`vusJ@S;THO;G*Kfc=35I2K)q1*BGZ1#w%$J_5`{$%Vxw?r<>n1WU$C7s2sFCTw}qF1$RBTA0!*rZZvMRJS7t8ffuC|yn^CV zf6kB$ag@Ti11-5c3y$`y<1Dxx!A-H?s2ru1+*}Kew#x;U+!>bK1(w|9mfW=#9QD6j zEx9`_xqB_S2Q4@{-}I;jNAuX1EV(t7+^3e@_ZA%Wzuzsn){6kUQqcBB=T$m_+fA}z z+wWfB_5m|eaxL&V$RF*`4+nFK1$QZ!CoH&E!TfB&wL3KuNym$lnZM!^Va0U^EDQrP z-hwLzQ(?iK3g&`9uC`dk?SO?F!8~BWEeG?K1@|?W&4HYAK6W?6-R87Nq!(V4!rJ$2 ztmp^ksnZ2V{Vb?`$AjBzG3G>P2#(6-aLx&)Zm@54CeF#?MJW|8hja3GF6@VZd0TQc z9tLrTz~1AmNaR?&D7C~Zh#Ld@QZQd6;d+4EmQGH&Qjot(v3>x!m68q1-vV&Eo`Zcb zUXdL<%b}ol-ds%wLiVi%a#;_A>J1 zB&Qrs{gq>NdvM1~Hq2i;aHoMeKM8jzxTRn=O3o~YQ-5jT+FXvliWeo5bMi;!I8ZVS z;w`8gBVj+-f+K&YTW~E<5odxsd#Q+OZb$Ql5$~tq^#GUw{}86IdGT)WHxtaFD+Cwj z?*gp81I&R}CiX|=m?IfM2G`5ZSXp7oongWChQDjUt(0t7f1&Mv4VVusxbd+-YmG~h}9n48$D6$?a;% z?Q6*mvEZnkMp|%G-Z2*3cHkyha1^)5lAC40-2i`cz;(P13rLh-r#+nUFAes=V5Uhf ztY6W5w^TA%%i=C6O|&o9R0Db z511KAIEp(L%(Y24iu)j#Z<25n_b)L0ZpH#qSUuDHbOe|J$%Xajepqn?myc%r5bpV%R!BM}QV8Ky) zPPgQawBTsJPz3I7$%gfV-M~Ex=FKGB9^gI%^G6bn%G>6?NTdT^l)~Z?*9FX;7F=&I z{VcelVDc=uabTueaD`w>l5kO!qYBIel1s(spnkeF?5{}%i=4u^_bs^I@UY&3qyD_z z{UV-v4~p9fD|fTtXuRLwf?ENu7~K93h^S%paxhkp0&}M1!p1)grID+^jC?S$zu{PY zG?+Uj7v^sSxM#q$c}VyR>!&TTx|3uC8Qi|qpLYP)HHp7n!1b{3w=1}83y#K(!!0=K ze}$G@sRc)I=UH$R_XJCBu?0tQFSOt&?q!zT^%fkp?_Cxg#eK+(qRW}l}8NBt~_qjBwGFl!|j)*dup`y9-+&tL&5jN1q6c76uuVDO?8#?g2` z@)?Yk&k~jRxO)hg>5>bp7iy0=l3|B<3o0*h$69hV794GFwU*pTmfRu>j{5x>mfQv4 zE|+XdNWDK8C*gX6+aMV%a^ik4 zpC0P3EI0>;#V*e|pJ^%DF+JLcA9Ly0>G)_*aQjP^%FkSYzfqR{3c$sZ_}d@T@L0AFBedM8^ENzAWEBxe_{P)4=}yGoW~#azkJCEkKz6%fIA|IKkBE) zTl!lJ?xH0AD1Y}^`g;uAG7Ep}Ed6~0?iUMxJ1kQ*C;o@EM^|vYB&*vkpgl%d`WpxC zuq6Jd|J7RhI~Uy2B>rgoeZ%fur1KXr z{$+z1Be}5lrTonXbFziMi@;oy#2@AFNy$+DD227}Dsb;6@kjal1#9LT<%mz0vi9c$OOTgUb@s|D;fji&A-(8me9s>8Qg};w1{jCSLF^NCwFP&aiH7EXu z^_Q;TdP!EdTR?k^u=F<$++h~}YAyXO1b425zdJ1bJpk_MB>vi?%0964_Z7HJ7XCV~ zvTKh$!1b1FqV~wQ^fv+A5f=WAxAeCN-1!#%?y~gv5V&V8{C#BUZ#}q;7XCWDV%HvB zz;%~wSbI=^$+h%14%}f${Ly$?Yw7PyaF-I=&6gFP<1$Uri!`g%PZ__RP%>h?y;qNj_e|La;#KPYiFkgAOfc*w2Aj8W$6kL81f7D-Qf;ryH1>|ojn47$ur@Yi(o|jCr{H+A{b`pQoUp86# zOL+tL5aC5Btp3PfZ^kMj2yn9gsp zE2p0Zls5y+P%jtIZij&>_i_RL&IPm7%X$1!c^?6@+{*>{`y9*$FBjmi!`ry84=+l( z-2(g#1(WaPJpO3=ohcc1h_|rzr~-F#5`WYlSAn_D%LU|bHJG(t&XYf?zs+FUz9Vv% zsJuPE^z(8af3)39kc{vcUf${8;uiiES^7I0++`O29`g4=Bhz^pO+`NwiJQyPx@<%DGeW!zq8~*(DNB$OB`a2)o6-oTj`0^N-RbDP& zeE9~45oCD#?hkH=g}Jj0yQJ-REtrj7 zf1dme2G{8$?Dz4a)CRAh@ruTc^Cd$ZrLgV%GH^FYHmqLA-?NtfR)AZR#2>ZWMoWLG zALG7UyeNg`kNW-o9~0rEu<{Q181s9)C?)b&^f4p)EzDmzxZ@=o=8yXQQZRRUxqyDU z63p9P&eIR5{x*SW^$8Y`bld=cdxPogDg#9pWvlywkzOllY_jEwc1?5x8rT z_@n;!q@}-Q;9j%v_r0aRU%;h)Dr!a7v#0(je|t(skm2>$3*3Mt{;0ncfSD<|7Wf?2 z9>;@OEIFOOfN|(1FslsCKMqm5eIps89G>!0{(b}3VV$5-@Q?Esz;yw$e-f@I^n<{} zBo{Uhqx>xabDiW`sJH?B{vj~WN-kA#p8Qd}eIywyatf>G_24#I`0MnU@|4(L7jWGr zn<#&|mi|V8o0`NQwOb9CGre3u{oMlQ0WasNKWdNHzZo{84*659Vzz7f^qjz@&U3Y9*}xs6F-o z)7Q%d_!|Rex|j2`FV){X$%x3|?Qt@=vy=Fv^4EqwVMpFpolD83D*XR-{Q>h%yeK8=2mK@?$nbIKKyV{0{KYN(%>h?y z;qNj_f7gJ!!|QKGRh23i{ipi!rUj9X&-C&1mvlfY;A^w=*BYOBUKhX(*nsm*cu@-D zXneU&G7RD^$ltcG-)6y4{vH9hK1tlR;P(CzZ>|&+cSo$>&w``4Ip8WK8&=*n;O_SM z!}S^S>jwP&vWLJuDOs@{MV|@cmV;Ss!MzLS6EElK2h<+kw4fv6+H#(LunU}hBV#JR zLG?^rtBr~f|AROhH}c?LqKWa+IDViH z&WGg<&z?Mb(&+r01NNFzHMgjuvKrQsvZB(O;`jmHpX&?%g}y{T80q$>e-1MFPd;kY z{}YsMkH+u$CCXsvPe{7F89(OO+`lCmmXH6&k4l<7V@$ymbbL>D8TbFldk^@is;+(X z3=<&K1f*IZKtLc0flv)d5)wIq2^~cNDG~&wnL<$!FrdUSitV*mEUz6!5!-7ZNLPxA zV#N+3f(?OJ&3)Edd+&30W(e{7?*0FM_uj2DS@WFd*=zT9&J3ZV|h@hqn}8otUtXH15X!&1fcci?51z!&`B6O0k?| zx#2Q5JT@`SEn1&EzU)kJlCVUJanfP6Wy^De*vZirIHH)Rr1$PsSUoem@j#R8qD|#- zEtf!p-Bo$%l#Jee(h84oA~ye{1d!Xa*zFitIsu`?*z+$)KcBMdZp=(<|95$LIVEef zTRc5+LU#CYDEx~XK9=$cumpEwy2|T?@l%SMgP%Zyl^Y%yj}$j6j0u+=XzKbB>>|PG zMSaqo!r$GJMzL<{$8*nedtcD3pk4aPfE(V<8CX(U(9|s+AMX||Y!;hW-3`|~5Ol*E zrxc$)S`~SAc(*1`DLU6FXy_JgMWLiQZh6_1qCOWpg-1eE*oFl;75!*8j7(7Zr(Zn& z;<9avk=S%Dg6CjKZM+XliY09nN+H1w{}9efDB2rXT3S%AC^zA6H=Hw63c6^0!niUz zooFYuSM+0hG>4^|k^G`#<#THbYiVg=&GN=zIosg5eHpdDhp{G&an68M#ugkY>6z}D z{`2d7+x_+r9XEB;+y?Hn&B-X!=ux#cQJoznsy6N#R33$e6jePps2WJc6tytXbTHAR zjj)wPQ&Lkd>)F=L-Bb6K2LBsm{ifoq~(AR8JY1 z7_aLGH6nd4Wmk%1aXA(8BV4qn!D@g(CkDUA{$u;hxYeOVS65&AGFsF8s$xXb&k65v zQ@6w|c^ELYrzumAJLzjV;dO3FdVKn;l;^mXNVAhuvS<-Lxbi1Gu0h(OxOjIt40m~4 zeA+{VJOpGVAuEBD5>g6e2O&Fv>?LF`ki&!=&Mx0v_&8$DUc8Qa5-s799`d z*LO?mA@z=Ko8_f$@qpM+asSxta2jG5o0uFbMxm`w7+*$9tFO42dXplSinAZA^<2bp zt1}aumC3tX+`tX5Epw9^xNCaf^mQ-%U*G-X2Y2o97#AhDc3(d?xC0EgcvyTHH?oB6 z@JHF<&2G}i=(Ca-H&{k~$CS~M_%Zguk%rUb-IAD6ckSNlZZLpRnSF)A>r!^{`84fJ zns8l9%qRv7qi%Soo3zKJlBpO!EzKqVe=PXF#cK+t7Ah_OtLVpGq42O~*+s`O_=Uo? z4g^Ce9b`SbBqm*>4G7&CqTYyE0yUc*-lbc0ud-BRtGl%7rMn7hWQWm0s+GC_2kgQ% zs4X=lq@y9bCATgDpn6JNgN#K$(K{LpTn+=hqd~?)gscRzl8{m$rG)GNvV)MlK=u-H z7|3C_d{g1$_~gVjs77Esz=mAQNQ`R5M-rDKfGWvk=rZ~MBCD;CBM`B-#{3Q9H$SAKT@Tf2Qilg#kqNOL+ zUvVf4lu-!!%w>VhUeyZf(-IL&!;D3Js$nIhs#q0WXV5?75mgtRS;V1%Ad)G?0b4;6 zsH_evDrhxE5?%!Fi4eAiFquaoNvW)g*#qYc(=iGI2}c{wj?YQmG{>xyFh9^ziB2XS zwGvzPmO<5E6}+ULxBT^@(HwUf0hUj`tc`D0c*qS80h!t`t@}80O_6|S zIRUg~m26&MtbAit%&fArd`*M^I(>J^(;%MA}w%Xq56UNT(tPo7fTA3cmp zikAP9lGesL3)a(|I%@V}od-+O={0t4>C!^~x1cP$y*0NRK2AM2bxT2#i-sHC%D|-D@4|!!++<(ETSL zlB&5okFr24m3wZGvBOFcq(Vc#`XTBCe~M zg#Y+D7!~?9_`#N2Pb$$U+fPo}#T5U@;+wL$2k^}^$qokWcsjUB<2@fXz(0pdun10n zm4;9pkkM%z9Z}(v+Vn0hja$+m`)pn(6M1U-t2A3hXEq0O@zse_ktQ4k(Rme}C}H_~ zahbK1c8hDc6f+gPTf!$lSb3{~y7;_UzPJq+Q+9=93l4voB^g+)6eK2;@4)fQBQ8$; zhPvTvFc{Z#Q#TfzGiA9O9vtuXcH;|iBIX=Obi*#@J&fng#fo=}2gbVPgA?FuA0kI4 z%AhRV33(tx`DB&uw+^uueytWEQQA1nDvAlR^FF*m_CQO&ABP- z-Qui%av+j&q`2^Tnu4=d6=%IJIiZ^RlK3S#&zJ9TOGZ5piyqsZX2F(7`RbO6G$)0-J?NJ{Be^E+&QWR=HBN;6t7Q zb5sNyvp$pwuyFg7;=;Gwq6L4*b#aQ^{-LfP!u2n3y=QD*ZJdO)ltck&DuQwbsIqeU zxhdPkU04;;;`OD-==h7rm9@d&00zAnr$4NrT-xJdozK?guzroDs|B#0VT|hWIkrk* z9pYHB&jSiNC2;&U9g7S6{@E0-QA zXk@zfySi)lM{h+$Zg>m~O+_!nIMIvOQ@o*(-9-`-C>EWl{lJAsCu-6$hQg9X-&j}& z`D!jK=^|H|tG-1@MCMYRLY$WQj`(Qh89uFI%4DVIOIaJl{tbKV087%-t4bcPIzh>e z@s*quM}*TvIFLfcn2U!lM^d5|I@p47R)Ups&u~F?EhX zk|GR`fuX%gCex_SFZPuz?fj(9&xIvroC!Ks(Qn>FUD2J4el)eDm|PYo1U6px1a|Od$4#5;^?sMrtIR_^l&x~b_ocFHpQkF zyRqrz>9K3j(;OUbWEVTyEW_b;Wr1c~`ZrEu9Gco@qMHVt$*^X#HPu+tVdXJ4+h8*&b{q^(fs%z?sgT{q!n;+23qiy&D@fUnxW`JbcpU7x?j}??7YUn)-Gui z?*BwTV8>Nn^cPzE_>FXEjoAuE1elr7V#b$s2Oy{I=fjfIb{YrdwB6nx(ppPe zP1>jtxN|o$eN_7S>6jUxN&NSpxOKPq$I&QTOc(oja`a7#OVcn;r-zSa;s6o70*^F= z!f$Q@779PM1ApA`(vRp*aaO4te)%vX_aDWd%x^ZbdjDU0LfQ?HV!J=h~TatydlBLb?@hxh~ z=+~}W!bEZ%no^vDWmfu{znPm;jT1#cEEXGXNeQBpgyt;$CT_{~V8MIA#FWi+t7U?V zCE)~$Cn5dSSh&E{?_`JHcf+B?(J}yFt=7ux_ni0hDCY21xxT*_eZs170_h9i50&IP z7){)bOB3+98s{Yu7RO%vSbLb|8z~bhI9a2&B7(6g>9^K7hwCX z(wx>6x3$an*F(`@&2X0+9)$)_4eel4@q!&_w8dG7NR~XsSs$SWHsRXdv{wRX0GSvJ z(+UOwTnX>5qC6cpE^}>G_}%oP%`sRreMAMDObKzxYR{#M8#C$Q53U$dYo*03}qB(24gH6|MaTlqS)W;6p% zL;72ki0rt`jp;?-{dJ-gAc3Lq21x|@$54UW(6!T+lowP-&JF}oC{*pU{YM#8IOfO& zZP`=;lD14Axxm6o8dsMyiUgl3cTD|fFT_v%sPIRwRVVks=-;Li>k3#h=3N8p2{g+X=N4lf zh9!rR9dPABj->}I;bj?X7OW6ooq=~bjJXPytmbV*6qn6{-Zy4t9m=GBNki6T8nR}G!uwIIb7hzbXDviae9#RqrH%~qW(;Ky z!o{{3>&ErZdVWfAx1k5(=>;NGH4&7EOjR&RST>Z2b=0u;u_k6nm^GXmL#rJ5;Te>iT_p~+QWVbHnoj?_>1bW3{asJ0#MspEW z{+J7uSkaHM*+oYKg^lDuI*7BIDVfD}hrv^98Dnm7pTs=E-I6}Ta`0?Z?ew@;)@Fw{ zP5Jd{H{2(YnTU#SFVj$qBE-Wdw8W$xRxe(VQwd;^%sZ{)Zqat!5-ICF(GyK}$0=IN&-xPN@_?)(8K<#U?28#l^=bfcTJHk4XAH)dc-pMYC3B#?y)M(Lc& z&rsFl4ATJT73cB;ji}frP@T@ro1H`xWv;lW2ewFWA71G2NOF61l73c zGTM%u$Kb9~2*)tRSD{^?O%#>K=V8(R`G%MjYKFb&A+a%Ki%q@Iydd>LM;eVW6UR7v zU`cP|Lh?P5gkdjdDn^y^wFONoJP)Stg%oGa(<>=7y>VsRIF1n%NqanZ=7z^jkPMj= zQ@f3WOZ<(;AG$B*wT3nTqy=??B`KxTg(ObtL|Bs21+e6isA#o|&4a&%`|G!6_N!EB z2n(}Qk4Z&$sl1{aX5;LiYnbYH4vP1fRC0M%_z$Y*cJ@<3Z71l}Xy|tY; z>j}Jn*am#5*JGD%11Y7rr{uMQ&L-XGm~>~s8po|*hDmoAmb3yMG3X8~p2?!l5!etD z@04wbY2c`_LLS$m;UbW-c}j8Jp?uWB55y**v!}=XX9varY`vwEmBge{O{qhkX7D3R zP~36n(G&^MWfujZn?~M?o{+-$pP=r0@}0J#I!Ah z8hMj4Xb(%uAOluEp6joHC1r3OEGYx3NP2=eloU|2Nz&Tv)YAO=n4CkY>yU?axZP70 z3Sts5pJ@DqFxFk8k7lxyN~u&Tv>H57hspzw9yXz;apkOq#!*QdJu=rFCydRwdhs+K zc7mZW60jq$g$;p(2lVRV*?}!{^nF#Im>=b{#Xd-h(|qC(-9_d5r`!kQ^Kj5fw^`Rl z`xt9q^?$@8tD;)ExiCnbDQSzl^BBj|VHnl|CF!wc-s9fhnufZ{P&$1W?Wza9sT-m} z?<#1Grc^$+F?zFVBOlR15SPq?XSp1aH4P=LGp7p6@x(+ZJU2F!^fL|n>TYXE45r@! z@dM>AR(UODMT9Oll%{sNzlMjk%V;Q*!8iw&48}B}$wF-oEZt@71(Q7L>kW?H!xr>d zlX@<=O3$k5HpLI+4~s|TpiO0`uFW4G3OB%`xYWYRHxW>wk>w=e+AeCtIcTKeE!jKw zXD6+t*4Qv*7g|zwT*eM+fIKv22X|J4xN*{i{wEI}-C#-MoCNDu?l^_UqDqpx9lR*r zvt$?Dgu>XK*P3cH*$sE0#U2KE8RM`uQk6&-_2L3wUDy!Q66<_(0H2EX+^nPPW!p#nT)XbCu5_&0^xPr*W93CIQ^aLJLM?K??u*gFC#)_j2LC zxl9eS3eV}FC-OrM)IBRak!-HWQ`l(!4YP~mLwFt{JTx}Dcqs1BW~0}UED1f27kd7C zG~1{^WQ3$UH)<53<>3F2C5`4}aUJ8PMXa}ZHj19EXe=ynF(hEIjv)aXZ8ao#LxFtf zfzCLj`zFAW?n^#IZGGoq2Yu&Zi?^4m7!^$+64lvJqDu6yxOU7%SF9@)>KmOTNi+#d zJaosYVv_zplA-92&F~;Wb3T?#c;bME{{-BQh|doHoE_fB-|*SPldRq9FvQVxj4=+2 zr^7U&@wB>uikaGuda44un5!|EEIksplnHi=t#?3quq4TeV?U(?dgrKczK@Q3+_+L|=~6j;(p zM!}M)g=bI!C-U(DGMArHRN4wD-o>vG!0OoaEwL1GLJc zoMEX!4_&1m&KtxKKHV+k3zww#mYVurLy~~%EsbsE3H~_BG5lx zR<66NT-UU$x2u`f-tuVKZLp+r?}jCnyUt*n4E7l;sa$$|K`NK3iFYHqYoW-p;$Fd5 z=g@huOrV`To)=sf*>7kPUb-u8$$G?^UD7Sy-){~_?>Fz}cjhm;spm+j_-XZwhbd82 ze+3HrNO59Q62um_n|ok5I!EE&C}lcamFYkf3Q-3gIFq&1oqJKEQf;NAkBhS+w2*iB ztcdQ7OQ*`O*r~3duEd>6_opPcZpFh^d>+n4>l|p!!st1Esc|lz~rPax7r0FnAk5y9m8)AB)YNyjK)@!}V zRH)<2Iv}MoM$zI)#;BnNqg%;><-_`zr}?F@q{QhkKuY{!Sh6KO1WOw9q9~79s&5zY zxKImB`BK5@#!~gAAD`#ts2-{=QbQHD7jLNQk3mW5zzw4HVwmc}h}ZP=FvSDZRvM$w zx@eFWf3f?6za!PDKv#hr3B0Vx&xNf)V;8zre1<216FlYQ*o=SEyLa&hw}7I zK1|h(>GU0&7!0GOSTn05cRDGh^ZB?}s$o5Y#!+E!!OxcC5kIr}D8>gqBB0F>zFb*c z8zOU+>E5XUZ#g(t-hafF{Xe^#qFrW%C#vI6G%}u;Js0mqu|Jd=Lq|hjkZ(k&nKa7z zU{%f#|3@5}V0cTSufw6_LnZ2v&2l%-- zF%aT}?4wMuOGe@`;-Ss31b`nmwy=Jo#69g34r?w|tj^8jAS@2WebT+2$sv zT5?6($M~bA`B;+Q+9ZDwtdkdwB=-~)4Nh9I9E=%C8wx5Ce1=I7-A{~OM0{h3zb!#u zKE|zDx*eQ@N7nH%yEu>&hLMH?5uCl^Km;edY6Rd%(NIQeB3Ea{gkf9-!zc^ zwWzlvrWPrJtR2f*_Bs`hFW|>5 z@WU31`kac4;ZZ3(!K+G(?j55S@$F-}%_74OofW>u!w;?gd|&oVri%NR?zE@V&Ebyj z#td%eG_J1U+N7z@itfD6s zV%l3WK_ z+ac^FM~6zzIwzF$dv@wOd`Bre{DD^tv}yRF0QZD(R|}JudZIvms>4S|bo6j4ev+aS zA3c;b%7A??P1@44v-uZnaDdg1hil&+8uta4^hOh=CF`J)Mwdb(4`%Lf1Jq6ZYi^i~C?f6P4l_;G+EgL6PI}kCUc2T4s6Pf4iVD?o#%_h=pz0eC%#AR8`ZF zOQ`sA-i)cTMUTK@0X+gY=`)J!;;|UCa5b0WsfMu^j~iouQ*B!w@*+E!d9Y+KxeJ#3 zDAK2}WN?f_1<8s$1WT}Yjpd@r3ig(~2m?M6FVmowJ(_8Dv3l1C6tHd2TALJb)>Tt7t)*T0W) zHdu&)qrLVFIwQ9F_sNn^?bI9iXu#xiTC`^PR!{S^x z+7vXU80TNGq-os;OPbbpSkkyZfF+Il4AW>wz>=#M!jh{qVaewGQ^UhU`o3db{mhHr zFU@V|_8!)(AOSyL#*;msw7@fWIy-2hr*TgB&Zau1OF&|zfAJ0XxAyqOcxaF2SNoAgR~{q5?+oEc0^7zd*;obO$%T6IL`47C{fiMr z{zB|+a+0>>l$_qc4UfQ%4R^A!87#{mkX@2qPDX`8(ZMBkn`dKrgJlJt`{UV{?{vqc z?81CW_qKPU-XS4CF?n2e3;bcnWrjnwH-+$(srML&eP9KtpLumV~{oqv=-K(nNf&EiZ>Z+1$s<@@U()i z3Xc%6;*El^1iW;J7I&G%ttdKPfGRfIgQO$@SKBKE{fQRuW{%fiE_4c@Lvy}LUc@3V z+eLALayiu~#3IE9jGd@lghx3Ni^@e5gtfv;hiGwsB5^BQf1#%yBKH&t~w-KfMO)j?5FX=VtIPQ7$! zVH9GK;@3(Q2}U6nDUON4mlxUw>Cnn3#3Ds`go3_(sY7d{5Q`Mmt5XjOG>UZ^O~z|v zO{Wn`p;6a(E``>Z5Ohd1YOzRNN7QjOoVdv~oj54ty4GQ3XP>g2QHn*%2BP$pAALJi zhxSGx7AcyFqC!1w))M^fXjEd6>I_yjZ&lrCHmT9xhO-+?h)?z;@h}^*su8RX%%!XJ zjRhS#n^?u7SlckOb@kh*dvQ=h4gbtH0SS!K7x(ZrH@wbb1^MgD79CvlVvCMp@WIi4 zwQK#Cu2G=TR%7IiUVeVz{BYmckozg=mz?7CAcu}a27p02=-MtBN{>7p+ibeUCR3sRyy|I#wMJbl_G_PHa zdgo989H>;K?kLS(-DS#U;c!myrhJhml}o01ouE@Eqvp^W#eKPzQynkm)bsCoka#K1(G;Ny(c-;Aa_Spb>ETZux|v*xMY)_? zsiKEbh((G8qM&(cxU9+OX+<4+8iiP-DDo6)6-TG3I`lFMu}D!Y3a+tOr}l7}l_zNl z{`NL1u}F1urGCya3b9CWho?|^$?^F}H43pvaj&O{l9xV4Ar>hfK51V18kJb2dcvpj z)+K4UqQkjHB^Ifktu%H0j6y6@tP+K<#dOmS@HgEk#3IG3l`8rhg;=C`DXEgeMhr^5ouW`-h*670 z>fc$-vs;18ZdyTCg-7G3STuf$f>=M}r9-s1|0{7TijEhFP_fw_BwmWMjW5U1;tgP+ zKk<5)zF4lqFq31k$YV`W`})#(nvTCCj6y6@)DuO8R{OM1HOi>OBGoCPs$0XU+coxZ zjnbG2!J&~O@dZXH7Ac#vvelp(&Y<_}IC0<9b*dNCW^Z~7r+N@Rt%=2=)tV@Ym9Lj~ z<~kfHCi!S7K44MM@!A}Tmug?)r8pO#B;K}?>y@>gmA}<>9{;9}Q?FY+r{3^dr8OtW zy0De6el9e*7mHGsBq^gAUFBLU=&JB2O=3|=CwUs0VIbj~cmDpaM)^{K`hl~||G#G={}1+mib(ji*hw^%vV z@lsAb|DFelHw{OR*>)_gAWzY7}CTVudJt=W`eMQZ>ye z#3IF$5sFDZ#brhz7AcK(4Lx7LoDrPXI+ zjgVZ;3MxDcq*%`i z@<%`X6|}}rqQZ$&k3CU4ierm#8fO=ff$%(D6yI#+^j7@U<1qbdhK#RbQ5zJCe2SG| ztmfToV`dAVuxv8m-!7XSrfmM8sYZnvoKCzsVo^@Fn6lAxlxAz;J_YEqdC!#1ZmVo4 z-n#681e8-WG!7FHmCiZ+N{ZxMEXui9(#yS_kUmYJDDq9p#iEq&Veg{Cj=O7(3B+tm zZz>cRl~|k_nV|1mU6?9d2RHtH5>O?`Tj(F)1E$(lby{aXtAEm%QbTCt`3tD>0|EajpOd!!Pr z&laUJo-JaNaxxhR^YJ1NH{eBs!B6UQeU<)}_^Un9?=i{9AQsh=Sd=QU5{%W}Sjoon z-(746REK$-HoQ4vQ3)k-F8vCcQ*@Yb6k?I0qbTAc?;VZSGW@;LD8(XWvM4L;o96md zR~eO9r0U^Q)p2U))tEqncj!%ptBp!5QuSe#oMF^vo>tIR;Ze)#a$1{mI-6Yh*U1Y^PQ@ZmgGCjkKIm&wIxI9wu}C>m zl)kl=-t&`cu~CRcii;{$6d8qBq?jNI-&(6ZMXtgUqY#S}Q&`cwQ4H>A#?nbOmjVf> zzGSyc^_9mw!Y`sX6|OfiibXL_XQqGMqbs7iQYEOrgp;C>735_eTh#NeVN3T?{TCNF zkW$A=x~rI-#@D>JUN9*aK~5#%6i*r%2t)Al$6F7db)58jUNS0(MLxu$v`Ksk#;Sa; z>6IKQbdWfZFclk>!(z^be{^WC>G-?Ml(kr-xV}adilXDCQt|wI9wc6hbGVMwFm26)lFQom z(+ZP)svAvC#iG1Crc`_fHJQi*e2NmI5Q`K~i$eNaL}}h+6k?I$1y-D>G=)c{DHfHc zC@Pj_w76f9xS^roFHO(C=RxA7(j3Hmd5aeBo0aDBW|K>?D3@iG=2Cc+OR*@IqNte5 zXmM{oVJ3%8dJKEhQV@%rn8o}H8# zP%KKDSd=!2FTq%q*NInhq|ia)pgIu?8E_hKF8Ha$4B^r5e(7+JDQmGv(Nq+^6_39U z-fI+Mk>ZR99}Tqw{Jq~O#3DtT2t^y8;z6SjixeG15f_7}y=psgdGfTEe}(vvQHe#W z&a7&X5bGq2tm~ZC4R>ya*VtMG`)nOLM67*(auf=Rf-sKg@GP*KrXPsbGqnevC}XDgrL38N5;6q7{Zn}yEwDV{V6u}CpBLXqNAJZ%(Wkz!_q!oL%F)+odx zML~puTA~im8HHG+xRMpk}SU<4U9@c)gVEp6oCo3tvN7*7@ z^gY%9pL?I!*QL2LbMvNM;uOxjeCDjVGZS+2@@CQL+&>RNv>C~5xk&*Hy(de-v|0HD zdASp3INC^%&;N_0;7L%Glp1VNVbnB9p?{+y;3NR6Sn&Dt^9yqQqqzK|qPnL^nb1Ec zY9kvMnd9W*taO?)1uwEXIg_2~_z&YTN_fh&+`O!rg)?&VCKlul&&{7zn0HC8b2iw8 z%p&#-XExZAangOMGZk@6$7e5=oM|(sWfsnueL>!|f?P7-W43b%-V2;=KHjLpX_Nb- zKnrpilt{-SVifDNnU^LM%$k)jeb&rNooO@YOq@P#G8H%BvuEW`E0{KGrZXq^l7d-z zeMX+^QKwJKFR%b93VDB@%hQkSjzH*NUasPF@la}m0jhlplXLHQJCf5FS5C%h!W?QL6mIBpC&q+|_0<$t zq~3`$DWh?5B&Qj3TH&3_@UFXFTOP@w9~=n=sO3{w{d4G&NDh5DD;S{CrZ6_)tve$* zbdx_As65TI><9*^HBx$3J@Cfsk@1|t9BQk?nKb-k+()aJ_ZC&)&=;pp<}0BJ@lfe` zZKI^+Yv_&@)6<$cm6u_gDsU33z-e0r4vhxEKqlU)4F9V8+n14PrVd6*x3voNO-0ssiUc=FsRt<4@bJ z-~1BURtHpp<1(l6IVHOa94woVugc>YR0U3mIkdu|(CFIU|BcL74z2_Pw8Eh%I(-qjV!oy_hguPFPOtX^79eE#_g2%G!>tk4 z*EYRgX}<5|cY-IsUuZu?gxXAyIBJN$lL-R_Z`#Z};3TLn%LbM$=LZC=Bjk-pG% zk@qHer*M0N95nxmZEPv7$i9*|I~u-=MR!HcbyeV8&m8Js6jnWX(eIJ*EW;J)gD2(` zSAlaw6*%E4aBgIdZa+uct^RjpnoFv{xv2`Ao2$TC&YXC>Q}}D_Q)!Xuxdm5(0lj8> zChd+!k(^trz`3mooZG9wxq~^n&A)ov<(nhZ^RFs!?qm)I9UfbX`W?xLjOQ-qw8lHN z&<|gFZdD`)Q#Hzm=0W0I@ZM5XAX)yg?w%@e?yUmnzDhZhX)1N@XAb3yQnBpL1T4P1 z^auyTDAHUx=fO%j^C#o7^AL05@J=3845N z`12*4N0~zpf>QgKR%=ZE$T{UP=Fp?fls~O%YU&;6XHTA`acwS--trjR1aeV^FsFxn8 z)0de;?Sew|^B+_Xe9gi;slR^m;DpG$zrq}9r^H#jBl$=qXAN`EfjP|&&2sX?~qKF5W4;dDCgT{JtdbZ{W(w);4c4hkh!E+We&UUrzSN zBWeB*bFRfZt^LN$|Lo^CBhvg9bLgwK6wl0CpU;nsr<6I%@lNr?T=GcGw<6+M%bd#d zzK%K6HYhyQf7v&FUy}DST#@!eoMDeQ9umn}&zvN@Q=NXevBUR~oVS@neUvz7m4E(i zBxgevI2)NmWkVtQS`^&?X|9~JxeA;uRp4x8jxOiu=lt84Ln){Fx_wB8qR70z!yGg| z<~Z+lwc5PY#kEgFjkRgr_~6Py)zr?TF=|L(?qj*LH_GbaJ>r0#m|g1FBj#*HtSL+d&U z(eDrL#g$;-8oZOQ?UVY>@%xgt`XzHlVrS z!y|p|$CY597BkT17a!~t$@zgf)P5+X6Mz5d?nusoDsXEkaw*A2<`TChT-4v%~UKcEJD%RI8%&FYhugt03*Kbwu^*eL)dMx_B z2}>E&Dg6i!&2wYQQin#S`48r_#yjOE`rhg&bLi)IYQn0qxA(h|@f>3g{eTUP9pg${ zMHx4aGlzb*k=oh2n-{i>jOV}1Nx(a$=iVBNdPH*mWDfm^Bl$|{d^|mp^A~d}FCR>4 zC?ERS97@kG#p`a4jHjGA*i>-1d)Bh#NDd7J!9WMaX>$FR0g;>lbEy0%e9`f)36UIH zt(~mD2bt51W5Kx5;KtI(c<>Y};;E-N^FA3jDw0G06w=AYpBl{3b6oWKt0r@(eNiYH z-v6;kU$M-gx}q@P)1LbyIkl?5sm+|q$KE>3(fiXg4sW_W(pO#Ppz-k-ep<@qSQJ$3 z%k`K;`GRqR^&x$+)jL~`zJ{cqX+Ie!z6zWMRp2zN0_POwq#;kVMr_ui07X?X?~RyK z2iGZlzk9?bk(|aB=jr#xJs!zv!ki?D#`$$09Wz(-)s#846({;U*o--}r=;-x($m9{ z@z4|Y!2pe`6#moVmh4E*sm$4o>y-DmIu5@rl5-k!&c$^~X@|Mrbcy89ZYUUdTE#PD z{a;wOts(CPQo{DF8({Z~ZIW3rj!Ghb^rS(fLjO5UlroDAt^z~{2b97sMZ)o%M z$av_dq=JD{;fum`Z7+X2l0zeNFmResoW*SixRD$h;l1_YXDjZBGFK)tN4K9*_q{P9 zGM=^;=Z;Ti?Th5JtAejHt$3pQYHx9(`=WpE;$->iXvGuV7yXl?a{q#gF}km_m_zkN z;f42)W5HOl{hV#ZvwM3ZOhgqqoh(lD^w2DMvV0{oXA;sv{i1)TPbNqD>cX5H#TizX zhNe_8Jzc9153NRIj)URkT(u|4oZF2#r{FqqdUYFnW2CR{%&EN1_oxD=XB9ZTm=lAv zP>8;_>dhP!9GBskGk#tWnPysP1OtzPLnW7S?-~6gIjPK{ADg53`{wD7-5bg2!yNj_ zH|k>zzuvSYlGB$tdTdE}w=uRg73=F<=FqwYhI4J-Ls9CYA9LC%&ZwIQh9cuhV-Ah0 zR7U01`!DlzWUrUboCI8_R4jOS=GAGu%k=N@GnhkhP>6n((!UCvOp6n}zOtC3*CZ`6 z&$`^7X4x~IR|U=hixYiq<1$D0_tKl*!{WVSU1S>$3@7>+K9D)oM=5kXzX=xj72_FH z1rGg#F>+2qz8+5w+!Gm34s&R}AWk^>DJ+&N`Wnm}n!AaUxpC%;k(?pSX^-m^CN3?yP|cY-fA%b$=1_o2Z0?NQ z8JEnS&y*a4%$OzLI2de@{9MruVT9-xsF<&IC>{!zDP(~`<}0LiKyy|oq^?0eP)Ij} z)RgGZB($oRLIMVvqL5Ywxk({)4DyCTQVc@haG_A{=$IR;uJE!!&Q-`(gIuMM^#-|H zcOb+iQN9v^d>Vo1H=g1dni) zL6Q{GD4^phR7i7!ysVIB205&dA`?&3`iK_cK7*txgvQKifgjQARc8_+zmHd(fdTFP z8im9f5a&f+_-hN8K98iMzv5OyA4vRkPi*Q zx4042V1vw5hjyN)duOHw)J@i zDNx8lgKSgCod!vygEWM@405GHemBU63OQnso@&u{)F8Jj1U9{L{arM$XtcIZt}ieA#WL^Ra;S&8RQCuykn5J z6|&PHr?(T;#|Bxgkgp6<>rCMsFvw_y{A7?P6f(^q&D)D=u0aMUfY3-p{p1|>^8 z;|#J`A!7})T_FtuI)xW@5!J7TvsWQ!8cvU{!s%#`eF_ zV~{!L2(r;2BU1$#V34mAvcVt=`Uq#XLB3E(u0i_r6;8fE?p8=lK-bRbbA{8?AdUM8 z^1V@guaI2^sh=*K0Y)`TA)O5JzCwB%WK@Qz_L+Ew^cSRs;arg^NNt1cQpndvm69c# z?FPA9A?F)pheAder002}+G3E^3YlV%ZxvEtkVXSURnw$rkV5tw&J7BwZaCFkQKcEA zmqJ{FT&|GL26;pwjSaF}AuSD3H{0RxiSa%_A!`kCtwP>4$m27_dT1i8&1A1Gw8K`zS?&UFSUSIBz?SvOcXu0ft2BFHj> z^cX70Ee3f;AWQaj7 zzDPJX8ss&F++mPY#|YTCP*`b3{XgIgIuPNjs_WdnW*X-Acquk8jxyCZ!%LVu|nz@WObgz)5;(pE2NP@n&b=Tbb~BYNSZ-b zDWrozS`~<@hd~x9B*P%jDx|YPS`~__k3otQ(%T>p%n?pMgIqUPkcI|nI!}-UgWRu> zbc3{?FPyUsa^aPNG&aaXR|yhtkbPGRl5CJW7YNecAbS+j-5_oNWO7k3sGRLepibLH-Mb!siA#?>a%!13Km#72?HnKp|c{IoFG- zmWk(Ug*45EE`2+4?Z$Z)#DqF|72+Svr49CM0xM#GTG1!S#}mg64M115rpbOF*C zoIio86so8_q!+H8i`Qv7UtM%@7^EBJYcpP_YECzuFN3h^U*Nonm-yyNR6Z1vHK$9m0M6a`D;#!)PhAX0r}-Yk(eZRO9Njif zF^E>(t5sb{MVb4}Ae!SLbe:*|IAl+2+;eVEd)7*^|6ei-uNEh8WXuxGe9}GCF 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 diff --git a/breakpad/v120/lib64/exception_handler.lib b/breakpad/v120/lib64/exception_handler.lib deleted file mode 100644 index 30d8a5d6aee3a606709016b3451dc1afe03449cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292640 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 - - Debug + + Profile Win32 - - Debug - x64 - - - Purify - Win32 - - - Purify + + Profile x64 @@ -45,20 +37,18 @@ $(ExecutablePath);$(MSBuildProjectDirectory)\..\..\third_party\cygwin\bin\;$(MSBuildProjectDirectory)\..\..\third_party\python_26\ - $(SolutionDir)$(Configuration)\$(Platform)\ - $(OutDir)obj\$(ProjectName)\ - false - false + $(SolutionDir)renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\ + $(SolutionDir)renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\$(ProjectName)\ false false - true - true + true + true $(ProjectName) $(OutDir)\$(ProjectName).lib - + - ..\..;..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) EnableFastChecks true @@ -106,9 +96,9 @@ _DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - + - ..\..;..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) EnableFastChecks true @@ -156,108 +146,9 @@ _DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;%(PreprocessorDefinitions) - - - ..\..;..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - /MP %(AdditionalOptions) - true - ProgramDatabase - 4100;4127;4396;4503;4512;4819;4995;4800;%(DisableSpecificWarnings) - false - true - false - MaxSpeed - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions) - MultiThreaded - false - true - Level4 - - - ../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories) - /ignore:4221 %(AdditionalOptions) - $(OutDir)\$(ProjectName).lib - - - wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;%(AdditionalDependencies) - ../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories) - /safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions) - dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs) - false - true - $(OutDir)\$(TargetName).lib - $(OutDir)$(TargetName).map - Console - MachineX86 - - - dlldata.c - true - %(Filename).h - %(Filename)_i.c - $(IntDir) - %(Filename)_p.c - %(Filename).tlb - - - ../..;..\..;..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - 0x0409 - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - - - ..\..;..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - /MP %(AdditionalOptions) - false - ProgramDatabase - 4100;4127;4396;4503;4512;4819;4995;4800;%(DisableSpecificWarnings) - false - true - false - Disabled - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions) - MultiThreaded - false - true - Level4 - - - ../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories) - /ignore:4221 %(AdditionalOptions) - $(OutDir)\$(ProjectName).lib - - - wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;%(AdditionalDependencies) - ../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories) - /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions) - dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs) - false - false - true - $(OutDir)\$(TargetName).lib - $(OutDir)$(TargetName).map - Console - MachineX64 - - - dlldata.c - true - %(Filename).h - %(Filename)_i.c - $(IntDir) - %(Filename)_p.c - %(Filename).tlb - - - ../..;..\..;..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - 0x0409 - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - ..\..;..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) true @@ -309,13 +200,13 @@ _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - mkdir $(SolutionDir)\$(PlatformToolset)\lib32\ 2> nul -copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib32\ + + - ..\..;..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) true @@ -363,16 +254,32 @@ copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib32\ _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - mkdir $(SolutionDir)\$(PlatformToolset)\lib64\ 2> nul -copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib64\ + + + + + $(SolutionDir)3rdparty\ + + + + + $(SolutionDir)3rdparty\ + + - - - + + + + + + + + + diff --git a/renderdoc/3rdparty/breakpad/client/windows/common.vcxproj.filters b/renderdoc/3rdparty/breakpad/client/windows/common.vcxproj.filters new file mode 100644 index 000000000..24031ab1a --- /dev/null +++ b/renderdoc/3rdparty/breakpad/client/windows/common.vcxproj.filters @@ -0,0 +1,42 @@ + + + + + + + + + + + + + Common includes + + + Common includes + + + Common includes + + + Common includes + + + Common includes + + + Common includes + + + Common includes + + + Common includes + + + + + {0ee0db1a-3e13-4e79-8fb0-0d55d8261558} + + + \ No newline at end of file diff --git a/breakpad/client/windows/common/auto_critical_section.h b/renderdoc/3rdparty/breakpad/client/windows/common/auto_critical_section.h similarity index 100% rename from breakpad/client/windows/common/auto_critical_section.h rename to renderdoc/3rdparty/breakpad/client/windows/common/auto_critical_section.h diff --git a/breakpad/client/windows/common/ipc_protocol.h b/renderdoc/3rdparty/breakpad/client/windows/common/ipc_protocol.h similarity index 98% rename from breakpad/client/windows/common/ipc_protocol.h rename to renderdoc/3rdparty/breakpad/client/windows/common/ipc_protocol.h index a9239ec20..d9391095b 100644 --- a/breakpad/client/windows/common/ipc_protocol.h +++ b/renderdoc/3rdparty/breakpad/client/windows/common/ipc_protocol.h @@ -34,8 +34,8 @@ #include #include #include -#include "common/windows/string_utils-inl.h" -#include "google_breakpad/common/minidump_format.h" +#include "breakpad/common/windows/string_utils-inl.h" +#include "breakpad/google_breakpad/common/minidump_format.h" namespace google_breakpad { diff --git a/breakpad/client/windows/crash_generation/ReadMe.txt b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/ReadMe.txt similarity index 100% rename from breakpad/client/windows/crash_generation/ReadMe.txt rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/ReadMe.txt diff --git a/breakpad/client/windows/crash_generation/client_info.cc b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/client_info.cc similarity index 98% rename from breakpad/client/windows/crash_generation/client_info.cc rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/client_info.cc index 3a1a96262..0630c4e35 100644 --- a/breakpad/client/windows/crash_generation/client_info.cc +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/client_info.cc @@ -27,8 +27,8 @@ // (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/windows/crash_generation/client_info.h" -#include "client/windows/common/ipc_protocol.h" +#include "breakpad/client/windows/crash_generation/client_info.h" +#include "breakpad/client/windows/common/ipc_protocol.h" static const wchar_t kCustomInfoProcessUptimeName[] = L"ptime"; static const size_t kMaxCustomInfoEntries = 4096; diff --git a/breakpad/client/windows/crash_generation/client_info.h b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/client_info.h similarity index 97% rename from breakpad/client/windows/crash_generation/client_info.h rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/client_info.h index d807e9adf..fc9db7d99 100644 --- a/breakpad/client/windows/crash_generation/client_info.h +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/client_info.h @@ -32,9 +32,9 @@ #include #include -#include "client/windows/common/ipc_protocol.h" -#include "common/scoped_ptr.h" -#include "google_breakpad/common/minidump_format.h" +#include "breakpad/client/windows/common/ipc_protocol.h" +#include "breakpad/common/scoped_ptr.h" +#include "breakpad/google_breakpad/common/minidump_format.h" namespace google_breakpad { diff --git a/breakpad/client/windows/crash_generation/crash_generation.sln b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation.sln similarity index 100% rename from breakpad/client/windows/crash_generation/crash_generation.sln rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation.sln diff --git a/breakpad/client/windows/crash_generation/crash_generation_client.cc b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.cc similarity index 98% rename from breakpad/client/windows/crash_generation/crash_generation_client.cc rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.cc index f88216aba..49d0dcbbb 100644 --- a/breakpad/client/windows/crash_generation/crash_generation_client.cc +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.cc @@ -27,10 +27,10 @@ // (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/windows/crash_generation/crash_generation_client.h" +#include "breakpad/client/windows/crash_generation/crash_generation_client.h" #include #include -#include "client/windows/common/ipc_protocol.h" +#include "breakpad/client/windows/common/ipc_protocol.h" namespace google_breakpad { diff --git a/breakpad/client/windows/crash_generation/crash_generation_client.h b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.h similarity index 98% rename from breakpad/client/windows/crash_generation/crash_generation_client.h rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.h index ce9ec0919..bb47652f3 100644 --- a/breakpad/client/windows/crash_generation/crash_generation_client.h +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.h @@ -35,8 +35,8 @@ #include #include #include -#include "client/windows/common/ipc_protocol.h" -#include "common/scoped_ptr.h" +#include "breakpad/client/windows/common/ipc_protocol.h" +#include "breakpad/common/scoped_ptr.h" namespace google_breakpad { diff --git a/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj similarity index 64% rename from breakpad/client/windows/crash_generation/crash_generation_client.vcxproj rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj index 75994b72f..92039bb40 100644 --- a/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj @@ -1,20 +1,12 @@  - - Debug + + Profile Win32 - - Debug - x64 - - - Purify - Win32 - - - Purify + + Profile x64 @@ -44,20 +36,18 @@ $(ExecutablePath);$(MSBuildProjectDirectory)\..\..\..\third_party\cygwin\bin\;$(MSBuildProjectDirectory)\..\..\..\third_party\python_26\ - $(SolutionDir)$(Configuration)\$(Platform)\ - $(OutDir)obj\$(ProjectName)\ - false - false + $(SolutionDir)renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\ + $(SolutionDir)renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\$(ProjectName)\ false false - true - true + true + true $(ProjectName) $(OutDir)\$(ProjectName).lib - + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) EnableFastChecks true @@ -105,9 +95,9 @@ _DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) EnableFastChecks true @@ -155,108 +145,9 @@ _DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;%(PreprocessorDefinitions) - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - /MP %(AdditionalOptions) - true - ProgramDatabase - 4100;4127;4396;4503;4512;4819;4995;4800;%(DisableSpecificWarnings) - false - true - false - MaxSpeed - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions) - MultiThreaded - false - true - Level4 - - - ../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories) - /ignore:4221 %(AdditionalOptions) - $(OutDir)lib\$(ProjectName).lib - - - wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;%(AdditionalDependencies) - ../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories) - /safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions) - dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs) - false - true - $(OutDir)lib\$(TargetName).lib - $(OutDir)$(TargetName).map - Console - MachineX86 - - - dlldata.c - true - %(Filename).h - %(Filename)_i.c - $(IntDir) - %(Filename)_p.c - %(Filename).tlb - - - ../../..;..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - 0x0409 - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - /MP %(AdditionalOptions) - false - ProgramDatabase - 4100;4127;4396;4503;4512;4819;4995;4800;%(DisableSpecificWarnings) - false - true - false - Disabled - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions) - MultiThreaded - false - true - Level4 - - - ../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories) - /ignore:4221 %(AdditionalOptions) - $(OutDir)lib\$(ProjectName).lib - - - wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;%(AdditionalDependencies) - ../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories) - /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions) - dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs) - false - false - true - $(OutDir)lib\$(TargetName).lib - $(OutDir)$(TargetName).map - Console - MachineX64 - - - dlldata.c - true - %(Filename).h - %(Filename)_i.c - $(IntDir) - %(Filename)_p.c - %(Filename).tlb - - - ../../..;..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - 0x0409 - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) true @@ -308,13 +199,13 @@ _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - mkdir $(SolutionDir)\$(PlatformToolset)\lib32\ 2> nul -copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib32\ + + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) true @@ -362,16 +253,22 @@ copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib32\ _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - mkdir $(SolutionDir)\$(PlatformToolset)\lib64\ 2> nul -copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib64\ + + - - - + + + $(SolutionDir)3rdparty\ + + + + + $(SolutionDir)3rdparty\ + + - diff --git a/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj.filters b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj.filters similarity index 70% rename from breakpad/client/windows/crash_generation/crash_generation_client.vcxproj.filters rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj.filters index 89584cb2b..c1f192455 100644 --- a/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj.filters +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_client.vcxproj.filters @@ -5,9 +5,5 @@ - - - - \ No newline at end of file diff --git a/breakpad/client/windows/crash_generation/crash_generation_server.cc b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.cc similarity index 99% rename from breakpad/client/windows/crash_generation/crash_generation_server.cc rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.cc index 016158883..2a89834dd 100644 --- a/breakpad/client/windows/crash_generation/crash_generation_server.cc +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.cc @@ -27,14 +27,14 @@ // (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/windows/crash_generation/crash_generation_server.h" +#include "breakpad/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 "breakpad/client/windows/common/auto_critical_section.h" +#include "breakpad/common/scoped_ptr.h" -#include "client/windows/crash_generation/client_info.h" +#include "breakpad/client/windows/crash_generation/client_info.h" namespace google_breakpad { diff --git a/breakpad/client/windows/crash_generation/crash_generation_server.h b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.h similarity index 98% rename from breakpad/client/windows/crash_generation/crash_generation_server.h rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.h index 070198582..1f8a2cbcd 100644 --- a/breakpad/client/windows/crash_generation/crash_generation_server.h +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.h @@ -32,9 +32,9 @@ #include #include -#include "client/windows/common/ipc_protocol.h" -#include "client/windows/crash_generation/minidump_generator.h" -#include "common/scoped_ptr.h" +#include "breakpad/client/windows/common/ipc_protocol.h" +#include "breakpad/client/windows/crash_generation/minidump_generator.h" +#include "breakpad/common/scoped_ptr.h" namespace google_breakpad { class ClientInfo; diff --git a/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj similarity index 64% rename from breakpad/client/windows/crash_generation/crash_generation_server.vcxproj rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj index a661dbb0f..0530a38a0 100644 --- a/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj @@ -1,20 +1,12 @@  - - Debug + + Profile Win32 - - Debug - x64 - - - Purify - Win32 - - - Purify + + Profile x64 @@ -44,20 +36,18 @@ $(ExecutablePath);$(MSBuildProjectDirectory)\..\..\..\third_party\cygwin\bin\;$(MSBuildProjectDirectory)\..\..\..\third_party\python_26\ - $(SolutionDir)$(Configuration)\$(Platform)\ - $(OutDir)obj\$(ProjectName)\ - false - false + $(SolutionDir)renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\ + $(SolutionDir)renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\$(ProjectName)\ false false - true - true + true + true $(ProjectName) $(OutDir)\$(ProjectName).lib - + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) EnableFastChecks true @@ -105,9 +95,9 @@ _DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) EnableFastChecks true @@ -155,108 +145,9 @@ _DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;%(PreprocessorDefinitions) - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - /MP %(AdditionalOptions) - true - ProgramDatabase - 4100;4127;4396;4503;4512;4819;4995;4800;%(DisableSpecificWarnings) - false - true - false - MaxSpeed - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions) - MultiThreaded - false - true - Level4 - - - ../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories) - /ignore:4221 %(AdditionalOptions) - $(OutDir)\$(ProjectName).lib - - - wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;%(AdditionalDependencies) - ../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories) - /safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions) - dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs) - false - true - $(OutDir)lib\$(TargetName).lib - $(OutDir)$(TargetName).map - Console - MachineX86 - - - dlldata.c - true - %(Filename).h - %(Filename)_i.c - $(IntDir) - %(Filename)_p.c - %(Filename).tlb - - - ../../..;..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - 0x0409 - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - /MP %(AdditionalOptions) - false - ProgramDatabase - 4100;4127;4396;4503;4512;4819;4995;4800;%(DisableSpecificWarnings) - false - true - false - Disabled - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions) - MultiThreaded - false - true - Level4 - - - ../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories) - /ignore:4221 %(AdditionalOptions) - $(OutDir)\$(ProjectName).lib - - - wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;%(AdditionalDependencies) - ../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories) - /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions) - dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs) - false - false - true - $(OutDir)lib\$(TargetName).lib - $(OutDir)$(TargetName).map - Console - MachineX64 - - - dlldata.c - true - %(Filename).h - %(Filename)_i.c - $(IntDir) - %(Filename)_p.c - %(Filename).tlb - - - ../../..;..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - 0x0409 - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) true @@ -308,13 +199,13 @@ _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - mkdir $(SolutionDir)\$(PlatformToolset)\lib32\ 2> nul -copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib32\ + + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) true @@ -362,16 +253,22 @@ copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib32\ _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - mkdir $(SolutionDir)\$(PlatformToolset)\lib64\ 2> nul -copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib64\ + + - - - + + + $(SolutionDir)3rdparty\ + + + + + $(SolutionDir)3rdparty\ + + - diff --git a/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj.filters b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj.filters similarity index 79% rename from breakpad/client/windows/crash_generation/crash_generation_server.vcxproj.filters rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj.filters index 84f57a469..58f3b5dc0 100644 --- a/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj.filters +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/crash_generation_server.vcxproj.filters @@ -7,11 +7,7 @@ - - - - \ No newline at end of file diff --git a/breakpad/client/windows/crash_generation/minidump_generator.cc b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/minidump_generator.cc similarity index 99% rename from breakpad/client/windows/crash_generation/minidump_generator.cc rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/minidump_generator.cc index dd5515a46..b343bef92 100644 --- a/breakpad/client/windows/crash_generation/minidump_generator.cc +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/minidump_generator.cc @@ -27,7 +27,7 @@ // (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/windows/crash_generation/minidump_generator.h" +#include "breakpad/client/windows/crash_generation/minidump_generator.h" #include #include @@ -37,8 +37,8 @@ #include #include -#include "client/windows/common/auto_critical_section.h" -#include "common/windows/guid_string.h" +#include "breakpad/client/windows/common/auto_critical_section.h" +#include "breakpad/common/windows/guid_string.h" using std::wstring; diff --git a/breakpad/client/windows/crash_generation/minidump_generator.h b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/minidump_generator.h similarity index 98% rename from breakpad/client/windows/crash_generation/minidump_generator.h rename to renderdoc/3rdparty/breakpad/client/windows/crash_generation/minidump_generator.h index 034772687..f182e30d5 100644 --- a/breakpad/client/windows/crash_generation/minidump_generator.h +++ b/renderdoc/3rdparty/breakpad/client/windows/crash_generation/minidump_generator.h @@ -34,8 +34,8 @@ #include #include #include -#include "google_breakpad/common/minidump_format.h" -#include "client/windows/common/ipc_protocol.h" +#include "breakpad/google_breakpad/common/minidump_format.h" +#include "breakpad/client/windows/common/ipc_protocol.h" namespace google_breakpad { diff --git a/breakpad/client/windows/handler/exception_handler.cc b/renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.cc similarity index 99% rename from breakpad/client/windows/handler/exception_handler.cc rename to renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.cc index 10d781289..6d72d87fd 100644 --- a/breakpad/client/windows/handler/exception_handler.cc +++ b/renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.cc @@ -33,11 +33,11 @@ #include #include -#include "common/windows/string_utils-inl.h" +#include "breakpad/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" +#include "breakpad/client/windows/common/ipc_protocol.h" +#include "breakpad/client/windows/handler/exception_handler.h" +#include "breakpad/common/windows/guid_string.h" namespace google_breakpad { diff --git a/breakpad/client/windows/handler/exception_handler.h b/renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.h similarity index 98% rename from breakpad/client/windows/handler/exception_handler.h rename to renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.h index 6ca40d4f5..4d9c8ad16 100644 --- a/breakpad/client/windows/handler/exception_handler.h +++ b/renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.h @@ -69,10 +69,10 @@ #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" +#include "breakpad/client/windows/common/ipc_protocol.h" +#include "breakpad/client/windows/crash_generation/crash_generation_client.h" +#include "breakpad/common/scoped_ptr.h" +#include "breakpad/google_breakpad/common/minidump_format.h" namespace google_breakpad { diff --git a/breakpad/client/windows/handler/exception_handler.sln b/renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.sln similarity index 100% rename from breakpad/client/windows/handler/exception_handler.sln rename to renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.sln diff --git a/breakpad/client/windows/handler/exception_handler.vcxproj b/renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.vcxproj similarity index 64% rename from breakpad/client/windows/handler/exception_handler.vcxproj rename to renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.vcxproj index f4f494fa9..a763541da 100644 --- a/breakpad/client/windows/handler/exception_handler.vcxproj +++ b/renderdoc/3rdparty/breakpad/client/windows/handler/exception_handler.vcxproj @@ -1,20 +1,12 @@  - - Debug + + Profile Win32 - - Debug - x64 - - - Purify - Win32 - - - Purify + + Profile x64 @@ -44,20 +36,18 @@ $(ExecutablePath);$(MSBuildProjectDirectory)\..\..\..\third_party\cygwin\bin\;$(MSBuildProjectDirectory)\..\..\..\third_party\python_26\ - $(SolutionDir)$(Configuration)\$(Platform)\ - $(OutDir)obj\$(ProjectName)\ - false - false + $(SolutionDir)renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\ + $(SolutionDir)renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\$(ProjectName)\ false false - true - true + true + true $(ProjectName) $(OutDir)\$(ProjectName).lib - + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) EnableFastChecks true @@ -105,9 +95,9 @@ _DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) EnableFastChecks true @@ -155,108 +145,9 @@ _DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;%(PreprocessorDefinitions) - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - /MP %(AdditionalOptions) - true - ProgramDatabase - 4100;4127;4396;4503;4512;4819;4995;4800;%(DisableSpecificWarnings) - false - true - false - MaxSpeed - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions) - MultiThreaded - false - true - Level4 - - - ../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories) - /ignore:4221 %(AdditionalOptions) - $(OutDir)\$(ProjectName).lib - - - wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;%(AdditionalDependencies) - ../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories) - /safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions) - dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs) - false - true - $(OutDir)lib\$(TargetName).lib - $(OutDir)$(TargetName).map - Console - MachineX86 - - - dlldata.c - true - %(Filename).h - %(Filename)_i.c - $(IntDir) - %(Filename)_p.c - %(Filename).tlb - - - ../../..;..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - 0x0409 - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - /MP %(AdditionalOptions) - false - ProgramDatabase - 4100;4127;4396;4503;4512;4819;4995;4800;%(DisableSpecificWarnings) - false - true - false - Disabled - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions) - MultiThreaded - false - true - Level4 - - - ../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories) - /ignore:4221 %(AdditionalOptions) - $(OutDir)\$(ProjectName).lib - - - wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;%(AdditionalDependencies) - ../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories) - /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions) - dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs) - false - false - true - $(OutDir)lib\$(TargetName).lib - $(OutDir)$(TargetName).map - Console - MachineX64 - - - dlldata.c - true - %(Filename).h - %(Filename)_i.c - $(IntDir) - %(Filename)_p.c - %(Filename).tlb - - - ../../..;..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) - 0x0409 - _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) true @@ -308,13 +199,13 @@ _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - mkdir $(SolutionDir)\$(PlatformToolset)\lib32\ 2> nul -copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib32\ + + - ..\..\..;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories) + $(SolutionDir)renderdoc\3rdparty\ /MP %(AdditionalOptions) true @@ -362,13 +253,20 @@ copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib32\ _WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - mkdir $(SolutionDir)\$(PlatformToolset)\lib64\ 2> nul -copy $(TargetPath) $(SolutionDir)\$(PlatformToolset)\lib64\ + + - - - + + + $(SolutionDir)3rdparty\ + + + + + $(SolutionDir)3rdparty\ + + diff --git a/breakpad/common/scoped_ptr.h b/renderdoc/3rdparty/breakpad/common/scoped_ptr.h similarity index 100% rename from breakpad/common/scoped_ptr.h rename to renderdoc/3rdparty/breakpad/common/scoped_ptr.h diff --git a/breakpad/common/windows/guid_string.cc b/renderdoc/3rdparty/breakpad/common/windows/guid_string.cc similarity index 96% rename from breakpad/common/windows/guid_string.cc rename to renderdoc/3rdparty/breakpad/common/windows/guid_string.cc index b7f877e66..561ac8a57 100644 --- a/breakpad/common/windows/guid_string.cc +++ b/renderdoc/3rdparty/breakpad/common/windows/guid_string.cc @@ -33,9 +33,9 @@ #include -#include "common/windows/string_utils-inl.h" +#include "breakpad/common/windows/string_utils-inl.h" -#include "common/windows/guid_string.h" +#include "breakpad/common/windows/guid_string.h" namespace google_breakpad { diff --git a/breakpad/common/windows/guid_string.h b/renderdoc/3rdparty/breakpad/common/windows/guid_string.h similarity index 100% rename from breakpad/common/windows/guid_string.h rename to renderdoc/3rdparty/breakpad/common/windows/guid_string.h diff --git a/breakpad/common/windows/http_upload.cc b/renderdoc/3rdparty/breakpad/common/windows/http_upload.cc similarity index 99% rename from breakpad/common/windows/http_upload.cc rename to renderdoc/3rdparty/breakpad/common/windows/http_upload.cc index 838185b75..e6fed65e3 100644 --- a/breakpad/common/windows/http_upload.cc +++ b/renderdoc/3rdparty/breakpad/common/windows/http_upload.cc @@ -34,9 +34,9 @@ #include -#include "common/windows/string_utils-inl.h" +#include "breakpad/common/windows/string_utils-inl.h" -#include "common/windows/http_upload.h" +#include "breakpad/common/windows/http_upload.h" namespace google_breakpad { diff --git a/breakpad/common/windows/http_upload.h b/renderdoc/3rdparty/breakpad/common/windows/http_upload.h similarity index 100% rename from breakpad/common/windows/http_upload.h rename to renderdoc/3rdparty/breakpad/common/windows/http_upload.h diff --git a/breakpad/common/windows/string_utils-inl.h b/renderdoc/3rdparty/breakpad/common/windows/string_utils-inl.h similarity index 100% rename from breakpad/common/windows/string_utils-inl.h rename to renderdoc/3rdparty/breakpad/common/windows/string_utils-inl.h diff --git a/breakpad/common/windows/string_utils.cc b/renderdoc/3rdparty/breakpad/common/windows/string_utils.cc similarity index 98% rename from breakpad/common/windows/string_utils.cc rename to renderdoc/3rdparty/breakpad/common/windows/string_utils.cc index e6ffa0823..ea4d30f91 100644 --- a/breakpad/common/windows/string_utils.cc +++ b/renderdoc/3rdparty/breakpad/common/windows/string_utils.cc @@ -30,7 +30,7 @@ #include #include -#include "common/windows/string_utils-inl.h" +#include "breakpad/common/windows/string_utils-inl.h" namespace google_breakpad { diff --git a/breakpad/dump_syms.exe b/renderdoc/3rdparty/breakpad/dump_syms.exe similarity index 100% rename from breakpad/dump_syms.exe rename to renderdoc/3rdparty/breakpad/dump_syms.exe diff --git a/breakpad/getmssym.sh b/renderdoc/3rdparty/breakpad/getmssym.sh similarity index 100% rename from breakpad/getmssym.sh rename to renderdoc/3rdparty/breakpad/getmssym.sh diff --git a/breakpad/google_breakpad/common/breakpad_types.h b/renderdoc/3rdparty/breakpad/google_breakpad/common/breakpad_types.h similarity index 100% rename from breakpad/google_breakpad/common/breakpad_types.h rename to renderdoc/3rdparty/breakpad/google_breakpad/common/breakpad_types.h diff --git a/breakpad/google_breakpad/common/minidump_cpu_amd64.h b/renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_cpu_amd64.h similarity index 100% rename from breakpad/google_breakpad/common/minidump_cpu_amd64.h rename to renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_cpu_amd64.h diff --git a/breakpad/google_breakpad/common/minidump_cpu_x86.h b/renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_cpu_x86.h similarity index 100% rename from breakpad/google_breakpad/common/minidump_cpu_x86.h rename to renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_cpu_x86.h diff --git a/breakpad/google_breakpad/common/minidump_exception_win32.h b/renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_exception_win32.h similarity index 98% rename from breakpad/google_breakpad/common/minidump_exception_win32.h rename to renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_exception_win32.h index 458a70543..603eb06c6 100644 --- a/breakpad/google_breakpad/common/minidump_exception_win32.h +++ b/renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_exception_win32.h @@ -41,7 +41,7 @@ #include -#include "google_breakpad/common/breakpad_types.h" +#include "breakpad/google_breakpad/common/breakpad_types.h" /* For (MDException).exception_code. These values come from WinBase.h diff --git a/breakpad/google_breakpad/common/minidump_format.h b/renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_format.h similarity index 99% rename from breakpad/google_breakpad/common/minidump_format.h rename to renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_format.h index 90e5ba5b6..8ce2d08e8 100644 --- a/breakpad/google_breakpad/common/minidump_format.h +++ b/renderdoc/3rdparty/breakpad/google_breakpad/common/minidump_format.h @@ -63,7 +63,7 @@ #include -#include "google_breakpad/common/breakpad_types.h" +#include "breakpad/google_breakpad/common/breakpad_types.h" #if defined(_MSC_VER) @@ -114,10 +114,10 @@ typedef struct { } MDRawContextBase; #include "minidump_cpu_amd64.h" -#include "minidump_cpu_arm.h" -#include "minidump_cpu_ppc.h" -#include "minidump_cpu_ppc64.h" -#include "minidump_cpu_sparc.h" +//#include "minidump_cpu_arm.h" +//#include "minidump_cpu_ppc.h" +//#include "minidump_cpu_ppc64.h" +//#include "minidump_cpu_sparc.h" #include "minidump_cpu_x86.h" /* @@ -529,10 +529,10 @@ typedef struct { uint64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS]; } MDException; /* MINIDUMP_EXCEPTION */ -#include "minidump_exception_linux.h" -#include "minidump_exception_mac.h" -#include "minidump_exception_ps3.h" -#include "minidump_exception_solaris.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 { diff --git a/breakpad/makesym.sh b/renderdoc/3rdparty/breakpad/makesym.sh similarity index 100% rename from breakpad/makesym.sh rename to renderdoc/3rdparty/breakpad/makesym.sh diff --git a/breakpad/symup.sh b/renderdoc/3rdparty/breakpad/symup.sh similarity index 100% rename from breakpad/symup.sh rename to renderdoc/3rdparty/breakpad/symup.sh diff --git a/renderdoc/3rdparty/mhook/COPYING b/renderdoc/3rdparty/mhook/COPYING deleted file mode 100644 index a7fd4533d..000000000 --- a/renderdoc/3rdparty/mhook/COPYING +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2007-2014, Marton Anka -Portions Copyright (c) 2007, Matt Conover - -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. diff --git a/renderdoc/3rdparty/mhook/disasm-lib/cpu.c b/renderdoc/3rdparty/mhook/disasm-lib/cpu.c deleted file mode 100644 index 2a12692ac..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/cpu.c +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (C) 2003, Matt Conover (mconover@gmail.com) -#include "cpu.h" -#include - -// NOTE: this assumes default scenarios (i.e., we assume CS/DS/ES/SS and flat -// and all have a base of 0 and limit of 0xffffffff, we don't try to verify -// that in the GDT) -// -// TODO: use inline assembly to get selector for segment -// Segment = x86 segment register (SEG_ES = 0, SEG_CS = 1, ...) -BYTE *GetAbsoluteAddressFromSegment(BYTE Segment, DWORD Offset) -{ - switch (Segment) - { - // Windows uses a flat address space (except FS for x86 and GS for x64) - case 0: // SEG_ES - case 1: // SEG_CS - case 2: // SEG_SS - case 3: // SEG_DS - return (BYTE *)(DWORD_PTR)Offset; - case 4: // SEG_FS - case 5: // SEG_GS - return (BYTE *)(DWORD_PTR)Offset; - // Note: we're really supposed to do this, but get_teb is not implemented - // in this bastardized version of the disassembler. - // return (BYTE *)get_teb() + Offset; - default: - assert(0); - return (BYTE *)(DWORD_PTR)Offset; - } -} - -// This is an GDT/LDT selector (pGDT+Selector) -BYTE *GetAbsoluteAddressFromSelector(WORD Selector, DWORD Offset) -{ - DESCRIPTOR_ENTRY Entry; - GATE_ENTRY *Gate; - ULONG_PTR Base; - - assert(Selector < 0x10000); - if (!GetThreadSelectorEntry(GetCurrentThread(), Selector, (LDT_ENTRY *)&Entry)) return NULL; - if (!Entry.Present) return NULL; - if (Entry.System) - { - Base = 0; -#ifdef _WIN64 - Base |= (ULONG_PTR)Entry.HighOffset64 << 32; -#endif - Base |= Entry.BaseHi << 24; - Base |= Entry.BaseMid << 16; - Base |= Entry.BaseLow; - } - else - { - switch (Entry.Type) - { - case 1: // 16-bit TSS (available) - case 2: // LDT - case 3: // 16-bit TSS (busy) - case 9: // 32-bit TSS (available) - case 11: // 32-bit TSS (busy) - Base = 0; -#ifdef _WIN64 - Base |= (ULONG_PTR)Entry.HighOffset64 << 32; -#endif - Base |= Entry.BaseHi << 24; - Base |= Entry.BaseMid << 16; - Base |= Entry.BaseLow; - break; - - case 4: // 16-bit call gate - case 5: // task gate - case 6: // 16-bit interrupt gate - case 7: // 16-bit task gate - case 12: // 32-bit call gate - case 14: // 32-bit interrupt gate - case 15: // 32-bit trap gate - Gate = (GATE_ENTRY *)&Entry; -#ifdef _WIN64 - Base = ((ULONG_PTR)Gate->HighOffset64 << 32) | (Gate->HighOffset << 16) | Gate->LowOffset; -#else - Base = (Gate->HighOffset << 16) | Gate->LowOffset; -#endif - assert(!Offset); Offset = 0; - break; - default: - assert(0); - return NULL; - } - } - return (BYTE *)Base + Offset; -} - diff --git a/renderdoc/3rdparty/mhook/disasm-lib/cpu.h b/renderdoc/3rdparty/mhook/disasm-lib/cpu.h deleted file mode 100644 index dce9d3ee3..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/cpu.h +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright (C) 2003, Matt Conover (mconover@gmail.com) -#ifndef CPU_H -#define CPU_H -#ifdef __cplusplus -extern "C" { -#endif -#pragma pack(push,1) - -#pragma warning(disable: 4214) - -#include -#include "misc.h" - -//////////////////////////////////////////////////////// -// System descriptors -//////////////////////////////////////////////////////// - -#define GDT_NULL 0 -#define GDT_R0_CODE 0x08 -#define GDT_R0_DATA 0x10 -#define GDT_R3_CODE 0x18 -#define GDT_R3_DATA 0x20 -#define GDT_TSS 0x28 -#define GDT_PCR 0x30 -#define GDT_R3_TEB 0x38 -#define GDT_VDM 0x40 -#define GDT_LDT 0x48 -#define GDT_DOUBLEFAULT_TSS 0x50 -#define GDT_NMI_TSS 0x58 - -// 16-bit GDT entries: -// TODO: #define GDT_ABIOS_UNKNOWN 0x60 (22F30-32F2F) -#define GDT_ABIOS_VIDEO 0x68 -#define GDT_ABIOS_GDT 0x70 // descriptor describing ABIOS GDT itself -#define GDT_ABIOS_NTOS 0x78 // first 64K of NTOSKRNL -#define GDT_ABIOS_CDA 0xE8 // common data area -#define GDT_ABIOS_CODE 0xF0 // KiI386AbiosCall -#define GDT_ABIOS_STACK 0xF8 - -#define SELECTOR_RPL_MASK 0x03 // bits 0-1 -#define SELECTOR_LDT 0x04 // bit 2 - -// for data selectors -#define DATA_ACCESS_MASK (1<<0) -#define DATA_WRITE_ENABLE_MASK (1<<1) -#define DATA_EXPAND_DOWN_MASK (1<<2) - -// for code selectors -#define CODE_ACCESS_MASK (1<<0) -#define CODE_READ_MASK (1<<1) -#define CODE_CONFORMING_MASK (1<<2) -#define CODE_FLAG (1<<3) - -#define TASK_GATE 5 -#define INTERRUPT_GATE 6 -#define TRAP_GATE 7 - -typedef struct _IDT_ENTRY -{ - USHORT LowOffset; - USHORT Selector; - UCHAR Ignored : 5; - UCHAR Zero : 3; - UCHAR Type : 3; - UCHAR Is32Bit : 1; - UCHAR Ignored2 : 1; - UCHAR DPL : 2; - UCHAR Present : 1; - USHORT HighOffset; -#ifdef _WIN64 - ULONG HighOffset64; - ULONG Reserved; -#endif -} IDT_ENTRY, TRAP_GATE_ENTRY; - -typedef struct _CALL_GATE_ENTRY -{ - USHORT LowOffset; - USHORT Selector; - UCHAR ParameterCount: 4; - UCHAR Ignored : 3; - UCHAR Type : 5; - UCHAR DPL : 2; - UCHAR Present : 1; - USHORT HighOffset; -#ifdef _WIN64 - ULONG HighOffset64; - ULONG Reserved; -#endif -} CALL_GATE_ENTRY; - -typedef struct _TASK_GATE_ENTRY -{ - USHORT Ignored; - USHORT Selector; - UCHAR Ignored2 : 5; - UCHAR Zero : 3; - UCHAR Type : 5; - UCHAR DPL : 2; - UCHAR Present : 1; - USHORT Ignored3; -} TASK_GATE_ENTRY; - -typedef struct _DESCRIPTOR_ENTRY -{ - USHORT LimitLow; - USHORT BaseLow; - UCHAR BaseMid; - UCHAR Type : 4; // 10EWA (code), E=ExpandDown, W=Writable, A=Accessed - // 11CRA (data), C=Conforming, R=Readable, A=Accessed - UCHAR System : 1; // if 1 then it is a gate or LDT - UCHAR DPL : 2; // descriptor privilege level; - // for data selectors, MAX(CPL, RPL) must be <= DPL to access (or else GP# fault) - // for non-conforming code selectors (without callgate), MAX(CPL, RPL) must be <= DPL to access (or else GP# fault) - // for conforming code selectors, MAX(CPL, RPL) must be >= DPL (i.e., CPL 0-2 cannot access if DPL is 3) - // for non-conforming code selectors (with call gate), DPL indicates lowest privilege allowed to access gate - UCHAR Present : 1; - UCHAR LimitHigh : 4; - UCHAR Available: 1; // aka AVL - UCHAR Reserved : 1; - UCHAR Is32Bit : 1; // aka B flag - UCHAR Granularity : 1; // aka G flag - UCHAR BaseHi : 8; -#ifdef _WIN64 - ULONG HighOffset64; - ULONG Reserved2; -#endif -} DESCRIPTOR_ENTRY; - -typedef struct _GATE_ENTRY -{ - USHORT LowOffset; - UCHAR Skip; - UCHAR Type : 5; - UCHAR DPL : 2; - UCHAR Present : 1; - USHORT HighOffset; -#ifdef _WIN64 - ULONG HighOffset64; - ULONG Reserved; -#endif -} GATE_ENTRY; - -// TODO: update for X64 -typedef struct _PTE_ENTRY -{ - ULONG Present : 1; - ULONG Write : 1; - ULONG Owner : 1; // E.g., user mode or supervisor mode - ULONG WriteThrough : 1; - ULONG CacheDisable : 1; - ULONG Accessed : 1; - ULONG Dirty : 1; - ULONG PAT : 1; - ULONG Global : 1; - ULONG CopyOnWrite : 1; - ULONG Prototype : 1; - ULONG Transition : 1; - ULONG Address : 20; -} PTE_ENTRY; - -// TODO: update for X64 -typedef struct _PDE_ENTRY -{ - ULONG Present : 1; - ULONG Write : 1; - ULONG Owner : 1; - ULONG WriteThrough : 1; - ULONG CacheDisable : 1; - ULONG Accessed : 1; - ULONG Reserved1 : 1; - ULONG PageSize : 1; - ULONG Global : 1; - ULONG Reserved : 3; - ULONG Address : 20; -} PDE_ENTRY; - -// TODO: update for X64 -typedef struct _IO_ACCESS_MAP -{ - UCHAR DirectionMap[32]; - UCHAR IoMap[8196]; -} IO_ACCESS_MAP; - -#define MIN_TSS_SIZE FIELD_OFFSET(TSS_ENTRY, IoMaps) -// TODO: update for X64 -typedef struct _TSS_ENTRY -{ - USHORT Backlink; - USHORT Reserved0; - ULONG Esp0; - USHORT Ss0; - USHORT Reserved1; - ULONG NotUsed1[4]; - ULONG CR3; - ULONG Eip; - ULONG NotUsed2[9]; - USHORT Es; - USHORT Reserved2; - USHORT Cs; - USHORT Reserved3; - USHORT Ss; - USHORT Reserved4; - USHORT Ds; - USHORT Reserved5; - USHORT Fs; - USHORT Reserved6; - USHORT Gs; - USHORT Reserved7; - USHORT LDT; - USHORT Reserved8; - USHORT Flags; - USHORT IoMapBase; - IO_ACCESS_MAP IoMaps[1]; - UCHAR IntDirectionMap[32]; -} TSS_ENTRY; - -// TODO: update for X64 -typedef struct _TSS16_ENTRY -{ - USHORT Backlink; - USHORT Sp0; - USHORT Ss0; - USHORT Sp1; - USHORT Ss1; - USHORT Sp2; - USHORT Ss3; - USHORT Ip; - USHORT Flags; - USHORT Ax; - USHORT Cx; - USHORT Dx; - USHORT Bx; - USHORT Sp; - USHORT Bp; - USHORT Si; - USHORT Di; - USHORT Es; - USHORT Cs; - USHORT Ss; - USHORT Ds; - USHORT LDT; -} TSS16_ENTRY; - -// TODO: update for X64 -typedef struct _GDT_ENTRY -{ - USHORT LimitLow; - USHORT BaseLow; - union { - struct { - UCHAR BaseMid; - UCHAR Flags1; - UCHAR Flags2; - UCHAR BaseHi; - } Bytes; - struct { - ULONG BaseMid : 8; - ULONG Type : 5; - ULONG Dpl : 2; - ULONG Pres : 1; - ULONG LimitHi : 4; - ULONG Sys : 1; - ULONG Reserved_0 : 1; - ULONG Default_Big : 1; - ULONG Granularity : 1; - ULONG BaseHi : 8; - } Bits; - } HighWord; -} GDT_ENTRY; - -BYTE *GetAbsoluteAddressFromSegment(BYTE Segment, DWORD Offset); -BYTE *GetAbsoluteAddressFromSelector(WORD Selector, DWORD Offset); - -#pragma pack(pop) -#ifdef __cplusplus -} -#endif -#endif // CPU_H \ No newline at end of file diff --git a/renderdoc/3rdparty/mhook/disasm-lib/disasm.c b/renderdoc/3rdparty/mhook/disasm-lib/disasm.c deleted file mode 100644 index 43e7766b6..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/disasm.c +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (C) 2004, Matt Conover (mconover@gmail.com) -#undef NDEBUG -#include -#include -#include "disasm.h" - -#ifdef NO_SANITY_CHECKS -#define NDEBUG -#undef assert -#define assert(x) -#endif - -////////////////////////////////////////////////////////////////////// -// Global variables -////////////////////////////////////////////////////////////////////// - -ARCHITECTURE_FORMAT SupportedArchitectures[] = -{ - { ARCH_X86, &X86 }, - { ARCH_X86_16, &X86 }, - { ARCH_X64, &X86 }, - { ARCH_UNKNOWN, NULL } -}; - -typedef struct _DISASM_ARG_INFO -{ - INSTRUCTION *MatchedInstruction; - BOOL MatchPrefix; - U8 *Opcode; - U32 OpcodeLength; - INSTRUCTION_TYPE InstructionType; - U32 Count; -} DISASM_ARG_INFO; - -////////////////////////////////////////////////////////////////////// -// Function prototypes -////////////////////////////////////////////////////////////////////// - -BOOL InitInstruction(INSTRUCTION *Instruction, DISASSEMBLER *Disassembler); -struct _ARCHITECTURE_FORMAT *GetArchitectureFormat(ARCHITECTURE_TYPE Type); - -////////////////////////////////////////////////////////////////////// -// Disassembler setup -////////////////////////////////////////////////////////////////////// - -BOOL InitDisassembler(DISASSEMBLER *Disassembler, ARCHITECTURE_TYPE Architecture) -{ - ARCHITECTURE_FORMAT *ArchFormat; - - memset(Disassembler, 0, sizeof(DISASSEMBLER)); - Disassembler->Initialized = DISASSEMBLER_INITIALIZED; - - ArchFormat = GetArchitectureFormat(Architecture); - if (!ArchFormat) { assert(0); return FALSE; } - Disassembler->ArchType = ArchFormat->Type; - Disassembler->Functions = ArchFormat->Functions; - return TRUE; -} - -void CloseDisassembler(DISASSEMBLER *Disassembler) -{ - memset(Disassembler, 0, sizeof(DISASSEMBLER)); -} - -////////////////////////////////////////////////////////////////////// -// Instruction setup -////////////////////////////////////////////////////////////////////// - -BOOL InitInstruction(INSTRUCTION *Instruction, DISASSEMBLER *Disassembler) -{ - memset(Instruction, 0, sizeof(INSTRUCTION)); - Instruction->Initialized = INSTRUCTION_INITIALIZED; - Instruction->Disassembler = Disassembler; - memset(Instruction->String, ' ', MAX_OPCODE_DESCRIPTION-1); - Instruction->String[MAX_OPCODE_DESCRIPTION-1] = '\0'; - return TRUE; -} - -// If Decode = FALSE, only the following fields are valid: -// Instruction->Length, Instruction->Address, Instruction->Prefixes, Instruction->PrefixCount, -// Instruction->OpcodeBytes, Instruction->Instruction->OpcodeLength, Instruction->Groups, -// Instruction->Type, Instruction->OperandCount -// -// If Disassemble = TRUE, then Instruction->String is valid (also requires Decode = TRUE) -// -// WARNING: This will overwrite the previously obtained instruction -INSTRUCTION *GetInstruction(DISASSEMBLER *Disassembler, U64 VirtualAddress, U8 *Address, U32 Flags) -{ - if (Disassembler->Initialized != DISASSEMBLER_INITIALIZED) { assert(0); return NULL; } - assert(Address); - InitInstruction(&Disassembler->Instruction, Disassembler); - Disassembler->Instruction.Address = Address; - Disassembler->Instruction.VirtualAddressDelta = VirtualAddress - (U64)Address; - if (!Disassembler->Functions->GetInstruction(&Disassembler->Instruction, Address, Flags)) - { - assert(Disassembler->Instruction.Address == Address); - assert(Disassembler->Instruction.Length < MAX_INSTRUCTION_LENGTH); - - // Save the address that failed, in case the lower-level disassembler didn't - Disassembler->Instruction.Address = Address; - Disassembler->Instruction.ErrorOccurred = TRUE; - return NULL; - } - return &Disassembler->Instruction; -} - -/////////////////////////////////////////////////////////////////////////// -// Miscellaneous -/////////////////////////////////////////////////////////////////////////// - -ARCHITECTURE_FORMAT *GetArchitectureFormat(ARCHITECTURE_TYPE Type) -{ - ARCHITECTURE_FORMAT *Format; - for (Format = SupportedArchitectures; Format->Type != ARCH_UNKNOWN; Format++) - { - if (Format->Type == Type) return Format; - } - - assert(0); - return NULL; -} - diff --git a/renderdoc/3rdparty/mhook/disasm-lib/disasm.h b/renderdoc/3rdparty/mhook/disasm-lib/disasm.h deleted file mode 100644 index ea5cd3f55..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/disasm.h +++ /dev/null @@ -1,583 +0,0 @@ -// Copyright (C) 2004, Matt Conover (mconover@gmail.com) -// -// WARNING: -// I wouldn't recommend changing any flags like OP_*, ITYPE_*, or *_MASK -// aside from those marked as UNUSED. This is because the flags parts of -// the flags are architecture independent and other are left to specific -// architectures to define, so unless you understand the relationships -// between them, I would leave them as is. - -#ifndef DISASM_H -#define DISASM_H -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include "misc.h" - -#pragma warning(disable: 4214) -#pragma warning(disable: 4324) - -typedef signed char S8; -typedef unsigned char U8; -typedef signed short S16; -typedef unsigned short U16; -typedef signed long S32; -typedef unsigned long U32; -typedef LONG64 S64; -typedef ULONG64 U64; - -#ifdef SPEEDY -// On Visual Studio 6, making the internal functions inline makes compiling take forever -#define INTERNAL static _inline -#define INLINE _inline -#else -#define INTERNAL static -#define INLINE -#endif - -#define VALID_INSTRUCTION(i) ((i) && !((i)->ErrorOccurred)) -#define NEXT_INSTRUCTION(i) ((i)->Address + (i)->Length) -#define DISASM_ARCH_TYPE(dis) ((dis)->ArchType) -#define INS_ARCH_TYPE(ins) DISASM_ARCH_TYPE((ins)->Disassembler) - -// NOTE: these should be as big set to the maximum of the supported architectures -#define MAX_PREFIX_LENGTH 15 -#define MAX_OPERAND_COUNT 3 -#define MAX_INSTRUCTION_LENGTH 25 -#define MAX_OPCODE_LENGTH 3 -#define MAX_OPCODE_DESCRIPTION 256 - -///////////////////////////////////////////////////////////////////// -// Code branch -///////////////////////////////////////////////////////////////////// - -#define MAX_CODE_REFERENCE_COUNT 3 - -typedef struct _CODE_BRANCH -{ - U64 Addresses[MAX_CODE_REFERENCE_COUNT]; // NULL if multiple to addresses - U32 Count; - U8 IsLoop : 1; - U8 IsCall : 1; // branch if false - U8 IsIndirect : 1; // call/jmp [Address] - U8 AddressOffset: 5; - struct _INSTRUCTION_OPERAND *Operand; // the operand containg the address -} CODE_BRANCH; - -///////////////////////////////////////////////////////////////////// -// Data references -///////////////////////////////////////////////////////////////////// - -#define MAX_DATA_REFERENCE_COUNT 3 - -typedef struct _DATA_REFERENCE -{ - U64 Addresses[MAX_DATA_REFERENCE_COUNT]; // NULL if multiple to addresses - U32 Count; - ULONG_PTR DataSize; - struct _INSTRUCTION_OPERAND *Operand; // the operand containg the address -} DATA_REFERENCE; - -//////////////////////////////////////////////////////////////////// -// Instruction -///////////////////////////////////////////////////////////////////// - -// -// Instruction types (bits 0-7) -// Instruction groups (bits 8-26) -// -#define ITYPE_EXEC_OFFSET (1<<8) -#define ITYPE_ARITH_OFFSET (1<<9) -#define ITYPE_LOGIC_OFFSET (1<<10) -#define ITYPE_STACK_OFFSET (1<<11) -#define ITYPE_TESTCOND_OFFSET (1<<12) -#define ITYPE_LOAD_OFFSET (1<<13) -#define ITYPE_ARRAY_OFFSET (1<<14) -#define ITYPE_BIT_OFFSET (1<<15) -#define ITYPE_FLAG_OFFSET (1<<16) -#define ITYPE_FPU_OFFSET (1<<17) -#define ITYPE_TRAPS_OFFSET (1<<18) -#define ITYPE_SYSTEM_OFFSET (1<<19) -#define ITYPE_OTHER_OFFSET (1<<20) -#define ITYPE_UNUSED1_OFFSET (1<<21) -#define ITYPE_UNUSED2_OFFSET (1<<22) -#define ITYPE_UNUSED3_OFFSET (1<<23) -#define ITYPE_UNUSED4_OFFSET (1<<24) -#define ITYPE_UNUSED5_OFFSET (1<<25) -#define ITYPE_UNUSED6_OFFSET (1<<26) -#define ITYPE_EXT_UNUSED1 (1<<27) -#define ITYPE_EXT_UNUSED2 (1<<28) -#define ITYPE_EXT_UNUSED3 (1<<29) -#define ITYPE_EXT_UNUSED4 (1<<30) -#define ITYPE_EXT_UNUSED5 (1<<31) - -// -// X86-specific flags (bits 27-31) -// - -#define ITYPE_EXT_64 ITYPE_EXT_UNUSED1 // Use index 1 if in 64-bit mode and 0 otherwise -#define ITYPE_EXT_MODRM ITYPE_EXT_UNUSED2 // ModRM byte may extend the opcode -#define ITYPE_EXT_SUFFIX ITYPE_EXT_UNUSED3 // byte after ModRM/SIB/displacement is the third opcode -#define ITYPE_EXT_PREFIX ITYPE_EXT_UNUSED4 // prefix -#define ITYPE_EXT_FPU ITYPE_EXT_UNUSED5 // FPU instructions require special handling - -#define ITYPE_3DNOW_OFFSET ITYPE_UNUSED1_OFFSET -#define ITYPE_MMX_OFFSET ITYPE_UNUSED2_OFFSET -#define ITYPE_SSE_OFFSET ITYPE_UNUSED3_OFFSET -#define ITYPE_SSE2_OFFSET ITYPE_UNUSED4_OFFSET -#define ITYPE_SSE3_OFFSET ITYPE_UNUSED5_OFFSET - -// -// Instruction types -// - -#define ITYPE_TYPE_MASK 0x7FFFFFFF -#define ITYPE_GROUP_MASK 0x7FFFFF00 - -typedef enum _INSTRUCTION_TYPE -{ - // ITYPE_EXEC group - ITYPE_EXEC = ITYPE_EXEC_OFFSET, - ITYPE_BRANCH, - ITYPE_BRANCHCC, // conditional (not necessarily just flags) - ITYPE_CALL, - ITYPE_CALLCC, // conditional (not necessarily just flags) - ITYPE_RET, - ITYPE_LOOPCC, - - // ITYPE_ARITH group - ITYPE_ARITH = ITYPE_ARITH_OFFSET, - ITYPE_XCHGADD, - ITYPE_ADD, - ITYPE_SUB, - ITYPE_MUL, - ITYPE_DIV, - ITYPE_INC, - ITYPE_DEC, - ITYPE_SHL, - ITYPE_SHR, - ITYPE_ROL, - ITYPE_ROR, - - // ITYPE_LOGIC group - ITYPE_LOGIC=ITYPE_LOGIC_OFFSET, - ITYPE_AND, - ITYPE_OR, - ITYPE_XOR, - ITYPE_NOT, - ITYPE_NEG, - - // ITYPE_STACK group - ITYPE_STACK=ITYPE_STACK_OFFSET, - ITYPE_PUSH, - ITYPE_POP, - ITYPE_PUSHA, - ITYPE_POPA, - ITYPE_PUSHF, - ITYPE_POPF, - ITYPE_ENTER, - ITYPE_LEAVE, - - // ITYPE_TESTCOND group - ITYPE_TESTCOND=ITYPE_TESTCOND_OFFSET, - ITYPE_TEST, - ITYPE_CMP, - - // ITYPE_LOAD group - ITYPE_LOAD=ITYPE_LOAD_OFFSET, - ITYPE_MOV, - ITYPE_MOVCC, // conditional - ITYPE_LEA, - ITYPE_XCHG, - ITYPE_XCHGCC, // conditional - - // ITYPE_ARRAY group - ITYPE_ARRAY=ITYPE_ARRAY_OFFSET, - ITYPE_STRCMP, - ITYPE_STRLOAD, - ITYPE_STRMOV, - ITYPE_STRSTOR, - ITYPE_XLAT, - - // ITYPE_BIT group - ITYPE_BIT=ITYPE_BIT_OFFSET, - ITYPE_BITTEST, - ITYPE_BITSET, - ITYPE_BITCLR, - - // ITYPE_FLAG group - // PF = parify flag - // ZF = zero flag - // OF = overflow flag - // DF = direction flag - // SF = sign flag - ITYPE_FLAG=ITYPE_FLAG_OFFSET, - // clear - ITYPE_CLEARCF, - ITYPE_CLEARZF, - ITYPE_CLEAROF, - ITYPE_CLEARDF, - ITYPE_CLEARSF, - ITYPE_CLEARPF, - // set - ITYPE_SETCF, - ITYPE_SETZF, - ITYPE_SETOF, - ITYPE_SETDF, - ITYPE_SETSF, - ITYPE_SETPF, - // toggle - ITYPE_TOGCF, - ITYPE_TOGZF, - ITYPE_TOGOF, - ITYPE_TOGDF, - ITYPE_TOGSF, - ITYPE_TOGPF, - - // ITYPE_FPU group - ITYPE_FPU=ITYPE_FPU_OFFSET, - ITYPE_FADD, - ITYPE_FSUB, - ITYPE_FMUL, - ITYPE_FDIV, - ITYPE_FCOMP, - ITYPE_FEXCH, - ITYPE_FLOAD, - ITYPE_FLOADENV, - ITYPE_FSTORE, - ITYPE_FSTOREENV, - ITYPE_FSAVE, - ITYPE_FRESTORE, - ITYPE_FMOVCC, - - ITYPE_UNUSED1=ITYPE_UNUSED1_OFFSET, - ITYPE_UNUSED2=ITYPE_UNUSED2_OFFSET, - ITYPE_UNUSED3=ITYPE_UNUSED3_OFFSET, - - // ITYPE_MMX group - ITYPE_MMX=ITYPE_MMX_OFFSET, - ITYPE_MMX_MOV, - ITYPE_MMX_ADD, - ITYPE_MMX_SUB, - ITYPE_MMX_MUL, - ITYPE_MMX_DIV, - ITYPE_MMX_AND, - ITYPE_MMX_OR, - ITYPE_MMX_XOR, - ITYPE_MMX_CMP, - - // ITYPE_SSE group - ITYPE_SSE=ITYPE_SSE_OFFSET, - ITYPE_SSE_MOV, - ITYPE_SSE_ADD, - ITYPE_SSE_SUB, - ITYPE_SSE_MUL, - ITYPE_SSE_DIV, - ITYPE_SSE_AND, - ITYPE_SSE_OR, - ITYPE_SSE_XOR, - ITYPE_SSE_CMP, - - // ITYPE_SSE2 group - ITYPE_SSE2=ITYPE_SSE2_OFFSET, - ITYPE_SSE2_MOV, - ITYPE_SSE2_ADD, - ITYPE_SSE2_SUB, - ITYPE_SSE2_MUL, - ITYPE_SSE2_DIV, - ITYPE_SSE2_AND, - ITYPE_SSE2_OR, - ITYPE_SSE2_XOR, - ITYPE_SSE2_CMP, - - // ITYPE_SSE3 group - ITYPE_SSE3=ITYPE_SSE3_OFFSET, - ITYPE_SSE3_MOV, - ITYPE_SSE3_ADD, - ITYPE_SSE3_SUB, - ITYPE_SSE3_MUL, - ITYPE_SSE3_DIV, - ITYPE_SSE3_AND, - ITYPE_SSE3_OR, - ITYPE_SSE3_XOR, - ITYPE_SSE3_CMP, - - // ITYPE_3DNOW group - ITYPE_3DNOW=ITYPE_3DNOW_OFFSET, - ITYPE_3DNOW_ADD, - ITYPE_3DNOW_SUB, - ITYPE_3DNOW_MUL, - ITYPE_3DNOW_DIV, - ITYPE_3DNOW_CMP, - ITYPE_3DNOW_XCHG, - - // ITYPE_TRAP - ITYPE_TRAPS=ITYPE_TRAPS_OFFSET, - ITYPE_TRAP, // generate trap - ITYPE_TRAPCC, // conditional trap gen - ITYPE_TRAPRET, // return from trap - ITYPE_BOUNDS, // gen bounds trap - ITYPE_DEBUG, // gen breakpoint trap - ITYPE_TRACE, // gen single step trap - ITYPE_INVALID, // gen invalid instruction - ITYPE_OFLOW, // gen overflow trap - - // ITYPE_SYSTEM group - ITYPE_SYSTEM=ITYPE_SYSTEM_OFFSET, - ITYPE_HALT, // halt machine - ITYPE_IN, // input form port - ITYPE_OUT, // output to port - ITYPE_CPUID, // identify cpu - ITYPE_SETIF, // allow interrupts - ITYPE_CLEARIF, // block interrupts - ITYPE_SYSCALL, - ITYPE_SYSCALLRET, - - // ITYPE_OTHER group - ITYPE_OTHER = ITYPE_OTHER_OFFSET, - ITYPE_NOP, - ITYPE_BCDCONV, // convert to/from BCD - ITYPE_SZCONV // convert size of operand -} INSTRUCTION_TYPE; - -// -// Operand flags -// - -// Type = bits 0-6 (these are mutually exclusive -- bits 0-6 will always be a power of 2)) -#define OPTYPE_NONE 0x00 -#define OPTYPE_IMM 0x01 // immediate value -#define OPTYPE_OFFSET 0x02 // relative offset -#define OPTYPE_FLOAT 0x03 // floating point -#define OPTYPE_BCD 0x04 -#define OPTYPE_STRING 0x05 -#define OPTYPE_SPECIAL 0x06 -#define OPTYPE_MASK 0x7F - -// Flags = bits 7-23 (these can be combinations) -// These are used in the X86 opcode table -#define OP_REG (1<<7) // 0x80 -#define OP_SIGNED (1<<8) -#define OP_SYS (1<<9) // parameter is an index into some system structure -#define OP_CONDR (1<<10) -#define OP_CONDW (1<<11) -#define OP_UNUSED (1<<12) -#define OP_SRC (1<<13) // operand is source operand -#define OP_DST (1<<14) // operand is destination operand -#define OP_EXEC (1<<15) // operand is executed - -#define OP_CONDE OP_CONDR -#define OP_COND_EXEC (OP_CONDE|OP_EXEC) // executed only if the pre-conditions are met -#define OP_COND_SRC (OP_CONDR|OP_SRC) // set only if pre-conditions are met -#define OP_COND_DST (OP_CONDW|OP_DST) // set only if pre-conditions are met -#define OP_COND (OP_CONDR|OP_CONDW) - -// Bits 16-31 are available for use outside of the opcode table, but they can only -// be used in INSTRUCTION_OPERAND.Flags, they may conflit with the architecture specific -// operands. For example, bits 16-31 are used in X86 for AMODE_* and OPTYPE_* -#define OP_ADDRESS (1<<16) -#define OP_LOCAL (1<<17) -#define OP_PARAM (1<<18) -#define OP_GLOBAL (1<<19) -#define OP_FAR (1<<20) -#define OP_IPREL (1<<21) - -// -// X86-specific flags (bits 27-31) -// -#define OP_MSR (OP_SYS|OP_UNUSED) - -// -// Other architecture flags -// -#define OP_DELAY OP_UNUSED // delayed instruction (e.g., delayed branch that executes after the next instruction) - -///////////////////////////////////////////////////////////////////// -// Architectures -///////////////////////////////////////////////////////////////////// - -typedef enum _ARCHITECTURE_TYPE -{ - ARCH_UNKNOWN=0, - - // x86-based - ARCH_X86, // 32-bit x86 - ARCH_X86_16, // 16-bit x86 - ARCH_X64, // AMD64 and Intel EMD64 - - // everything else - ARCH_ALPHA, - ARCH_ARM, - ARCH_DOTNET, - ARCH_EFI, - ARCH_IA64, - ARCH_M68K, - ARCH_MIPS, - ARCH_PPC, - ARCH_SH3, - ARCH_SH4, - ARCH_SPARC, - ARCH_THUMB - -} ARCHITECTURE_TYPE; - -struct _INSTRUCTION; - -typedef BOOL (*INIT_INSTRUCTION)(struct _INSTRUCTION *Instruction); -typedef void (*DUMP_INSTRUCTION)(struct _INSTRUCTION *Instruction, BOOL ShowBytes, BOOL Verbose); -typedef BOOL (*GET_INSTRUCTION)(struct _INSTRUCTION *Instruction, U8 *Address, U32 Flags); -typedef U8 *(*FIND_FUNCTION_BY_PROLOGUE)(struct _INSTRUCTION *Instruction, U8 *StartAddress, U8 *EndAddress, U32 Flags); - -typedef struct _ARCHITECTURE_FORMAT_FUNCTIONS -{ - INIT_INSTRUCTION InitInstruction; - DUMP_INSTRUCTION DumpInstruction; - GET_INSTRUCTION GetInstruction; - FIND_FUNCTION_BY_PROLOGUE FindFunctionByPrologue; -} ARCHITECTURE_FORMAT_FUNCTIONS; - -typedef struct _ARCHITECTURE_FORMAT -{ - ARCHITECTURE_TYPE Type; - ARCHITECTURE_FORMAT_FUNCTIONS *Functions; -} ARCHITECTURE_FORMAT; - -#define DISASSEMBLER_INITIALIZED 0x1234566F -#define INSTRUCTION_INITIALIZED 0x1234567F - -#include "disasm_x86.h" - -typedef struct DECLSPEC_ALIGN(16) _S128 -{ - U64 Low; - S64 High; -} S128; -typedef struct DECLSPEC_ALIGN(16) _U128 -{ - U64 Low; - U64 High; -} U128; - -typedef struct _INSTRUCTION_OPERAND -{ - U32 Flags; - U8 Type : 6; - U8 Unused : 2; - U16 Length; - - - // If non-NULL, this indicates the target address of the instruction (e.g., a branch or - // a displacement with no base register). However, this address is only reliable if the - // image is mapped correctly (e.g., the executable is mapped as an image and fixups have - // been applied if it is not at its preferred image base). - // - // If disassembling a 16-bit DOS application, TargetAddress is in the context of - // X86Instruction->Segment. For example, if TargetAddress is the address of a code branch, - // it is in the CS segment (unless X86Instruction->HasSegmentOverridePrefix is set). If - // TargetAddress is a data pointer, it is in the DS segment (unless - // X86Instruction->HasSegmentOverridePrefix is set) - U64 TargetAddress; - U32 Register; - - union - { - // All 8/16/32-bit operands are extended to 64-bits automatically - // If you want to downcast, check whether Flags & OP_SIGNED is set - // Like this: - // U32 GetOperand32(OPERAND *Operand) - // { - // if (Operand->Flags & OP_SIGNED) return (S32)Operand->Value_S64; - // else return (U32)Operand->Value_U64; - //} - U64 Value_U64; - S64 Value_S64; - U128 Value_U128; - U128 Float128; - U8 Float80[80]; - U8 BCD[10]; - }; -} INSTRUCTION_OPERAND; - -typedef struct _INSTRUCTION -{ - U32 Initialized; - struct _DISASSEMBLER *Disassembler; - - char String[MAX_OPCODE_DESCRIPTION]; - U8 StringIndex; - U64 VirtualAddressDelta; - - U32 Groups; // ITYPE_EXEC, ITYPE_ARITH, etc. -- NOTE groups can be OR'd together - INSTRUCTION_TYPE Type; // ITYPE_ADD, ITYPE_RET, etc. -- NOTE there is only one possible type - - U8 *Address; - U8 *OpcodeAddress; - U32 Length; - - U8 Prefixes[MAX_PREFIX_LENGTH]; - U32 PrefixCount; - - U8 LastOpcode; // last byte of opcode - U8 OpcodeBytes[MAX_OPCODE_LENGTH]; - U32 OpcodeLength; // excludes any operands and prefixes - - INSTRUCTION_OPERAND Operands[MAX_OPERAND_COUNT]; - U32 OperandCount; - - X86_INSTRUCTION X86; - - DATA_REFERENCE DataSrc; - DATA_REFERENCE DataDst; - CODE_BRANCH CodeBranch; - - // Direction depends on which direction the stack grows - // For example, on x86 a push results in StackChange < 0 since the stack grows down - // This is only relevant if (Group & ITYPE_STACK) is true - // - // If Groups & ITYPE_STACK is set but StackChange = 0, it means that the change - // couldn't be determined (non-constant) - LONG StackChange; - - // Used to assist in debugging - // If set, the current instruction is doing something that requires special handling - // For example, popf can cause tracing to be disabled - - U8 StringAligned : 1; // internal only - U8 NeedsEmulation : 1; // instruction does something that re - U8 Repeat : 1; // instruction repeats until some condition is met (e.g., REP prefix on X86) - U8 ErrorOccurred : 1; // set if instruction is invalid - U8 AnomalyOccurred : 1; // set if instruction is anomalous - U8 LastInstruction : 1; // tells the iterator callback it is the last instruction - U8 CodeBlockFirst: 1; - U8 CodeBlockLast : 1; -} INSTRUCTION; - -typedef struct _DISASSEMBLER -{ - U32 Initialized; - ARCHITECTURE_TYPE ArchType; - ARCHITECTURE_FORMAT_FUNCTIONS *Functions; - INSTRUCTION Instruction; - U32 Stage1Count; // GetInstruction called - U32 Stage2Count; // Opcode fully decoded - U32 Stage3CountNoDecode; // made it through all checks when DISASM_DECODE is not set - U32 Stage3CountWithDecode; // made it through all checks when DISASM_DECODE is set -} DISASSEMBLER; - -#define DISASM_DISASSEMBLE (1<<1) -#define DISASM_DECODE (1<<2) -#define DISASM_SUPPRESSERRORS (1<<3) -#define DISASM_SHOWFLAGS (1<<4) -#define DISASM_ALIGNOUTPUT (1<<5) -#define DISASM_DISASSEMBLE_MASK (DISASM_ALIGNOUTPUT|DISASM_SHOWBYTES|DISASM_DISASSEMBLE) - -BOOL InitDisassembler(DISASSEMBLER *Disassembler, ARCHITECTURE_TYPE Architecture); -void CloseDisassembler(DISASSEMBLER *Disassembler); -INSTRUCTION *GetInstruction(DISASSEMBLER *Disassembler, U64 VirtualAddress, U8 *Address, U32 Flags); - -#ifdef __cplusplus -} -#endif -#endif // DISASM_H diff --git a/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86.c b/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86.c deleted file mode 100644 index 9a16abe4a..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86.c +++ /dev/null @@ -1,4664 +0,0 @@ -// Copyright (C) 2004, Matt Conover (mconover@gmail.com) -#undef NDEBUG -#include -#include "disasm.h" -#include "cpu.h" - -// Since addresses are internally represented as 64-bit, we need to specially handle -// cases where IP + Displacement wraps around for 16-bit/32-bit operand size -// Otherwise, ignorethe possibility of wraparounds -#define SUPPORT_WRAPAROUND - -#ifdef NO_SANITY_CHECKS -#undef NDEBUG -#undef DEBUG_DISASM -#undef assert -#define assert(x) -#endif - -#ifdef DEBUG_DISASM -#define DISASM_OUTPUT(x) printf x -#else -#define DISASM_OUTPUT(x) -#endif - -#include "disasm_x86_tables.h" - -#ifdef _WIN64 -#pragma warning(disable:4311 4312) -#endif - -#pragma warning(disable:4702) - -//////////////////////////////////////////////////////////////////////// -// Internal macros -//////////////////////////////////////////////////////////////////////// - -#define VIRTUAL_ADDRESS ((U64)Instruction->Address + Instruction->VirtualAddressDelta) - -#define AMD64_DIFF (AMD64_8BIT_OFFSET-X86_8BIT_OFFSET) -#define IS_AMD64() (INS_ARCH_TYPE(Instruction) == ARCH_X64) -#define IS_X86_32() (INS_ARCH_TYPE(Instruction) == ARCH_X86) -#define IS_X86_16() (INS_ARCH_TYPE(Instruction) == ARCH_X86_16) - -#define X86_BOUND 0x62 -#define X86_PUSH_REG 0x50 -#define X86_PUSH_CS 0x0e -#define X86_PUSH_DS 0x1e -#define X86_PUSH_SS 0x16 -#define X86_PUSH_ES 0x06 -#define X86_PUSH_FS 0xa0 -#define X86_PUSH_GS 0xa8 -#define X86_PUSH_U8 0x6a -#define X86_PUSH_U32 0x68 -#define X86_POP_DS 0x1f -#define X86_POP_ES 0x07 -#define X86_POP_SS 0x17 -#define X86_POP_FS 0xa1 -#define X86_POP_GS 0xa9 -#define X86_POP_REG 0x58 - -#define OPCSTR Instruction->String+Instruction->StringIndex -#define APPEND Instruction->StringIndex += (U8)_snprintf -#define APPENDPAD(x) \ -{ \ - if (Instruction->StringAligned) \ - { \ - if (Instruction->StringIndex > x) assert(0); \ - while (x != Instruction->StringIndex) APPENDB(' '); \ - } \ - else if (Instruction->StringIndex) \ - { \ - APPENDB(' '); \ - } \ -} - -#define APPENDB(a) Instruction->String[Instruction->StringIndex++] = a -#define APPENDS(a) APPEND(OPCSTR, SIZE_LEFT, a); - -#define SIZE_LEFT (MAX_OPCODE_DESCRIPTION-1 > Instruction->StringIndex ? MAX_OPCODE_DESCRIPTION-Instruction->StringIndex : 0) - -// If an address size prefix is used for an instruction that doesn't make sense, restore it -// to the default - -#define SANITY_CHECK_OPERAND_SIZE() \ -{ \ - if (!Instruction->AnomalyOccurred && X86Instruction->HasOperandSizePrefix) \ - { \ - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Unexpected operand size prefix\n", VIRTUAL_ADDRESS); \ - Instruction->AnomalyOccurred = TRUE; \ - X86Instruction->HasOperandSizePrefix = FALSE; \ - switch (X86Instruction->OperandSize) \ - { \ - case 4: X86Instruction->OperandSize = 2; break; \ - case 2: X86Instruction->OperandSize = 4; break; \ - default: assert(0); \ - } \ - } \ -} - -#define SANITY_CHECK_ADDRESS_SIZE() \ -{ \ - if (!Instruction->AnomalyOccurred && X86Instruction->HasAddressSizePrefix) \ - { \ - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Unexpected address size prefix\n", VIRTUAL_ADDRESS); \ - Instruction->AnomalyOccurred = TRUE; \ - } \ - X86Instruction->HasAddressSizePrefix = FALSE; \ - switch (INS_ARCH_TYPE(Instruction)) \ - { \ - case ARCH_X64: X86Instruction->AddressSize = 8; break; \ - case ARCH_X86: X86Instruction->AddressSize = 4; break; \ - case ARCH_X86_16: X86Instruction->AddressSize = 2; break; \ - } \ -} - -#define SANITY_CHECK_SEGMENT_OVERRIDE() \ - if (!Instruction->AnomalyOccurred && X86Instruction->HasSegmentOverridePrefix) \ - { \ - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Unexpected segment override\n", VIRTUAL_ADDRESS); \ - Instruction->AnomalyOccurred = TRUE; \ - } - -#define INSTR_INC(size) \ -{ \ - Instruction->Length += size; \ - Address += size; \ -} - -#define X86_SET_TARGET() \ -{ \ - if (X86Instruction->HasSelector) \ - { \ - if (!Instruction->AnomalyOccurred) \ - { \ - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: unexpected segment 0x%02X\n", VIRTUAL_ADDRESS, X86Instruction->Selector); \ - Instruction->AnomalyOccurred = TRUE; \ - } \ - } \ - else \ - { \ - switch (X86Instruction->Segment) \ - { \ - case SEG_CS: \ - case SEG_DS: \ - case SEG_SS: \ - case SEG_ES: \ - assert(!X86Instruction->HasSelector); \ - Operand->TargetAddress = (U64)X86Instruction->Displacement; \ - /* assert(!GetAbsoluteAddressFromSegment((BYTE)X86Instruction->Segment, (DWORD)X86Instruction->Displacement) || GetAbsoluteAddressFromSegment(X86Instruction->Segment, (DWORD)X86Instruction->Displacement) == Operand->TargetAddress); */ \ - break; \ - case SEG_FS: \ - case SEG_GS: \ - assert(!X86Instruction->HasSelector); \ - Operand->TargetAddress = (U64)GetAbsoluteAddressFromSegment((BYTE)X86Instruction->Segment, (DWORD)X86Instruction->Displacement); \ - break; \ - default: \ - assert(0); /* shouldn't be possible */ \ - break; \ - } \ - } \ -} - -#define X86_SET_SEG(reg) \ -{ \ - if (!X86Instruction->HasSegmentOverridePrefix && (reg == REG_EBP || reg == REG_ESP)) \ - { \ - assert(!X86Instruction->HasSelector); \ - X86Instruction->Segment = SEG_SS; \ - } \ -} - -#define X86_SET_ADDR() \ -{ \ - if (Operand->Flags & OP_DST) \ - { \ - assert(!X86Instruction->HasDstAddressing); \ - X86Instruction->HasDstAddressing = TRUE; \ - X86Instruction->DstOpIndex[X86Instruction->DstOpCount] = (U8)OperandIndex; \ - X86Instruction->DstOpCount++; \ - X86Instruction->DstAddressIndex = (U8)OperandIndex; \ - } \ - if (Operand->Flags & OP_SRC) \ - { \ - if (Instruction->Type != ITYPE_STRCMP) assert(!X86Instruction->HasSrcAddressing); \ - X86Instruction->HasSrcAddressing = TRUE; \ - X86Instruction->SrcOpIndex[X86Instruction->SrcOpCount] = (U8)OperandIndex; \ - X86Instruction->SrcOpCount++; \ - X86Instruction->SrcAddressIndex = (U8)OperandIndex; \ - } \ -} - -#define X86_SET_REG(reg) \ -{ \ - if (Operand->Flags & OP_DST) \ - { \ - X86Instruction->DstOpIndex[X86Instruction->DstOpCount] = (U8)OperandIndex; \ - X86Instruction->DstOpCount++; \ - assert(OperandIndex < 2); \ - if (Operand->Length > 1 && reg == REG_ESP) Instruction->Groups |= ITYPE_STACK; \ - } \ - if (Operand->Flags & OP_SRC) \ - { \ - X86Instruction->SrcOpIndex[X86Instruction->SrcOpCount] = (U8)OperandIndex; \ - X86Instruction->SrcOpCount++; \ - } \ -} - -#define CHECK_AMD64_REG() { if (IS_AMD64()) Operand->Register += AMD64_DIFF; } - -//////////////////////////////////////////////////////////////////////// -// Internal structures/variables -//////////////////////////////////////////////////////////////////////// - -ARCHITECTURE_FORMAT_FUNCTIONS X86 = -{ - X86_InitInstruction, - NULL, - X86_GetInstruction, - X86_FindFunctionByPrologue -}; - -char *X86_Registers[0xE0] = -{ - // Segments - "es", // 0x00 - "cs", // 0x01 - "ss", // 0x02 - "ds", // 0x03 - "fs", // 0x04 - "gs", // 0x05 - "flags", // 0x06 - "eflags", // 0x07 - "rflags", // 0x08 - "ip+ilen", // 0x09 - "eip+ilen", // 0x0A - "rip+ilen", // 0x0B - NULL, // 0x0C - NULL, // 0x0D - NULL, // 0x0E - NULL, // 0x0F - - // Test - "tr0", // 0x10 - "tr1", // 0x11 - "tr2", // 0x12 - "tr3", // 0x13 - "tr4", // 0x14 - "tr5", // 0x15 - "tr6", // 0x16 - "tr7", // 0x17 - "tr8", // 0x18 - "tr9", // 0x19 - "tr10", // 0x1A - "tr11", // 0x1B - "tr12", // 0x1C - "tr13", // 0x1D - "tr14", // 0x1E - "tr15", // 0x1F - - // Control - "cr0", // 0x20 - "cr1", // 0x21 - "cr2", // 0x22 - "cr3", // 0x23 - "cr4", // 0x24 - "cr5", // 0x25 - "cr6", // 0x26 - "cr7", // 0x27 - "cr8", // 0x18 - "cr9", // 0x19 - "cr10", // 0x1A - "cr11", // 0x1B - "cr12", // 0x1C - "cr13", // 0x1D - "cr14", // 0x1E - "cr15", // 0x1F - - // Debug - "dr0", // 0x30 - "dr1", // 0x31 - "dr2", // 0x32 - "dr3", // 0x33 - "dr4", // 0x34 - "dr5", // 0x35 - "dr6", // 0x36 - "dr7", // 0x37 - "dr8", // 0x38 - "dr9", // 0x39 - "dr10", // 0x3A - "dr11", // 0x3B - "dr12", // 0x3C - "dr13", // 0x3D - "dr14", // 0x3E - "dr15", // 0x3F - - // FPU - "st(0)", // 0x40 - "st(1)", // 0x41 - "st(2)", // 0x42 - "st(3)", // 0x43 - "st(4)", // 0x44 - "st(5)", // 0x45 - "st(6)", // 0x46 - "st(7)", // 0x47 - NULL, // 0x48 - NULL, // 0x49 - NULL, // 0x4A - NULL, // 0x4B - NULL, // 0x4C - NULL, // 0x4D - NULL, // 0x4E - NULL, // 0x4F - - // MMX - "mm0", // 0x50 - "mm1", // - "mm2", - "mm3", - "mm4", - "mm5", - "mm6", - "mm7", - NULL, // 0x58 - NULL, // 0x59 - NULL, // 0x5A - NULL, // 0x5B - NULL, // 0x5C - NULL, // 0x5D - NULL, // 0x5E - NULL, // 0x5F - - // XMM - "xmm0", // 0x60 - "xmm1", // 0x61 - "xmm2", // 0x62 - "xmm3", // 0x63 - "xmm4", // 0x64 - "xmm5", // 0x65 - "xmm6", // 0x66 - "xmm7", // 0x67 - "xmm8", // 0x68 - "xmm9", // 0x69 - "xmm10", // 0x6a - "xmm11", // 0x6b - "xmm12", // 0x6c - "xmm13", // 0x6d - "xmm14", // 0x6e - "xmm15", // 0x6f - - // 8-bit - "al", // 0x70 - "cl", // 0x71 - "dl", // 0x72 - "bl", // 0x73 - "ah", // 0x74 - "ch", // 0x75 - "dh", // 0x76 - "bh", // 0x77 - NULL, // 0x78 - NULL, // 0x79 - NULL, // 0x7A - NULL, // 0x7B - NULL, // 0x7C - NULL, // 0x7D - NULL, // 0x7E - NULL, // 0x7F - - // 16-bit - "ax", // 0x80 - "cx", // 0x81 - "dx", // 0x82 - "bx", // 0x83 - "sp", // 0x84 - "bp", // 0x85 - "si", // 0x86 - "di", // 0x87 - NULL, // 0x88 - NULL, // 0x89 - NULL, // 0x8A - NULL, // 0x8B - NULL, // 0x8C - NULL, // 0x8D - NULL, // 0x8E - NULL, // 0x8F - - // 32-bit - "eax", // 0x90 - "ecx", // 0x91 - "edx", // 0x92 - "ebx", // 0x93 - "esp", // 0x94 - "ebp", // 0x95 - "esi", // 0x96 - "edi", // 0x97 - NULL, // 0x98 - NULL, // 0x99 - NULL, // 0x9A - NULL, // 0x9B - NULL, // 0x9C - NULL, // 0x9D - NULL, // 0x9E - NULL, // 0x9F - - // X86-64 8-bit register - "al", // 0xA0 - "cl", // 0xA1 - "dl", // 0xA2 - "bl", // 0xA3 - "spl", // 0xA4 - "bpl", // 0xA5 - "sil", // 0xA6 - "dil", // 0xA7 - "r8b", // 0xA8 - "r9b", // 0xA9 - "r10b", // 0xAA - "r11b", // 0xAB - "r12b", // 0xAC - "r13b", // 0xAD - "r14b", // 0xAE - "r15b", // 0xAF - - // X86-64 16-bit register - "ax", // 0xB0 - "cx", // 0xB1 - "dx", // 0xB2 - "bx", // 0xB3 - "sp", // 0xB4 - "bp", // 0xB5 - "si", // 0xB6 - "di", // 0xB7 - "r8w", // 0xB8 - "r9w", // 0xB9 - "r10w", // 0xBA - "r11w", // 0xBB - "r12w", // 0xBC - "r13w", // 0xBD - "r14w", // 0xBE - "r15w", // 0xBF - - // X86-64 32-bit register - "eax", // 0xC0 - "ecx", // 0xC1 - "edx", // 0xC2 - "ebx", // 0xC3 - "esp", // 0xC4 - "ebp", // 0xC5 - "esi", // 0xC6 - "edi", // 0xC7 - "r8d", // 0xC8 - "r9d", // 0xC9 - "r10d", // 0xCA - "r11d", // 0xCB - "r12d", // 0xCC - "r13d", // 0xCD - "r14d", // 0xCE - "r15d", // 0xCF - - // X86-64 64-bit register - "rax", // 0xD0 - "rcx", // 0xD1 - "rdx", // 0xD2 - "rbx", // 0xD3 - "rsp", // 0xD4 - "rbp", // 0xD5 - "rsi", // 0xD6 - "rdi", // 0xD7 - "r8", // 0xD8 - "r9", // 0xD9 - "r10", // 0xDA - "r11", // 0xDB - "r12", // 0xDC - "r13", // 0xDD - "r14", // 0xDE - "r15" // 0xDF -}; - -void OutputBounds(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputGeneral(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputDescriptor(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputSegOffset(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputPackedReal(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputPackedBCD(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputScalarReal(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputScalarGeneral(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputFPUEnvironment(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputFPUState(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -void OutputCPUState(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); - -typedef void (*OUTPUT_OPTYPE)(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex); -#define OPTYPE_SHIFT 24 -#define MAX_OPTYPE_INDEX 26 -OUTPUT_OPTYPE OptypeHandlers[] = -{ - NULL, - OutputBounds, // 01 OPTYPE_a - OutputGeneral, // 02 OPTYPE_b - OutputGeneral, // 03 OPTYPE_d - OutputSegOffset, // 04 OPTYPE_p - OutputGeneral, // 05 OPTYPE_q - OutputDescriptor, // 06 OPTYPE_dt - OutputGeneral, // 07 OPTYPE_v - OutputGeneral, // 08 OPTYPE_w - OutputPackedReal, // 09 OPTYPE_ps - OutputPackedReal, // 0A OPTYPE_pd - OutputPackedBCD, // 0B OPTYPE_pb - OutputScalarReal, // 0C OPTYPE_ss - OutputScalarReal, // 0D OPTYPE_sd - OutputScalarReal, // 0E OPTYPE_se - OutputFPUEnvironment, // 0F OPTYPE_fev - OutputFPUState, // 10 OPTYPE_fst1 - OutputFPUState, // 11 OPTYPE_fst2 - OutputGeneral, // 12 OPTYPE_z - OutputGeneral, // 13 OPTYPE_o - OutputGeneral, // 14 OPTYPE_dq - OutputGeneral, // 15 OPTYPE_mw - OutputScalarGeneral, // 16 OPTYPE_sso - OutputScalarGeneral, // 17 OPTYPE_sdo - OutputCPUState, // 18 OPTYPE_cpu - OutputGeneral, // 19 OPTYPE_lea -}; - -#define OPTYPE_a 0x01000000 -#define OPTYPE_b 0x02000000 -#define OPTYPE_d 0x03000000 -#define OPTYPE_p 0x04000000 -#define OPTYPE_q 0x05000000 -#define OPTYPE_dt 0x06000000 -#define OPTYPE_v 0x07000000 -#define OPTYPE_w 0x08000000 -#define OPTYPE_ps 0x09000000 // packed 128-bit single real -#define OPTYPE_pd 0x0A000000 // packed 128-bit double real -#define OPTYPE_pb 0x0B000000 // packed BCD (10 bytes, 18-bit precision) -#define OPTYPE_ss 0x0C000000 // scalar single real -#define OPTYPE_sd 0x0D000000 // scalar double real -#define OPTYPE_se 0x0E000000 // scalar extended real -#define OPTYPE_fev 0x0F000000 // FPU environment (28 bytes if 32-bit modes, 14 bytes in 16-bit mode) -#define OPTYPE_fst1 0x10000000 // FPU state (108 bytes in 32-bit modes, 94 bytes in 16-bit real mode) -#define OPTYPE_fst2 0x11000000 // FPU/MMX/XMM/MXCSR state (512 bytes) -#define OPTYPE_z 0x12000000 -#define OPTYPE_o 0x13000000 -#define OPTYPE_dq 0x14000000 // OPTYPE_d or OPTYPE_o -#define OPTYPE_mw 0x15000000 // word if memory, register size otherwise -#define OPTYPE_sso 0x16000000 // OPTYPE_ss or OPTYPE_o -#define OPTYPE_sdo 0x17000000 // OPTYPE_ss or OPTYPE_o -#define OPTYPE_cpu 0x18000000 // pointer to CPU state structure -#define OPTYPE_lea 0x19000000 // size set by other operand - -//////////////////////////////////////////////////////////////////////// -// Internal functions -//////////////////////////////////////////////////////////////////////// - -#ifdef TEST_DISASM // TODO: remove -U32 X86_GetLength(INSTRUCTION *Instruction, U8 *Address); -#endif - -INTERNAL BOOL IsValidLockPrefix(X86_INSTRUCTION *Instruction, U8 Opcode, U32 OpcodeLength, U8 Group, U8 OpcodeExtension); -INTERNAL U8 *SetOperands(INSTRUCTION *Instruction, U8 *Address, U32 Flags); -INTERNAL U8 *SetModRM32(INSTRUCTION *Instruction, U8 *Address, INSTRUCTION_OPERAND *Operand, U32 OperandIndex, BOOL SuppressErrors); -INTERNAL U8 *SetModRM16(INSTRUCTION *Instruction, U8 *Address, INSTRUCTION_OPERAND *Operand, U32 OperandIndex, BOOL SuppressErrors); -INTERNAL U8 *SetSIB(INSTRUCTION *Instruction, U8 *Address, INSTRUCTION_OPERAND *Operand, U32 OperandIndex, BOOL SuppressErrors); -INTERNAL U64 ApplyDisplacement(U64 Address, INSTRUCTION *Instruction); - -////////////////////////////////////////////////////////// -// Instruction setup -////////////////////////////////////////////////////////// - -#define APPLY_OFFSET(addr) \ -{ \ - switch (X86Instruction->OperandSize) \ - { \ - case 8: addr = ((U64)(addr + Instruction->VirtualAddressDelta)); break; \ - case 4: addr = (U64)((U32)(addr + Instruction->VirtualAddressDelta)); break; \ - case 2: addr = (U64)((U8)(addr + Instruction->VirtualAddressDelta)); break; \ - default: assert(0); break; \ - } \ -} - -BOOL X86_InitInstruction(INSTRUCTION *Instruction) -{ - X86_INSTRUCTION *X86Instruction; -#ifdef NO_SANITY_CHECKS - assert(0); // be sure assertions are disabled -#endif - X86Instruction = &Instruction->X86; - memset(X86Instruction, 0, sizeof(X86_INSTRUCTION)); - - switch (INS_ARCH_TYPE(Instruction)) - { - case ARCH_X64: - X86Instruction->AddressSize = 8; - X86Instruction->OperandSize = 4; - break; - case ARCH_X86: - X86Instruction->AddressSize = 4; - X86Instruction->OperandSize = 4; - break; - case ARCH_X86_16: - X86Instruction->AddressSize = 2; - X86Instruction->OperandSize = 2; - break; - default: - assert(0); - return FALSE; - } - X86Instruction->Instruction = Instruction; - X86Instruction->Segment = SEG_DS; - return TRUE; -} - -//////////////////////////////////////////////////////////// -// Formatting -// You can change these to whatever you prefer -//////////////////////////////////////////////////////////// - -#define X86_WRITE_OPFLAGS() \ - if (Flags & DISASM_SHOWFLAGS) \ - { \ - APPENDB('{'); \ - assert(Operand->Flags & (OP_EXEC|OP_SRC|OP_DST)); \ - if (Operand->Flags & OP_IPREL) APPENDB('r'); \ - if (Operand->Flags & OP_FAR) APPENDB('f'); \ - if (Operand->Flags & OP_CONDR) APPENDB('c'); \ - if (Operand->Flags & OP_EXEC) APPENDB('X'); \ - else if (Operand->Flags & OP_SRC) APPENDB('R'); \ - if (Operand->Flags & OP_CONDW) APPENDB('c'); \ - if (Operand->Flags & OP_DST) APPENDB('W'); \ - if (Operand->Flags & OP_SYS) APPENDB('S'); \ - if (Operand->Flags & OP_ADDRESS) APPENDB('A'); \ - if (Operand->Flags & OP_PARAM) APPENDB('P'); \ - if (Operand->Flags & OP_LOCAL) APPENDB('L'); \ - if (Operand->Flags & OP_GLOBAL) APPENDB('G'); \ - APPENDB('}'); \ - } - -#define X86_WRITE_IMMEDIATE() \ -{ \ - switch (Operand->Length) \ - { \ - case 8: \ - APPEND(OPCSTR, SIZE_LEFT, "0x%02I64X=", Operand->Value_U64); \ - if (Operand->Value_S64 >= 0 || !(Operand->Flags & OP_SIGNED)) APPEND(OPCSTR, SIZE_LEFT, "%I64u", Operand->Value_U64); \ - /*else APPEND(OPCSTR, SIZE_LEFT, "-0x%02I64X=%I64d", -Operand->Value_S64, Operand->Value_S64);*/ \ - else APPEND(OPCSTR, SIZE_LEFT, "%I64d", Operand->Value_S64); \ - break; \ - case 4: \ - APPEND(OPCSTR, SIZE_LEFT, "0x%02lX=", (U32)Operand->Value_U64); \ - if (Operand->Value_S64 >= 0 || !(Operand->Flags & OP_SIGNED)) APPEND(OPCSTR, SIZE_LEFT, "%lu", (U32)Operand->Value_U64); \ - /*else APPEND(OPCSTR, SIZE_LEFT, "-0x%02lX=%ld", (U32)-Operand->Value_S64, (S32)Operand->Value_S64);*/ \ - else APPEND(OPCSTR, SIZE_LEFT, "%ld", (S32)Operand->Value_S64); \ - break; \ - case 2: \ - APPEND(OPCSTR, SIZE_LEFT, "0x%02X=", (U16)Operand->Value_U64); \ - if (Operand->Value_S64 >= 0 || !(Operand->Flags & OP_SIGNED)) APPEND(OPCSTR, SIZE_LEFT, "%u", (U16)Operand->Value_U64); \ - /*else APPEND(OPCSTR, SIZE_LEFT, "-0x%02X=%d", (U16)-Operand->Value_S64, (S16)Operand->Value_S64);*/ \ - else APPEND(OPCSTR, SIZE_LEFT, "%d", (S16)Operand->Value_S64); \ - break; \ - case 1: \ - APPEND(OPCSTR, SIZE_LEFT, "0x%02X=", (U8)Operand->Value_U64); \ - if (Operand->Value_S64 >= 0 || !(Operand->Flags & OP_SIGNED)) APPEND(OPCSTR, SIZE_LEFT, "%u", (U8)Operand->Value_U64); \ - /*else APPEND(OPCSTR, SIZE_LEFT, "-0x%02X=%d", (U8)-Operand->Value_S64, (S8)Operand->Value_S64);*/ \ - else APPEND(OPCSTR, SIZE_LEFT, "%d", (S8)Operand->Value_S64); \ - break; \ - default: assert(0); break; \ - } \ -} - -#define X86_WRITE_ABSOLUTE_DISPLACEMENT() \ -{ \ - switch (X86Instruction->AddressSize) \ - { \ - case 8: \ - APPEND(OPCSTR, SIZE_LEFT, "0x%04I64X", X86Instruction->Displacement); \ - break; \ - case 4: \ - APPEND(OPCSTR, SIZE_LEFT, "0x%04lX", (U32)X86Instruction->Displacement); \ - break; \ - case 2: \ - APPEND(OPCSTR, SIZE_LEFT, "0x%04X", (U16)X86Instruction->Displacement); \ - break; \ - default: assert(0); break; \ - } \ -} - -#define X86_WRITE_RELATIVE_DISPLACEMENT64() \ - if (X86Instruction->Displacement >= 0) APPEND(OPCSTR, SIZE_LEFT, "+0x%02I64X", X86Instruction->Displacement); \ - else APPEND(OPCSTR, SIZE_LEFT, "-0x%02I64X", -X86Instruction->Displacement); - -#define X86_WRITE_RELATIVE_DISPLACEMENT32() \ - if (X86Instruction->Displacement >= 0) APPEND(OPCSTR, SIZE_LEFT, "+0x%02lX", (U32)X86Instruction->Displacement); \ - else APPEND(OPCSTR, SIZE_LEFT, "-0x%02lX", (U32)-X86Instruction->Displacement); - -#define X86_WRITE_RELATIVE_DISPLACEMENT16() \ - if (X86Instruction->Displacement >= 0) APPEND(OPCSTR, SIZE_LEFT, "+0x%02X", (U16)X86Instruction->Displacement); \ - else APPEND(OPCSTR, SIZE_LEFT, "-0x%02X", (U16)-X86Instruction->Displacement); - -#define X86_WRITE_RELATIVE_DISPLACEMENT() \ -{ \ - switch (X86Instruction->AddressSize) \ - { \ - case 8: \ - X86_WRITE_RELATIVE_DISPLACEMENT64() \ - break; \ - case 4: \ - X86_WRITE_RELATIVE_DISPLACEMENT32() \ - break; \ - case 2: \ - X86_WRITE_RELATIVE_DISPLACEMENT16() \ - break; \ - default: assert(0); break; \ - } \ -} - -#define X86_WRITE_IP_OFFSET(op) \ -{ \ - switch (X86Instruction->OperandSize) \ - { \ - case 8: \ - APPENDS("[rip+ilen"); \ - assert((op)->TargetAddress); \ - X86_WRITE_RELATIVE_DISPLACEMENT64() \ - APPEND(OPCSTR, SIZE_LEFT, "]=0x%04I64X", (op)->TargetAddress+Instruction->VirtualAddressDelta); \ - break; \ - case 4: \ - APPENDS("[eip+ilen"); \ - assert((op)->TargetAddress); \ - X86_WRITE_RELATIVE_DISPLACEMENT32() \ - APPEND(OPCSTR, SIZE_LEFT, "]=0x%04lX", (U32)((op)->TargetAddress+Instruction->VirtualAddressDelta)); \ - break; \ - case 2: \ - APPENDS("[ip+ilen"); \ - X86_WRITE_RELATIVE_DISPLACEMENT16() \ - APPEND(OPCSTR, SIZE_LEFT, "]=0x%04X", (U16)((op)->TargetAddress+Instruction->VirtualAddressDelta)); \ - break; \ - default: assert(0); break; \ - } \ -} - -#define X86_WRITE_OFFSET(op) \ -{ \ - assert((op)->Length <= 8); \ - if (X86Instruction->HasSelector) \ - { \ - assert((op)->Flags & OP_FAR); \ - APPEND(OPCSTR, SIZE_LEFT, "%s 0x%02X:[", DataSizes[((op)->Length >> 1)], X86Instruction->Selector); \ - } \ - else \ - { \ - assert(!((op)->Flags & OP_FAR)); \ - assert(X86Instruction->Segment < SEG_MAX) ; \ - APPEND(OPCSTR, SIZE_LEFT, "%s %s:[", DataSizes[((op)->Length >> 1)], Segments[X86Instruction->Segment]); \ - } \ - X86_WRITE_ABSOLUTE_DISPLACEMENT() \ - APPENDB(']'); \ -} - -void OutputAddress(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - BOOL ShowDisplacement = FALSE; - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - - assert(!X86Instruction->HasSelector); - assert(X86Instruction->SrcAddressIndex == OperandIndex || X86Instruction->DstAddressIndex == OperandIndex); - if (Operand->Length > 16 || (Operand->Length > 1 && (Operand->Length & 1))) APPEND(OPCSTR, SIZE_LEFT, "%d_byte ptr ", Operand->Length); - else APPEND(OPCSTR, SIZE_LEFT, "%s ", DataSizes[Operand->Length >> 1]); - - // - // This attempts to display the address intelligently - // If it has a positive 32-bit displacement, it is shown as seg:Displacement[base+index*scale] - // If it is a negative displacement or 8-bit, it is shown as seg:[base+index*scale+displacement] - // - APPEND(OPCSTR, SIZE_LEFT, "%s:", Segments[X86Instruction->Segment]); - if (X86Instruction->HasBaseRegister) - { - if (X86Instruction->Displacement) - { - if (X86Instruction->HasFullDisplacement) X86_WRITE_ABSOLUTE_DISPLACEMENT() - else ShowDisplacement = TRUE; - } - APPEND(OPCSTR, SIZE_LEFT, "[%s", X86_Registers[X86Instruction->BaseRegister]); - if (X86Instruction->HasIndexRegister) - { - APPEND(OPCSTR, SIZE_LEFT, "+%s", X86_Registers[X86Instruction->IndexRegister]); - if (X86Instruction->Scale > 1) APPEND(OPCSTR, SIZE_LEFT, "*%d", X86Instruction->Scale); - } - if (ShowDisplacement) X86_WRITE_RELATIVE_DISPLACEMENT() - APPENDB(']'); - if (X86Instruction->Relative) - { - U64 Address = Operand->TargetAddress; - assert(Address); - APPLY_OFFSET(Address) - APPEND(OPCSTR, SIZE_LEFT, "=[0x%04I64X]", Address); - } - } - else if (X86Instruction->HasIndexRegister) - { - if (X86Instruction->Displacement) - { - if (X86Instruction->HasFullDisplacement) X86_WRITE_ABSOLUTE_DISPLACEMENT() - else ShowDisplacement = TRUE; - } - APPEND(OPCSTR, SIZE_LEFT, "[%s", X86_Registers[X86Instruction->IndexRegister]); - if (X86Instruction->Scale > 1) APPEND(OPCSTR, SIZE_LEFT, "*%d", X86Instruction->Scale); - if (ShowDisplacement) X86_WRITE_RELATIVE_DISPLACEMENT() - APPENDB(']'); - } - else // just a displacement - { - APPENDB('['); - X86_WRITE_ABSOLUTE_DISPLACEMENT() - APPENDB(']'); - } -} - -void OutputBounds(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - assert(X86Instruction->HasSrcAddressing); - assert(!(Operand->Length & 1)); - Operand->Length >>= 1; - APPENDB('('); - OutputAddress(Instruction, Operand, OperandIndex); - APPENDS(", "); - X86Instruction->Displacement += Operand->Length; - OutputAddress(Instruction, Operand, OperandIndex); - X86Instruction->Displacement -= Operand->Length; - APPENDB(')'); - Operand->Length <<= 1; -} - -void OutputGeneral(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - if ((X86Instruction->HasDstAddressing && X86Instruction->DstAddressIndex == OperandIndex) || - (X86Instruction->HasSrcAddressing && X86Instruction->SrcAddressIndex == OperandIndex)) - { - OutputAddress(Instruction, Operand, OperandIndex); - } - else - { - APPENDS(X86_Registers[Operand->Register]); - } -} - -void OutputDescriptor(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - assert(X86Instruction->HasSrcAddressing || X86Instruction->HasDstAddressing); - OutputAddress(Instruction, Operand, OperandIndex); -} - -void OutputPackedReal(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - if ((X86Instruction->HasDstAddressing && X86Instruction->DstAddressIndex == OperandIndex) || - (X86Instruction->HasSrcAddressing && X86Instruction->SrcAddressIndex == OperandIndex)) - { - OutputAddress(Instruction, Operand, OperandIndex); - } - else - { - APPENDS(X86_Registers[Operand->Register]); - } -} - -void OutputPackedBCD(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - if ((X86Instruction->HasDstAddressing && X86Instruction->DstAddressIndex == OperandIndex) || - (X86Instruction->HasSrcAddressing && X86Instruction->SrcAddressIndex == OperandIndex)) - { - OutputAddress(Instruction, Operand, OperandIndex); - } - else - { - APPENDS(X86_Registers[Operand->Register]); - } -} - -void OutputScalarReal(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - if ((X86Instruction->HasDstAddressing && X86Instruction->DstAddressIndex == OperandIndex) || - (X86Instruction->HasSrcAddressing && X86Instruction->SrcAddressIndex == OperandIndex)) - { - OutputAddress(Instruction, Operand, OperandIndex); - } - else - { - APPENDS(X86_Registers[Operand->Register]); - } -} - -void OutputScalarGeneral(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - if (Operand->Type == OPTYPE_FLOAT) - { - OutputScalarReal(Instruction, Operand, OperandIndex); - } - else - { - OutputGeneral(Instruction, Operand, OperandIndex); - } -} - -void OutputFPUEnvironment(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - assert(X86Instruction->HasSrcAddressing || X86Instruction->HasDstAddressing); - OutputAddress(Instruction, Operand, OperandIndex); -} - -void OutputFPUState(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - assert(X86Instruction->HasSrcAddressing || X86Instruction->HasDstAddressing); - OutputAddress(Instruction, Operand, OperandIndex); -} - -void OutputCPUState(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - assert(X86Instruction->HasSrcAddressing); - OutputAddress(Instruction, Operand, OperandIndex); -} - -void OutputSegOffset(INSTRUCTION *Instruction, INSTRUCTION_OPERAND *Operand, U32 OperandIndex) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - assert(X86Instruction->HasSrcAddressing); - OutputAddress(Instruction, Operand, OperandIndex); -} - -//////////////////////////////////////////////////////////// -// Prologue support -//////////////////////////////////////////////////////////// - -typedef struct _PROLOGUE -{ - char *Data; - U32 Length; -} PROLOGUE; - -PROLOGUE StandardPrologues[] = -{ - { "\x55\x8b\xec", 3 }, - { "\x55\x89\xe5", 3 }, - { "\x83\xec", 2 }, - { "\x81\xec", 2 }, - // TODO: add AMD64 prologues - // TODO: add VS2003/VS2003 prologues - // TODO: add any unique prologues from other compilers - { NULL, 0 } -}; - -// Find the first function between StartAddress and EndAddress -// -// This will match a standard prologue and then analyze the following instructions to verify -// it is a valid function -U8 *X86_FindFunctionByPrologue(INSTRUCTION *Instruction, U8 *StartAddress, U8 *EndAddress, U32 Flags) -{ - assert(0); // TODO - return NULL; -} - -////////////////////////////////////////////////////////// -// Instruction decoder -////////////////////////////////////////////////////////// - -BOOL X86_GetInstruction(INSTRUCTION *Instruction, U8 *Address, U32 Flags) -{ - BOOL SpecialExtension = FALSE; - U8 Opcode = 0, OpcodeExtension = 0, Group = 0, SSE_Prefix = 0, Suffix; - U32 i = 0, Result = 0, tmpScale; - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - X86_OPCODE *X86Opcode; -#ifdef TEST_DISASM - U32 InstructionLength = 0; -#endif - INSTRUCTION_OPERAND *Operand, *Operand1 = NULL; - DISASSEMBLER *Disassembler = Instruction->Disassembler; - BOOL Decode = Flags & DISASM_DECODE; - BOOL Disassemble = Flags & DISASM_DISASSEMBLE; - BOOL SuppressErrors = Flags & DISASM_SUPPRESSERRORS; - - if (Disassemble && !Decode) - { - assert(0); - Decode = TRUE; - } - - if (!Address || !X86_InitInstruction(Instruction)) - { - assert(0); - goto abort; - } - - assert(Instruction->Address == Address); - assert(!Instruction->StringIndex && !Instruction->Length); - - Disassembler->Stage1Count++; - if (Flags & DISASM_ALIGNOUTPUT) Instruction->StringAligned = TRUE; - - // - // Get prefixes or three byte opcode - // - while (TRUE) - { - Opcode = *Address; - INSTR_INC(1); // increment Instruction->Length and address - X86Opcode = &X86_Opcodes_1[Opcode]; - - // Handle a misplaced REX prefix -- AMD64 manual says it is just ignored - if (IS_AMD64() && (Opcode >= REX_PREFIX_START && Opcode <= REX_PREFIX_END) && X86_PREFIX((&X86_Opcodes_1[*Address]))) - { - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: REX prefix before legacy prefix 0x%02X\n", VIRTUAL_ADDRESS, Opcode); - Instruction->AnomalyOccurred = TRUE; - } - continue; - } - - if (X86_PREFIX(X86Opcode)) - { - if (!Instruction->AnomalyOccurred) - { - for (i = 0; i < Instruction->PrefixCount; i++) - { - if (Instruction->Prefixes[i] == Opcode) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Duplicate prefix 0x%02X\n", VIRTUAL_ADDRESS, Opcode); - Instruction->AnomalyOccurred = TRUE; - break; - } - } - } - - switch (Opcode) - { - case PREFIX_REPNE: // may be three byte opcode - SSE_Prefix = Opcode; - if (!Instruction->AnomalyOccurred && X86Instruction->HasRepeatWhileEqualPrefix) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Conflicting prefix\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - Instruction->Repeat = TRUE; - X86Instruction->HasRepeatWhileEqualPrefix = FALSE; - X86Instruction->HasRepeatWhileNotEqualPrefix = TRUE; - break; - case PREFIX_REP: // may be three byte opcode - SSE_Prefix = Opcode; - if (!Instruction->AnomalyOccurred && X86Instruction->HasRepeatWhileNotEqualPrefix) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Conflicting prefix\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - - Instruction->Repeat = TRUE; - X86Instruction->HasRepeatWhileNotEqualPrefix = FALSE; - X86Instruction->HasRepeatWhileEqualPrefix = TRUE; - break; - - case PREFIX_OPERAND_SIZE: // may be three byte opcode - SSE_Prefix = Opcode; - if (!Instruction->AnomalyOccurred && X86Instruction->HasOperandSizePrefix) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Conflicting prefix\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - - if (X86Instruction->HasOperandSizePrefix) break; - else X86Instruction->HasOperandSizePrefix = TRUE; - switch (X86Instruction->OperandSize) - { - case 4: X86Instruction->OperandSize = 2; break; - case 2: X86Instruction->OperandSize = 4; break; - default: assert(0); goto abort; - } - break; - - case PREFIX_ADDRESS_SIZE: - if (!Instruction->AnomalyOccurred && X86Instruction->HasAddressSizePrefix) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Conflicting prefix\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - - if (X86Instruction->HasAddressSizePrefix) break; - else X86Instruction->HasAddressSizePrefix = TRUE; - switch (X86Instruction->AddressSize) - { - case 8: - X86Instruction->AddressSize = 4; - break; - case 4: - assert(!IS_AMD64()); // this should not be possible - X86Instruction->AddressSize = 2; - break; - case 2: - X86Instruction->AddressSize = 4; - break; - default: - assert(0); goto abort; - } - break; - - case PREFIX_SEGMENT_OVERRIDE_ES: - SANITY_CHECK_SEGMENT_OVERRIDE(); - if (!IS_AMD64()) - { - X86Instruction->HasSegmentOverridePrefix = TRUE; - X86Instruction->Segment = SEG_ES; - } - else if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Meaningless segment override\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - break; - case PREFIX_SEGMENT_OVERRIDE_CS: - SANITY_CHECK_SEGMENT_OVERRIDE(); - if (!IS_AMD64()) - { - X86Instruction->HasSegmentOverridePrefix = TRUE; - X86Instruction->Segment = SEG_CS; - } - else if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Meaningless segment override\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - break; - case PREFIX_SEGMENT_OVERRIDE_SS: - SANITY_CHECK_SEGMENT_OVERRIDE(); - if (!IS_AMD64()) - { - X86Instruction->HasSegmentOverridePrefix = TRUE; - X86Instruction->Segment = SEG_SS; - } - else if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Meaningless segment override\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - break; - case PREFIX_SEGMENT_OVERRIDE_DS: - SANITY_CHECK_SEGMENT_OVERRIDE(); - if (!IS_AMD64()) - { - X86Instruction->HasSegmentOverridePrefix = TRUE; - X86Instruction->Segment = SEG_DS; - } - else if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Meaningless segment override\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - break; - case PREFIX_SEGMENT_OVERRIDE_FS: - SANITY_CHECK_SEGMENT_OVERRIDE(); - X86Instruction->HasSegmentOverridePrefix = TRUE; - X86Instruction->Segment = SEG_FS; - break; - case PREFIX_SEGMENT_OVERRIDE_GS: - SANITY_CHECK_SEGMENT_OVERRIDE(); - X86Instruction->HasSegmentOverridePrefix = TRUE; - X86Instruction->Segment = SEG_GS; - break; - - case PREFIX_LOCK: - if (!Instruction->AnomalyOccurred && X86Instruction->HasLockPrefix) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Conflicting prefix\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - X86Instruction->HasLockPrefix = TRUE; - break; - - default: - assert(0); - goto abort; - } - - if (Instruction->PrefixCount >= X86_MAX_INSTRUCTION_LEN) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Reached maximum prefix count %d\n", VIRTUAL_ADDRESS, X86_MAX_PREFIX_LENGTH); - goto abort; - } - else if (Instruction->PrefixCount == X86_MAX_PREFIX_LENGTH) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Reached maximum prefix count %d\n", VIRTUAL_ADDRESS, X86_MAX_PREFIX_LENGTH); - Instruction->AnomalyOccurred = TRUE; - } - - assert(Instruction->AnomalyOccurred || Instruction->PrefixCount < X86_MAX_PREFIX_LENGTH); - Instruction->Prefixes[Instruction->PrefixCount] = Opcode; - Instruction->PrefixCount++; - //DISASM_OUTPUT(("[0x%08I64X] Prefix 0x%02X (prefix count %d)\n", VIRTUAL_ADDRESS, Opcode, Instruction->PrefixCount)); - } - else - { - break; - } - } - - // Check for REX opcode - // This is checked here instead of the prefix loop above because it must be the - // last prefix - if (IS_AMD64() && (Opcode >= REX_PREFIX_START && Opcode <= REX_PREFIX_END)) - { - if (Instruction->PrefixCount >= X86_MAX_INSTRUCTION_LEN) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Reached maximum prefix count %d\n", VIRTUAL_ADDRESS, X86_MAX_PREFIX_LENGTH); - goto abort; - } - else if (!Instruction->AnomalyOccurred && Instruction->PrefixCount == AMD64_MAX_PREFIX_LENGTH) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Reached maximum prefix count %d\n", VIRTUAL_ADDRESS, X86_MAX_PREFIX_LENGTH); - Instruction->AnomalyOccurred = TRUE; - } - - assert(Instruction->AnomalyOccurred || Instruction->PrefixCount < AMD64_MAX_PREFIX_LENGTH); - - Instruction->Prefixes[Instruction->PrefixCount] = Opcode; - Instruction->PrefixCount++; - X86Instruction->rex_b = Opcode; - SET_REX(X86Instruction->rex, X86Instruction->rex_b); - DISASM_OUTPUT(("[0x%08I64X] REX prefix 0x%02X (prefix count %d, w=%d, r=%d, x=%d, b=%d)\n", VIRTUAL_ADDRESS, Opcode, Instruction->PrefixCount, X86Instruction->rex.w, X86Instruction->rex.r, X86Instruction->rex.x, X86Instruction->rex.b)); - - assert(X86Instruction->AddressSize >= 4); - if (X86Instruction->rex.w) - { - X86Instruction->OperandSize = 8; - X86Instruction->HasOperandSizePrefix = FALSE; - } - else if (X86Instruction->HasOperandSizePrefix) - { - assert(X86Instruction->OperandSize == 2); - } - else if (X86Instruction->rex_b == REX_PREFIX_START) - { - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: meaningless REX prefix used\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - X86Instruction->rex_b = 0; - } - - Opcode = *Address; - INSTR_INC(1); // increment Instruction->Length and address - - X86Opcode = &X86_Opcodes_1[Opcode]; - assert(!X86_PREFIX(X86Opcode)); - } - //DISASM_OUTPUT(("[0x%08I64X] OperandSize = %d, AddressSize = %d\n", VIRTUAL_ADDRESS, X86Instruction->OperandSize, X86Instruction->AddressSize)); - Instruction->LastOpcode = Opcode; - Instruction->OpcodeAddress = Address-1; - - if (X86_INVALID(X86Opcode)) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Invalid opcode 0x%02X\n", VIRTUAL_ADDRESS, Opcode); - goto abort; - } - - if (Opcode == X86_TWO_BYTE_OPCODE) - { - // - // Handle case that it is a group (with opcode extension), floating point, or two byte opcode - // - assert(!Instruction->OpcodeLength); - Instruction->LastOpcode = Opcode = *Address; - INSTR_INC(1); // increment Instruction->Length and address - assert(X86Opcode->Table == X86_Opcodes_2); - X86Opcode = &X86_Opcodes_2[Opcode]; - - // - // Check for errors - // - if (X86_INVALID(X86Opcode)) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Invalid two byte opcode 0x%02X 0x%02X\n", VIRTUAL_ADDRESS, X86_TWO_BYTE_OPCODE, Opcode); - goto abort; - } - - if (X86Instruction->AddressSize == 8) - { - if (X86_Invalid_Addr64_2[Opcode]) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Opcode 0x%02X 0x%02X (\"%s\") illegal in 64-bit mode\n", VIRTUAL_ADDRESS, X86_TWO_BYTE_OPCODE, Opcode, X86Opcode->Mnemonic); - goto abort; - } -#if 0 - if (X86Instruction->rex_b && - (GET_REX_B(X86Instruction->rex_b) && !GET_REX_B(X86_REX_2[Opcode]) || - GET_REX_X(X86Instruction->rex_b) && !GET_REX_X(X86_REX_2[Opcode]) || - GET_REX_R(X86Instruction->rex_b) && !GET_REX_R(X86_REX_2[Opcode]) || - GET_REX_W(X86Instruction->rex_b) && !GET_REX_W(X86_REX_2[Opcode]))) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Illegal REX prefix 0x%02X for opcode 0x%02X 0x%02X\n", VIRTUAL_ADDRESS, X86Instruction->rex_b, X86_TWO_BYTE_OPCODE, Opcode); - assert(0); - goto abort; - } -#endif - } - - if (X86Instruction->OperandSize == 2 && X86_Invalid_Op16_2[Opcode]) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Opcode 0x%02X 0x%02X (\"%s\") illegal with 16-bit operand size\n", VIRTUAL_ADDRESS, X86_TWO_BYTE_OPCODE, Opcode, X86Opcode->Mnemonic); - goto abort; - } - - X86Instruction->HasModRM = X86_ModRM_2[Opcode]; - if (X86Instruction->HasModRM) X86Instruction->modrm_b = *Address; - Instruction->OpcodeBytes[0] = X86_TWO_BYTE_OPCODE; - Instruction->OpcodeBytes[1] = Opcode; - Instruction->OpcodeLength = 2; - - if (X86_SPECIAL_EXTENSION(X86Opcode)) - { - DISASM_OUTPUT(("[0x%08I64X] Special opcode extension 0x%02X 0x%02X\n", VIRTUAL_ADDRESS, X86_TWO_BYTE_OPCODE, Opcode)); - SpecialExtension = TRUE; - goto HasSpecialExtension; - } - else if (SSE_Prefix && !X86_INVALID(&X86_SSE[Opcode])) // SSEx instruction - { - Instruction->OpcodeLength = 3; - Instruction->OpcodeBytes[2] = SSE_Prefix; - assert(Instruction->OpcodeBytes[1] == Opcode); - - // Since the prefix was really an opcode extension, remove it from - // the prefix list - for (i = 0; i < Instruction->PrefixCount; i++) - { - if (Instruction->Prefixes[i]) break; - } - assert(i != Instruction->PrefixCount); - Instruction->PrefixCount--; - Instruction->Prefixes[i] = 0; - - // Slide any prefixes following the removed prefix down by 1 - memmove(&Instruction->Prefixes[i], &Instruction->Prefixes[i+1], Instruction->PrefixCount-i); - Instruction->Prefixes[Instruction->PrefixCount] = 0; - Instruction->Repeat = FALSE; - X86Instruction->HasRepeatWhileEqualPrefix = FALSE; - X86Instruction->HasRepeatWhileNotEqualPrefix = FALSE; - X86Instruction->HasOperandSizePrefix = FALSE; - if (SSE_Prefix == PREFIX_OPERAND_SIZE) - { - if (IS_AMD64() && X86Instruction->rex.w) X86Instruction->OperandSize = 8; - else X86Instruction->OperandSize = 4; - } - - if (IS_X86_16()) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: SSE invalid in 16-bit mode\n", VIRTUAL_ADDRESS); - goto abort; - } - - assert(X86Instruction->HasModRM); - switch (SSE_Prefix) - { - case PREFIX_OPERAND_SIZE: X86Opcode = &X86_SSE[0x000+Opcode]; break; - case PREFIX_REPNE: X86Opcode = &X86_SSE[0x100+Opcode]; break; - case PREFIX_REP: X86Opcode = &X86_SSE[0x200+Opcode]; break; - } - - if (X86_INVALID(X86Opcode)) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Illegal SSE instruction opcode 0x%02X 0x%02X + prefix 0x%02X\n", VIRTUAL_ADDRESS, Instruction->OpcodeBytes[0], Instruction->OpcodeBytes[1], Instruction->OpcodeBytes[2]); - goto abort; - } - else if (X86_EXTENDED_OPCODE(X86Opcode)) - { - // SSE in group (13, 14, or 15) - OpcodeExtension = GET_MODRM_EXT(X86Instruction->modrm_b); - Group = X86_Groups_2[Opcode]; - X86Instruction->Group = (U8)Group; - assert(Group >= 13 && Group <= 15 && X86Opcode->Table); - switch (SSE_Prefix) - { - case PREFIX_OPERAND_SIZE: X86Opcode = &X86Opcode->Table[0x00+OpcodeExtension]; break; - case PREFIX_REPNE: X86Opcode = &X86Opcode->Table[0x08+OpcodeExtension]; break; - case PREFIX_REP: X86Opcode = &X86Opcode->Table[0x10+OpcodeExtension]; break; - } - - if (X86_INVALID(X86Opcode)) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Illegal SSE instruction opcode 0x%02X 0x%02X + prefix 0x%02X + extension %d\n", VIRTUAL_ADDRESS, Instruction->OpcodeBytes[0], Instruction->OpcodeBytes[1], Instruction->OpcodeBytes[2], OpcodeExtension); - goto abort; - } - } - - Instruction->Repeat = FALSE; - X86Instruction->HasRepeatWhileEqualPrefix = FALSE; - X86Instruction->HasRepeatWhileNotEqualPrefix = FALSE; - X86Instruction->HasOperandSizePrefix = FALSE; - switch (X86_GET_CATEGORY(X86Opcode)) - { - case ITYPE_SSE: case ITYPE_SSE2: case ITYPE_SSE3: break; - default: assert(0); goto abort; - } - } - else if (X86_EXTENDED_OPCODE(X86Opcode)) // 2 byte group - { - assert(!X86Opcode->MnemonicFlags); - OpcodeExtension = GET_MODRM_EXT(X86Instruction->modrm_b); - - assert(X86Opcode->Table); - X86Opcode = &X86Opcode->Table[OpcodeExtension]; - if (X86_INVALID(X86Opcode)) - { - Instruction->Length++; - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Invalid group opcode 0x%02X 0x%02X extension 0x%02X\n", VIRTUAL_ADDRESS, X86_TWO_BYTE_OPCODE, Opcode, OpcodeExtension); - goto abort; - } - - assert(!X86_SPECIAL_EXTENSION(X86Opcode)); - Group = X86_Groups_2[Opcode]; - X86Instruction->Group = (U8)Group; - assert(Group > 0 && Group <= 19); - assert(X86Opcode->Mnemonic); - DISASM_OUTPUT(("[0x%08I64X] Group %d (bytes 0x%02X 0x%02X) extension 0x%02X (\"%s\")\n", VIRTUAL_ADDRESS, Group, X86_TWO_BYTE_OPCODE, Opcode, OpcodeExtension, X86Opcode->Mnemonic)); - } - else - { - assert(X86Opcode->Mnemonic); - DISASM_OUTPUT(("[0x%08I64X] Two byte opcode 0x%02X 0x%02X (\"%s\")\n", VIRTUAL_ADDRESS, X86_TWO_BYTE_OPCODE, Opcode, X86Opcode->Mnemonic)); - X86Instruction->HasModRM = X86_ModRM_2[Opcode]; - if (X86Instruction->HasModRM) X86Instruction->modrm_b = *Address; - } - } - else // 1-byte opcode - { - if (X86Instruction->AddressSize == 8) - { - if (X86_Invalid_Addr64_1[Opcode]) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Opcode 0x%02X (\"%s\") illegal in 64-bit mode\n", VIRTUAL_ADDRESS, Opcode, X86Opcode->Mnemonic); - goto abort; - } - -#if 0 - if (X86Instruction->rex_b && - (GET_REX_B(X86Instruction->rex_b) && !GET_REX_B(X86_REX_1[Opcode]) || - GET_REX_X(X86Instruction->rex_b) && !GET_REX_X(X86_REX_1[Opcode]) || - GET_REX_R(X86Instruction->rex_b) && !GET_REX_R(X86_REX_1[Opcode]) || - GET_REX_W(X86Instruction->rex_b) && !GET_REX_W(X86_REX_1[Opcode]))) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Illegal REX prefix 0x%02X for opcode 0x%02X\n", VIRTUAL_ADDRESS, X86Instruction->rex_b, Opcode); - assert(0); - goto abort; - } -#endif - } - - if (X86Instruction->OperandSize == 2 && X86_Invalid_Op16_1[Opcode]) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Opcode 0x%02X (\"%s\") illegal with 16-bit operand size\n", VIRTUAL_ADDRESS, Opcode, X86Opcode->Mnemonic); - goto abort; - } - - Instruction->OpcodeBytes[0] = Opcode; - Instruction->OpcodeLength = 1; - X86Instruction->HasModRM = X86_ModRM_1[Opcode]; - if (X86Instruction->HasModRM) X86Instruction->modrm_b = *Address; - - if (X86_EXTENDED_OPCODE(X86Opcode)) // a group - { - assert(X86Instruction->HasModRM); - OpcodeExtension = GET_MODRM_EXT(*Address); // leave Address pointing at ModRM byte - - if (X86_SPECIAL_EXTENSION(X86Opcode)) - { - DISASM_OUTPUT(("[0x%08I64X] Special opcode extension 0x%02X 0x%02X\n", VIRTUAL_ADDRESS, X86_TWO_BYTE_OPCODE, Opcode)); - SpecialExtension = TRUE; - goto HasSpecialExtension; - } - - assert(X86Opcode->Table); - X86Opcode = &X86Opcode->Table[OpcodeExtension]; - if (X86_INVALID(X86Opcode)) - { - Instruction->Length++; - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Invalid group opcode 0x%02X extension 0x%02X\n", VIRTUAL_ADDRESS, Opcode, OpcodeExtension); - goto abort; - } - - Group = X86_Groups_1[Opcode]; - X86Instruction->Group = (U8)Group; - DISASM_OUTPUT(("[0x%08I64X] Group %d (byte 0x%02X) extension 0x%02X (\"%s\")\n", VIRTUAL_ADDRESS, Group, Opcode, OpcodeExtension, X86Opcode->Mnemonic)); - assert(Group > 0 && Group <= 17); - assert(X86Opcode->Mnemonic); - } - else - { - if (X86_SPECIAL_EXTENSION(X86Opcode)) - { - DISASM_OUTPUT(("[0x%08I64X] Special opcode extension 0x%02X\n", VIRTUAL_ADDRESS, Opcode)); - SpecialExtension = TRUE; - goto HasSpecialExtension; - } - - DISASM_OUTPUT(("[0x%08I64X] One byte opcode 0x%02X (\"%s\")\n", VIRTUAL_ADDRESS, Opcode, X86Opcode->Mnemonic)); - } - } - -HasSpecialExtension: - if (SpecialExtension) - { - if (X86Opcode->MnemonicFlags & ITYPE_EXT_MODRM) - { - assert(X86Opcode->Table); - assert(Instruction->OpcodeLength == 2); - assert(X86Instruction->HasModRM); - X86Opcode = &X86Opcode->Table[*Address]; - if (X86_INVALID(X86Opcode)) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Illegal opcode 0x%02X 0x%02X + modrm 0x%02X\n", VIRTUAL_ADDRESS, Instruction->OpcodeBytes[0], Instruction->OpcodeBytes[1], *Address); - goto abort; - } - else if (X86_EXTENDED_OPCODE(X86Opcode)) - { - assert(!X86Opcode->MnemonicFlags); - OpcodeExtension = GET_MODRM_EXT(X86Instruction->modrm_b); - - assert(X86Opcode->Table); - X86Opcode = &X86Opcode->Table[OpcodeExtension]; - if (X86_INVALID(X86Opcode)) - { - Instruction->Length++; - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Invalid group opcode 0x%02X 0x%02X extension 0x%02X\n", VIRTUAL_ADDRESS, X86_TWO_BYTE_OPCODE, Opcode, OpcodeExtension); - goto abort; - } - - assert(!X86_SPECIAL_EXTENSION(X86Opcode)); - Group = X86_Groups_2[Opcode]; - X86Instruction->Group = (U8)Group; - assert(Group > 0 && Group <= 19); - assert(X86Opcode->Mnemonic); - DISASM_OUTPUT(("[0x%08I64X] Group %d (bytes 0x%02X 0x%02X) extension 0x%02X (\"%s\")\n", VIRTUAL_ADDRESS, Group, X86_TWO_BYTE_OPCODE, Opcode, OpcodeExtension, X86Opcode->Mnemonic)); - } - else if (!X86_OPERAND_COUNT(X86Opcode)) - { - INSTR_INC(1); // increment Instruction->Length and address - } - } - else if (X86Opcode->MnemonicFlags & ITYPE_EXT_FPU) - { - assert(X86Opcode->Table); - if (X86Instruction->modrm_b < 0xC0) - { - // It is an opcode extension, use the X86Opcode->Table - OpcodeExtension = GET_MODRM_EXT(X86Instruction->modrm_b); - X86Opcode = &X86Opcode->Table[OpcodeExtension]; - } - else - { - // The whole ModRM byte is used, these start at index 0x08 in X86Opcode->Table - OpcodeExtension = (X86Instruction->modrm_b & 0x3F); - X86Opcode = &X86Opcode->Table[0x08 + OpcodeExtension]; - } - - if (X86_INVALID(X86Opcode)) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Invalid FPU opcode 0x%02X + modrm extension 0x%02X (index 0x%02X)\n", VIRTUAL_ADDRESS, Opcode, X86Instruction->modrm_b, 0x08 + OpcodeExtension); - goto abort; - } - - DISASM_OUTPUT(("[0x%08I64X] FPU instruction is (\"%s\"): 0x%02X + modrm 0x%02X (index 0x%02X)\n", VIRTUAL_ADDRESS, X86Opcode->Mnemonic, Opcode, X86Instruction->modrm_b, 0x08 + OpcodeExtension)); - if (!X86_OPERAND_COUNT(X86Opcode)) INSTR_INC(1); // increment Instruction->Length and address - } - else if (X86Opcode->MnemonicFlags & ITYPE_EXT_SUFFIX) - { - if (X86Instruction->HasOperandSizePrefix) - { - if (!Instruction->AnomalyOccurred && X86Opcode->Table == X86_3DNOW_0F) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: operand size prefix used with 3DNOW instruction\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - X86Instruction->HasOperandSizePrefix = FALSE; - X86Instruction->OperandSize = 4; - } - Instruction->OperandCount = X86_OPERAND_COUNT(X86Opcode); - assert(Instruction->OpcodeLength == 2 && X86Instruction->HasModRM && Instruction->OperandCount == 2); - memcpy(&X86Instruction->Opcode, X86Opcode, sizeof(X86_OPCODE)); - Instruction->Operands[0].Flags = X86Opcode->OperandFlags[0] & X86_OPFLAGS_MASK; - Instruction->Operands[1].Flags = X86Opcode->OperandFlags[1] & X86_OPFLAGS_MASK; - Instruction->Operands[2].Flags = X86Opcode->OperandFlags[2] & X86_OPFLAGS_MASK; - assert(Address == Instruction->Address + Instruction->Length); - if (!SetOperands(Instruction, Address, Flags & DISASM_SUPPRESSERRORS)) goto abort; - Suffix = Instruction->Address[Instruction->Length++]; - Instruction->OpcodeBytes[2] = Suffix; - Instruction->OpcodeLength = 3; - X86Opcode = &X86Opcode->Table[Suffix]; - - if (X86_INVALID(X86Opcode)) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Illegal opcode 0x%02X 0x%02X + suffix 0x%02X\n", VIRTUAL_ADDRESS, Instruction->OpcodeBytes[0], Instruction->OpcodeBytes[1], Suffix); - goto abort; - } - assert(Instruction->Length >= 4 + Instruction->PrefixCount); - } - else if (X86Opcode->MnemonicFlags & ITYPE_EXT_64) - { - assert(X86Opcode->Table); - if (IS_AMD64()) X86Opcode = &X86Opcode->Table[1]; - else X86Opcode = &X86Opcode->Table[0]; - assert(!X86_INVALID(X86Opcode)); - } - } - - // Detect incompatibilities - if (IS_X86_16() && X86Opcode->CPU > CPU_I386) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Instruction \"%s\" (opcode 0x%02X) can't be used in 16-bit X86\n", VIRTUAL_ADDRESS, X86Opcode->Mnemonic, Instruction->LastOpcode); - goto abort; - } - if (!IS_AMD64() && X86Opcode->CPU >= CPU_AMD64) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Instruction \"%s\" (opcode 0x%02X) can only be used in X86-64\n", VIRTUAL_ADDRESS, X86Opcode->Mnemonic, Instruction->LastOpcode); - goto abort; - } - - // Copy the opcode into the local structure and set the fields - assert(Instruction->OpcodeLength && !X86_INVALID(X86Opcode)); - memcpy(&X86Instruction->Opcode, X86Opcode, sizeof(X86_OPCODE)); - Instruction->Groups |= X86_GET_CATEGORY(X86Opcode); - assert(Instruction->Groups); - Instruction->Type |= X86_GET_TYPE(X86Opcode); - assert((U32)Instruction->Type >= Instruction->Groups); - Instruction->OperandCount = X86_OPERAND_COUNT(X86Opcode); - - // - // Sanity check prefixes now that opcode is known and prefixes are resolved - // - - // Instructions that implicitly reference the CS/DS can't have segment override prefixes - switch (Instruction->Type) - { - case ITYPE_PUSHF: case ITYPE_POPF: - case ITYPE_ENTER: case ITYPE_LEAVE: - SANITY_CHECK_SEGMENT_OVERRIDE(); - X86Instruction->HasSegmentOverridePrefix = FALSE; - X86Instruction->Segment = SEG_SS; - break; - case ITYPE_RET: case ITYPE_DEBUG: - case ITYPE_OFLOW: case ITYPE_TRAP: - case ITYPE_TRAPRET: - SANITY_CHECK_SEGMENT_OVERRIDE(); - X86Instruction->HasSegmentOverridePrefix = FALSE; - X86Instruction->Segment = SEG_CS; - break; - } - - // Check illegal prefixes used with FPU/MMX/SSEx - if (Instruction->Groups & (ITYPE_FPU|ITYPE_MMX|ITYPE_SSE|ITYPE_SSE2|ITYPE_SSE3)) - { - // Check for prefixes that produce unpredictable results - for (i = 0; i < Instruction->PrefixCount; i++) - { - switch (Instruction->Prefixes[i]) - { - case PREFIX_OPERAND_SIZE: - switch (Instruction->Type) - { - case ITYPE_FSTOREENV: case ITYPE_FLOADENV: case ITYPE_FSAVE: case ITYPE_FRESTORE: continue; - default: break; - } - - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: operand size prefix used with FPU/MMX/SSEx\n", VIRTUAL_ADDRESS); - goto abort; - } - X86Instruction->HasOperandSizePrefix = FALSE; - if (X86Instruction->OperandSize == 2) X86Instruction->OperandSize = 2; - break; - - case PREFIX_REPNE: - case PREFIX_REP: - if (Instruction->Groups & ITYPE_FPU) { assert(Instruction->Repeat); continue; } - // The Intel manual says this results in unpredictable behavior -- it's not even - // clear which SSE prefix is used as the third opcode byte in this case - // (e.g., is it the first or last SSE prefix?) - if (!SuppressErrors) printf("[0x%08I64X] ERROR: rep/repne used with MMX/SSEx\n", VIRTUAL_ADDRESS); - goto abort; - - default: - break; - } - } - } - - // Check for conflicts involving operand size - if (IS_AMD64()) - { - // Check for use of rex.w=1 with an operand size prefix - if (X86Instruction->rex.w) - { - assert(X86Instruction->OperandSize == 8); - for (i = 0; i < Instruction->PrefixCount; i++) - { - if (Instruction->Prefixes[i] == PREFIX_OPERAND_SIZE) - { - X86Instruction->HasOperandSizePrefix = FALSE; - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: use of operand size prefix meaningless when REX.w=1\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - } - } - } - - // Set default operand size to 64 instead of 32 for some instructions - switch (Instruction->Type) - { - case ITYPE_PUSH: case ITYPE_POP: - case ITYPE_PUSHF: case ITYPE_POPF: - case ITYPE_ENTER: case ITYPE_LEAVE: - case ITYPE_CALL: case ITYPE_BRANCH: - case ITYPE_LOOPCC: case ITYPE_RET: - X86Instruction->HasDefault64Operand = TRUE; - break; - - case ITYPE_SYSTEM: - if (Instruction->OpcodeLength != 2) break; - - // lgdt/lidt/lldt/ltr - if ((Instruction->LastOpcode == 0x00 || Instruction->LastOpcode == 0x01) && - (OpcodeExtension == 0x02 || OpcodeExtension == 0x03)) - { - X86Instruction->HasDefault64Operand = TRUE; - } - break; - - default: - break; - } - - if (X86Instruction->HasDefault64Operand) - { - if (X86Instruction->rex.w) - { - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: use of REX.w is meaningless (default operand size is 64)\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - X86Instruction->rex_b &= ~8; - X86Instruction->rex.w = 0; - } - - if (X86Instruction->HasOperandSizePrefix) - { - assert(X86Instruction->OperandSize == 2); - X86Instruction->HasDefault64Operand = FALSE; - } - else - { - assert(X86Instruction->OperandSize >= 4); - X86Instruction->OperandSize = 8; - } - } - } - - // Make sure rep/repe/repne is set correctly based on instruction - if (Instruction->Repeat) - { - switch (Instruction->Type) - { - case ITYPE_IN: - case ITYPE_OUT: - case ITYPE_STRMOV: - case ITYPE_STRSTOR: - case ITYPE_STRLOAD: - if (X86Instruction->HasRepeatWhileNotEqualPrefix) - { - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: REPNE should only be used with cmps/scas\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - // Treat it as just a "rep" - X86Instruction->HasRepeatWhileNotEqualPrefix = FALSE; - X86Instruction->HasRepeatWhileEqualPrefix = TRUE; - } - break; - case ITYPE_STRCMP: - break; - default: - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Repeat prefix used with non-string instruction\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - Instruction->Repeat = FALSE; - X86Instruction->HasRepeatWhileEqualPrefix = FALSE; - X86Instruction->HasRepeatWhileNotEqualPrefix = FALSE; - break; - } - } - - if (Disassemble) - { - assert(!Instruction->StringIndex); - if (X86Instruction->HasRepeatWhileEqualPrefix) - { - if (Instruction->Type == ITYPE_STRCMP) { APPENDS("repe "); } - else { APPENDS("rep "); } - } - if (X86Instruction->HasRepeatWhileNotEqualPrefix) APPENDS("repne "); - if (X86Instruction->HasLockPrefix) APPENDS("lock "); - if (X86Instruction->HasBranchTakenPrefix) APPENDS("hinttake "); - if (X86Instruction->HasBranchNotTakenPrefix) APPENDS("hintskip "); - APPENDPAD(12); - APPEND(OPCSTR, SIZE_LEFT, "%s", X86Opcode->Mnemonic); - APPENDPAD(24); - } - - if (Instruction->OperandCount) - { - Instruction->Operands[0].Flags = X86Opcode->OperandFlags[0] & X86_OPFLAGS_MASK; - Instruction->Operands[1].Flags = X86Opcode->OperandFlags[1] & X86_OPFLAGS_MASK; - Instruction->Operands[2].Flags = X86Opcode->OperandFlags[2] & X86_OPFLAGS_MASK; - Address = SetOperands(Instruction, Address, Flags); - if (!Address) goto abort; - assert(!(Instruction->Operands[0].Flags & 0x7F)); - assert(!(Instruction->Operands[1].Flags & 0x7F)); - assert(!(Instruction->Operands[2].Flags & 0x7F)); - } - - Disassembler->Stage2Count++; - -#ifdef TEST_DISASM - ////////////////////////////////////////////////////////////////////// - // Test against other disassemblers - ////////////////////////////////////////////////////////////////////// - - if (IS_X86_32()) - { - InstructionLength = X86_GetLength(Instruction, Instruction->Address); - if (InstructionLength && Instruction->Length != InstructionLength) - { - printf("[0x%08I64X] WARNING: instruction lengths differ (%d vs %d)\n", VIRTUAL_ADDRESS, Instruction->Length, InstructionLength); - DumpInstruction(Instruction, TRUE, TRUE); - assert(0); - } - } - else if (IS_AMD64()) - { - // TODO: need other amd64 (x86-64) disassembler to test against - } - else if (IS_X86_16()) - { - // TODO: need other x86 16-bit disassembler to test against - } -#endif - - ////////////////////////////////////////////////////////////////////// - // Post-operand sanity checks - ////////////////////////////////////////////////////////////////////// - - if (!X86Instruction->HasDstAddressing && !X86Instruction->HasSrcAddressing) - { - if (X86Instruction->HasAddressSizePrefix) - { - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: address size prefix used with no addressing\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - X86Instruction->HasAddressSizePrefix = FALSE; - } - - if (X86Instruction->HasSegmentOverridePrefix) - { - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: segment override used with no addressing\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - X86Instruction->HasSegmentOverridePrefix = FALSE; - } - } - - // Detect use of unusual segments - if (!Instruction->AnomalyOccurred && !IS_X86_16()) - { - switch (X86Instruction->Segment) - { - case SEG_CS: case SEG_DS: case SEG_SS: - break; - case SEG_ES: - switch (Instruction->Type) - { - case ITYPE_IN: case ITYPE_STRMOV: case ITYPE_STRCMP: case ITYPE_STRSTOR: - break; - default: - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: use of unexpected segment ES\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - break; - } - break; - case SEG_FS: - if (IS_X86_32() && !(Instruction->Groups & ITYPE_EXEC)) break; - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: use of unexpected segment FS\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - break; - case SEG_GS: - if (IS_AMD64() && !(Instruction->Groups & ITYPE_EXEC)) break; - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: use of unexpected segment GS\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - break; - default: - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: unexpected segment 0x%02X\n", VIRTUAL_ADDRESS, X86Instruction->Selector); - Instruction->AnomalyOccurred = TRUE; - break; - } - } - - if ((X86Opcode->OperandFlags[0] & OP_COND_EXEC) == OP_COND_EXEC) - { - assert(Instruction->Type == ITYPE_BRANCHCC || Instruction->Type == ITYPE_LOOPCC); - for (i = 0; i < Instruction->PrefixCount; i++) - { - switch (Instruction->Prefixes[i]) - { - case PREFIX_BRANCH_NOT_TAKEN: - if (!Instruction->AnomalyOccurred && X86Instruction->Segment != SEG_CS) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Segment override used with conditional branch\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - X86Instruction->HasSegmentOverridePrefix = FALSE; - X86Instruction->Segment = SEG_CS; - X86Instruction->HasBranchNotTakenPrefix = TRUE; - break; - case PREFIX_BRANCH_TAKEN: - if (!Instruction->AnomalyOccurred && X86Instruction->Segment != SEG_DS) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Segment override used with conditional branch\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - X86Instruction->HasSegmentOverridePrefix = FALSE; - X86Instruction->Segment = SEG_CS; - X86Instruction->HasBranchTakenPrefix = TRUE; - break; - } - } - } - - // - // If lock prefix is enabled, verify it is valid - // - if (X86Instruction->HasLockPrefix && - !IsValidLockPrefix(X86Instruction, Opcode, Instruction->OpcodeLength, Group, OpcodeExtension)) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: Illegal use of lock prefix for instruction \"%s\"\n", VIRTUAL_ADDRESS, X86Opcode->Mnemonic); - goto abort; - } - - ////////////////////////////////////////////////////////////////////// - // Generate disassembly output - ////////////////////////////////////////////////////////////////////// - - if (Disassemble) - { - if ((Flags & DISASM_SHOWFLAGS) && - (X86Instruction->Opcode.Preconditions || X86Instruction->Opcode.FlagsChanged || X86Instruction->Opcode.ResultsIfTrue)) - { - APPENDPAD(124); - if (X86Instruction->Opcode.Preconditions) - { - Result = X86Instruction->Opcode.Preconditions; - APPENDS("COND:{ "); - if (Result & COND_L) APPENDS("L "); - if (Result & COND_NL) APPENDS("NL "); - if (Result & COND_LE) APPENDS("LE "); - if (Result & COND_NLE) APPENDS("NLE "); - if (Result & COND_G) APPENDS("G "); - if (Result & COND_NG) APPENDS("NG "); - if (Result & COND_GE) APPENDS("GE "); - if (Result & COND_NGE) APPENDS("NGE "); - if (Result & COND_A) APPENDS("A "); - if (Result & COND_NA) APPENDS("NA "); - if (Result & COND_AE) APPENDS("AE "); - if (Result & COND_NAE) APPENDS("NAE "); - if (Result & COND_B) APPENDS("B "); - if (Result & COND_NB) APPENDS("NB "); - if (Result & COND_BE) APPENDS("BE "); - if (Result & COND_NBE) APPENDS("NBE "); - if (Result & COND_E) APPENDS("E "); - if (Result & COND_NE) APPENDS("NE "); - if (Result & COND_C) APPENDS("C "); - if (Result & COND_NC) APPENDS("NC "); - if (Result & COND_Z) APPENDS("Z "); - if (Result & COND_NZ) APPENDS("NZ "); - if (Result & COND_P) APPENDS("P "); - if (Result & COND_NP) APPENDS("NP "); - if (Result & COND_PE) APPENDS("PE "); - if (Result & COND_PO) APPENDS("PO "); - if (Result & COND_O) APPENDS("O "); - if (Result & COND_NO) APPENDS("NO "); - if (Result & COND_U) APPENDS("U "); - if (Result & COND_NU) APPENDS("NU "); - if (Result & COND_S) APPENDS("S "); - if (Result & COND_NS) APPENDS("NS "); - if (Result & COND_D) APPENDS("D "); - APPENDB('}'); - } - - if (X86Instruction->Opcode.FlagsChanged) - { - Result = X86Instruction->Opcode.FlagsChanged; - - if (Result & FLAG_SET_MASK) - { - APPENDS("SET:{ "); - if (Result & FLAG_CF_SET) APPENDS("C "); - if (Result & FLAG_DF_SET) APPENDS("D "); - if (Result & FLAG_IF_SET) APPENDS("I "); - APPENDB('}'); - } - - if (Result & FLAG_CLR_MASK) - { - APPENDS("CLR:{ "); - if (Result & FLAG_SF_CLR) APPENDS("S "); - if (Result & FLAG_ZF_CLR) APPENDS("Z "); - if (Result & FLAG_AF_CLR) APPENDS("A "); - if (Result & FLAG_CF_CLR) APPENDS("C "); - if (Result & FLAG_DF_CLR) APPENDS("D "); - if (Result & FLAG_IF_CLR) APPENDS("I "); - if (Result & FLAG_OF_CLR) APPENDS("O "); - if ((Result & FPU_ALL_CLR) == FPU_ALL_CLR) - { - APPENDS("FPU_ALL "); - } - else - { - if (Result & FPU_C0_CLR) APPENDS("FPU_C0 "); - if (Result & FPU_C1_CLR) APPENDS("FPU_C1 "); - if (Result & FPU_C2_CLR) APPENDS("FPU_C2 "); - if (Result & FPU_C3_CLR) APPENDS("FPU_C3 "); - } - APPENDB('}'); - } - - if ((Result & FLAG_MOD_MASK) == FLAG_MOD_MASK) - { - APPENDS("MOD:{ "); - if ((Result & FLAG_ALL_MOD) == FLAG_ALL_MOD) - { - APPENDS("FLAGS_ALL "); - } - else if ((Result & FLAG_COMMON_MOD) == FLAG_COMMON_MOD) - { - APPENDS("FLAGS_COMMON "); - } - else - { - if (Result & FLAG_OF_MOD) APPENDS("O "); - if (Result & FLAG_SF_MOD) APPENDS("S "); - if (Result & FLAG_ZF_MOD) APPENDS("Z "); - if (Result & FLAG_AF_MOD) APPENDS("A "); - if (Result & FLAG_PF_MOD) APPENDS("P "); - if (Result & FLAG_CF_MOD) APPENDS("C "); - if (Result & FLAG_DF_MOD) APPENDS("D "); - if (Result & FLAG_IF_MOD) APPENDS("I "); - } - if ((Result & FPU_ALL_MOD) == FPU_ALL_MOD) - { - APPENDS("FPU_ALL "); - } - else - { - if (Result & FPU_C0_MOD) APPENDS("FPU_C0 "); - if (Result & FPU_C1_MOD) APPENDS("FPU_C1 "); - if (Result & FPU_C2_MOD) APPENDS("FPU_C2 "); - if (Result & FPU_C3_MOD) APPENDS("FPU_C3 "); - } - APPENDB('}'); - } - - if (Result & FLAG_TOG_MASK) - { - APPENDS("TOG:{ "); - if (Result & FLAG_CF_TOG) APPENDS("C "); - APPENDB('}'); - } - } - } - - APPENDS("\n"); - } - else - { - Instruction->String[0] = '\0'; - } - - if (!Instruction->Length || Instruction->Length > X86_MAX_INSTRUCTION_LEN) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: maximum instruction length reached (\"%s\")\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic); - goto abort; - } - - if (!Decode) - { - Disassembler->Stage3CountNoDecode++; - return TRUE; // all work is done - } - - ////////////////////////////////////////////////////////////////////// - // Detect particularly interesting intructions - ////////////////////////////////////////////////////////////////////// - - Operand1 = &Instruction->Operands[0]; - if (Instruction->Groups & ITYPE_EXEC) - { - // If it is a negative offset with a 1-byte or 2-byte offset, assume it is a loop - if (Operand1->Type == OPTYPE_OFFSET && - Operand1->Length <= 2 && X86Instruction->Displacement < 0) - { - Instruction->CodeBranch.IsLoop = TRUE; - Instruction->CodeBranch.Operand = Operand1; - } - - if (!Instruction->AnomalyOccurred && - Operand1->TargetAddress >= (U64)Instruction->Address && - Operand1->TargetAddress < (U64)Instruction->Address + Instruction->Length) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: branch into the middle of an instruction\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - - switch (Instruction->Type) - { - case ITYPE_BRANCH: - Operand1->Flags |= OP_ADDRESS; - assert(Instruction->OperandCount == 1); - if (!(Operand1->Flags & (OP_GLOBAL|OP_FAR))) - { - assert(!X86Instruction->HasSelector); - X86Instruction->Segment = SEG_CS; - } - - if (Operand1->TargetAddress) - { - assert(!Instruction->CodeBranch.AddressOffset); - Instruction->CodeBranch.Count = 1; - Instruction->CodeBranch.Addresses[0] = Operand1->TargetAddress; - Instruction->CodeBranch.Operand = Operand1; - } - // If there is both a base and index register, the Result will probably be too wrong - // to even guess - else if (X86Instruction->HasFullDisplacement && - ((X86Instruction->HasBaseRegister && !X86Instruction->HasIndexRegister) || - (!X86Instruction->HasBaseRegister && X86Instruction->HasIndexRegister))) - { - assert(Operand1->Length <= 0xFF); - if (!X86Instruction->Scale) - { - if (Operand1->Length) X86Instruction->Scale = (U8)Operand1->Length; - else X86Instruction->Scale = X86Instruction->OperandSize; - } - assert(Operand1->Length <= 0xFF); - tmpScale = MAX(X86Instruction->Scale, Operand1->Length); - - assert(tmpScale <= 16); - Instruction->CodeBranch.AddressOffset = (U8)tmpScale; - for (i = 0; i < MAX_CODE_REFERENCE_COUNT; i++) Instruction->CodeBranch.Addresses[i] = (U64)X86Instruction->Displacement + (i * tmpScale); - Instruction->CodeBranch.Count = i; - Instruction->CodeBranch.IsIndirect = TRUE; - Instruction->CodeBranch.Operand = Operand1; - } - break; - - case ITYPE_CALL: - Instruction->Groups |= ITYPE_STACK; - Instruction->CodeBranch.IsCall = TRUE; - Operand1->Flags |= OP_ADDRESS; - assert(Instruction->OperandCount == 1); - if (!(Operand1->Flags & (OP_GLOBAL|OP_FAR))) - { - assert(!X86Instruction->HasSelector); - X86Instruction->Segment = SEG_CS; - } - - if (Operand1->TargetAddress) - { - assert(!Instruction->CodeBranch.AddressOffset); - Instruction->CodeBranch.Count = 1; - Instruction->CodeBranch.Addresses[0] = Operand1->TargetAddress; - Instruction->CodeBranch.Operand = Operand1; - } - // If there is both a base and index register, the Result will probably be too wrong - // to even guess - else if (X86Instruction->HasFullDisplacement && - ((X86Instruction->HasBaseRegister && !X86Instruction->HasIndexRegister) || - (!X86Instruction->HasBaseRegister && X86Instruction->HasIndexRegister))) - { - //DISASM_OUTPUT(("[0x%08I64X] Scale %d, displacement 0x%08I64x\n", VIRTUAL_ADDRESS, X86Instruction->Scale, X86Instruction->Displacement)); - if (!X86Instruction->Scale) - { - assert(Operand1->Length <= 0xFF); - if (Operand1->Length) X86Instruction->Scale = (U8)Operand1->Length; - else X86Instruction->Scale = X86Instruction->OperandSize; - } - tmpScale = MAX(X86Instruction->Scale, Operand1->Length); - - assert(tmpScale <= 16); - Instruction->CodeBranch.AddressOffset = (U8)tmpScale; - assert(X86Instruction->Scale > 1); - for (i = 0; i < MAX_CODE_REFERENCE_COUNT; i++) Instruction->CodeBranch.Addresses[i] = (U64)X86Instruction->Displacement + (i * tmpScale); - Instruction->CodeBranch.Count = i; - Instruction->CodeBranch.IsIndirect = TRUE; - Instruction->CodeBranch.Operand = Operand1; - } - break; - - case ITYPE_BRANCHCC: - assert(Instruction->OperandCount == 1); - assert(Operand1->Flags & OP_ADDRESS); - assert(Operand1->Type == OPTYPE_OFFSET); - if (!(Operand1->Flags & (OP_GLOBAL|OP_FAR))) - { - assert(!X86Instruction->HasSelector); - X86Instruction->Segment = SEG_CS; - } - - if (Operand1->TargetAddress) - { - assert(!Instruction->CodeBranch.AddressOffset); - Instruction->CodeBranch.Count = 2; - Instruction->CodeBranch.Addresses[0] = Operand1->TargetAddress; - Instruction->CodeBranch.Addresses[1] = (U64)Instruction->Address + Instruction->Length; - Instruction->CodeBranch.Operand = Operand1; - } - break; - - case ITYPE_LOOPCC: - Instruction->CodeBranch.IsLoop = TRUE; - assert(Instruction->OperandCount == 1); - assert(Operand1->Flags & OP_ADDRESS); - assert(Operand1->Type == OPTYPE_OFFSET); - assert(!(Operand1->Flags & (OP_GLOBAL|OP_FAR))); - if (Operand1->TargetAddress) - { - assert(!Instruction->CodeBranch.AddressOffset); - Instruction->CodeBranch.Count = 2; - Instruction->CodeBranch.Addresses[0] = Operand1->TargetAddress; - Instruction->CodeBranch.Addresses[1] = (U64)Instruction->Address + Instruction->Length; - Instruction->CodeBranch.Operand = Operand1; - } - break; - - case ITYPE_RET: - Instruction->Groups |= ITYPE_STACK; - break; - - default: - break; // do nothing - } - } - else // possible data instruction - { - for (i = 0, Operand = Instruction->Operands; i < Instruction->OperandCount; i++, Operand++) - { - if (Operand->TargetAddress) - { - if (Operand->Flags & OP_DST) - { - assert(!Instruction->DataDst.Count); - Instruction->DataDst.Count = 1; - Instruction->DataDst.Addresses[0] = Operand->TargetAddress; - Instruction->DataDst.DataSize = Operand->Length; - Instruction->DataDst.Operand = Operand; - DISASM_OUTPUT(("[0x%08I64X] Write of size %d to 0x%04I64X\n", VIRTUAL_ADDRESS, Operand->Length, Operand->TargetAddress)); - } - if (Operand->Flags & OP_SRC) - { - assert(!Instruction->DataSrc.Count); - Instruction->DataSrc.Count = 1; - Instruction->DataSrc.Addresses[0] = Operand->TargetAddress; - Instruction->DataSrc.DataSize = Operand->Length; - Instruction->DataSrc.Operand = Operand; - DISASM_OUTPUT(("[0x%08I64X] Read of size %d to 0x%04I64X\n", VIRTUAL_ADDRESS, Operand->Length, Operand->TargetAddress)); - } - } - - // If there is both a base and index register, the Result will probably be too wrong - // to even guess - else if (Operand->Flags & OP_GLOBAL && - ((X86Instruction->HasBaseRegister && !X86Instruction->HasIndexRegister) || - (!X86Instruction->HasBaseRegister && X86Instruction->HasIndexRegister))) - { - DISASM_OUTPUT(("[0x%08I64X] Data reference (scale %d, size %d, displacement 0x%08I64x)\n", VIRTUAL_ADDRESS, X86Instruction->Scale, Operand->Length, X86Instruction->Displacement)); - if (!X86Instruction->Scale) - { - assert(Operand->Length <= 0xFF); - if (Operand->Length) X86Instruction->Scale = (U8)Operand->Length; - else X86Instruction->Scale = X86Instruction->OperandSize; - } - tmpScale = MAX(X86Instruction->Scale, Operand->Length); - - assert(X86Instruction->HasFullDisplacement); - if (Operand->Flags & OP_DST) - { - assert(!Instruction->DataDst.Count); - assert(tmpScale <= 16); - Instruction->CodeBranch.AddressOffset = (U8)tmpScale; - for (i = 0; i < MAX_DATA_REFERENCE_COUNT; i++) Instruction->DataDst.Addresses[i] = (U64)X86Instruction->Displacement + (i * tmpScale); - Instruction->DataDst.Count = i; - Instruction->DataDst.DataSize = Operand->Length; - Instruction->DataDst.Operand = Operand; - } - if (Operand->Flags & OP_SRC) - { - assert(!Instruction->DataSrc.Count); - assert(tmpScale <= 16); - Instruction->CodeBranch.AddressOffset = (U8)tmpScale; - for (i = 0; i < MAX_DATA_REFERENCE_COUNT; i++) Instruction->DataSrc.Addresses[i] = (U64)X86Instruction->Displacement + (i * tmpScale); - Instruction->DataSrc.Count = i; - Instruction->DataSrc.DataSize = Operand->Length; - Instruction->DataSrc.Operand = Operand; - } - } - } - } - - if (Instruction->Groups & ITYPE_STACK) - { - switch (Instruction->Type) - { - case ITYPE_PUSH: - assert(Instruction->OperandCount == 1 && Operand1->Length); - Instruction->StackChange = -Operand1->Length; - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_POP: - assert(Instruction->OperandCount == 1 && Operand1->Length); - Instruction->StackChange = Operand1->Length; - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_PUSHA: - Instruction->StackChange = -(X86Instruction->OperandSize * 8); // xAX, xCX, xDX, xBX, xBP, xSP, xSI, xDI - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_POPA: - Instruction->StackChange = X86Instruction->OperandSize * 8; // xDI, xSI, xSP, xBP, xBX, xDX, xCX, xAX - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_PUSHF: - Instruction->StackChange = -Operand1->Length; - Instruction->NeedsEmulation = TRUE; - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_POPF: - Instruction->StackChange = Operand1->Length; - Instruction->NeedsEmulation = TRUE; - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_ENTER: - if (!Instruction->AnomalyOccurred) - { - if (Instruction->Operands[1].Value_U64 & 3) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: ENTER has invalid operand 2\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - if (Instruction->Operands[2].Value_U64 & ~0x1F) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: ENTER has invalid operand 3\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - } - SANITY_CHECK_ADDRESS_SIZE(); - Instruction->Operands[2].Value_U64 &= 0x1F; - - // frame pointer + stack space - i = Operand1->Length + (U32)Instruction->Operands[1].Value_U64; - Instruction->StackChange = -((LONG)i); - i = (U32)Instruction->Operands[2].Value_U64 * Operand1->Length; - Instruction->StackChange -= i; - break; - - case ITYPE_LEAVE: - // This will do "mov esp, ebp; pop ebp" so the StackChange size is dynamic - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_CALL: - Instruction->StackChange = -X86Instruction->OperandSize; - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_RET: - Instruction->StackChange = X86Instruction->OperandSize; - - switch (Opcode) - { - case 0xC3: // ret with no args - break; - - case 0xC2: // ret with 1 arg - if (!Instruction->AnomalyOccurred && (Operand1->Value_U64 & 3)) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: ret has invalid operand 1\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - Instruction->StackChange += (LONG)Operand1->Value_U64; - break; - - case 0xCB: // far ret with no args - Instruction->StackChange *= 2; // account for segment - Instruction->StackChange += (LONG)Operand1->Value_U64; - break; - - case 0xCA: // far ret with 1 arg - if (!Instruction->AnomalyOccurred && (Operand1->Value_U64 & 3)) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: retf has invalid operand 1\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - Instruction->StackChange *= 2; // account for segment - Instruction->StackChange += (LONG)Operand1->Value_U64; - break; - } - SANITY_CHECK_ADDRESS_SIZE(); - break; - - case ITYPE_ADD: - case ITYPE_XCHGADD: - if (Instruction->Operands[1].Value_S64) Instruction->StackChange = (LONG)(Instruction->Operands[1].Value_S64); - break; - case ITYPE_SUB: - if (Instruction->Operands[1].Value_S64) Instruction->StackChange = (LONG)(-Instruction->Operands[1].Value_S64); - break; - case ITYPE_MOV: - case ITYPE_AND: - break; - - default: - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Instruction \"%s\" is modifying the stack\n", VIRTUAL_ADDRESS, X86Opcode->Mnemonic); - Instruction->AnomalyOccurred = TRUE; - } - break; - } - - if (!Instruction->AnomalyOccurred && - ((X86Instruction->OperandSize != 2 && (Instruction->StackChange & 3)) || (Instruction->StackChange & 1))) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: \"%s\" has invalid stack change 0x%02X\n", VIRTUAL_ADDRESS, X86Opcode->Mnemonic, Instruction->StackChange); - Instruction->AnomalyOccurred = TRUE; - } - } - - if (Instruction->Groups & ITYPE_TRAPS) - { - switch (Instruction->Type) - { - case ITYPE_TRAP: - case ITYPE_TRAPCC: - case ITYPE_TRAPRET: - case ITYPE_BOUNDS: - case ITYPE_DEBUG: - case ITYPE_TRACE: - case ITYPE_INVALID: - case ITYPE_OFLOW: - Instruction->NeedsEmulation = TRUE; - break; - default: - assert(0); - break; - } - } - - if (Instruction->Groups & ITYPE_SYSTEM) - { - switch (Instruction->Type) - { - case ITYPE_CPUID: - case ITYPE_SYSCALL: - case ITYPE_SYSCALLRET: - // This doesn't require privileges - break; - - case ITYPE_HALT: - case ITYPE_IN: - case ITYPE_OUT: - default: - Instruction->NeedsEmulation = TRUE; - break; - } - } - - Disassembler->Stage3CountWithDecode++; - return TRUE; - -abort: - if (!SuppressErrors) - { -#ifdef TEST_DISASM - printf("Dump of 0x%04I64X:\n", VIRTUAL_ADDRESS); - __try { DumpAsBytes(stdout, Instruction->Address, (ULONG_PTR)VIRTUAL_ADDRESS, 16, TRUE); } - __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {} -#endif - fflush(stdout); - } - return FALSE; -} - -// Address = address to first byte after the opcode (e.g., first byte of ModR/M byte or -// immediate value -// -// Returns the address immediately following the operand (e.g., the next operand or the -// start of the next instruction -INTERNAL U8 *SetOperands(INSTRUCTION *Instruction, U8 *Address, U32 Flags) -{ - INSTRUCTION_OPERAND *Operand; - U32 Index, OperandIndex; - S64 Displacement = 0; - U8 Register; - U32 OperandFlags, OperandType, AddressMode, Segment; - U8 Opcode; - MODRM modrm; - REX rex; - REX_MODRM rex_modrm; - X86_OPCODE *X86Opcode; - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - BOOL Decode = Flags & DISASM_DECODE; - BOOL Disassemble = Flags & DISASM_DISASSEMBLE; - BOOL SuppressErrors = Flags & DISASM_SUPPRESSERRORS; - - Opcode = Instruction->LastOpcode; - X86Opcode = &X86Instruction->Opcode; - - // Setup Mod R/M byte - if (X86Instruction->HasModRM) - { - SET_MODRM(X86Instruction->modrm, X86Instruction->modrm_b); - modrm = X86Instruction->modrm; - rex = X86Instruction->rex; - SET_REX_MODRM(X86Instruction->rex_modrm, rex, modrm); - rex_modrm = X86Instruction->rex_modrm; - //DISASM_OUTPUT(("[0x%08I64X] ModRM = 0x%02X (mod=%d, reg=%d, rm=%d)\n", VIRTUAL_ADDRESS, X86Instruction->modrm_b, modrm.mod, rex_modrm.reg, rex_modrm.rm)); - INSTR_INC(1); // increment Instruction->Length and address - } - else - { - // initialize them to 0 - modrm = X86Instruction->modrm; - rex = X86Instruction->rex; - rex_modrm = X86Instruction->rex_modrm; - } - - for (OperandIndex = 0; OperandIndex < Instruction->OperandCount; OperandIndex++) - { - Operand = &Instruction->Operands[OperandIndex]; - assert(!(Operand->Flags & 0x7F)); - - OperandFlags = X86Opcode->OperandFlags[OperandIndex] & X86_OPFLAGS_MASK; - OperandType = X86Opcode->OperandFlags[OperandIndex] & X86_OPTYPE_MASK; - AddressMode = X86Opcode->OperandFlags[OperandIndex] & X86_AMODE_MASK; - if (Decode && OperandIndex != 0) APPENDS(", "); - - switch (OperandType) - { - //////////////////////////////////////////////////////////// - // Special operand types with no associated addressing mode - //////////////////////////////////////////////////////////// - - case OPTYPE_0: - if (!Decode) continue; - Operand->Value_U64 = 0; - Operand->Type = OPTYPE_IMM; - //DISASM_OUTPUT(("[SetOperand] const 0\n")); - if (Disassemble) - { - APPENDS("<0>"); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_1: - if (!Decode) continue; - Operand->Value_U64 = 1; - Operand->Type = OPTYPE_IMM; - //DISASM_OUTPUT(("[SetOperand] const 1\n")); - if (Disassemble) - { - APPENDS("<1>"); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FF: - if (!Decode) continue; - Operand->Value_U64 = 0xFF; - Operand->Type = OPTYPE_IMM; - //DISASM_OUTPUT(("[SetOperand] const 0xff\n")); - if (Disassemble) - { - APPENDS("<0xFF>"); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_TSC: - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] TSC\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_CS_MSR: - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] CS MSR\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_EIP_MSR: - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] EIP MSR\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_ESP_MSR: - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] ESP MSR\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_KERNELBASE_MSR: - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] KernelBase MSR\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_STAR_MSR: - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] KernelBase MSR\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_CSTAR_MSR: - assert(!IS_AMD64()); - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] CSTAR MSR\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_LSTAR_MSR: - assert(IS_AMD64()); - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] LSTAR MSR\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FMASK_MSR: - if (!Decode) continue; - Operand->Length = 8; - Operand->Type = OPTYPE_SPECIAL; - //DISASM_OUTPUT(("[SetOperand] FMASK MSR\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - case OP_REG: - if (!Decode) continue; - // The reg field is included in the opcode - Operand->Length = X86Instruction->OperandSize; - Register = X86_GET_REG64(Opcode); - switch (X86Instruction->OperandSize) - { - case 8: - Operand->Register = AMD64_64BIT_OFFSET + Register; - break; - case 4: - Operand->Register = X86_32BIT_OFFSET + Register; - CHECK_AMD64_REG(); - break; - case 2: - Operand->Register = X86_16BIT_OFFSET + Register; - CHECK_AMD64_REG(); - break; - case 1: - Operand->Register = X86_8BIT_OFFSET + Register; - if (X86Instruction->rex_b) CHECK_AMD64_REG(); - break; - default: - assert(0); - return NULL; - } - X86_SET_REG(Register); - - //DISASM_OUTPUT(("[SetOperand] OP_REG %s\n", X86_Registers[Operand->Register])); - if (Disassemble) - { - APPENDB('<'); APPENDS(X86_Registers[Operand->Register]); APPENDB('>'); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_REG8: - if (!Decode) continue; - // The reg field is included in the opcode - Operand->Length = 1; - Register = X86_GET_REG64(Opcode); - Operand->Register = X86_8BIT_OFFSET + Register; - CHECK_AMD64_REG(); - X86_SET_REG(Register); - - //DISASM_OUTPUT(("[SetOperand] OP_REG %s\n", X86_Registers[Operand->Register])); - if (Disassemble) - { - APPENDB('<'); APPENDS(X86_Registers[Operand->Register]); APPENDB('>'); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_REG_AL: - if (!Decode) continue; - Operand->Length = 1; - Operand->Register = X86_REG_AL; - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] reg AL\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_REG_CL: - if (!Decode) continue; - Operand->Length = 1; - Operand->Register = X86_REG_CL; - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] reg CL\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_REG_AH: - if (!Decode) continue; - Operand->Length = 1; - Operand->Register = X86_REG_AH; - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] reg AH\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_REG_AX: - if (!Decode) continue; - Operand->Length = 2; - Operand->Register = X86_REG_AX; - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] reg AX\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_REG_DX: - if (!Decode) continue; - Operand->Length = 2; - Operand->Register = X86_REG_DX; - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] reg DX\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_REG_ECX: - if (!Decode) continue; - Operand->Length = 4; - Operand->Register = X86_REG_ECX; - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] reg ECX\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_REG_xBP: - if (!Decode) continue; - Operand->Length = X86Instruction->OperandSize; - switch (X86Instruction->OperandSize) - { - case 8: Operand->Register = AMD64_REG_RBP; break; - case 4: Operand->Register = X86_REG_EBP; break; - case 2: Operand->Register = X86_REG_BP; break; - default: assert(0); return NULL; - } - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] xAX_BIG (size = %d)\n", Operand->Length)); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_REG_xAX_BIG: - if (!Decode) continue; - Operand->Length = X86Instruction->OperandSize; - switch (X86Instruction->OperandSize) - { - case 8: Operand->Register = AMD64_REG_RAX; break; - case 4: Operand->Register = X86_REG_EAX; break; - case 2: Operand->Register = X86_REG_AX; break; - default: assert(0); return NULL; - } - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] xAX_BIG (size = %d)\n", Operand->Length)); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_REG_xAX_SMALL: - if (!Decode) continue; - Operand->Length = X86Instruction->OperandSize >> 1; - switch (X86Instruction->OperandSize) - { - case 8: Operand->Register = X86_REG_EAX; break; - case 4: Operand->Register = X86_REG_AX; break; - case 2: Operand->Register = X86_REG_AL; break; - default: assert(0); return NULL; - } - X86_SET_REG(0); - //DISASM_OUTPUT(("[SetOperand] xAX_SMALL (size = %d)\n", Operand->Length)); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_xCX_HI_xBX_LO: - if (!Decode) continue; - Operand->Length = X86Instruction->OperandSize << 1; - if (Disassemble) - { - switch (X86Instruction->OperandSize) - { - case 8: APPENDS(""); break; - case 4: APPENDS(""); break; - case 2: APPENDS(""); break; - default: assert(0); return NULL; - } - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] xCX_BIG:xBX_BIG (size = %d)\n", Operand->Length)); - continue; - case OPTYPE_xDX_HI_xAX_LO: - if (!Decode) continue; - Operand->Length = X86Instruction->OperandSize << 1; - if (Disassemble) - { - switch (X86Instruction->OperandSize) - { - case 8: APPENDS(""); break; - case 4: APPENDS(""); break; - case 2: APPENDS(""); break; - default: assert(0); return NULL; - } - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] xDX_BIG:xAX_BIG (size = %d)\n", Operand->Length)); - continue; - - case OPTYPE_EDX_HI_EAX_LO: - if (!Decode) continue; - Operand->Length = 8; - //DISASM_OUTPUT(("[SetOperand] EDX:EAX\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_EDX_ECX_EBX_EAX: - Operand->Length = 32; - //DISASM_OUTPUT(("[SetOperand] EDX:ECX:EBX:EAX\n")); - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_FLAGS: - if (!Decode) continue; - Operand->Length = 2; - Operand->Flags |= OP_REG; - Operand->Register = X86_REG_FLAGS; - //DISASM_OUTPUT(("[SetOperand] reg FLAGS\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_xFLAGS: - if (!Decode) continue; - Operand->Length = X86Instruction->OperandSize; - Operand->Flags |= OP_REG; - switch (X86Instruction->OperandSize) - { - case 8: Operand->Register = AMD64_REG_RFLAGS; break; - case 4: Operand->Register = X86_REG_EFLAGS; break; - case 2: Operand->Register = X86_REG_FLAGS; break; - default: assert(0); return NULL; - } - //DISASM_OUTPUT(("[SetOperand] reg xFLAGS (size = %d)\n", Operand->Length)); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_CS: - if (!Decode) continue; - if (Instruction->Type != ITYPE_PUSH && Instruction->Type != ITYPE_POP) Operand->Length = 2; - else Operand->Length = X86Instruction->OperandSize; - Operand->Register = X86_SEG_CS; - Operand->Flags |= OP_REG; - //DISASM_OUTPUT(("[SetOperand] seg CS\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_DS: - if (!Decode) continue; - if (Instruction->Type != ITYPE_PUSH && Instruction->Type != ITYPE_POP) Operand->Length = 2; - else Operand->Length = X86Instruction->OperandSize; - Operand->Register = X86_SEG_DS; - Operand->Flags |= OP_REG; - //DISASM_OUTPUT(("[SetOperand] seg DS\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_ES: - if (!Decode) continue; - if (Instruction->Type != ITYPE_PUSH && Instruction->Type != ITYPE_POP) Operand->Length = 2; - else Operand->Length = X86Instruction->OperandSize; - Operand->Register = X86_SEG_ES; - Operand->Flags |= OP_REG; - //DISASM_OUTPUT(("[SetOperand] seg ES\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FS: - if (!Decode) continue; - if (Instruction->Type != ITYPE_PUSH && Instruction->Type != ITYPE_POP) Operand->Length = 2; - else Operand->Length = X86Instruction->OperandSize; - Operand->Register = X86_SEG_FS; - Operand->Flags |= OP_REG; - //DISASM_OUTPUT(("[SetOperand] seg FS\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_GS: - if (!Decode) continue; - if (Instruction->Type != ITYPE_PUSH && Instruction->Type != ITYPE_POP) Operand->Length = 2; - else Operand->Length = X86Instruction->OperandSize; - Operand->Register = X86_SEG_GS; - Operand->Flags |= OP_REG; - //DISASM_OUTPUT(("[SetOperand] seg GS\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_SS: - if (!Decode) continue; - if (Instruction->Type != ITYPE_PUSH && Instruction->Type != ITYPE_POP) Operand->Length = 2; - else Operand->Length = X86Instruction->OperandSize; - Operand->Register = X86_SEG_SS; - Operand->Flags |= OP_REG; - //DISASM_OUTPUT(("[SetOperand] seg SS\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_CR0: - if (!Decode) continue; - Operand->Length = X86Instruction->OperandSize; - Operand->Register = X86_REG_CR0; - Operand->Flags |= OP_REG; - //DISASM_OUTPUT(("[SetOperand] reg CR0\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_STx: - if (!Decode) continue; - Operand->Length = 10; - Operand->Type = OPTYPE_FLOAT; - Operand->Flags |= OP_REG; - Register = X86_GET_REG(X86Instruction->modrm_b); - Operand->Register = X86_FPU_OFFSET + Register; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_STx: reg st(%d)\n", Register)); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_ST0: - if (!Decode) continue; - Operand->Length = 10; - Operand->Type = OPTYPE_FLOAT; - Operand->Flags |= OP_REG; - Operand->Register = X86_REG_ST0; - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_ST1: - if (!Decode) continue; - Operand->Length = 10; - Operand->Type = OPTYPE_FLOAT; - Operand->Flags |= OP_REG; - Operand->Register = X86_REG_ST1; - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "<%s>", X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_FPU_STATUS: - if (!Decode) continue; - Operand->Length = 2; - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_FPU_CONTROL: - if (!Decode) continue; - Operand->Length = 2; - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_FPU_TAG: - if (!Decode) continue; - Operand->Length = 2; - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - case OPTYPE_FLDZ: - if (!Decode) continue; - Operand->Type = OPTYPE_FLOAT; - Operand->Length = 10; - if (Disassemble) - { - APPENDS("<0.0>"); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FLD1: - if (!Decode) continue; - Operand->Type = OPTYPE_FLOAT; - Operand->Length = 10; - if (Disassemble) - { - APPENDS("<1.0>"); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FLDPI: - if (!Decode) continue; - Operand->Type = OPTYPE_FLOAT; - Operand->Length = 10; - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FLDL2T: - if (!Decode) continue; - Operand->Type = OPTYPE_FLOAT; - Operand->Length = 10; - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FLDL2E: - if (!Decode) continue; - Operand->Type = OPTYPE_FLOAT; - Operand->Length = 10; - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FLDLG2: - if (!Decode) continue; - Operand->Type = OPTYPE_FLOAT; - Operand->Length = 10; - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - case OPTYPE_FLDLN2: - if (!Decode) continue; - Operand->Type = OPTYPE_FLOAT; - Operand->Length = 10; - if (Disassemble) - { - APPENDS(""); - X86_WRITE_OPFLAGS(); - } - continue; - - //////////////////////////////////////////////////////////// - // Fixed sizes regardless of operand size - //////////////////////////////////////////////////////////// - - case OPTYPE_b: // byte regardless of operand size - Operand->Length = 1; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_b (size 1, signed %d)\n", ((OperandFlags & OP_SIGNED) != 0))); - break; - - case OPTYPE_w: // word regardless of operand size - Operand->Length = 2; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_w (size 2)\n")); - break; - - case OPTYPE_d: // dword regardless of operand size - Operand->Length = 4; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_d (size 4)\n")); - break; - - case OPTYPE_q: // qword regardless of operand size - Operand->Length = 8; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_q (size 8)\n")); - break; - - case OPTYPE_o: // oword regardless of operand size - Operand->Length = 16; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_o (size 16)\n")); - break; - - case OPTYPE_dt: // 6-byte or 10-byte pseudo descriptor (sgdt, lgdt, sidt, lidt) - if (IS_AMD64()) Operand->Length = 10; - else Operand->Length = 6; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_dt (%d bytes)\n", Operand->Length)); - break; - - case OPTYPE_cpu: - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Undocumented loadall instruction?\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - Operand->Length = 204; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_cpu (size 204)\n")); - break; - - //////////////////////////////////////////////////////////// - // Sizes depending on the operand size - //////////////////////////////////////////////////////////// - - case OPTYPE_z: // word if operand size is 16 bits and dword otherwise - switch (X86Instruction->OperandSize) - { - case 8: case 4: Operand->Length = 4; break; - case 2: Operand->Length = 2; break; - default: assert(0); return NULL; - } - //DISASM_OUTPUT(("[SetOperand] OPTYPE_z (length %d)\n", Operand->Length)); - break; - - case OPTYPE_v: // word, dword, or qword - Operand->Length = X86Instruction->OperandSize; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_v (size %d, signed = %d)\n", Operand->Length, ((OperandFlags & OP_SIGNED) != 0))); - break; - - case OPTYPE_a: // two word or dword operands in memory (used only by bound) - assert(Instruction->OpcodeBytes[0] == X86_BOUND); - switch (X86Instruction->OperandSize) - { - case 8: case 4: Operand->Length = 8; break; - case 2: Operand->Length = 4; break; - default: assert(0); return NULL; - } - //DISASM_OUTPUT(("[SetOperand] OPTYPE_a (size %d)\n", Operand->Length)); - break; - - case OPTYPE_p: // 32-bit or 48-bit pointer depending on operand size - if (!Instruction->AnomalyOccurred && X86Instruction->HasSegmentOverridePrefix) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Segment override used when segment is explicit\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - switch (X86Instruction->OperandSize) - { - case 8: case 4: Operand->Length = 6; break; - case 2: Operand->Length = 4; break; - default: assert(0); return NULL; - } - //DISASM_OUTPUT(("[SetOperand] OPTYPE_p (length %d)\n", Operand->Length)); - break; - - case OPTYPE_dq: // dword or qword - //DISASM_OUTPUT(("[SetOperand] OPTYPE_dq (size 4 or 8)\n")); - switch (X86Instruction->OperandSize) - { - case 8: Operand->Length = 8; break; - case 4: case 2: Operand->Length = 4; break; - default: assert(0); return NULL; - } - break; - - case OPTYPE_mw: // a word if the destination operand is memory - //DISASM_OUTPUT(("[SetOperand] OPTYPE_mw (size 0)\n")); - assert(X86Instruction->HasModRM); - if (modrm.mod == 3) Operand->Length = X86Instruction->OperandSize; // using register - else Operand->Length = 2; // using memory - break; - - case OPTYPE_lea: - //DISASM_OUTPUT(("[SetOperand] OPTYPE_lea (size 0)\n")); - assert(OperandIndex == 1); - Operand->Length = Instruction->Operands[0].Length; - break; - - //////////////////////////////////////////////////////////// - // FPU types - //////////////////////////////////////////////////////////// - - case OPTYPE_ps: // packed single real - Operand->Length = 4; - Operand->Type = OPTYPE_FLOAT; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_ps (packed single real)\n")); - break; - case OPTYPE_pd: // packed double real - Operand->Length = 8; - Operand->Type = OPTYPE_FLOAT; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_pd (packed double real)\n")); - break; - case OPTYPE_pb: // packed BCD - Operand->Length = 10; - Operand->Type = OPTYPE_BCD; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_pb (packed BCD)\n")); - break; - case OPTYPE_ss: // scalar single real - Operand->Length = 4; - Operand->Type = OPTYPE_FLOAT; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_ss (single real)\n")); - break; - case OPTYPE_sd: // scalar double real - Operand->Length = 8; - Operand->Type = OPTYPE_FLOAT; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_sd (double real)\n")); - break; - case OPTYPE_se: // extended real - Operand->Length = 10; - Operand->Type = OPTYPE_FLOAT; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_se (extended real)\n")); - break; - - case OPTYPE_fev: // FPU environment (28 bytes in 32-bit modes, 14 bytes in 16-bit real mode) - switch (X86Instruction->OperandSize) - { - case 8: case 4: Operand->Length = 28; break; - case 2: Operand->Length = 14; break; - default: assert(0); return NULL; - } - //DISASM_OUTPUT(("[SetOperand] OPTYPE_fev (FPU environment, length %d)\n", Operand->Length)); - break; - - case OPTYPE_fst1: // FPU state (108 bytes in 32-bit modes, 94 bytes in 16-bit real mode) - switch (X86Instruction->OperandSize) - { - case 8: case 4: Operand->Length = 108; break; - case 2: Operand->Length = 94; break; - default: assert(0); return NULL; - } - //DISASM_OUTPUT(("[SetOperand] OPTYPE_fst1 (FPU state, length %d)\n", Operand->Length)); - break; - - case OPTYPE_fst2: // 512 bytes for FPU state (FPU + MMX + XXM + MXCSR) - Operand->Length = 512; - //DISASM_OUTPUT(("[SetOperand] OPTYPE_fst2 (FPU + MMX + XXM + MXCSR state, length 512)\n")); - break; - - case OPTYPE_sso: - if (modrm.mod == 3) // from register - { - Operand->Length = 16; - } - else // from memory - { - Operand->Length = 4; - Operand->Type = OPTYPE_FLOAT; - } - //DISASM_OUTPUT(("[SetOperand] OPTYPE_sso (single real or oword)\n")); - break; - - case OPTYPE_sdo: - if (modrm.mod == 3) // from register - { - Operand->Length = 16; - } - else // from memory - { - Operand->Length = 8; - Operand->Type = OPTYPE_FLOAT; - } - //DISASM_OUTPUT(("[SetOperand] OPTYPE_sso (double real or oword)\n")); - break; - - default: - assert(0); - return NULL; - } - - switch (AddressMode) - { - //////////////////////////////////////////////////////////// - // Special types - //////////////////////////////////////////////////////////// - - case AMODE_xlat: // DS:[EBX+AL] - if (!Decode) continue; - assert(Operand->Length == 1); - Operand->Flags |= OP_ADDRESS | OP_REG; - Operand->Type = OPTYPE_STRING; - - switch (X86Instruction->AddressSize) - { - case 8: Operand->Register = AMD64_REG_RBX; break; - case 4: Operand->Register = X86_REG_EBX; break; - case 2: Operand->Register = X86_REG_BX; break; - default: assert(0); return NULL; - } - X86_SET_ADDR(); - X86Instruction->Scale = 1; - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - X86Instruction->IndexRegister = X86_REG_AL; - X86Instruction->HasIndexRegister = TRUE; - - //DISASM_OUTPUT(("[SetOperand] AMODE_xlat (DS:[EBX+AL])\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "%s:[%s]", - Segments[X86Instruction->Segment], X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - //////////////////////////////////////////////////////////// - // Without mod R/M byte - //////////////////////////////////////////////////////////// - - case AMODE_I: // immediate value - if (Decode) - { - Operand->Type = OPTYPE_IMM; - switch (Operand->Length) - { - case 8: - if (OperandFlags & OP_SIGNED) Operand->Value_S64 = (S64)*((S64 *)Address); - else Operand->Value_U64 = (U64)*((U64 *)Address); - break; - case 4: - if (!(OperandFlags & OP_SIGNED) && OperandIndex == 1 && - (Instruction->Operands[0].Flags & (OP_REG|OP_ADDRESS)) && - Instruction->Operands[0].Length == 8) - { - // For some opcodes the second operand is a sign-extended imm32 value - assert(X86Instruction->OperandSize == 8); - switch (Instruction->Type) - { - case ITYPE_AND: - case ITYPE_ADD: - case ITYPE_XCHGADD: - case ITYPE_CMP: - case ITYPE_MOV: - case ITYPE_SUB: - case ITYPE_TEST: - case ITYPE_OR: - case ITYPE_XOR: - assert(OperandIndex == 1); - Operand->Value_S64 = (S64)*((S32 *)Address); - break; - default: - assert(0); - if (OperandFlags & OP_SIGNED) Operand->Value_S64 = (S64)*((S32 *)Address); - else Operand->Value_U64 = (U64)*((U32 *)Address); - break; - } - } - else - { - if (OperandFlags & OP_SIGNED) Operand->Value_S64 = (S64)*((S32 *)Address); - else Operand->Value_U64 = (U64)*((U32 *)Address); - } - break; - case 2: - if (OperandFlags & OP_SIGNED) Operand->Value_S64 = (S64)*((S16 *)Address); - else Operand->Value_U64 = (U64)*((U16 *)Address); - break; - case 1: - if (OperandFlags & OP_SIGNED) Operand->Value_S64 = (S64)*((S8 *)Address); - else Operand->Value_U64 = (U64)*((U8 *)Address); - break; - default: - assert(0); - return NULL; - } - } - INSTR_INC(Operand->Length); // increment Instruction->Length and address - assert(X86Instruction->OperandSize >= Operand->Length); - if (Instruction->Type == ITYPE_PUSH) Operand->Length = X86Instruction->OperandSize; - - //DISASM_OUTPUT(("[SetOperand] AMODE_I (immediate data)\n")); - if (Disassemble) - { - X86_WRITE_IMMEDIATE(); - X86_WRITE_OPFLAGS(); - } - continue; - - case AMODE_J: // IP-relative jump offset - SANITY_CHECK_ADDRESS_SIZE(); - if (Decode) - { - Operand->Flags |= OP_IPREL | OP_SIGNED | OP_REG | OP_ADDRESS; - Operand->Type = OPTYPE_OFFSET; - switch (X86Instruction->OperandSize) - { - case 8: Operand->Register = AMD64_REG_RIP; break; - case 4: Operand->Register = X86_REG_EIP; break; - case 2: Operand->Register = X86_REG_IP; break; - default: assert(0); return NULL; - } - switch (Operand->Length) - { - case 8: X86Instruction->Displacement = *((S64 *)Address); break; - case 4: X86Instruction->Displacement = (S64)*((S32 *)Address); break; - case 2: X86Instruction->Displacement = (S64)*((S16 *)Address); break; - case 1: X86Instruction->Displacement = (S64)*((S8 *)Address); break; - default: assert(0); return NULL; - } - - Operand->Value_S64 = X86Instruction->Displacement; - X86Instruction->Relative = TRUE; - - if ((Operand->Flags & OP_COND) && !X86Instruction->Displacement) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: Both conditions of branch go to same address\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - } - - INSTR_INC(Operand->Length); // increment Instruction->Length and address - if (!Decode) continue; - - assert((Operand->Flags & OP_EXEC) && (Instruction->Groups & ITYPE_EXEC)); - Operand->TargetAddress = ApplyDisplacement((U64)Address, Instruction); - X86Instruction->Relative = TRUE; - X86_SET_ADDR(); - SANITY_CHECK_SEGMENT_OVERRIDE(); - X86Instruction->HasSegmentOverridePrefix = FALSE; - X86Instruction->Segment = SEG_CS; - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - assert(Instruction->OperandCount == 1); - //DISASM_OUTPUT(("[SetOperand] AMODE_J (branch with relative offset)\n")); - if (Disassemble) - { - X86_WRITE_IP_OFFSET(Operand); - X86_WRITE_OPFLAGS(); - } - continue; - - case AMODE_O: // word/dword offset - Operand->Type = OPTYPE_OFFSET; - Operand->Flags |= OP_ADDRESS; - SANITY_CHECK_OPERAND_SIZE(); - switch (X86Instruction->AddressSize) - { - case 8: - if (Operand->Flags & OP_SIGNED) X86Instruction->Displacement = *((S64 *)Address); - else X86Instruction->Displacement = (S64)*((U64 *)Address); - break; - case 4: - if (Operand->Flags & OP_SIGNED) X86Instruction->Displacement = (S64)*((S32 *)Address); - else X86Instruction->Displacement = (S64)*((U32 *)Address); - break; - case 2: - if (Operand->Flags & OP_SIGNED) X86Instruction->Displacement = (S64)*((S16 *)Address); - else X86Instruction->Displacement = (S64)*((U16 *)Address); - break; - default: - assert(0); - return FALSE; - } - - INSTR_INC(X86Instruction->AddressSize); // increment Instruction->Length and address - if (!Decode) continue; - - X86Instruction->HasFullDisplacement = TRUE; - X86_SET_ADDR(); - X86_SET_TARGET(); - assert(X86Instruction->Segment == SEG_DS || X86Instruction->HasSegmentOverridePrefix); - //DISASM_OUTPUT(("[SetOperand] AMODE_O (offset)\n")); - if (Disassemble) - { - X86_WRITE_OFFSET(Operand); - X86_WRITE_OPFLAGS(); - } - continue; - - case AMODE_A: // absolute address - Operand->Flags |= OP_ADDRESS | OP_FAR; - SANITY_CHECK_ADDRESS_SIZE(); - SANITY_CHECK_SEGMENT_OVERRIDE(); - X86Instruction->HasSelector = TRUE; - X86Instruction->HasSegmentOverridePrefix = FALSE; - switch (Operand->Length) - { - case 6: - X86Instruction->Segment = *((U16 *)Address); INSTR_INC(2); - X86Instruction->Displacement = (S64)*((S32 *)Address); INSTR_INC(4); - break; - case 4: - X86Instruction->Segment = *((U16 *)Address); INSTR_INC(2); - X86Instruction->Displacement = (S64)*((S16 *)Address); INSTR_INC(2); - break; - default: - assert(0); - return FALSE; - } - if (!Decode) continue; - X86Instruction->HasFullDisplacement = TRUE; - X86_SET_ADDR(); - X86_SET_TARGET(); - //DISASM_OUTPUT(("[SetOperand] AMODE_A (absolute address)\n")); - if (Disassemble) - { - X86_WRITE_OFFSET(Operand); - X86_WRITE_OPFLAGS(); - } - continue; - - case AMODE_X: // DS:[ESI] - if (!Decode) continue; - Operand->Flags |= OP_ADDRESS | OP_REG; - Operand->Type = OPTYPE_STRING; - switch (X86Instruction->AddressSize) - { - case 8: Operand->Register = AMD64_REG_RSI; break; - case 4: Operand->Register = X86_REG_ESI; break; - case 2: Operand->Register = X86_REG_SI; break; - default: assert(0); return NULL; - } - - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - X86_SET_ADDR(); - if (!X86Instruction->HasSegmentOverridePrefix) X86Instruction->Segment = SEG_DS; - - //DISASM_OUTPUT(("[SetOperand] AMODE_X (addressing via DS:[ESI])\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "%s:[%s]", - Segments[X86Instruction->Segment], X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - case AMODE_Y: // ES:[EDI] - if (!Decode) continue; - Operand->Flags |= OP_ADDRESS | OP_REG; - Operand->Type = OPTYPE_STRING; - switch (X86Instruction->AddressSize) - { - case 8: Operand->Register = AMD64_REG_RDI; break; - case 4: Operand->Register = X86_REG_EDI; break; - case 2: Operand->Register = X86_REG_DI; break; - default: assert(0); return NULL; - } - - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - X86_SET_ADDR(); - if (X86Instruction->HasSegmentOverridePrefix) - { - if (!Instruction->AnomalyOccurred) - { - if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: segment override used with AMODE_Y\n", VIRTUAL_ADDRESS); - Instruction->AnomalyOccurred = TRUE; - } - Segment = X86Instruction->DstSegment = SEG_ES; - X86Instruction->HasDstSegment = TRUE; - } - else - { - Segment = X86Instruction->Segment = SEG_ES; - } - - //DISASM_OUTPUT(("[SetOperand] AMODE_Y (addressing via ES:[EDI])\n")); - if (Disassemble) - { - APPEND(OPCSTR, SIZE_LEFT, "%s:[%s]", - Segments[Segment], X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - continue; - - //////////////////////////////////////////////////////////// - // Mod R/M byte with only registers - // Handle that case here since it is straightforward - //////////////////////////////////////////////////////////// - - case AMODE_PR: // modrm.rm = mmx register and modrm.mod = 11 - assert(X86Instruction->HasModRM); - if (modrm.mod != 3) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: mod != 3 for AMODE_PR (\"%s\")\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic); - goto abort; - } - else if (rex_modrm.rm > 7) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: invalid mmx register %d for AMODE_PR (\"%s\")\n", VIRTUAL_ADDRESS, rex_modrm.rm, X86Instruction->Opcode.Mnemonic); - goto abort; - } - else if (X86Instruction->OperandSize == 2) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: AMODE_PR illegal in 16-bit mode (\"%s\")\n", VIRTUAL_ADDRESS, rex_modrm.rm, X86Instruction->Opcode.Mnemonic); - goto abort; - } - if (!Decode) continue; - - Operand->Flags |= OP_REG; - Operand->Register = X86_MMX_OFFSET + rex_modrm.rm; - X86_SET_REG(0); - - if (Disassemble) - { - assert(X86_Registers[Operand->Register]); - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_PR (MMX register)\n")); - continue; - - case AMODE_VR: // modrm.rm = xmm register and modrm.mod = 11 - assert(X86Instruction->HasModRM); - if (modrm.mod != 3) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: mod != 3 for AMODE_VR (\"%s\")\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic); - goto abort; - } - else if (X86Instruction->OperandSize == 2) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: AMODE_VR illegal in 16-bit mode (\"%s\")\n", VIRTUAL_ADDRESS, rex_modrm.rm, X86Instruction->Opcode.Mnemonic); - goto abort; - } - if (!Decode) continue; - - Operand->Flags |= OP_REG; - Operand->Register = X86_XMM_OFFSET + rex_modrm.rm; - X86_SET_REG(0); - - if (Disassemble) - { - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_VR (XMM register)\n")); - continue; - - case AMODE_P: // modrm.reg = mmx register - assert(X86Instruction->HasModRM); - if (rex_modrm.reg > 7) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: invalid mmx register %d for AMODE_P (\"%s\")\n", VIRTUAL_ADDRESS, rex_modrm.reg, X86Instruction->Opcode.Mnemonic); - goto abort; - } - else if (X86Instruction->OperandSize == 2) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: AMODE_P illegal in 16-bit mode (\"%s\")\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic); - goto abort; - } - if (!Decode) continue; - - Operand->Flags |= OP_REG; - Operand->Register = X86_MMX_OFFSET + rex_modrm.reg; - X86_SET_REG(0); - - if (Disassemble) - { - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_P (MMX register)\n")); - continue; - - case AMODE_V: // modrm.reg = xmm register - assert(X86Instruction->HasModRM); - if (X86Instruction->OperandSize == 2) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: AMODE_P illegal in 16-bit mode (\"%s\")\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic); - goto abort; - } - if (!Decode) continue; - - Operand->Flags |= OP_REG; - Operand->Register = X86_XMM_OFFSET + rex_modrm.reg; break; - X86_SET_REG(0); - - if (Disassemble) - { - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_V (XMM register)\n")); - continue; - - case AMODE_R: // modrm.rm is general register and modrm.mod = 11 - assert(X86Instruction->HasModRM); - if (modrm.mod != 3) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: mod != 3 for AMODE_R (\"%s\")\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic); - goto abort; - } - if (!Decode) continue; - Operand->Flags |= OP_REG; - switch (Operand->Length) - { - case 8: Operand->Register = AMD64_64BIT_OFFSET + rex_modrm.rm; break; - case 4: Operand->Register = X86_32BIT_OFFSET, rex_modrm.rm; CHECK_AMD64_REG(); break; - case 2: Operand->Register = X86_16BIT_OFFSET, rex_modrm.rm; CHECK_AMD64_REG(); break; - case 1: Operand->Register = X86_8BIT_OFFSET, rex_modrm.rm; if (X86Instruction->rex_b) CHECK_AMD64_REG(); break; - default: assert(0); return NULL; - } - X86_SET_REG(rex_modrm.rm); - if (Disassemble) - { - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_R (general register)\n")); - continue; - - case AMODE_G: // modrm.reg = general register - assert(X86Instruction->HasModRM); - if (!Decode) continue; - Operand->Flags |= OP_REG; - switch (Operand->Length) - { - case 8: Operand->Register = AMD64_64BIT_OFFSET + rex_modrm.reg; break; - case 4: Operand->Register = X86_32BIT_OFFSET + rex_modrm.reg; CHECK_AMD64_REG(); break; - case 2: Operand->Register = X86_16BIT_OFFSET + rex_modrm.reg; CHECK_AMD64_REG(); break; - case 1: Operand->Register = X86_8BIT_OFFSET + rex_modrm.reg; if (X86Instruction->rex_b) CHECK_AMD64_REG(); break; - default: assert(0); return NULL; - } - X86_SET_REG(rex_modrm.reg); - if (Disassemble) - { - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_G (general register)\n")); - continue; - - case AMODE_S: // modrm.reg = segment register - assert(X86Instruction->HasModRM); - if (!Decode) continue; - Operand->Flags |= OP_REG; - switch (X86Instruction->OperandSize) - { - case 8: - case 4: - case 2: - if (rex_modrm.reg <= 5) Operand->Register = X86_SEGMENT_OFFSET + rex_modrm.reg; - break; - default: - assert(0); - return NULL; - } - - X86_SET_REG(0); - if (Disassemble) - { - if (rex_modrm.reg > 5) APPEND(OPCSTR, SIZE_LEFT, "seg_%02X", rex_modrm.reg); - else APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_S (segment register)\n")); - continue; - - case AMODE_T: // modrm.reg = test register - assert(X86Instruction->HasModRM); - if (!Decode) continue; - Instruction->Groups |= ITYPE_SYSTEM; - Instruction->NeedsEmulation = TRUE; - Operand->Flags |= OP_REG; - switch (X86Instruction->OperandSize) - { - case 8: - case 4: - case 2: - Operand->Register = X86_TEST_OFFSET + rex_modrm.reg; - break; - default: - assert(0); - return NULL; - } - - X86_SET_REG(0); - if (Disassemble) - { - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_T (test register)\n")); - continue; - - case AMODE_C: // modrm.reg = control register - assert(X86Instruction->HasModRM); - assert(Instruction->Type == ITYPE_MOV); - if (!Decode) continue; - Instruction->Groups |= ITYPE_SYSTEM; - Instruction->NeedsEmulation = TRUE; - Operand->Flags |= OP_REG; - if (IS_AMD64()) X86Instruction->OperandSize = 8; - switch (X86Instruction->OperandSize) - { - case 8: - case 4: - case 2: - Operand->Register = X86_CONTROL_OFFSET + rex_modrm.reg; - break; - default: - assert(0); - return NULL; - } - - X86_SET_REG(0); - if (Disassemble) - { - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_C (control register)\n")); - continue; - - case AMODE_D: // modrm.reg = debug register - assert(X86Instruction->HasModRM); - assert(Instruction->Type == ITYPE_MOV); - if (!Decode) continue; - Instruction->NeedsEmulation = TRUE; - Operand->Flags |= OP_REG; - Instruction->Groups |= ITYPE_SYSTEM; - Instruction->NeedsEmulation = TRUE; - if (IS_AMD64()) X86Instruction->OperandSize = 8; - switch (X86Instruction->OperandSize) - { - case 8: - case 4: - case 2: - Operand->Register = X86_DEBUG_OFFSET + rex_modrm.reg; - break; - default: - assert(0); - return NULL; - } - - X86_SET_REG(0); - if (Disassemble) - { - APPENDS(X86_Registers[Operand->Register]); - X86_WRITE_OPFLAGS(); - } - //DISASM_OUTPUT(("[SetOperand] AMODE_D (debug register)\n")); - continue; - - //////////////////////////////////////////////////////////// - // Mod R/M byte with memory or register - //////////////////////////////////////////////////////////// - - case AMODE_M: // memory only - assert(X86Instruction->HasModRM); - if (modrm.mod == 3) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: mod = 3 for AMODE_M (\"%s\")\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic); - goto abort; - } - assert(X86Instruction->Segment == SEG_DS || X86Instruction->HasSegmentOverridePrefix); - //DISASM_OUTPUT(("[SetOperand] AMODE_M (memory only)\n")); - Address = SetModRM32(Instruction, Address, Operand, OperandIndex, SuppressErrors); - if (!Address) return NULL; - break; - - case AMODE_E: // general register or memory - assert(X86Instruction->HasModRM); - if (OperandType == OPTYPE_p && modrm.mod == 3) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: mod = 3 for AMODE_E with OPTYPE_p (\"%s\")\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic); - goto abort; - } - - //DISASM_OUTPUT(("[SetOperand] AMODE_E (general register or memory)\n")); - Address = SetModRM32(Instruction, Address, Operand, OperandIndex, SuppressErrors); - if (!Address) return NULL; - if (Decode && (Instruction->Type == ITYPE_PUSH || Instruction->Type == ITYPE_POP)) - { - assert(X86Instruction->OperandSize >= Operand->Length); - Operand->Length = X86Instruction->OperandSize; - } - break; - - case AMODE_Q: // mmx register or memory address - assert(X86Instruction->HasModRM); - //DISASM_OUTPUT(("[SetOperand] AMODE_Q (MMX register or memory address)\n")); - if (modrm.mod == 3) // it is a register - { - if (rex_modrm.rm > 7) - { - if (!SuppressErrors) printf("[0x%08I64X] ERROR: invalid mmx register %d for AMODE_P (\"%s\")\n", VIRTUAL_ADDRESS, rex_modrm.rm, X86Instruction->Opcode.Mnemonic); - goto abort; - } - Operand->Register = X86_MMX_OFFSET + rex_modrm.rm; - Operand->Flags |= OP_REG; - X86_SET_REG(0); - } - else - { - Address = SetModRM32(Instruction, Address, Operand, OperandIndex, SuppressErrors); - if (!Address) return NULL; - } - break; - - case AMODE_W: // xmm register or memory address - assert(X86Instruction->HasModRM); - //DISASM_OUTPUT(("[SetOperand] AMODE_W (XMM register or memory address)\n")); - if (modrm.mod == 3) // it is a register - { - Operand->Register = X86_XMM_OFFSET + rex_modrm.rm; - Operand->Flags |= OP_REG; - X86_SET_REG(0); - } - else - { - Address = SetModRM32(Instruction, Address, Operand, OperandIndex, SuppressErrors); - if (!Address) return NULL; - } - break; - - default: - assert(0); - return NULL; - } - - if (!Decode) continue; - - // If this is reached then SetModRM32 was called - if ((Operand->Flags & OP_ADDRESS)) - { - assert(Operand->Length); - switch (Operand->Register) - { - case X86_REG_BP: - case X86_REG_EBP: - case AMD64_REG_RBP: - if (X86Instruction->Displacement > 0) Operand->Flags |= OP_PARAM; - else Operand->Flags |= OP_LOCAL; - break; - default: - break; - } - } - - if (Disassemble) - { - Index = OperandType >> OPTYPE_SHIFT; - assert(Index > 0 && Index < MAX_OPTYPE_INDEX && OptypeHandlers[Index]); - OptypeHandlers[Index](Instruction, Operand, OperandIndex); - X86_WRITE_OPFLAGS(); - } - } - - return Address; - -abort: - if (!SuppressErrors) - { -#ifdef TEST_DISASM - printf("Dump of 0x%04I64X:\n", VIRTUAL_ADDRESS); - __try { DumpAsBytes(stdout, Instruction->Address, (ULONG_PTR)VIRTUAL_ADDRESS, 16, TRUE); } - __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {} -#endif - fflush(stdout); - } - return NULL; -} - -// NOTE: Address points one byte after ModRM -INTERNAL U8 *SetModRM16(INSTRUCTION *Instruction, U8 *Address, INSTRUCTION_OPERAND *Operand, U32 OperandIndex, BOOL SuppressErrors) -{ - MODRM modrm; - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - - DISASM_OUTPUT(("[SetModRM16] Current instruction length = %d\n", Instruction->Length)); - modrm = X86Instruction->modrm; - assert(!X86Instruction->rex_b); - - // - // Both operands are registers - // Condition: mod = 3 - // - if (modrm.mod == 3) - { - //DISASM_OUTPUT(("[SetModRM16] Both regs (rm_reg %d)\n", modrm.rm)); - switch (Operand->Length) - { - case 4: Operand->Register = X86_32BIT_OFFSET + modrm.rm; break; - case 2: Operand->Register = X86_16BIT_OFFSET + modrm.rm; break; - case 1: Operand->Register = X86_8BIT_OFFSET + modrm.rm; break; - default: assert(0); return NULL; - } - Operand->Flags |= OP_REG; - } - - // - // Address is an absolute address (technically a 16-bit offset from DS:0) - // Condition: mod = 0 and rm = 6 - // - else if (modrm.mod == 0 && modrm.rm == 6) - { - //DISASM_OUTPUT(("[SetModRM16] Absolute addressing (displacement 0x%04X)\n", *(S16 *)Address)); - X86Instruction->Displacement = (S64)(*((S16 *)Address)); - if (IS_VALID_ADDRESS(X86Instruction->Displacement)) - { - X86Instruction->HasFullDisplacement = TRUE; - X86_SET_TARGET(); - Operand->Flags |= OP_GLOBAL; - } - X86_SET_ADDR(); - Operand->Flags |= OP_ADDRESS; - INSTR_INC(2); - } - - // Conditions: - // (1) mod = 0 and rm != 6 - // (2) mod = 1-2 and rm = 0-7 - else - { - switch (modrm.mod) - { - case 0: // no displacement - //DISASM_OUTPUT(("[SetModRM16] Indirect addressing (no displacement)\n")); - break; - case 1: // 8-bit signed displacement - //DISASM_OUTPUT(("[SetModRM16] Indirect addressing (displacement = 0x%02X, reg_rm = %d)\n", *(S8 *)Address, modrm.rm)); - X86Instruction->Displacement = (S64)(*((S8 *)Address)); - INSTR_INC(1); // increment Instruction->Length and address - break; - case 2: // 16-bit displacement - //DISASM_OUTPUT(("[SetModRM16] Indirect addressing (displacement = 0x%04X, reg_rm = %d)\n", *(S16 *)Address, modrm.rm)); - X86Instruction->Displacement = (S64)(*((S16 *)Address)); - if (IS_VALID_ADDRESS(X86Instruction->Displacement)) - { - Operand->Flags |= OP_GLOBAL; - X86Instruction->HasFullDisplacement = TRUE; - } - INSTR_INC(2); - break; - } - - switch (modrm.rm) - { - case 0: - //DISASM_OUTPUT(("[SetModRM16] Addressing mode [BX+SI]\n")); - X86Instruction->BaseRegister = X86_REG_BX; - X86Instruction->IndexRegister = X86_REG_SI; - X86Instruction->HasIndexRegister = TRUE; - break; - case 1: - //DISASM_OUTPUT(("[SetModRM16] Addressing mode [BX+DI]\n")); - X86Instruction->BaseRegister = X86_REG_BX; - X86Instruction->IndexRegister = X86_REG_DI; - X86Instruction->HasIndexRegister = TRUE; - break; - case 2: - //DISASM_OUTPUT(("[SetModRM16] Addressing mode [BP+SI]\n")); - X86Instruction->BaseRegister = X86_REG_BP; - X86Instruction->IndexRegister = X86_REG_SI; - X86Instruction->HasIndexRegister = TRUE; - X86_SET_SEG(REG_BP); - break; - case 3: - //DISASM_OUTPUT(("[SetModRM16] Addressing mode [BP+DI]\n")); - X86Instruction->BaseRegister = X86_REG_BP; - X86Instruction->IndexRegister = X86_REG_DI; - X86Instruction->HasIndexRegister = TRUE; - X86_SET_SEG(REG_BP); - break; - case 4: - //DISASM_OUTPUT(("[SetModRM16] Addressing mode [SI]\n")); - X86Instruction->BaseRegister = X86_REG_SI; - break; - case 5: - //DISASM_OUTPUT(("[SetModRM16] Addressing mode [DI]\n")); - X86Instruction->BaseRegister = X86_REG_DI; - break; - case 6: - //DISASM_OUTPUT(("[SetModRM16] Addressing mode [BP]\n")); - X86Instruction->BaseRegister = X86_REG_BP; - break; - case 7: - //DISASM_OUTPUT(("[SetModRM16] Addressing mode [BX]\n")); - X86Instruction->BaseRegister = X86_REG_BX; - break; - } - - X86Instruction->HasBaseRegister = TRUE; - Operand->Flags |= OP_ADDRESS | OP_REG; - X86_SET_ADDR(); - } - - return Address; -} - -// NOTE: Address points one byte after ModRM -INTERNAL U8 *SetModRM32(INSTRUCTION *Instruction, U8 *Address, INSTRUCTION_OPERAND *Operand, U32 OperandIndex, BOOL SuppressErrors) -{ - MODRM modrm; - REX_MODRM rex_modrm; - U32 i, ImmediateSize = 0; - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - - if (X86Instruction->AddressSize == 2) - { - return SetModRM16(Instruction, Address, Operand, OperandIndex, SuppressErrors); - } - - //DISASM_OUTPUT(("[SetModRM32] Length %d, modrm = 0x%02X\n", Instruction->Length, X86Instruction->modrm_b)); - modrm = X86Instruction->modrm; - rex_modrm = X86Instruction->rex_modrm; - - // - // Both operands are registers - // Condition: mod = 3 - // - if (modrm.mod == 3) - { - switch (Operand->Length) - { - case 8: Operand->Register = AMD64_64BIT_OFFSET + rex_modrm.rm; break; - case 4: Operand->Register = X86_32BIT_OFFSET + rex_modrm.rm; CHECK_AMD64_REG(); break; - case 2: Operand->Register = X86_16BIT_OFFSET + rex_modrm.rm; CHECK_AMD64_REG(); break; - case 1: Operand->Register = X86_8BIT_OFFSET + rex_modrm.rm; if (X86Instruction->rex_b) CHECK_AMD64_REG(); break; - default: assert(0); return NULL; - } - X86_SET_REG(rex_modrm.rm); - Operand->Flags |= OP_REG; - } - - // - // Address is an absolute address (technically a 32-bit offset from DS:0) - // mod = 0 and rm = 5 - // - else if (modrm.mod == 0 && modrm.rm == 5) - { - //DISASM_OUTPUT(("[SetModRM32] Absolute addressing (displacement 0x%08lX)\n", *(S32 *)Address)); - Operand->Flags |= OP_ADDRESS; - X86Instruction->Displacement = (S64)*((S32 *)Address); - INSTR_INC(4); // increment Instruction->Length and address - - if (IS_AMD64()) - { - // RIP-relative addressing always replaced Disp32, even when using a 32-bit address space - // (via address size override prefix) - switch (X86Instruction->OperandSize) - { - case 8: Operand->Register = AMD64_REG_RIP; break; - case 4: Operand->Register = X86_REG_EIP; break; - case 2: Operand->Register = X86_REG_IP; break; - default: assert(0); return NULL; - } - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - X86Instruction->Relative = TRUE; - Operand->Flags |= OP_IPREL | OP_SIGNED | OP_REG; - SANITY_CHECK_SEGMENT_OVERRIDE(); - if (!X86Instruction->HasSegmentOverridePrefix) X86Instruction->Segment = SEG_CS; - X86Instruction->HasFullDisplacement = TRUE; - - // Since there may be an immediate value to follow, it is necessary - // to determine the length in order get the proper offset - // - // Maybe there is a better way to do this, since this is wasteful - // (the size of the immediate value will have to be decoded again later - // in SetOperands) - - for (ImmediateSize = 0, i = OperandIndex+1; i < Instruction->OperandCount; i++) - { - if ((X86Instruction->Opcode.OperandFlags[i] & X86_AMODE_MASK) != AMODE_I) continue; - else assert(!ImmediateSize); - switch (X86Instruction->Opcode.OperandFlags[i] & X86_OPTYPE_MASK) - { - case OPTYPE_v: - ImmediateSize = X86Instruction->OperandSize; - break; - case OPTYPE_z: - switch (X86Instruction->OperandSize) - { - case 8: case 4: ImmediateSize = 4; break; - case 2: ImmediateSize = 2; break; - default: assert(0); return NULL; - } - break; - case OPTYPE_b: - ImmediateSize = 1; - break; - case OPTYPE_w: - ImmediateSize = 2; - break; - case OPTYPE_1: - break; - default: - assert(0); - break; - } - } - - Operand->TargetAddress = ApplyDisplacement((U64)Address + ImmediateSize, Instruction); - } - else if (IS_VALID_ADDRESS(X86Instruction->Displacement)) - { - X86_SET_TARGET(); - Operand->Flags |= OP_GLOBAL; - X86Instruction->HasFullDisplacement = TRUE; - } - - X86_SET_ADDR(); - } - - // - // Addressing mode indicated by SIB byte - // Condition: mod = 0-2 and rm = 4 - // - else if (modrm.rm == 4) - { - // The X86_SET_*() is called from within SetSIB() - Address = SetSIB(Instruction, Address, Operand, OperandIndex, SuppressErrors); - if (!Address) - { - assert(0); - return NULL; - } - - if (X86Instruction->sib.base != 5) // if base == 5, the displacement is handled in SetSIB - { - switch (modrm.mod) - { - case 1: // 8-bit displacement - //DISASM_OUTPUT(("[SetModRM32] After SIB: displacement 0x%02X\n", *((S8 *)Address))); - X86Instruction->Displacement = (S64)(*((S8 *)Address)); - INSTR_INC(1); // increment Instruction->Length and address - break; - case 2: // 32-bit displacement - //DISASM_OUTPUT(("[SetModRM32] After SIB: displacement 0x%08lX\n", *((S32 *)Address))); - X86Instruction->Displacement = (S64)*((S32 *)Address); - if (IS_VALID_ADDRESS(X86Instruction->Displacement)) - { - Operand->Flags |= OP_GLOBAL; - X86Instruction->HasFullDisplacement = TRUE; - } - INSTR_INC(4); // increment Instruction->Length and address - break; - } - } - } - - // Indirect addressing - // Conditions: - // (1) mod = 0 and (rm = 0-3 or 6-7) - // (2) mod = 1-2 and rm != 4 - else - { - switch (X86Instruction->AddressSize) - { - case 8: Operand->Register = AMD64_64BIT_OFFSET + rex_modrm.rm; break; - case 4: Operand->Register = X86_32BIT_OFFSET + rex_modrm.rm; CHECK_AMD64_REG(); break; - default: assert(0); return NULL; - } - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - Operand->Flags |= OP_ADDRESS | OP_REG; - X86_SET_SEG(rex_modrm.rm); - X86_SET_ADDR(); - - switch (modrm.mod) - { - case 0: // no displacement - //DISASM_OUTPUT(("[SetModRM32] Indirect addressing (no displacement, reg_rm = %d)\n", rex_modrm.rm)); - break; - case 1: // 8-bit signed displacement - //DISASM_OUTPUT(("[SetModRM32] Indirect addressing (displacement = 0x%02X, reg_rm = %d)\n", *(S8 *)Address, rex_modrm.rm)); - X86Instruction->Displacement = (S64)(*((S8 *)Address)); - INSTR_INC(1); // increment Instruction->Length and address - break; - case 2: // 32-bit displacement - //DISASM_OUTPUT(("[SetModRM32] Indirect addressing (displacement = 0x%08lX, reg_rm = %d)\n", *(S32 *)Address, rex_modrm.rm)); - X86Instruction->Displacement = (S64)*((S32 *)Address); - if (IS_VALID_ADDRESS(X86Instruction->Displacement)) - { - Operand->Flags |= OP_GLOBAL; - X86Instruction->HasFullDisplacement = TRUE; - } - INSTR_INC(4); // increment Instruction->Length and address - break; - } - } - - return Address; -} - -// NOTE: Address points at SIB -INTERNAL U8 *SetSIB(INSTRUCTION *Instruction, U8 *Address, INSTRUCTION_OPERAND *Operand, U32 OperandIndex, BOOL SuppressErrors) -{ - REX rex; - SIB sib; - REX_SIB rex_sib; - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - - X86Instruction->sib_b = *Address; - SET_SIB(X86Instruction->sib, *Address); - sib = X86Instruction->sib; - rex = X86Instruction->rex; - SET_REX_SIB(X86Instruction->rex_sib, rex, sib); - rex_sib = X86Instruction->rex_sib; - - //if (!X86Instruction->rex_b) DISASM_OUTPUT(("[0x%08I64X] SIB = 0x%02X (scale=%d, index=%d, base=%d)\n", VIRTUAL_ADDRESS, *Address, sib.scale, sib.index, sib.base)); \ - //else DISASM_OUTPUT(("[0x%08I64X] SIB = 0x%02X (scale=%d, index=%d, base=%d)\n", VIRTUAL_ADDRESS, *Address, sib.scale, rex_sib.index, rex_sib.base)); \ - //DISASM_OUTPUT(("[SetSIB] Current instruction length = %d\n", Instruction->Length)); - - Operand->Flags |= OP_ADDRESS; - X86_SET_ADDR(); - INSTR_INC(1); // increment Instruction->Length and address - - if (sib.base == 5) - { - switch (X86Instruction->modrm.mod) - { - case 0: - X86Instruction->Displacement = (S64)*((S32 *)Address); - if (IS_VALID_ADDRESS(X86Instruction->Displacement)) - { - X86Instruction->HasFullDisplacement = TRUE; - X86_SET_TARGET(); - Operand->Flags |= OP_GLOBAL; - } - INSTR_INC(4); - break; - case 1: - X86Instruction->Displacement = (S64)(*((S8 *)Address)); - if (rex_sib.base == 5) - { - switch (X86Instruction->AddressSize) - { - case 8: Operand->Register = AMD64_REG_RBP; break; - case 4: Operand->Register = X86_REG_EBP; break; - default: assert(0); return NULL; - } - X86_SET_SEG(REG_EBP); - } - else - { - Operand->Register = AMD64_REG_R13; - } - - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - Operand->Flags |= OP_REG; - INSTR_INC(1); - break; - case 2: - X86Instruction->Displacement = (S64)*((S32 *)Address); - if (rex_sib.base == 5) - { - switch (X86Instruction->AddressSize) - { - case 8: Operand->Register = AMD64_REG_RBP; break; - case 4: Operand->Register = X86_REG_EBP; break; - default: assert(0); return NULL; - } - X86_SET_SEG(REG_EBP); - } - else - { - Operand->Register = AMD64_REG_R13; - } - - if (IS_VALID_ADDRESS(X86Instruction->Displacement)) - { - Operand->Flags |= OP_GLOBAL; - X86Instruction->HasFullDisplacement = TRUE; - } - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - Operand->Flags |= OP_REG; - INSTR_INC(4); - break; - } - } - else - { - switch (X86Instruction->AddressSize) - { - case 8: Operand->Register = AMD64_64BIT_OFFSET + rex_sib.base; break; - case 4: Operand->Register = X86_32BIT_OFFSET + rex_sib.base; CHECK_AMD64_REG(); break; - default: assert(0); return NULL; - } - X86Instruction->BaseRegister = Operand->Register; - X86Instruction->HasBaseRegister = TRUE; - X86_SET_SEG(rex_sib.base); - Operand->Flags |= OP_REG; - } - - if (rex_sib.index != 4) - { - switch (X86Instruction->AddressSize) - { - case 8: - X86Instruction->IndexRegister = AMD64_64BIT_OFFSET + rex_sib.index; - break; - case 4: - X86Instruction->IndexRegister = X86_32BIT_OFFSET + rex_sib.index; - break; - default: - fflush(stdout); - assert(0); - return NULL; - } - - Operand->TargetAddress = 0; - X86Instruction->HasIndexRegister = TRUE; - //DISASM_OUTPUT(("[SetSIB] Index register = %s\n", X86_Registers[X86_32BIT_OFFSET + rex_sib.index])); - - switch (sib.scale) - { - case 0: X86Instruction->Scale = 1; break; - case 1: X86Instruction->Scale = 2; break; - case 2: X86Instruction->Scale = 4; break; - case 3: X86Instruction->Scale = 8; break; - } - //DISASM_OUTPUT(("[SetSIB] Scale = %d\n", X86Instruction->Scale)); - } - - return Address; -} - -INTERNAL U64 ApplyDisplacement(U64 Address, INSTRUCTION *Instruction) -{ - X86_INSTRUCTION *X86Instruction = &Instruction->X86; - -#ifdef SUPPORT_WRAPAROUND - U64 VirtualAddress = Address + Instruction->VirtualAddressDelta; - switch (X86Instruction->OperandSize) - { - case 8: - { - U64 PreAddr = VirtualAddress; - U64 PostAddr = PreAddr + X86Instruction->Displacement; - return Address + (PostAddr - PreAddr); - } - case 4: - { - // We have to do this carefully... - // If EIP = FFFFF000 and Displacement=2000 then the final IP should be 1000 - // due to wraparound - U32 PreAddr = (U32)VirtualAddress; - U32 PostAddr = PreAddr + (S32)X86Instruction->Displacement; - return Address + (PostAddr - PreAddr); - } - case 2: - { - // We have to do this carefully... - // If IP = F000 and Displacement=2000 then the final IP should be 1000 - // due to wraparound - U16 PreAddr = (U16)VirtualAddress; - U16 PostAddr = PreAddr + (S16)X86Instruction->Displacement; - return Address + (PostAddr - PreAddr); - } - default: - assert(0); - return 0; - } -#else - return (Address + X86Instruction->Displacement); -#endif -} - - - -INTERNAL BOOL IsValidLockPrefix(X86_INSTRUCTION *X86Instruction, U8 Opcode, U32 OpcodeLength, U8 Group, U8 OpcodeExtension) -{ - switch (OpcodeLength) - { - case 1: - switch (X86_LockPrefix_1[Opcode]) - { - case 0: // instruction can't be locked - return FALSE; - case 1: // instruction can be locked - break; - case GR: - assert(Group); - if (!X86_LockPrefix_Groups[Group-1][OpcodeExtension]) return FALSE; - break; - default: - assert(0); - return FALSE; - } - break; - - case 2: - case 3: - switch (X86_LockPrefix_2[Opcode]) - { - case 0: // lock prefix is not acceptable - return FALSE; - case 1: // lock prefix allowed - break; - case GR: - assert(Group); - if (!X86_LockPrefix_Groups[Group-1][OpcodeExtension]) return FALSE; - break; - default: - assert(0); - return FALSE; - } - break; - - default: - assert(0); - return FALSE; - } - - if (!X86Instruction->HasModRM || X86Instruction->modrm.mod == 3 || !X86Instruction->HasDstAddressing) - { - DISASM_OUTPUT(("[0x%08I64X] ERROR: Instruction \"%s\" with LOCK prefix has invalid ModRM addressing\n", VIRTUAL_ADDRESS, X86Instruction->Opcode.Mnemonic, X86Instruction->Instruction->Address)); - return FALSE; - } - - return TRUE; -} diff --git a/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86.h b/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86.h deleted file mode 100644 index 7a9f0d75a..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86.h +++ /dev/null @@ -1,839 +0,0 @@ -// Copyright (C) 2004, Matt Conover (mconover@gmail.com) -#ifndef X86_DISASM_H -#define X86_DISASM_H -#ifdef __cplusplus -extern "C" { -#endif - -#pragma warning(disable: 4201) - -// NOTE: the processor may actually accept less than this amount (officially 15) -// #define AMD64_MAX_INSTRUCTION_LEN 15 // theoretical max 25=5+2+1+1+8+8 -#define AMD64_MAX_PREFIX_LENGTH 5 // 4 legacy + 1 rex -#define AMD64_MAX_ADDRESS_LENGTH 18 // modrm + sib + 8 byte displacement + 8 byte immediate value - -// NOTE: the processor may actually accept less than this amount (officially 15) -#define X86_MAX_INSTRUCTION_LEN 15 // theoretical 16=4+2+1+1+4+4 -#define X86_MAX_PREFIX_LENGTH 4 -#define X86_MAX_OPCODE_LENGTH 3 // third byte is either a suffix or prefix -#define X86_MAX_ADDRESS_LENGTH 10 // modrm + sib + 4 byte displacement + 4 byte immediate value -#define X86_MAX_OPERANDS 3 - -#define X86_PREFIX(a) ((a)->MnemonicFlags == ITYPE_EXT_PREFIX) -#define X86_SPECIAL_EXTENSION(a) ((a)->MnemonicFlags & (ITYPE_EXT_MODRM|ITYPE_EXT_FPU|ITYPE_EXT_SUFFIX|ITYPE_EXT_64)) -#define X86_EXTENDED_OPCODE(a) ((a)->Table) -#define X86_INVALID(a) (!(a)->MnemonicFlags && !(a)->Table) -#define X86_OPERAND_COUNT(a) ((a)->OperandFlags[0] ? ((a)->OperandFlags[1] ? ((a)->OperandFlags[2] ? 3 : 2) : 1) : 0) -#define X86_GET_CATEGORY(p) ((p)->MnemonicFlags & ITYPE_GROUP_MASK) -#define X86_GET_TYPE(p) ((p)->MnemonicFlags & ITYPE_TYPE_MASK) - -// Various instructions being specially decoded -#define X86_TWO_BYTE_OPCODE 0x0f -#define PREFIX_SEGMENT_OVERRIDE_ES 0x26 -#define PREFIX_SEGMENT_OVERRIDE_CS 0x2e -#define PREFIX_BRANCH_NOT_TAKEN 0x2e // used only with conditional jumps -#define PREFIX_SEGMENT_OVERRIDE_SS 0x36 -#define PREFIX_SEGMENT_OVERRIDE_DS 0x3e -#define PREFIX_BRANCH_TAKEN 0x3e // used only with conditional jumps -#define PREFIX_SEGMENT_OVERRIDE_FS 0x64 -#define PREFIX_SEGMENT_OVERRIDE_GS 0x65 -#define PREFIX_OPERAND_SIZE 0x66 -#define PREFIX_ADDRESS_SIZE 0x67 -#define PREFIX_LOCK 0xf0 -#define PREFIX_REPNE 0xf2 -#define PREFIX_REP 0xf3 - -////////////////////////////////////////////////////////////////// -// Implicit operand handling -////////////////////////////////////////////////////////////////// - -#define X86_AMODE_MASK 0x00FF0000 // bits 16-23 (AMODE_*) -#define X86_OPFLAGS_MASK 0x0000FF80 // bits 7-15 (OPTYPE_*) -#define X86_OPTYPE_MASK 0xFF0000FF // bits 0-7 (OPTYPE_* below + OP_REG) and 24-31 (OPTYPE_* above) - -#define OPTYPE_0 0x01 -#define OPTYPE_1 0x02 -#define OPTYPE_FF 0x03 -//... -#define OPTYPE_CS 0x10 -#define OPTYPE_DS 0x11 -#define OPTYPE_ES 0x12 -#define OPTYPE_FS 0x13 -#define OPTYPE_GS 0x14 -#define OPTYPE_SS 0x15 -#define OPTYPE_CR0 0x16 -#define OPTYPE_TSC 0x17 // time stamp counter -//... -#define OPTYPE_FLAGS 0x20 -#define OPTYPE_xFLAGS 0x21 // RFLAGS/EFLAGS (depending on operand size) -#define OPTYPE_xCX_HI_xBX_LO 0x22 // represented by 2 registers CX:BX or ECX:EBX (depending on operand size) -#define OPTYPE_xDX_HI_xAX_LO 0x23 // DX:AX or EDX:EAX (depending on operand size) -#define OPTYPE_EDX_HI_EAX_LO 0x24 // DX:AX or EDX:EAX (depending on operand size) -#define OPTYPE_EDX_ECX_EBX_EAX 0x25 // all registers are set -//... -#define OPTYPE_STx 0x30 -#define OPTYPE_ST0 0x31 -#define OPTYPE_ST1 0x32 -#define OPTYPE_FPU_STATUS 0x33 -#define OPTYPE_FPU_CONTROL 0x34 -#define OPTYPE_FPU_TAG 0x35 -#define OPTYPE_FLDZ 0x36 // 0 -#define OPTYPE_FLD1 0x37 // 1 -#define OPTYPE_FLDPI 0x38 // pi -#define OPTYPE_FLDL2T 0x39 // lg 10 -#define OPTYPE_FLDL2E 0x3A // lg e -#define OPTYPE_FLDLG2 0x3B // log_10 2 -#define OPTYPE_FLDLN2 0x3C // log_e 2 -//... -#define OPTYPE_CS_MSR 0x40 -#define OPTYPE_EIP_MSR 0x41 -#define OPTYPE_ESP_MSR 0x42 -#define OPTYPE_KERNELBASE_MSR 0x43 -#define OPTYPE_FMASK_MSR 0x44 -#define OPTYPE_STAR_MSR 0x45 -#define OPTYPE_CSTAR_MSR 0x46 // 32-bit mode -#define OPTYPE_LSTAR_MSR 0x47 // 64-bit mode - - -// NOTE: OPTYPES >= 0x80 reserved for registers (OP_REG+XX) -#define OPTYPE_REG_AL OP_REG+0x01 -#define OPTYPE_REG_CL OP_REG+0x02 -#define OPTYPE_REG_AH OP_REG+0x03 -#define OPTYPE_REG_AX OP_REG+0x04 -#define OPTYPE_REG_DX OP_REG+0x05 -#define OPTYPE_REG_ECX OP_REG+0x06 -#define OPTYPE_REG8 OP_REG+0x07 - -// If address size is 2, use BP -// If address size is 4, use EBP -// If address size is 8, use RBP -#define OPTYPE_REG_xBP OP_REG+0x08 - -// If address size is 2, use BP -// If address size is 4, use EBP -// If address size is 8, use RBP -#define OPTYPE_REG_xSP OP_REG+0x09 - -// If operand size is 2, take 8-bit register -// If operand size is 4, take 16-bit register -// If operand size is 8, take 32-bit register -#define OPTYPE_REG_xAX_SMALL OP_REG+0x0a - -// If operand size is 2, take 16-bit register -// If operand size is 4, take 32-bit register -// If operand size is 8, take 64-bit register -#define OPTYPE_REG_xAX_BIG OP_REG+0x0b - -typedef enum _CPU_TYPE -{ - CPU_UNKNOWN=0, - - /////////////////////////////////////// - // 1st generation - /////////////////////////////////////// - // 1978 - //CPU_8086 = 1MB address limit, 16-bit registers - // 1982 - //CPU_i186 - - /////////////////////////////////////// - // 2nd generation - /////////////////////////////////////// - // 1982 - //CPU_I286 // 16MB limit, 16-bit registers, added protected mode - CPU_I287, // CPU_I286 + math coprocessor - - /////////////////////////////////////// - // 3rd generation - /////////////////////////////////////// - // 1985 - CPU_I386, // 32-bit registers, 4GB memory limit - // 1988 - CPU_I387, // CPU_I386 + math coprocessor - - /////////////////////////////////////// - // 4th generation (1989) - /////////////////////////////////////// - CPU_I486, - - /////////////////////////////////////// - // 5th generation - /////////////////////////////////////// - // 1993 - CPU_PENTIUM, // superscalar architecture - // 1997 - //CPU_PENTIUM_MMX - - /////////////////////////////////////// - // 6th generation (1995) - /////////////////////////////////////// - CPU_PENTIUM_PRO, // P6 architecture, no MMX, out-of-order execution, speculative execution - //CPU_CYRIX_6X86, - //CPU_AMD_K5 // RISC processor - // 1997 - CPU_PENTIUM2, // Pentium Pro architecture + MMX - //CPU_AMD_K6, - //CPU_CYRIX_6X86MX, // Cyrix 6x86 + MMX - // 1998 - CPU_AMD_K6_2, // added 3DNow! (MMX) - // 1999 - // CPU_AMD_K6_3 // added SSE - - /////////////////////////////////////// - // 7th generation - /////////////////////////////////////// - // 1999 - CPU_PENTIUM3, // introduced SSE - // CPU_AMD_K7 // aka Athlon - // 2000 - CPU_PENTIUM4, // introduced SSE2 and hyperthreading - - // 2004? 2005? - CPU_PRESCOTT, // introduced SSE3 - - /////////////////////////////////////// - // 8th generation (X86-64) - // IA32 instruction set with 64-bit extensions, >4GB RAM - /////////////////////////////////////// - - // 2003 - CPU_AMD64, // includes Athlon 64 and Opteron aka X86-64 - - // 2004? - //CPU_EMD64 // Intel's version of AMD64 - CPU_IA64 // aka Itanium: new instruction set -- adds JMPE to IA32 mode to return to IA64 native code - -} CPU_TYPE; - -////////////////////////////////////////////////////////////////// -// Conditions (these can be OR'd) -////////////////////////////////////////////////////////////////// - -// Used for Flags.Preconditions -#define COND_O (1<<0) // overflow (signed) -#define COND_C (1<<1) // below (unsigned) -#define COND_Z (1<<2) // equal (unsigned) -#define COND_S (1<<3) // sign set (signed) -#define COND_P (1<<4) // parity even -#define COND_BE (1<<5) // CF or ZF is set (unsigned) -#define COND_L (1<<6) // (SF && !OF) || (OF && !SF) -#define COND_LE (1<<7) // ZF || (SF && !OF) || (OF && !SF) (signed) -#define COND_NO (1<<8) // !O -#define COND_NC (1<<9) // !C (not below, above or equal to) -#define COND_NZ (1<<10) // !Z (not equal) -#define COND_NS (1<<11) // !S -#define COND_NP (1<<12) // !P (parity odd) -#define COND_NL (1<<13) // (!SF && !OF) || (SF && OF) -#define COND_G (1<<14) // !ZF && ((!SF && !OF) || (SF && OF)) -#define COND_D (1<<15) // DF -#define COND_REG_xCX_BIG_Z (1<<16) // CX/ECX/RCX (depending on address size) == 0 -#define COND_REG_xCX_BIG_NZ (1<<17) // CX/ECX/RCX (depending on address size) != 0 -#define COND_OP1_EQ_OP2 (1<<18) -#define COND_OP1_EQ_OP3 (1<<19) -#define COND_B COND_C -#define COND_NAE COND_C -#define COND_E COND_Z -#define COND_NA COND_BE -#define COND_PE COND_P -#define COND_U COND_P -#define COND_NGE COND_L -#define COND_NG COND_LE -#define COND_PO COND_NP -#define COND_NU COND_NP -#define COND_NE COND_NZ -#define COND_NB COND_NC -#define COND_AE COND_NC -#define COND_NE COND_NZ -#define COND_A (COND_NC|COND_NZ) -#define COND_NBE COND_A -#define COND_GE COND_NL -#define COND_NLE COND_G - -// Used for Opcode.FlagsChanged -#define FLAG_CF_SET (1<<0) -#define FLAG_DF_SET (1<<1) -#define FLAG_IF_SET (1<<2) -#define FLAG_SET_MASK (FLAG_CF_SET|FLAG_DF_SET|FLAG_IF_SET) - -#define FLAG_SF_CLR (1<<3) -#define FLAG_ZF_CLR (1<<4) -#define FLAG_AF_CLR (1<<5) -#define FLAG_CF_CLR (1<<6) -#define FLAG_DF_CLR (1<<7) -#define FLAG_IF_CLR (1<<8) -#define FLAG_OF_CLR (1<<9) -#define FPU_C0_CLR (1<<19) -#define FPU_C1_CLR (1<<20) -#define FPU_C2_CLR (1<<21) -#define FPU_C3_CLR (1<<22) -#define FPU_ALL_CLR (FPU_C0_CLR|FPU_C1_CLR|FPU_C2_CLR|FPU_C3_CLR) -#define FLAG_CLR_MASK (FLAG_SF_CLR|FLAG_ZF_CLR|FLAG_AF_CLR|FLAG_CF_CLR|FLAG_DF_CLR|FLAG_IF_CLR|FLAG_OF_CLR|FPU_ALL_CLR) - -#define FLAG_OF_MOD (1<<10) -#define FLAG_SF_MOD (1<<11) -#define FLAG_ZF_MOD (1<<12) -#define FLAG_AF_MOD (1<<13) -#define FLAG_PF_MOD (1<<14) -#define FLAG_CF_MOD (1<<15) -#define FLAG_DF_MOD (1<<16) -#define FLAG_IF_MOD (1<<17) -#define FLAG_ALL_MOD (FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD|FLAG_CF_MOD|FLAG_DF_MOD|FLAG_IF_MOD) -#define FLAG_COMMON_MOD (FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD|FLAG_CF_MOD) -#define FPU_C0_MOD (1<<23) -#define FPU_C1_MOD (1<<24) -#define FPU_C2_MOD (1<<25) -#define FPU_C3_MOD (1<<26) -#define FPU_ALL_MOD (FPU_C0_MOD|FPU_C1_MOD|FPU_C2_MOD|FPU_C3_MOD) -#define FLAG_MOD_MASK (FLAG_ALL_MOD|FPU_ALL_MOD) - -#define FLAG_CF_TOG (1<<18) -#define FLAG_TOG_MASK FLAG_CF_TOG - -// Used for Opcode.ResultsIfTrue and Opcode.ResultsIfFalse -#define OP1_DST (1<<0) -#define OP2_DST (1<<1) -#define OP3_DST (1<<2) -#define OP1_SRC (1<<3) -#define OP2_SRC (1<<4) -#define OP3_SRC (1<<5) -#define FPU_STACK_INC (1<<6) -#define FPU_STACK_INC2 (1<<7) -#define FPU_STACK_DEC (1<<8) -#define SERIALIZE_WRITE (1<<9) -#define SERIALIZE_READ (1<<10) -#define xCX_DEC (1<<11) -#define xCX_REP_DEC (1<<12) -#define xDI_DEC (1<<13) -#define xDI_INC (1<<14) -#define xSI_DEC (1<<15) -#define xSI_INC (1<<16) -#define xDI_DECx (1<<17) -#define xDI_INCx (1<<18) -#define xSI_DECx (1<<19) -#define xSI_INCx (1<<20) -#define FPU_STACK_PUSH FPU_STACK_DEC -#define FPU_STACK_POP FPU_STACK_INC -#define FPU_STACK_POP2 FPU_STACK_INC2 -#define SERIALIZE_ALL (SERIALIZE_WRITE|SERIALIZE_READ) - -#define X86_SEGMENT_OFFSET 0x00 -#define X86_TEST_OFFSET 0x10 -#define X86_CONTROL_OFFSET 0x20 -#define X86_DEBUG_OFFSET 0x30 -#define X86_FPU_OFFSET 0x40 -#define X86_MMX_OFFSET 0x50 -#define X86_XMM_OFFSET 0x60 -#define X86_8BIT_OFFSET 0x70 -#define X86_16BIT_OFFSET 0x80 -#define X86_32BIT_OFFSET 0x90 -#define AMD64_8BIT_OFFSET 0xA0 -#define AMD64_16BIT_OFFSET 0xB0 -#define AMD64_32BIT_OFFSET 0xC0 -#define AMD64_64BIT_OFFSET 0xD0 - -typedef enum _X86_REGISTER -{ - // Segments - X86_SEG_ES = X86_SEGMENT_OFFSET, - X86_SEG_CS, - X86_SEG_SS, - X86_SEG_DS, - X86_SEG_FS, - X86_SEG_GS, - - // Miscellaneous - X86_REG_FLAGS, - X86_REG_EFLAGS, - AMD64_REG_RFLAGS, - X86_REG_IP, - X86_REG_EIP, - AMD64_REG_RIP, - - // Test registers - X86_REG_TR0 = X86_TEST_OFFSET, - X86_REG_TR1, - X86_REG_TR2, - X86_REG_TR3, - X86_REG_TR4, - X86_REG_TR5, - X86_REG_TR6, - X86_REG_TR7, - X86_REG_TR8, - X86_REG_TR9, - X86_REG_TR10, - X86_REG_TR11, - X86_REG_TR12, - X86_REG_TR13, - X86_REG_TR14, - X86_REG_TR15, - - // Control registers - X86_REG_CR0=X86_CONTROL_OFFSET, - X86_REG_CR1, - X86_REG_CR2, - X86_REG_CR3, - X86_REG_CR4, - X86_REG_CR5, - X86_REG_CR6, - X86_REG_CR7, - X86_REG_CR8, - X86_REG_CR9, - X86_REG_CR10, - X86_REG_CR11, - X86_REG_CR12, - X86_REG_CR13, - X86_REG_CR14, - X86_REG_CR15, - - // Debug registers - X86_REG_DR0=X86_DEBUG_OFFSET, - X86_REG_DR1, - X86_REG_DR2, - X86_REG_DR3, - X86_REG_DR4, - X86_REG_DR5, - X86_REG_DR6, - X86_REG_DR7, - X86_REG_DR8, - X86_REG_DR9, - X86_REG_DR10, - X86_REG_DR11, - X86_REG_DR12, - X86_REG_DR13, - X86_REG_DR14, - X86_REG_DR15, - - // FPU registers - X86_REG_ST0=X86_FPU_OFFSET, - X86_REG_ST1, - X86_REG_ST2, - X86_REG_ST3, - X86_REG_ST4, - X86_REG_ST5, - X86_REG_ST6, - X86_REG_ST7, - - // MMX registers - X86_REG_MM0=X86_MMX_OFFSET, - X86_REG_MM1, - X86_REG_MM2, - X86_REG_MM3, - X86_REG_MM4, - X86_REG_MM5, - X86_REG_MM6, - X86_REG_MM7, - - // XMM registers - X86_REG_XMM0=X86_XMM_OFFSET, - X86_REG_XMM1, - X86_REG_XMM2, - X86_REG_XMM3, - X86_REG_XMM4, - X86_REG_XMM5, - X86_REG_XMM6, - X86_REG_XMM7, - - // 8-bit registers - X86_REG_AL=X86_8BIT_OFFSET, - X86_REG_CL, - X86_REG_DL, - X86_REG_BL, - X86_REG_AH, - X86_REG_CH, - X86_REG_DH, - X86_REG_BH, - - // 16-bit registers - X86_REG_AX=X86_16BIT_OFFSET, - X86_REG_CX, - X86_REG_DX, - X86_REG_BX, - X86_REG_SP, - X86_REG_BP, - X86_REG_SI, - X86_REG_DI, - - // 32-bit registers - X86_REG_EAX=X86_32BIT_OFFSET, - X86_REG_ECX, - X86_REG_EDX, - X86_REG_EBX, - X86_REG_ESP, - X86_REG_EBP, - X86_REG_ESI, - X86_REG_EDI, - - // AMD64 8-bit registers - AMD64_REG_AL=AMD64_8BIT_OFFSET, - AMD64_REG_CL, - AMD64_REG_DL, - AMD64_REG_BL, - AMD64_REG_SPL, - AMD64_REG_BPL, - AMD64_REG_SIL, - AMD64_REG_DIL, - AMD64_REG_R8B, - AMD64_REG_R9B, - AMD64_REG_R10B, - AMD64_REG_R11B, - AMD64_REG_R12B, - AMD64_REG_R13B, - AMD64_REG_R14B, - AMD64_REG_R15B, - - // AMD64 16-bit registers - AMD64_REG_AX=AMD64_16BIT_OFFSET, - AMD64_REG_CX, - AMD64_REG_DX, - AMD64_REG_BX, - AMD64_REG_SP, - AMD64_REG_BP, - AMD64_REG_SI, - AMD64_REG_DI, - AMD64_REG_R8W, - AMD64_REG_R9W, - AMD64_REG_R10W, - AMD64_REG_R11W, - AMD64_REG_R12W, - AMD64_REG_R13W, - AMD64_REG_R14W, - AMD64_REG_R15W, - - // AMD64 32-bit registers - AMD64_REG_EAX=AMD64_32BIT_OFFSET, - AMD64_REG_ECX, - AMD64_REG_EDX, - AMD64_REG_EBX, - AMD64_REG_ESP, - AMD64_REG_EBP, - AMD64_REG_ESI, - AMD64_REG_EDI, - AMD64_REG_R8D, - AMD64_REG_R9D, - AMD64_REG_R10D, - AMD64_REG_R11D, - AMD64_REG_R12D, - AMD64_REG_R13D, - AMD64_REG_R14D, - AMD64_REG_R15D, - - // AMD64 64-bit registers - AMD64_REG_RAX=AMD64_64BIT_OFFSET, - AMD64_REG_RCX, - AMD64_REG_RDX, - AMD64_REG_RBX, - AMD64_REG_RSP, - AMD64_REG_RBP, - AMD64_REG_RSI, - AMD64_REG_RDI, - AMD64_REG_R8, - AMD64_REG_R9, - AMD64_REG_R10, - AMD64_REG_R11, - AMD64_REG_R12, - AMD64_REG_R13, - AMD64_REG_R14, - AMD64_REG_R15 -} X86_REGISTER; - -typedef enum _X86_TEST_REGISTER -{ - REG_TR0=0, - REG_TR1, - REG_TR2, - REG_TR3, - REG_TR4, - REG_TR5, - REG_TR6, - REG_TR7, - REG_TR8, - REG_TR9, - REG_TR10, - REG_TR11, - REG_TR12, - REG_TR13, - REG_TR14, - REG_TR15 -} X86_TEST_REGISTER; - -typedef enum _X86_CONTROL_REGISTER -{ - REG_CR0, - REG_CR1, - REG_CR2, - REG_CR3, - REG_CR4, - REG_CR5, - REG_CR6, - REG_CR7, - REG_CR8, - REG_CR9, - REG_CR10, - REG_CR11, - REG_CR12, - REG_CR13, - REG_CR14, - REG_CR15 -} X86_CONTROL_REGISTER; - -typedef enum _X86_DEBUG_REGISTER -{ - REG_DR0, - REG_DR1, - REG_DR2, - REG_DR3, - REG_DR4, - REG_DR5, - REG_DR6, - REG_DR7, - REG_DR8, - REG_DR9, - REG_DR10, - REG_DR11, - REG_DR12, - REG_DR13, - REG_DR14, - REG_DR15 -} X86_DEBUG_REGISTER; - -typedef enum _X86_MMX_REGISTER -{ - REG_MM0=0, - REG_MM1=1, - REG_MM2=2, - REG_MM3=3, - REG_MM4=4, - REG_MM5=5, - REG_MM6=6, - REG_MM7=7 -} X86_MMX_REGISTER; - -typedef enum _X86_SSE_REGISTER -{ - REG_XMM0=0, - REG_XMM1=1, - REG_XMM2=2, - REG_XMM3=3, - REG_XMM4=4, - REG_XMM5=5, - REG_XMM6=6, - REG_XMM7=7 -} X86_SSE_REGISTER; - -typedef enum _X86_FPU_REGISTER -{ - REG_ST0=0, - REG_ST1=1, - REG_ST2=2, - REG_ST3=3, - REG_ST4=4, - REG_ST5=5, - REG_ST6=6, - REG_ST7=7 -} X86_FPU_REGISTER; - -typedef enum _X86_8BIT_REGISTER -{ - REG_AL = 0, - REG_CL = 1, - REG_DL = 2, - REG_BL = 3, - REG_AH = 4, - REG_CH = 5, - REG_DH = 6, - REG_BH = 7 -} X86_8BIT_REGISTER; - -typedef enum _X86_16BIT_REGISTER -{ - REG_AX = 0, - REG_CX = 1, - REG_DX = 2, - REG_BX = 3, - REG_SP = 4, - REG_BP = 5, - REG_SI = 6, - REG_DI = 7 -} X86_16BIT_REGISTER; - -typedef enum _X86_32BIT_REGISTER -{ - REG_EAX = 0, - REG_ECX = 1, - REG_EDX = 2, - REG_EBX = 3, - REG_ESP = 4, - REG_EBP = 5, - REG_ESI = 6, - REG_EDI = 7 -} X86_32BIT_REGISTER; - -typedef enum _X86_SEGMENT -{ - SEG_ES = 0, - SEG_CS = 1, - SEG_SS = 2, - SEG_DS = 3, - SEG_FS = 4, - SEG_GS = 5, - SEG_MAX = 6 -} X86_SEGMENT; - -extern char *X86_Registers[]; - -#pragma pack(push,1) -typedef struct _MODRM -{ - U8 mod : 2; - U8 reg : 3; - U8 rm : 3; -} MODRM; -typedef struct _SIB -{ - U8 scale : 2; - U8 index : 3; - U8 base : 3; -} SIB; -typedef struct _REX -{ - U8 unused : 4; // bits 4,5,6,7 - U8 w : 1; // bit 3 - U8 r : 1; // bit 2 - U8 x : 1; // bit 1 - U8 b : 1; // bit 0 -} REX; -typedef struct _REX_MODRM -{ - U8 reg : 4; - U8 rm : 4; -} REX_MODRM; -typedef struct _REX_SIB -{ - U8 index : 4; - U8 base : 4; -} REX_SIB; -#pragma pack(pop) - -// -// Properties: -// If an operand is OP_COND_EXEC, it means that it is executed only if the pre-conditions are met. -// -// If if an instruction has one or more OP_COND_DST operands, then the actions are determined by -// whether the Opcode.Preconditions are met or not. If all the COND_* flags in Opcode.Preconditions -// are true, then the results are determined by ResultsIfTrue. If the preconditions are not met, then -// the results are determined by ResultsIfFalse. -// -// If Preconditions == NOCOND, then results in ResultsIfTrue are unconditional and ResultsIfFalse -// is ignored -// -typedef struct _X86_OPCODE -{ - struct _X86_OPCODE *Table; - CPU_TYPE CPU; // minimum CPU (starting with i386) - U32 MnemonicFlags; - char Mnemonic[X86_MAX_INSTRUCTION_LEN+1]; - U32 OperandFlags[X86_MAX_OPERANDS]; - U32 Preconditions; - U32 FlagsChanged; // changes in flags - U32 ResultsIfTrue; // results if Preconditions are met - U32 ResultsIfFalse; // results if Preconditions are not met -} X86_OPCODE; - -typedef struct _X86_INSTRUCTION -{ - struct _INSTRUCTION *Instruction; // the generic instruction format representing this instruction - - X86_OPCODE Opcode; - - U8 sib_b; - U8 modrm_b; - MODRM modrm; - SIB sib; - U8 rex_b; - REX rex; - REX_MODRM rex_modrm; - REX_SIB rex_sib; - - X86_SEGMENT DstSegment; - union - { - X86_SEGMENT Segment; - DWORD Selector; - }; - - // NOTE: these are for internal use, use Instruction->Operands[] - // - // If DstRegAddressing or SrcRegAddressing = TRUE then BaseRegister is the base register - // It is the operand represented by SIBOperand - // - // The operand indices of the destination operands is in DstOpIndex[0 to DstOpCount-1] - // The operand indices of the source operands is in SrcOpIndex[0 to SrcOpCount-1] - // - // These are used both for instructions like xadd/xchg (where both operands are source/destination) - // and to represent implicit registers (e.g., cmpxchg) - - U8 SrcOpIndex[3]; - U8 DstOpIndex[3]; - - // Addressing mode: - // If DstRegAddressing = TRUE, then these apply to DstReg - // If SrcRegAddressing = TRUE, then this applies to SrcReg[AddressIndex] - // If both are false, then SrcReg and DstReg are not addresses - X86_REGISTER BaseRegister; - X86_REGISTER IndexRegister; - - U8 Scale; - U8 HasDefault64Operand : 1; - U8 HasOperandSizePrefix : 1; - U8 HasAddressSizePrefix : 1; - U8 HasSegmentOverridePrefix : 1; - U8 HasLockPrefix : 1; - U8 HasRepeatWhileEqualPrefix : 1; - U8 HasRepeatWhileNotEqualPrefix : 1; - U8 HasBranchTakenPrefix : 1; - U8 HasBranchNotTakenPrefix : 1; - U8 HasDstAddressing : 1; - U8 HasSrcAddressing : 1; - U8 HasModRM : 1; - U8 HasBaseRegister : 1; - U8 HasIndexRegister : 1; - U8 HasFullDisplacement : 1; - U8 HasDstSegment : 1; // used for ins/cmps/scas/movs/etc which have 2 segments - U8 DstAddressIndex : 2; // DstOpIndex[DstAddressIndex] - U8 SrcAddressIndex : 2; // SrcOpIndex[SrcAddressIndex] - U8 DstOpCount : 2; - U8 SrcOpCount : 2; - U8 OperandSize : 4; - U8 AddressSize : 4; - U8 Relative : 1; - U8 HasSelector : 1; // segment is actually a selector - U8 Group : 5; - - S64 Displacement; - -} X86_INSTRUCTION; - -//////////////////////////////////////////////////////////////////////////////////// -// Exported functions -//////////////////////////////////////////////////////////////////////////////////// - -extern ARCHITECTURE_FORMAT_FUNCTIONS X86; - -// Instruction setup -BOOL X86_InitInstruction(struct _INSTRUCTION *Instruction); -void X86_CloseInstruction(struct _INSTRUCTION *Instruction); - -// Instruction translator -BOOL X86_TranslateInstruction(struct _INSTRUCTION *Instruction, BOOL Verbose); - -// Instruction decoder -BOOL X86_GetInstruction(struct _INSTRUCTION *Instruction, U8 *Address, DWORD Flags); - -// Function finding -U8 *X86_FindFunctionByPrologue(struct _INSTRUCTION *Instruction, U8 *StartAddress, U8 *EndAddress, DWORD Flags); - -#ifdef __cplusplus -} -#endif -#endif // X86_DISASM_H - diff --git a/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86_tables.h b/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86_tables.h deleted file mode 100644 index 170bcc912..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/disasm_x86_tables.h +++ /dev/null @@ -1,3656 +0,0 @@ -// Copyright (C) 2004, Matt Conover (mconover@gmail.com) -// -// The opcode tables in this file are based off the Intel Instruction Set Reference -// and an assortment of disassemblers, primarily libdisasm (by mammon) - -#ifndef DISASM_X86_TABLES -#define DISASM_X86_TABLES - -#pragma warning(disable: 4245) - -#define X86_GET_REG(val) ((val) & 7) -#define X86_GET_REG64(val) ((GET_REX_B(X86Instruction->rex_b) << 3) | ((val) & 7)) - -#define GET_MODRM_MOD(a) (((a) >> 6) & 3) // bits 6, 7 -#define GET_MODRM_REG(a) (((a) >> 3) & 7) // bits 3, 4, 5 -#define GET_MODRM_EXT(a) (((a) >> 3) & 7) // bits 3, 4, 5 -#define GET_MODRM_RM(a) ((a) & 7) // bits 0, 1, 2 - -#define GET_SIB_SCALE(a) (((a) >> 6) & 3) // bits 6, 7 -#define GET_SIB_INDEX(a) (((a) >> 3) & 7) // bits 3, 4, 5 -#define GET_SIB_BASE(a) ((a) & 7) // bits 0, 1, 2 - -#define REX_PREFIX_START 0x40 -#define REX_PREFIX_END 0x4F -#define GET_REX_W(r) (((r) & 8) >> 3) // bit 3 -#define GET_REX_R(r) (((r) & 4) >> 2) // bit 2 -#define GET_REX_X(r) (((r) & 2) >> 1) // bit 1 -#define GET_REX_B(r) ((r) & 1) // bit 0 -#define REX_MASK(n) ((n >> 16) & 0x0F) // bits 0-3 - -// Groupings to make the opcode table more readible -#define NOARGS { 0, 0, 0 } -#define NOCOND 0 -#define NOGROUP NULL -#define NOACTION 0 -#define NOCHANGE 0 -#define IGNORED 0 -#define NOINSTR NOGROUP, CPU_UNKNOWN, 0, "", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED -#define GROUP CPU_UNKNOWN, 0, "", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED -#define PREFIX NOGROUP, CPU_UNKNOWN, ITYPE_EXT_PREFIX, "", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED -#define EXT_FPU CPU_UNKNOWN, ITYPE_EXT_FPU, "", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED -#define EXT_64 CPU_UNKNOWN, ITYPE_EXT_64, "", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED -#define EXT_SUFFIX(a, b, c) CPU_UNKNOWN, ITYPE_EXT_SUFFIX, "", { a, b, c }, NOCOND, NOCHANGE, NOACTION, IGNORED -#define EXT_MODRM CPU_UNKNOWN, ITYPE_EXT_MODRM, "", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED - -#define SET_MODRM(modrm, src) \ -{ \ - (modrm).mod = GET_MODRM_MOD(src); \ - (modrm).reg = GET_MODRM_REG(src); \ - (modrm).rm = GET_MODRM_RM(src); \ -} - -#define SET_REX_MODRM(rex_modrm, rex, modrm) \ -{ \ - (rex_modrm).rm = ((rex).b << 3) | (modrm).rm; \ - (rex_modrm).reg = ((rex).r << 3) | (modrm).reg; \ -} - -#define SET_SIB(sib, src) \ -{ \ - (sib).scale = GET_SIB_SCALE(src); \ - (sib).index = GET_SIB_INDEX(src); \ - (sib).base = GET_SIB_BASE(src); \ -} - -#define SET_REX_SIB(rex_sib, rex, sib) \ -{ \ - (rex_sib).index = ((rex).x << 3) | (sib).index; \ - (rex_sib).base = ((rex).b << 3) | (sib).base; \ -} - -#define SET_REX(rex, src) \ -{ \ - (rex).w = GET_REX_W(src); \ - (rex).r = GET_REX_R(src); \ - (rex).x = GET_REX_X(src); \ - (rex).b = GET_REX_B(src); \ -} - -// Addressing modes -#define AMODE_A 0x00010000 -#define AMODE_C 0x00020000 -#define AMODE_D 0x00030000 -#define AMODE_E 0x00040000 -#define AMODE_G 0x00050000 -#define AMODE_I 0x00060000 -#define AMODE_J 0x00070000 -#define AMODE_M 0x00080000 -#define AMODE_O 0x00090000 -#define AMODE_P 0x000A0000 -#define AMODE_Q 0x000B0000 -#define AMODE_R 0x000C0000 -#define AMODE_S 0x000D0000 -#define AMODE_T 0x000E0000 -#define AMODE_V 0x000F0000 -#define AMODE_W 0x00100000 -#define AMODE_X 0x00110000 -#define AMODE_Y 0x00120000 -#define AMODE_PR 0x00130000 -#define AMODE_VR 0x00140000 -#define AMODE_xlat 0x00150000 - -// Operand types -#define OPTYPE_a 0x01000000 -#define OPTYPE_b 0x02000000 -#define OPTYPE_d 0x03000000 -#define OPTYPE_p 0x04000000 -#define OPTYPE_q 0x05000000 -#define OPTYPE_dt 0x06000000 -#define OPTYPE_v 0x07000000 -#define OPTYPE_w 0x08000000 -#define OPTYPE_ps 0x09000000 // packed 128-bit single real -#define OPTYPE_pd 0x0A000000 // packed 128-bit double real -#define OPTYPE_pb 0x0B000000 // packed BCD (10 bytes, 18-bit precision) -#define OPTYPE_ss 0x0C000000 // scalar single real -#define OPTYPE_sd 0x0D000000 // scalar double real -#define OPTYPE_se 0x0E000000 // scalar extended real -#define OPTYPE_fev 0x0F000000 // FPU environment (28 bytes if 32-bit modes, 14 bytes in 16-bit mode) -#define OPTYPE_fst1 0x10000000 // FPU state (108 bytes in 32-bit modes, 94 bytes in 16-bit real mode) -#define OPTYPE_fst2 0x11000000 // FPU/MMX/XMM/MXCSR state (512 bytes) -#define OPTYPE_z 0x12000000 -#define OPTYPE_o 0x13000000 -#define OPTYPE_dq 0x14000000 // OPTYPE_d or OPTYPE_o -#define OPTYPE_mw 0x15000000 // word if memory, register size otherwise -#define OPTYPE_sso 0x16000000 // OPTYPE_ss or OPTYPE_o -#define OPTYPE_sdo 0x17000000 // OPTYPE_ss or OPTYPE_o -#define OPTYPE_cpu 0x18000000 // pointer to CPU state structure -#define OPTYPE_lea 0x19000000 // size set by other operand -// NOTE: if you change this, you must also update OptypeHandlers[] in disasm_x86.c -// Be sure to preserve the ordering - -////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// Registers -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -static char *Addressing16[8] = {"bx+si","bx+di","bp+si","bp+di","si","di","bp","bx"}; -static char *MMX_Registers[8] = {"mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7"}; -static char *SSE_Registers[8] = {"xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"}; -static char *DR_Registers[8] = {"dr0", "dr1", "dr2", "dr3", "dr4", "dr5", "dr6", "dr7"}; -static char *CR_Registers[8] = {"cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7"}; -static char *TR_Registers[8] = {"tr0", "tr1", "tr2", "tr3", "tr4", "tr5", "tr6", "tr7"}; -static char *FPU_Registers[8] = {"st(0)", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)"}; -static char *Segments[8] = {"es", "cs", "ss", "ds", "fs", "gs", "ERROR", "ERROR"}; -static char *Registers8[8] = {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" }; -static char *Registers16[8] = {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di" }; -static char *Registers32[8] = {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi" }; -static char *REX_Registers8[16] = {"al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" }; -static char *REX_Registers16[16] = {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" }; -static char *REX_Registers32[16] = {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" }; -static char *REX_Registers64[16] = {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" }; -static char *DataSizes[8+1] = {"byte ptr", "word ptr", "dword ptr", "6_byte ptr", "qword ptr", "10_byte ptr", "INVALID PTR", "INVALID PTR", "oword ptr"}; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// FPU constants -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -BYTE float_0[10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -BYTE float_1[10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F }; -BYTE float_l2t[10] = { 0xFE, 0x8A, 0x1B, 0xCD, 0x4B, 0x78, 0x9A, 0xD4, 0x00, 0x40 }; -BYTE float_l2e[10] = { 0xBC, 0xF0, 0x17, 0x5C, 0x29, 0x3B, 0xAA, 0xB8, 0xFF, 0x3F }; -BYTE float_pi[10] = { 0x35, 0xC2, 0x68, 0x21, 0xA2, 0xDA, 0x0F, 0xC9, 0x00, 0x40 }; -BYTE float_lg2[10] = { 0x99, 0xF7, 0xCF, 0xFB, 0x84, 0x9A, 0x20, 0x9A, 0xFD, 0x3F }; -BYTE float_ln2[10] = { 0xAC, 0x79, 0xCF, 0xD1, 0xF7, 0x17, 0x72, 0xB1, 0xFE, 0x3F }; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// Tables -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -extern X86_OPCODE X86_Opcodes_2[0x100]; -extern X86_OPCODE X86_Group_1_80[8], X86_Group_1_81[8], X86_Group_1_82[8], X86_Group_1_83[8], X86_Group_2_C0[8], X86_Group_2_C1[8], X86_Group_2_D0[8], X86_Group_2_D1[8], X86_Group_2_D2[8], X86_Group_2_D3[8], X86_Group_3_F6[8], X86_Group_3_F7[8], X86_Group_4[8], X86_Group_5[8], X86_Group_6[8], X86_Group_7[8], X86_Group_8[8], X86_Group_9[8], X86_Group_10[8], X86_Group_11[8], X86_Group_12_C6[8], X86_Group_12_C7[8], X86_Group_13[8], X86_Group_14[8], X86_Group_15[8], X86_Group_16[8], X86_Group_17[8], X86_Group_P[8]; -extern X86_OPCODE X86_SSE[0x300], X86_SSE2_Group_13[24], X86_SSE2_Group_14[24], X86_SSE2_Group_15[24]; -extern X86_OPCODE X86_ESC_0[0x48], X86_ESC_1[0x48], X86_ESC_2[0x48], X86_ESC_3[0x48], X86_ESC_3[0x48], X86_ESC_4[0x48], X86_ESC_5[0x48], X86_ESC_6[0x48], X86_ESC_7[0x48]; -extern X86_OPCODE X86_3DNOW_0F[0x100]; -extern X86_OPCODE X86_0F01_ModRM[0x100]; -extern X86_OPCODE X86_Opcode_63[2], X86_Opcode_0F05[2]; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// Opcode tables -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -X86_OPCODE X86_Opcodes_1[0x100] = // 1 byte opcodes -{ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { AMODE_E | OPTYPE_b | OP_DST, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { AMODE_G | OPTYPE_b | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { OPTYPE_REG_AL | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OPTYPE_ES | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OPTYPE_ES | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x07 */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { AMODE_E | OPTYPE_b | OP_DST, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x08 */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x09 */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { AMODE_G | OPTYPE_b | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x0A */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x0B */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { OPTYPE_REG_AL | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x0C */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x0D */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OPTYPE_CS | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x0E */ - { X86_Opcodes_2, GROUP }, /* 0x0F */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { AMODE_E | OPTYPE_b | OP_DST, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x10 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x11 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { AMODE_G | OPTYPE_b | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x12 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x13 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { OPTYPE_REG_AL | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x14 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x15 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OPTYPE_SS | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x16 */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OPTYPE_SS | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x17 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { AMODE_E | OPTYPE_b | OP_DST, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x18 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x19 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { AMODE_G | OPTYPE_b | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x1A */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x1B */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { OPTYPE_REG_AL | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x1C */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x1D */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OPTYPE_DS | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x1E */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OPTYPE_DS | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x1F */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { AMODE_E | OPTYPE_b | OP_DST, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x20 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x21 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { AMODE_G | OPTYPE_b | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x22 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x23 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { OPTYPE_REG_AL | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x24 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x25 */ - { PREFIX }, /* 0x26 */ - { NOGROUP, CPU_I386, ITYPE_BCDCONV, "daa", { OPTYPE_REG_AL | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_AF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x27 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { AMODE_E | OPTYPE_b | OP_DST, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x28 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x29 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { AMODE_G | OPTYPE_b | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x2A */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x2B */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { OPTYPE_REG_AL | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x2C */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x2D */ - { PREFIX }, /* 0x2E */ - { NOGROUP, CPU_I386, ITYPE_BCDCONV, "das", { OPTYPE_REG_AL | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_AF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x2F */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { AMODE_E | OPTYPE_b | OP_DST, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x30 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x31 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { AMODE_G | OPTYPE_b | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x32 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x33 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { OPTYPE_REG_AL | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x34 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x35 */ - { PREFIX }, /* 0x36 */ - { NOGROUP, CPU_I386, ITYPE_BCDCONV, "aaa", { OPTYPE_REG_AL | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_AF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x37 */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { AMODE_E | OPTYPE_b | OP_SRC, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x38 */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x39 */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { AMODE_G | OPTYPE_b | OP_SRC, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x3A */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { AMODE_G | OPTYPE_v | OP_SRC, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x3B */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { OPTYPE_REG_AL | OP_SIGNED | OP_SRC, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x3C */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { OPTYPE_REG_xAX_BIG | OP_SIGNED | OP_SRC, AMODE_I | OPTYPE_z | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x3D */ - { PREFIX }, /* 0x3E */ - { NOGROUP, CPU_I386, ITYPE_BCDCONV, "aas", { OPTYPE_REG_AL | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_AF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x3F */ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x40 */ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x41 */ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x42 */ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x43 */ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x44 */ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x45 */ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x46 */ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x47 */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x48 */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x49 */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x4A */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x4B */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x4C */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x4D */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x4E */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x4F */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OP_REG | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x50 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OP_REG | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x51 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OP_REG | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x52 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OP_REG | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x53 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OP_REG | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x54 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OP_REG | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x55 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OP_REG | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x56 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OP_REG | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x57 */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OP_REG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x58 */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OP_REG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x59 */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OP_REG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5A */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OP_REG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5B */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OP_REG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5C */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OP_REG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5D */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OP_REG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5E */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OP_REG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5F */ - { NOGROUP, CPU_I386, ITYPE_PUSHA, "pushad", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x60 */ - { NOGROUP, CPU_I386, ITYPE_POPA, "popad", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x61 */ - { NOGROUP, CPU_I386, ITYPE_BOUNDS, "bound", { AMODE_G | OPTYPE_v | OP_SRC, AMODE_M | OPTYPE_a | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x62 */ - { X86_Opcode_63, EXT_64 }, /* 0x63 */ - { PREFIX }, /* 0x64 */ - { PREFIX }, /* 0x65 */ - { PREFIX }, /* 0x66 */ - { PREFIX }, /* 0x67 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { AMODE_I | OPTYPE_z | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x68 */ - { NOGROUP, CPU_I386, ITYPE_MUL, "imul", { AMODE_G | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_v | OP_SIGNED | OP_SRC, AMODE_I | OPTYPE_z | OP_SIGNED | OP_SRC }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x69 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x6A */ - { NOGROUP, CPU_I386, ITYPE_MUL, "imul", { AMODE_G | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_v | OP_SIGNED | OP_SRC, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x6B */ - { NOGROUP, CPU_I386, ITYPE_IN, "insb", { AMODE_Y | OPTYPE_b | OP_DST, OPTYPE_REG_DX | OP_SYS | OP_SRC, 0 }, COND_D, NOCHANGE, xDI_DEC | xCX_REP_DEC, xDI_INC | xCX_REP_DEC }, /* 0x6C */ - { NOGROUP, CPU_I386, ITYPE_IN, "insd", { AMODE_Y | OPTYPE_z | OP_DST, OPTYPE_REG_DX | OP_SYS | OP_SRC, 0 }, COND_D, NOCHANGE, xDI_DECx | xCX_REP_DEC, xDI_INCx | xCX_REP_DEC }, /* 0x6D */ - { NOGROUP, CPU_I386, ITYPE_OUT, "outsb", { OPTYPE_REG_DX | OP_SYS | OP_DST, AMODE_X | OPTYPE_b | OP_SRC, 0 }, COND_D, NOCHANGE, xSI_DEC | xCX_REP_DEC, xSI_INC | xCX_REP_DEC }, /* 0x6E */ - { NOGROUP, CPU_I386, ITYPE_OUT, "outsd", { OPTYPE_REG_DX | OP_SYS | OP_DST, AMODE_X | OPTYPE_z | OP_SRC, 0 }, COND_D, NOCHANGE, xSI_DECx | xCX_REP_DEC, xSI_INCx | xCX_REP_DEC}, /* 0x6F */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jo", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_O, NOCHANGE, OP1_DST, NOACTION }, /* 0x70 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jno", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_NO, NOCHANGE, OP1_DST, NOACTION }, /* 0x71 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jb", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_C, NOCHANGE, OP1_DST, NOACTION }, /* 0x72 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jnb", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_NC, NOCHANGE, OP1_DST, NOACTION }, /* 0x73 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jz", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_Z, NOCHANGE, OP1_DST, NOACTION }, /* 0x74 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jnz", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_NZ, NOCHANGE, OP1_DST, NOACTION }, /* 0x75 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jbe", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_BE, NOCHANGE, OP1_DST, NOACTION }, /* 0x76 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "ja", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_A, NOCHANGE, OP1_DST, NOACTION }, /* 0x77 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "js", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_S, NOCHANGE, OP1_DST, NOACTION }, /* 0x78 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jns", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_NS, NOCHANGE, OP1_DST, NOACTION }, /* 0x79 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jpe", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_PE, NOCHANGE, OP1_DST, NOACTION }, /* 0x7A */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jpo", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_PO, NOCHANGE, OP1_DST, NOACTION }, /* 0x7B */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jl", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_L, NOCHANGE, OP1_DST, NOACTION }, /* 0x7C */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jge", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_GE, NOCHANGE, OP1_DST, NOACTION }, /* 0x7D */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jle", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_LE, NOCHANGE, OP1_DST, NOACTION }, /* 0x7E */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jg", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_G, NOCHANGE, OP1_DST, NOACTION }, /* 0x7F */ - { X86_Group_1_80, GROUP }, /* 0x80 Eb Ib */ - { X86_Group_1_81, GROUP }, /* 0x81 Ev Iz */ - { X86_Group_1_82, GROUP }, /* 0x82 Eb Ib */ - { X86_Group_1_83, GROUP }, /* 0x83 Ev Ib */ - { NOGROUP, CPU_I386, ITYPE_TEST, "test", { AMODE_E | OPTYPE_b | OP_SRC, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x84 */ - { NOGROUP, CPU_I386, ITYPE_TEST, "test", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x85 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { AMODE_E | OPTYPE_b | OP_SRC | OP_DST, AMODE_G | OPTYPE_b | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x86 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, AMODE_G | OPTYPE_v | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x87 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_E | OPTYPE_b | OP_DST, AMODE_G | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x88 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x89 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_G | OPTYPE_b | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x8A */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x8B */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_E | OPTYPE_mw | OP_DST, AMODE_S | OPTYPE_w | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x8C */ - { NOGROUP, CPU_I386, ITYPE_LEA, "lea", { AMODE_G | OPTYPE_v | OP_DST, AMODE_M | OPTYPE_lea | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x8D */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_S | OPTYPE_w | OP_DST, AMODE_E | OPTYPE_w | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x8E */ - { X86_Group_10, GROUP }, /* 0x8F */ - { NOGROUP, CPU_I386, ITYPE_NOP, "nop", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x90 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { OPTYPE_REG_xAX_BIG | OP_SRC | OP_DST, OP_REG | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x91 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { OPTYPE_REG_xAX_BIG | OP_SRC | OP_DST, OP_REG | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x92 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { OPTYPE_REG_xAX_BIG | OP_SRC | OP_DST, OP_REG | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x93 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { OPTYPE_REG_xAX_BIG | OP_SRC | OP_DST, OP_REG | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x94 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { OPTYPE_REG_xAX_BIG | OP_SRC | OP_DST, OP_REG | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x95 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { OPTYPE_REG_xAX_BIG | OP_SRC | OP_DST, OP_REG | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x96 */ - { NOGROUP, CPU_I386, ITYPE_XCHG, "xchg", { OPTYPE_REG_xAX_BIG | OP_SRC | OP_DST, OP_REG | OP_SRC | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x97 */ - { NOGROUP, CPU_I386, ITYPE_SZCONV, "cwde", { OPTYPE_REG_xAX_BIG | OP_SIGNED | OP_DST, OPTYPE_REG_xAX_SMALL | OP_SIGNED | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x98 */ - { NOGROUP, CPU_I386, ITYPE_SZCONV, "cdq", { OPTYPE_xDX_HI_xAX_LO | OP_SIGNED | OP_DST, OPTYPE_REG_xAX_BIG | OP_SIGNED | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x99 */ - { NOGROUP, CPU_I386, ITYPE_CALL, "call", { AMODE_A | OPTYPE_p | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x9A */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "wait", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x9B */ - { NOGROUP, CPU_I386, ITYPE_PUSHF, "pushf", { OPTYPE_xFLAGS | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x9C */ - { NOGROUP, CPU_I386, ITYPE_POPF, "popf", { OPTYPE_xFLAGS | OP_DST, 0, 0 }, NOCOND, FLAG_ALL_MOD, NOACTION, IGNORED }, /* 0x9D */ - { NOGROUP, CPU_I386, ITYPE_MOV, "sahf", { OPTYPE_FLAGS | OP_DST, OPTYPE_REG_AH | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_AF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x9E */ - { NOGROUP, CPU_I386, ITYPE_MOV, "lahf", { OPTYPE_REG_AH | OP_DST, OPTYPE_FLAGS | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x9F */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG_AL | OP_DST, AMODE_O | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA0 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_O | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA1 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_O | OPTYPE_b | OP_DST, OPTYPE_REG_AL | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA2 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_O | OPTYPE_v | OP_DST, OPTYPE_REG_xAX_BIG | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA3 */ - { NOGROUP, CPU_I386, ITYPE_STRMOV, "movsb", { AMODE_Y | OPTYPE_b | OP_DST, AMODE_X | OPTYPE_b | OP_SRC, 0 }, COND_D, NOCHANGE, xDI_DEC | xSI_DEC | xCX_REP_DEC, xDI_INC | xSI_INC | xCX_REP_DEC}, /* 0xA4 */ - { NOGROUP, CPU_I386, ITYPE_STRMOV, "movsd", { AMODE_Y | OPTYPE_z | OP_DST, AMODE_X | OPTYPE_z | OP_SRC, 0 }, COND_D, NOCHANGE, xDI_DECx | xSI_DECx| xCX_REP_DEC, xDI_INCx | xSI_INCx | xCX_REP_DEC }, /* 0xA5 */ - { NOGROUP, CPU_I386, ITYPE_STRCMP, "cmpsb", { AMODE_X | OPTYPE_b | OP_SRC, AMODE_Y | OPTYPE_b | OP_SRC, 0 }, COND_D, FLAG_COMMON_MOD, xDI_DEC | xSI_DEC | xCX_REP_DEC, xDI_INC | xSI_INC | xCX_REP_DEC }, /* 0xA6 */ - { NOGROUP, CPU_I386, ITYPE_STRCMP, "cmpsd", { AMODE_X | OPTYPE_z | OP_SRC, AMODE_Y | OPTYPE_z | OP_SRC, 0 }, COND_D, FLAG_COMMON_MOD, xDI_DECx | xSI_DECx | xCX_REP_DEC, xDI_INCx | xSI_INCx | xCX_REP_DEC}, /* 0xA7 */ - { NOGROUP, CPU_I386, ITYPE_TEST, "test", { OPTYPE_REG_AL | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0xA8 */ - { NOGROUP, CPU_I386, ITYPE_TEST, "test", { OPTYPE_REG_xAX_BIG | OP_SRC, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0xA9 */ - { NOGROUP, CPU_I386, ITYPE_STRSTOR, "stosb", { AMODE_Y | OPTYPE_b | OP_DST, OPTYPE_REG_AL | OP_SRC, 0 }, COND_D, NOCHANGE, xDI_DEC | xSI_DEC | xCX_REP_DEC, xDI_INC | xSI_INC | xCX_REP_DEC }, /* 0xAA */ - { NOGROUP, CPU_I386, ITYPE_STRSTOR, "stosd", { AMODE_Y | OPTYPE_z | OP_DST, OPTYPE_REG_xAX_BIG | OP_SRC, 0 }, COND_D, NOCHANGE, xDI_DECx | xSI_DECx | xCX_REP_DEC, xDI_INCx | xSI_INCx | xCX_REP_DEC }, /* 0xAB */ - { NOGROUP, CPU_I386, ITYPE_STRLOAD, "lodsb", { OPTYPE_REG_AL | OP_DST, AMODE_X | OPTYPE_b | OP_SRC, 0 }, COND_D, NOCHANGE, xSI_DEC | xCX_REP_DEC, xSI_INC | xCX_REP_DEC }, /* 0xAC */ - { NOGROUP, CPU_I386, ITYPE_STRLOAD, "lodsd", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_X | OPTYPE_z | OP_SRC, 0 }, COND_D, NOCHANGE, xSI_DECx | xCX_REP_DEC, xSI_INCx | xCX_REP_DEC }, /* 0xAD */ - { NOGROUP, CPU_I386, ITYPE_STRCMP, "scasb", { OPTYPE_REG_AL | OP_SRC, AMODE_Y | OPTYPE_b | OP_SRC, 0 }, COND_D, FLAG_COMMON_MOD, xDI_DEC | xCX_REP_DEC, xDI_INC | xCX_REP_DEC }, /* 0xAE */ - { NOGROUP, CPU_I386, ITYPE_STRCMP, "scasd", { OPTYPE_REG_xAX_BIG | OP_SRC, AMODE_Y | OPTYPE_z | OP_SRC, 0 }, COND_D, FLAG_COMMON_MOD, xDI_DECx, xDI_INCx }, /* 0xAF */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG8 | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB0 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG8 | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB1 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG8 | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB2 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG8 | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB3 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG8 | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB4 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG8 | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB5 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG8 | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB6 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OPTYPE_REG8 | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB7 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OP_REG | OP_DST, AMODE_I | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB8 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OP_REG | OP_DST, AMODE_I | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB9 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OP_REG | OP_DST, AMODE_I | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xBA */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OP_REG | OP_DST, AMODE_I | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xBB */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OP_REG | OP_DST, AMODE_I | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xBC */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OP_REG | OP_DST, AMODE_I | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xBD */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OP_REG | OP_DST, AMODE_I | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xBE */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { OP_REG | OP_DST, AMODE_I | OPTYPE_v | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xBF */ - { X86_Group_2_C0, GROUP }, /* 0xC0 Eb Ib */ - { X86_Group_2_C1, GROUP }, /* 0xC1 Ev Ib */ - { NOGROUP, CPU_I386, ITYPE_RET, "ret", { AMODE_I | OPTYPE_w | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC2 */ - { NOGROUP, CPU_I386, ITYPE_RET, "ret", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC3 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "les", { AMODE_G | OPTYPE_z | OP_DST, AMODE_M | OPTYPE_p | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC4 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "lds", { AMODE_G | OPTYPE_z | OP_DST, AMODE_M | OPTYPE_p | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC5 */ - { X86_Group_12_C6, GROUP }, /* 0xC6 Eb Ib */ - { X86_Group_12_C7, GROUP }, /* 0xC7 Ev Iz */ - { NOGROUP, CPU_I386, ITYPE_ENTER, "enter", { OPTYPE_REG_xBP | OP_SRC | OP_DST, AMODE_I | OPTYPE_w | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC8 */ - { NOGROUP, CPU_I386, ITYPE_LEAVE, "leave", { OPTYPE_REG_xBP | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC9 */ - { NOGROUP, CPU_I386, ITYPE_RET, "retf", { AMODE_I | OPTYPE_w | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCA */ - { NOGROUP, CPU_I386, ITYPE_RET, "retf", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCB */ - { NOGROUP, CPU_I386, ITYPE_DEBUG, "int3", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCC */ - { NOGROUP, CPU_I386, ITYPE_TRAP, "int", { AMODE_I | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCD */ - { NOGROUP, CPU_I386, ITYPE_OFLOW, "into", NOARGS, NOCOND, NOCHANGE, NOACTION, NOACTION }, /* 0xCE */ - { NOGROUP, CPU_I386, ITYPE_TRAPRET, "iret", NOARGS, NOCOND, FLAG_ALL_MOD, NOACTION, IGNORED }, /* 0xCF */ - { X86_Group_2_D0, GROUP }, /* 0xD0 Eb, 1 */ - { X86_Group_2_D1, GROUP }, /* 0xD1 Ev, 1 */ - { X86_Group_2_D2, GROUP }, /* 0xD2 Eb, CL */ - { X86_Group_2_D3, GROUP }, /* 0xD3 Ev, CL */ - { NOGROUP, CPU_I386, ITYPE_BCDCONV, "aam", { OPTYPE_REG_AX | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD, NOACTION, IGNORED }, /* 0xD4 */ - { NOGROUP, CPU_I386, ITYPE_BCDCONV, "aad", { OPTYPE_REG_AX | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD, NOACTION, IGNORED }, /* 0xD5 */ - { NOGROUP, CPU_I386, ITYPE_ARITH, "salc", { OPTYPE_REG_AL | OP_DST, OPTYPE_FF | OP_SRC, OPTYPE_0 | OP_SRC }, COND_C, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0xD6 */ - { NOGROUP, CPU_I386, ITYPE_XLAT, "xlat", { OPTYPE_REG_AL | OP_DST, AMODE_xlat | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD7 */ - { X86_ESC_0, EXT_FPU }, /* 0xD8 */ - { X86_ESC_1, EXT_FPU }, /* 0xD9 */ - { X86_ESC_2, EXT_FPU }, /* 0xDA */ - { X86_ESC_3, EXT_FPU }, /* 0xDB */ - { X86_ESC_4, EXT_FPU }, /* 0xDC */ - { X86_ESC_5, EXT_FPU }, /* 0xDD */ - { X86_ESC_6, EXT_FPU }, /* 0xDE */ - { X86_ESC_7, EXT_FPU }, /* 0xDF */ - { NOGROUP, CPU_I386, ITYPE_LOOPCC, "loopnz", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_REG_xCX_BIG_NZ | COND_NZ, NOCHANGE, OP1_DST | xCX_DEC, NOACTION }, /* 0xE0 */ - { NOGROUP, CPU_I386, ITYPE_LOOPCC, "loopz", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_REG_xCX_BIG_NZ | COND_Z, NOCHANGE, OP1_DST | xCX_DEC, NOACTION }, /* 0xE1 */ - { NOGROUP, CPU_I386, ITYPE_LOOPCC, "loop", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_REG_xCX_BIG_NZ, NOCHANGE, OP1_DST | xCX_DEC, NOACTION }, /* 0xE2 */ - { NOGROUP, CPU_I386, ITYPE_LOOPCC, "jecxz", { AMODE_J | OPTYPE_b | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_REG_xCX_BIG_Z, NOCHANGE, OP1_DST, NOACTION }, /* 0xE3 */ - { NOGROUP, CPU_I386, ITYPE_IN, "in", { OPTYPE_REG_AL | OP_DST, AMODE_I | OPTYPE_b | OP_SYS | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, NOACTION }, /* 0xE4 */ - { NOGROUP, CPU_I386, ITYPE_IN, "in", { OPTYPE_REG_xAX_BIG | OP_DST, AMODE_I | OPTYPE_b | OP_SYS | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, NOACTION }, /* 0xE5 */ - { NOGROUP, CPU_I386, ITYPE_OUT, "out", { AMODE_I | OPTYPE_b | OP_SYS | OP_DST, OPTYPE_REG_AL | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, NOACTION }, /* 0xE6 */ - { NOGROUP, CPU_I386, ITYPE_OUT, "out", { AMODE_I | OPTYPE_b | OP_SYS | OP_DST, OPTYPE_REG_xAX_BIG | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, NOACTION }, /* 0xE7 */ - { NOGROUP, CPU_I386, ITYPE_CALL, "call", { AMODE_J | OPTYPE_z | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE8 */ - { NOGROUP, CPU_I386, ITYPE_BRANCH, "jmp", { AMODE_J | OPTYPE_z | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE9 */ - { NOGROUP, CPU_I386, ITYPE_BRANCH, "jmp", { AMODE_A | OPTYPE_p | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEA */ - { NOGROUP, CPU_I386, ITYPE_BRANCH, "jmp", { AMODE_J | OPTYPE_b | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEB */ - { NOGROUP, CPU_I386, ITYPE_IN, "in", { OPTYPE_REG_AL | OP_DST, OPTYPE_REG_DX | OP_SYS | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEC */ - { NOGROUP, CPU_I386, ITYPE_IN, "in", { OPTYPE_REG_xAX_BIG | OP_DST, OPTYPE_REG_DX | OP_SYS | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xED */ - { NOGROUP, CPU_I386, ITYPE_OUT, "out", { OPTYPE_REG_DX | OP_SYS | OP_DST, OPTYPE_REG_AL | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEE */ - { NOGROUP, CPU_I386, ITYPE_OUT, "out", { OPTYPE_REG_DX | OP_SYS | OP_DST, OPTYPE_REG_xAX_BIG | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEF */ - { PREFIX }, /* 0xF0 */ - { NOGROUP, CPU_I386, ITYPE_DEBUG, "int1", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, // aka icebp /* 0xF1 */ - { PREFIX }, /* 0xF2 */ - { PREFIX }, /* 0xF3 */ - { NOGROUP, CPU_I386, ITYPE_HALT, "hlt", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF4 */ - { NOGROUP, CPU_I386, ITYPE_TOGCF, "cmc", { OPTYPE_FLAGS | OP_DST, 0, 0 }, NOCOND, FLAG_CF_TOG, IGNORED }, /* 0xF5 */ - { X86_Group_3_F6, GROUP }, /* 0xF6 Eb */ - { X86_Group_3_F7, GROUP }, /* 0xF7 Ev */ - { NOGROUP, CPU_I386, ITYPE_CLEARCF, "clc", { OPTYPE_FLAGS | OP_DST, 0, 0 }, NOCOND, FLAG_CF_CLR, NOACTION, IGNORED }, /* 0xF8 */ - { NOGROUP, CPU_I386, ITYPE_SETCF, "stc", { OPTYPE_FLAGS | OP_DST, 0, 0 }, NOCOND, FLAG_CF_SET, NOACTION, IGNORED }, /* 0xF9 */ - { NOGROUP, CPU_I386, ITYPE_CLEARIF, "cli", { OPTYPE_FLAGS | OP_DST, 0, 0 }, NOCOND, FLAG_IF_CLR, NOACTION, IGNORED }, /* 0xFA */ - { NOGROUP, CPU_I386, ITYPE_SETIF, "sti", { OPTYPE_FLAGS | OP_DST, 0, 0 }, NOCOND, FLAG_IF_SET, NOACTION, IGNORED }, /* 0xFB */ - { NOGROUP, CPU_I386, ITYPE_CLEARDF, "cld", { OPTYPE_FLAGS | OP_DST, 0, 0 }, NOCOND, FLAG_DF_CLR, NOACTION, IGNORED }, /* 0xFC */ - { NOGROUP, CPU_I386, ITYPE_SETDF, "std", { OPTYPE_FLAGS | OP_DST, 0, 0 }, NOCOND, FLAG_DF_SET, NOACTION, IGNORED }, /* 0xFD */ - { X86_Group_4, GROUP }, /* 0xFE */ - { X86_Group_5, GROUP }, /* 0xFF */ -}; - -X86_OPCODE X86_Opcodes_2[0x100] = // 2 byte opcodes -{ - { X86_Group_6, GROUP }, /* 0x00 */ - { X86_0F01_ModRM, EXT_MODRM }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "lar", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_w | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "lsl", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_w | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { X86_Opcode_0F05, EXT_64 }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "clts", { OPTYPE_CR0 | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_SYSCALLRET, "sysret", { OPTYPE_STAR_MSR | OP_MSR | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x07 */ - // 0F 07 could also be this undocumented instruction on older CPUs: - // { NOGROUP, CPU_I386, ITYPE_SYSTEM, "loadall", { AMODE_Y | OPTYPE_cpu | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x07 */ - { NOGROUP, CPU_I486, ITYPE_SYSTEM, "invd", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x08 */ - { NOGROUP, CPU_I486, ITYPE_SYSTEM, "wbinvd", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x09 */ - { NOINSTR }, /* 0x0A */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_INVALID, "undef" /* aka UD2 */, NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x0B */ - { NOINSTR }, /* 0x0C */ - { X86_Group_P, GROUP }, /* 0x0D */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "femms", { OPTYPE_FPU_TAG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x0E */ - { X86_3DNOW_0F, EXT_SUFFIX(AMODE_P | OPTYPE_q, AMODE_Q | OPTYPE_q, 0) }, /* 0x0F */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movups", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x10 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movups", { AMODE_W | OPTYPE_ps | OP_DST, AMODE_V | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x11 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movlps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x12 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movlps", { AMODE_M | OPTYPE_q | OP_DST, AMODE_V | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x13 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "unpcklps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x14 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "unpckhps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x15 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movhps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x16 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movhps", { AMODE_M | OPTYPE_q | OP_DST, AMODE_V | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x17 */ - { X86_Group_17, GROUP }, /* 0x18 */ - { NOINSTR }, /* 0x19 */ - { NOINSTR }, /* 0x1A */ - { NOINSTR }, /* 0x1B */ - { NOINSTR }, /* 0x1C */ - { NOINSTR }, /* 0x1D */ - { NOINSTR }, /* 0x1E */ - { NOINSTR }, /* 0x1F */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_R | OPTYPE_dq | OP_DST, AMODE_C | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x20 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_R | OPTYPE_dq | OP_DST, AMODE_D | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x21 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_C | OPTYPE_dq | OP_DST, AMODE_R | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x22 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_D | OPTYPE_dq | OP_DST, AMODE_R | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x23 */ - { NOINSTR }, /* 0x24 */ - //{ NOGROUP, CPU_I486, ITYPE_MOV, "mov", { AMODE_R | OPTYPE_d | OP_DST, AMODE_T | OPTYPE_d | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x24 */ - { NOINSTR }, /* 0x25 */ - { NOINSTR }, /* 0x26 */ - //{ NOGROUP, CPU_I486, ITYPE_MOV, "mov", { AMODE_T | OPTYPE_d | OP_DST, AMODE_R | OPTYPE_d | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x26 */ - { NOINSTR }, /* 0x27 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movaps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x28 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movaps", { AMODE_W | OPTYPE_ps | OP_DST, AMODE_V | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x29 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "cvtpi2ps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x2A */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movntps", { AMODE_M | OPTYPE_o | OP_DST, AMODE_V | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x2B */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "cvttps2pi", { AMODE_P | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x2C */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "cvtps2pi", { AMODE_P | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x2D */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_CMP, "ucomiss", { AMODE_V | OPTYPE_ss | OP_SRC, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_CF_MOD | FLAG_PF_MOD | FLAG_OF_CLR | FLAG_SF_CLR | FLAG_AF_CLR, NOACTION, IGNORED }, /* 0x2E */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_CMP, "comiss", { AMODE_V | OPTYPE_ps | OP_SRC, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_CF_MOD | FLAG_PF_MOD | FLAG_OF_CLR | FLAG_SF_CLR | FLAG_AF_CLR, NOACTION, IGNORED }, /* 0x2F */ - { NOGROUP, CPU_PENTIUM, ITYPE_SYSTEM, "wrmsr", { OPTYPE_REG_ECX | OP_MSR | OP_DST, OPTYPE_EDX_HI_EAX_LO | OP_SRC, 0 } , NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x30 */ - { NOGROUP, CPU_PENTIUM, ITYPE_SYSTEM, "rdtsc", { OPTYPE_EDX_HI_EAX_LO | OP_DST, OPTYPE_TSC | OP_MSR | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x31 */ - { NOGROUP, CPU_PENTIUM, ITYPE_SYSTEM, "rdmsr", { OPTYPE_EDX_HI_EAX_LO | OP_DST, OPTYPE_REG_ECX | OP_MSR | OP_SRC, 0 } , NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x32 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_OTHER, "rdpmc", { OPTYPE_EDX_HI_EAX_LO | OP_DST, OPTYPE_REG_ECX | OP_SYS | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x33 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSCALL, "sysenter", { OPTYPE_CS_MSR | OP_MSR | OP_SRC, OPTYPE_EIP_MSR | OP_MSR | OP_SRC, OPTYPE_ESP_MSR | OP_MSR | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x34 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSCALLRET, "sysexit", { OPTYPE_CS_MSR | OP_MSR | OP_SRC, OPTYPE_EIP_MSR | OP_MSR | OP_SRC, OPTYPE_ESP_MSR | OP_MSR | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x35 */ - { NOINSTR }, /* 0x36 */ - { NOINSTR }, /* 0x37 */ - { NOINSTR }, /* 0x38 */ - { NOINSTR }, /* 0x39 */ - { NOINSTR }, /* 0x3A */ - { NOINSTR }, /* 0x3B */ - { NOINSTR }, /* 0x3C */ - { NOINSTR }, /* 0x3D */ - { NOINSTR }, /* 0x3E */ - { NOINSTR }, /* 0x3F */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovo", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_O, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x40 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovno", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_NO, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x41 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovc", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_C, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x42 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovnc", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_NC, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x43 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovz", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_Z, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x44 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovnz", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_NZ, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x45 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovbe", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_BE, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x46 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmova", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_A, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x47 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovs", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_S, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x48 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovns", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_NS, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x49 */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovpe", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_PE, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x4A */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovpo", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_PO, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x4B */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovl", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_L, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x4C */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovge", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_GE, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x4D */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovle", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_LE, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x4E */ - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_MOVCC, "cmovg", { AMODE_G | OPTYPE_v | OP_COND_DST, AMODE_E | OPTYPE_v | OP_COND_SRC, 0 }, COND_G, NOCHANGE, OP1_DST | OP2_SRC, NOACTION }, /* 0x4F */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "movmskps", { AMODE_G | OPTYPE_d | OP_DST, AMODE_VR | OPTYPE_ps| OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x50 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "sqrtps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x51 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "rsqrtps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x52 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "rcpps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x53 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_AND, "andps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x54 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_AND, "andnps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x55 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_OR, "orps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x56 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_XOR, "xorps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x57 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_ADD, "addps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x58 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MUL, "mulps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x59 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtps2pd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5A */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtdq2ps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5B */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_SUB, "subps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5C */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "minps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5D */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_DIV, "divps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5E */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "maxps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x5F */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "punpcklbw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_d | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x60 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "punpcklwd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_d | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x61 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "punpckldq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_d | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x62 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "packsswb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x63 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_CMP, "pcmpgtb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x64 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_CMP, "pcmpgtw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x65 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_CMP, "pcmpgtd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x66 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "packuswb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x67 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "punpckhbw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_d | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x68 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "punpckhwd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_d | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x69 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "punpckhdq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_d | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x6A */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "packssdw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x6B */ - { NOINSTR }, /* 0x6C */ - { NOINSTR }, /* 0x6D */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_MOV, "movd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_E | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x6E */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_MOV, "movq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x6F */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "pshufw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x70 */ - { X86_Group_13, GROUP }, /* 0x71 */ - { X86_Group_14, GROUP }, /* 0x72 */ - { X86_Group_15, GROUP }, /* 0x73 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_CMP, "pcmpeqb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x74 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_CMP, "pcmpeqw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x75 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_CMP, "pcmpeqd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x76 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "emms", { OPTYPE_FPU_TAG | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x77 */ - { NOINSTR }, /* 0x78 */ - { NOINSTR }, /* 0x79 */ - { NOINSTR }, /* 0x7A */ - { NOINSTR }, /* 0x7B */ - { NOINSTR }, /* 0x7C */ - { NOINSTR }, /* 0x7D */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_MOV, "movd", { AMODE_E | OPTYPE_dq | OP_DST, AMODE_P | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x7E */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_MOV, "movq", { AMODE_Q | OPTYPE_q | OP_DST, AMODE_P | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x7F */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jo", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_O, NOCHANGE, OP1_DST, NOACTION }, /* 0x80 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jno", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_NO, NOCHANGE, OP1_DST, NOACTION }, /* 0x81 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jb", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_C, NOCHANGE, OP1_DST, NOACTION }, /* 0x82 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jnb", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_NC, NOCHANGE, OP1_DST, NOACTION }, /* 0x83 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jz", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_Z, NOCHANGE, OP1_DST, NOACTION }, /* 0x84 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jnz", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_NZ, NOCHANGE, OP1_DST, NOACTION }, /* 0x85 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jbe", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_BE, NOCHANGE, OP1_DST, NOACTION }, /* 0x86 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "ja", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_A, NOCHANGE, OP1_DST, NOACTION }, /* 0x87 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "js", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_S, NOCHANGE, OP1_DST, NOACTION }, /* 0x88 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jns", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_NS, NOCHANGE, OP1_DST, NOACTION }, /* 0x89 */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jpe", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_PE, NOCHANGE, OP1_DST, NOACTION }, /* 0x8A */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jpo", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_PO, NOCHANGE, OP1_DST, NOACTION }, /* 0x8B */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jl", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_L, NOCHANGE, OP1_DST, NOACTION }, /* 0x8C */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jge", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_GE, NOCHANGE, OP1_DST, NOACTION }, /* 0x8D */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jle", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_LE, NOCHANGE, OP1_DST, NOACTION }, /* 0x8E */ - { NOGROUP, CPU_I386, ITYPE_BRANCHCC, "jg", { AMODE_J | OPTYPE_z | OP_SRC | OP_COND_EXEC, 0, 0 }, COND_G, NOCHANGE, OP1_DST, NOACTION }, /* 0x8F */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "seto", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_O, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x90 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setno", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_NO, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x91 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setb", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_C, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x92 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setnb", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_NC, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x93 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "sete", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_Z, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x94 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setne", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_NZ, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x95 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setbe", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_BE, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x96 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "seta", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_A, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x97 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "sets", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_S, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x98 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setns", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_NS, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x99 */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setpe", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_PE, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x9A */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setpo", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_PO, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x9B */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setl", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_L, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x9C */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setge", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_GE, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x9D */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setle", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_LE, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x9E */ - { NOGROUP, CPU_I386, ITYPE_MOVCC, "setg", { AMODE_E | OPTYPE_b | OP_COND_DST, OPTYPE_1 | OP_COND_SRC, OPTYPE_0 | OP_COND_SRC }, COND_G, NOCHANGE, OP1_DST | OP2_SRC, OP1_DST | OP3_SRC }, /* 0x9F */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OPTYPE_FS | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA0 */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OPTYPE_FS | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA1 */ - { NOGROUP, CPU_PENTIUM, ITYPE_CPUID, "cpuid", { OPTYPE_EDX_ECX_EBX_EAX | OP_DST, OPTYPE_REG_xAX_BIG | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA2 */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "bt", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xA3 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "shld", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xA4 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "shld", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, OPTYPE_REG_CL | OP_SRC }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xA5 */ - { NOINSTR }, /* 0xA6 */ - { NOINSTR }, /* 0xA7 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { OPTYPE_GS | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA8 */ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { OPTYPE_GS | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xA9 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "rsm", NOARGS, NOCOND, FLAG_ALL_MOD, NOACTION, IGNORED }, /* 0xAA */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "bts", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xAB */ - { NOGROUP, CPU_I386, ITYPE_SHR, "shrd", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xAC */ - { NOGROUP, CPU_I386, ITYPE_SHR, "shrd", { AMODE_E | OPTYPE_v | OP_DST, AMODE_G | OPTYPE_v | OP_SRC, OPTYPE_REG_CL | OP_SRC }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xAD */ - { X86_Group_16, GROUP }, /* 0xAE */ - { NOGROUP, CPU_I386, ITYPE_MUL, "imul", { AMODE_G | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_v | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xAF */ - { NOGROUP, CPU_I486, ITYPE_XCHGCC, "cmpxchg", { AMODE_E | OPTYPE_b | OP_SRC | OP_COND_DST, OPTYPE_REG_AL | OP_SRC | OP_COND_DST, AMODE_G | OPTYPE_b | OP_COND_SRC }, COND_OP1_EQ_OP2, FLAG_COMMON_MOD, OP1_DST | OP3_SRC, OP2_DST | OP1_SRC }, /* 0xB0 */ - { NOGROUP, CPU_I486, ITYPE_XCHGCC, "cmpxchg", { AMODE_E | OPTYPE_v | OP_SRC | OP_COND_DST, OPTYPE_REG_xAX_BIG | OP_SRC | OP_COND_DST, AMODE_G | OPTYPE_v | OP_COND_SRC }, COND_OP1_EQ_OP2, FLAG_COMMON_MOD, OP1_DST | OP3_SRC, OP2_DST | OP1_SRC }, /* 0xB1 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "lss", { AMODE_G | OPTYPE_z | OP_DST, AMODE_M | OPTYPE_p | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB2 */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "btr", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xB3 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "lfs", { AMODE_G | OPTYPE_z | OP_DST, AMODE_M | OPTYPE_p | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB4 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "lgs", { AMODE_G | OPTYPE_z | OP_DST, AMODE_M | OPTYPE_p | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB5 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "movzx", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB6 */ - { NOGROUP, CPU_I386, ITYPE_MOV, "movzx", { AMODE_G | OPTYPE_v | OP_DST, AMODE_E | OPTYPE_w | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xB7 */ - { NOINSTR }, /* 0xB8 */ - { X86_Group_11, GROUP }, /* 0xB9 */ - { X86_Group_8, GROUP }, /* 0xBA */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "btc", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_G | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0xBB */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "bsf", { AMODE_G | OPTYPE_v | OP_SRC, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD, NOACTION, IGNORED }, /* 0xBC */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "bsr", { AMODE_G | OPTYPE_v | OP_SRC, AMODE_E | OPTYPE_v | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD, NOACTION, IGNORED }, /* 0xBD */ - { NOGROUP, CPU_I386, ITYPE_MOV, "movsx", { AMODE_G | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xBE */ - { NOGROUP, CPU_I386, ITYPE_MOV, "movsx", { AMODE_G | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_w | OP_SIGNED | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xBF */ - { NOGROUP, CPU_I486, ITYPE_XCHGADD, "xadd", { AMODE_E | OPTYPE_b | OP_SRC | OP_DST, AMODE_G | OPTYPE_b | OP_SRC | OP_DST, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0xC0 */ - { NOGROUP, CPU_I486, ITYPE_XCHGADD, "xadd", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, AMODE_G | OPTYPE_v | OP_SRC | OP_DST, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0xC1 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_CMP, "cmpps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0xC2 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movnti", { AMODE_M | OPTYPE_dq | OP_DST, AMODE_G | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC3 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pinsrw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_E | OPTYPE_w | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC4 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pextrw", { AMODE_G | OPTYPE_d | OP_DST, AMODE_PR | OPTYPE_q | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC5 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "shufps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC6 */ - { X86_Group_9, GROUP }, /* 0xC7 */ - { NOGROUP, CPU_I486, ITYPE_XCHG, "bswap", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC8 */ - { NOGROUP, CPU_I486, ITYPE_XCHG, "bswap", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC9 */ - { NOGROUP, CPU_I486, ITYPE_XCHG, "bswap", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCA */ - { NOGROUP, CPU_I486, ITYPE_XCHG, "bswap", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCB */ - { NOGROUP, CPU_I486, ITYPE_XCHG, "bswap", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCC */ - { NOGROUP, CPU_I486, ITYPE_XCHG, "bswap", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCD */ - { NOGROUP, CPU_I486, ITYPE_XCHG, "bswap", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCE */ - { NOGROUP, CPU_I486, ITYPE_XCHG, "bswap", { OP_REG | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xCF */ - { NOINSTR }, /* 0xD0 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrlw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD1 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrld", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD2 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrlq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD3 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_ADD, "paddq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD4 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_MUL, "pmullw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD5 */ - { NOINSTR }, /* 0xD6 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pmovmskb", { AMODE_G | OPTYPE_d | OP_DST, AMODE_PR | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD7 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_SUB, "psubusb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD8 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_SUB, "psubusw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xD9 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pminub", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xDA */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_AND, "pand", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xDB */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_ADD, "paddusb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xDC */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_ADD, "paddusw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xDD */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pmaxub", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xDE */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_AND, "pandn", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xDF */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pavgb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE0 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psraw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE1 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrad", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE2 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pavgw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE3 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MUL, "pmulhuw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE4 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_MUL, "pmulhw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE5 */ - { NOINSTR }, /* 0xE6 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MOV, "movntq", { AMODE_M | OPTYPE_q | OP_DST, AMODE_P | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE7 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_SUB, "psubsb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE8 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_SUB, "psubsw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xE9 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pminsw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEA */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_OR, "por", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEB */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_ADD, "paddsb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEC */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_ADD, "paddsw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xED */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "pmaxsw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEE */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_XOR, "pxor", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xEF */ - { NOINSTR }, /* 0xF0 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psllw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF1 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "pslld", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF2 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psllq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF3 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_MUL, "pmuludq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF4 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_ADD, "pmaddwd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF5 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "psadbw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF6 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "maskmovq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_PR | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF7 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_SUB, "psubb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF8 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_SUB, "psubw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xF9 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_SUB, "psubd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xFA */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_SUB, "psubq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xFB */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_ADD, "paddb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xFC */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_ADD, "paddw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xFD */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX_ADD, "paddd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xFE */ - { NOINSTR } /* 0xFF */, -}; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// Groups -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -X86_OPCODE X86_Group_1_80[8] = // 80 -{ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { AMODE_E | OPTYPE_b | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_1_81[8] = // 81 -{ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_1_82[8] = // 82 -{ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_SRC, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_1_83[8] = // 83 -{ - { NOGROUP, CPU_I386, ITYPE_ADD, "add", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_OR, "or", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ADD, "adc", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sbb", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_AND, "and", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SUB, "sub", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_XOR, "xor", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_CMP, "cmp", { AMODE_E | OPTYPE_v | OP_SIGNED | OP_SRC, AMODE_I | OPTYPE_b | OP_SIGNED | OP_SRC, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_2_C0[8] = // C0 -{ - { NOGROUP, CPU_I386, ITYPE_ROL, "rol", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "ror", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ROL, "rcl", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "rcr", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "shl", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "shr", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "sal", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "sar", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_2_C1[8] = // C1 -{ - { NOGROUP, CPU_I386, ITYPE_ROL, "rol", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "ror", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ROL, "rcl", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "rcr", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "shl", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "shr", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "sal", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "sar", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_2_D0[8] = // D0 -{ - { NOGROUP, CPU_I386, ITYPE_ROL, "rol", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "ror", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ROL, "rcl", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "rcr", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "shl", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "shr", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "sal", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "sar", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_2_D1[8] = // D1 -{ - { NOGROUP, CPU_I386, ITYPE_ROL, "rol", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "ror", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ROL, "rcl", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "rcr", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "shl", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "shr", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "sal", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "sar", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_1 | OP_SRC, 0 }, NOCOND, FLAG_OF_MOD | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_2_D2[8] = // D2 -{ - { NOGROUP, CPU_I386, ITYPE_ROL, "rol", { AMODE_E | OPTYPE_b | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "ror", { AMODE_E | OPTYPE_b | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ROL, "rcl", { AMODE_E | OPTYPE_b | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "rcr", { AMODE_E | OPTYPE_b | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "shl", { AMODE_E | OPTYPE_b | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "shr", { AMODE_E | OPTYPE_b | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "sal", { AMODE_E | OPTYPE_b | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "sar", { AMODE_E | OPTYPE_b | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_2_D3[8] = // D3 -{ - { NOGROUP, CPU_I386, ITYPE_ROL, "rol", { AMODE_E | OPTYPE_v | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "ror", { AMODE_E | OPTYPE_v | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_ROL, "rcl", { AMODE_E | OPTYPE_v | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_ROR, "rcr", { AMODE_E | OPTYPE_v | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "shl", { AMODE_E | OPTYPE_v | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "shr", { AMODE_E | OPTYPE_v | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_SHL, "sal", { AMODE_E | OPTYPE_v | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_SHR, "sar", { AMODE_E | OPTYPE_v | OP_DST, OPTYPE_REG_CL | OP_SRC, 0 }, NOCOND, FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_3_F6[8] = // F6 -{ - { NOGROUP, CPU_I386, ITYPE_TEST, "test", { AMODE_E | OPTYPE_b | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_TEST, "test", { AMODE_E | OPTYPE_b | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_NOT, "not", { AMODE_E | OPTYPE_b | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_NEG, "neg", { AMODE_E | OPTYPE_b | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_MUL, "mul", { OPTYPE_REG_AX | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, OPTYPE_REG_AL | OP_SRC }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_MUL, "imul", { OPTYPE_REG_AX | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_b | OP_SIGNED | OP_SRC, OPTYPE_REG_AL | OP_SIGNED | OP_SRC }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_DIV, "div", { OPTYPE_REG_AX | OP_DST, AMODE_E | OPTYPE_b | OP_SRC, OPTYPE_REG_AX | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_DIV, "idiv", { OPTYPE_REG_AX | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_b | OP_SIGNED | OP_SRC, OPTYPE_REG_AX | OP_SIGNED | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED } /* 0x07 */, -}; - -X86_OPCODE X86_Group_3_F7[8] = // F7 -{ - { NOGROUP, CPU_I386, ITYPE_TEST, "test", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_TEST, "test", { AMODE_E | OPTYPE_v | OP_SRC, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, FLAG_OF_CLR | FLAG_SF_MOD | FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_CLR, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_NOT, "not", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_NEG, "neg", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_MUL, "mul", { OPTYPE_xDX_HI_xAX_LO | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, OPTYPE_REG_xAX_BIG | OP_SRC }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_MUL, "imul", { OPTYPE_xDX_HI_xAX_LO | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_v | OP_SIGNED | OP_SRC, OPTYPE_REG_xAX_BIG | OP_SRC }, NOCOND, FLAG_OF_MOD | FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_DIV, "div", { OPTYPE_xDX_HI_xAX_LO | OP_DST, AMODE_E | OPTYPE_v | OP_SRC, OPTYPE_REG_xAX_BIG | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_DIV, "idiv", { OPTYPE_xDX_HI_xAX_LO | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_v | OP_SIGNED | OP_SRC, OPTYPE_REG_xAX_BIG | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_4[8] = // FE -{ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { AMODE_E | OPTYPE_b | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { AMODE_E | OPTYPE_b | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR } /* 0x07 */ -}; - -X86_OPCODE X86_Group_5[8] = // FF -{ - { NOGROUP, CPU_I386, ITYPE_INC, "inc", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_DEC, "dec", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, 0, 0 }, NOCOND, FLAG_OF_MOD|FLAG_SF_MOD|FLAG_ZF_MOD|FLAG_AF_MOD|FLAG_PF_MOD, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_CALL, "call", { AMODE_E | OPTYPE_v | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_CALL, "call", { AMODE_E | OPTYPE_p | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_BRANCH, "jmp", { AMODE_E | OPTYPE_v | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_BRANCH, "jmp", { AMODE_E | OPTYPE_p | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_PUSH, "push", { AMODE_E | OPTYPE_v | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_6[8] = // 0F 00 -{ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "sldt", { AMODE_E | OPTYPE_mw | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "str", { AMODE_E | OPTYPE_mw | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "lldt", { AMODE_E | OPTYPE_w | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "ltr", { AMODE_E | OPTYPE_w | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "verr", { AMODE_E | OPTYPE_w | OP_SRC, 0, 0 }, NOCOND, FLAG_ZF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "verw", { AMODE_E | OPTYPE_w | OP_SRC, 0, 0 }, NOCOND, FLAG_ZF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_IA64, ITYPE_BRANCH, "jmpe", { AMODE_E | OPTYPE_v | OP_SRC | OP_EXEC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOINSTR } /* 0x07 */ -}; - -X86_OPCODE X86_Group_7[8] = // 0F 01 -{ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "sgdt", { AMODE_M | OPTYPE_dt | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "sidt", { AMODE_M | OPTYPE_dt | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "lgdt", { AMODE_M | OPTYPE_dt | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "lidt", { AMODE_M | OPTYPE_dt | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "smsw", { AMODE_E | OPTYPE_mw | OP_DST, OPTYPE_CR0 | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "lmsw", { OPTYPE_CR0 | OP_DST, AMODE_E | OPTYPE_w | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I486, ITYPE_SYSTEM, "invlpg", { AMODE_M | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_8[8] = // 0F BA -{ - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "bt", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "bts", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "btr", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_BITTEST, "btc", { AMODE_E | OPTYPE_v | OP_SRC | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, FLAG_CF_MOD, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_9[8] = // 0F C7 -{ - { NOINSTR }, /* 0x00 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_XCHGCC, "cmpxchg8b", { AMODE_M | OPTYPE_q | OP_SRC | OP_COND_DST, OPTYPE_xDX_HI_xAX_LO | OP_SRC | OP_COND_DST, OPTYPE_xCX_HI_xBX_LO | OP_COND_SRC }, COND_OP1_EQ_OP2, FLAG_ZF_MOD, OP1_DST | OP3_SRC, OP2_DST | OP1_SRC }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_10[8] = // 8F (NOTE: AMD64 labels this Group 1A) -{ - { NOGROUP, CPU_I386, ITYPE_POP, "pop", { AMODE_E | OPTYPE_v | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_11[8] = // 0F B9 (NOTE: AMD64 labels this Group 10) -{ - { NOGROUP, CPU_I386, ITYPE_INVALID, "undef", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_I386, ITYPE_INVALID, "undef", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_I386, ITYPE_INVALID, "undef", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_I386, ITYPE_INVALID, "undef", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_I386, ITYPE_INVALID, "undef", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_I386, ITYPE_INVALID, "undef", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_I386, ITYPE_INVALID, "undef", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_I386, ITYPE_INVALID, "undef", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED } /* 0x07 */ -}; - -X86_OPCODE X86_Group_12_C6[8] = // C6 (NOTE: AMD64 labels this Group 11) -{ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_E | OPTYPE_b | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0xC6 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_12_C7[8] = // C7 (NOTE: AMD64 labels this Group 11) -{ - { NOGROUP, CPU_I386, ITYPE_MOV, "mov", { AMODE_E | OPTYPE_v | OP_DST, AMODE_I | OPTYPE_z | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -// NOTE: the X86_SSE2_* is only followed if it is a 3-byte opcode (e.g., prefix is 66, F2, or F3) -X86_OPCODE X86_Group_13[8] = // 0F 71 (NOTE: AMD64 labels this Group 12) -{ - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrlw", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psraw", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psllw", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_14[8] = // 0F 72 (NOTE: AMD64 labels this Group 13) -{ - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrld", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrad", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "pslld", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_15[8] = // 0F 73 (NOTE: AMD64 labels this Group 14) -{ - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrlq", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psrldq", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "psllq", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_MMX, "pslldq", { AMODE_PR | OPTYPE_q | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED } /* 0x07 */ -}; - -X86_OPCODE X86_Group_16[8] = // 0F AE (NOTE: AMD64 labels this Group 15) -{ - { NOGROUP, CPU_PENTIUM2, ITYPE_FPU, "fxsave", { AMODE_M | OPTYPE_fst2 | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_FPU, "fxrstor", { AMODE_M | OPTYPE_fst2 | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "ldmxcsr", { AMODE_M | OPTYPE_d | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "stmxcsr", { AMODE_M | OPTYPE_d | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "lfence", NOARGS, NOCOND, NOCHANGE, SERIALIZE_READ, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "mfence", NOARGS, NOCOND, NOCHANGE, SERIALIZE_ALL, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "sfence", NOARGS, NOCOND, NOCHANGE, SERIALIZE_WRITE, IGNORED } /* 0x07 */ -}; - -X86_OPCODE X86_Group_17[8] = // 0F 18 (NOTE: AMD64 labels this Group 16) -{ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "prefetchnta", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x00 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "prefetcht0", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "prefetcht1", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "prefetcht2", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x03 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "hintnop", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x04 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "hintnop", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x05 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "hintnop", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_PENTIUM2, ITYPE_SYSTEM, "hintnop", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x07 */ -}; - -X86_OPCODE X86_Group_P[8] = // 0F 0D -{ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "prefetch", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x01 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "prefetchw", { AMODE_E | OPTYPE_b | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// FPU (ESC) opcodes -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - - -X86_OPCODE X86_ESC_0[0x48] = // D8 -{ - // - // ModRM < C0 - // Index 0x00-0x07 = opcode extension - // - - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_ss | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x00 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_ss | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x01 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { AMODE_M | OPTYPE_ss | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // 0x02 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { AMODE_M | OPTYPE_ss | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // 0x03 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_ss | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x04 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_ss | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x05 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_ss | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x06 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_ss | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x07 - - // - // ModRM >= C0: ST(0) <- ST(0) + ST(i) - // Index 0x08-0x47 = ModRM 0xC0-0xFF - // - - // C0-C7 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x7 - // C8-CF - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - // D0-D7 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x7 - // D8-DF - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xF - // E0-E7 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x7 - // E8-EF - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xF - // F0-F7 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x7 - // F8-FF - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED } // xF -}; - - -X86_OPCODE X86_ESC_1[0x48] = // D9 -{ - // - // ModRM < C0 - // Index 0x00-0x07 = opcode extension - // - - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { AMODE_M | OPTYPE_ss | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // 0x00 - { NOINSTR }, // 0x01 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { AMODE_M | OPTYPE_ss | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x02 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { AMODE_M | OPTYPE_ss | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // 0x03 - { NOGROUP, CPU_I287, ITYPE_FLOADENV, "fldenv", { AMODE_M | OPTYPE_fev | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // 0x04 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fldcw", { OPTYPE_FPU_CONTROL | OP_DST, AMODE_M | OPTYPE_w | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // 0x05 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstenv", { AMODE_M | OPTYPE_fev | OP_DST, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // 0x06 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fnstcw", { AMODE_M | OPTYPE_w | OP_DST, OPTYPE_FPU_CONTROL | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // 0x07 - - // - // ModRM >= C0 - // Index 0x08-0x47 = ModRM 0xC0-0xFF - // - - // C0-C7 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { OPTYPE_STx | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { OPTYPE_STx | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { OPTYPE_STx | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { OPTYPE_STx | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { OPTYPE_STx | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { OPTYPE_STx | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { OPTYPE_STx | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { OPTYPE_STx | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x7 - // C8-CF - { NOGROUP, CPU_I287, ITYPE_FEXCH, "fxch", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC | OP_DST, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FEXCH, "fxch", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC | OP_DST, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FEXCH, "fxch", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC | OP_DST, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FEXCH, "fxch", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC | OP_DST, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FEXCH, "fxch", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC | OP_DST, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FEXCH, "fxch", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC | OP_DST, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FEXCH, "fxch", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC | OP_DST, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FEXCH, "fxch", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_STx | OP_SRC | OP_DST, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xF - // D0-D7 - { NOGROUP, CPU_I287, ITYPE_FPU, "fnop", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // D8-DF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - // E0-E7 - { NOGROUP, CPU_I287, ITYPE_FPU, "fchs", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FPU, "fabs", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOGROUP, CPU_I287, ITYPE_FPU, "ftst", { OPTYPE_ST0 | OP_SRC, OPTYPE_FLDZ | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FPU, "fxam", { OPTYPE_ST0 | OP_SRC, 0, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // E8-EF - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld1", { OPTYPE_FLD1 | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fldl2t", { OPTYPE_FLDL2T | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fldl2e", { OPTYPE_FLDL2E | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fldpi", { OPTYPE_FLDPI | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fldlg2", { OPTYPE_FLDLG2| OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fldln2", { OPTYPE_FLDLN2 | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fldz", { OPTYPE_FLDZ | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // xE - { NOINSTR }, // xF - // F0-F7 - { NOGROUP, CPU_I287, ITYPE_FPU, "f2xm1", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FPU, "fyl2x", { OPTYPE_ST1 | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FPU, "fptan", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, FPU_C1_MOD|FPU_C2_MOD, FPU_STACK_PUSH, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FPU, "fpatan", { OPTYPE_ST1 | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC , 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FPU, "fxtract", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_ST1 | OP_DST, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x4 - { NOGROUP, CPU_I387, ITYPE_FPU, "fprem1", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_ST1 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FPU, "fdecstp", NOARGS, NOCOND, FPU_C1_MOD, FPU_STACK_DEC, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FPU, "fincstp", NOARGS, NOCOND, FPU_C1_MOD, FPU_STACK_INC, IGNORED }, // x7 - // F8-FF - { NOGROUP, CPU_I287, ITYPE_FPU, "fprem", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_ST1 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FPU, "fyl2xp1", { OPTYPE_ST1 | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FPU, "fsqrt", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FPU, "fsincos", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, FPU_C1_MOD|FPU_C2_MOD, FPU_STACK_PUSH, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FPU, "frndint", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FPU, "fscale", { OPTYPE_ST0 | OP_SRC | OP_DST, OPTYPE_ST1 | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FPU, "fsin", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, FPU_C1_MOD|FPU_C2_MOD, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FPU, "fcos", { OPTYPE_ST0 | OP_SRC | OP_DST, 0, 0 }, NOCOND, FPU_C1_MOD|FPU_C2_MOD, NOACTION, IGNORED } // xF -}; - - -X86_OPCODE X86_ESC_2[0x48] = // DA -{ - // - // ModRM < C0 - // Index 0x00-0x07 = opcode extension - // - - { NOGROUP, CPU_I287, ITYPE_FADD, "fiadd", { OPTYPE_ST0 | OP_SIGNED | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fimul", { OPTYPE_ST0 | OP_SIGNED | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "ficom", { AMODE_M | OPTYPE_sd | OP_SIGNED | OP_SRC, OPTYPE_ST0 | OP_SRC | OP_DST, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "ficomp", { AMODE_M | OPTYPE_sd | OP_SIGNED | OP_SRC, OPTYPE_ST0 | OP_SRC | OP_DST, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fisub", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fisubr", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fidiv", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fidivr", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x7 - - // - // ModRM >= C0 - // Index 0x08-0x47 = ModRM 0xC0-0xFF - // - - // C0-C7 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_B, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x0 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_B, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x1 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_B, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x2 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_B, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x3 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_B, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x4 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_B, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x5 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_B, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x6 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_B, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x7 - // C8-CF - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmove", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_E, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x8 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmove", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_E, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x9 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmove", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_E, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xA - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmove", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_E, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xB - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmove", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_E, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xC - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmove", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_E, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xD - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmove", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_E, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xE - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmove", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_E, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xF - // D0-D7 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_BE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x0 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_BE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x1 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_BE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x2 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_BE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x3 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_BE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x4 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_BE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x5 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_BE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x6 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_BE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x7 - // D8-DF - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_U, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x8 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_U, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x9 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_U, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xA - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_U, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xB - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_U, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xC - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_U, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xD - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_U, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xE - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FMOVCC, "fcmovu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_COND_SRC, 0 }, COND_U, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xF - // E0-E7 - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // E8-EF - { NOINSTR }, // x8 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucompp", { OPTYPE_ST1 | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP2, IGNORED }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - // F0-F7 - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // F8-FF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR } // xF -}; - - - -X86_OPCODE X86_ESC_3[0x48] = // DB -{ - // - // ModRM < C0 - // Index 0x00-0x07 = opcode extension - // - - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fild", { AMODE_M | OPTYPE_d | OP_SIGNED | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // 0x00 - { NOGROUP, CPU_PENTIUM4, ITYPE_FSTORE, "fisttp", { AMODE_M | OPTYPE_d | OP_SIGNED | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // 0x01 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fist", { AMODE_M | OPTYPE_d | OP_SIGNED | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x02 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fistp", { AMODE_M | OPTYPE_d | OP_SIGNED | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // 0x03 - { NOINSTR }, // 0x04 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { AMODE_M | OPTYPE_se | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // 0x05 - { NOINSTR }, // 0x06 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { AMODE_M | OPTYPE_se | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // 0x07 - - // - // ModRM >= C0 - // Index 0x08-0x47 = ModRM 0xC0-0xFF - // - - // C0-C7 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NB, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x0 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NB, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x1 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NB, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x2 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NB, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x3 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NB, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x4 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NB, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x5 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NB, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x6 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnb", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NB, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x7 - // C8-CF - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovne", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x8 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovne", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x9 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovne", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xA - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovne", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xB - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovne", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xC - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovne", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xD - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovne", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xE - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovne", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xF - // D0-D7 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NBE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x0 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NBE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x1 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NBE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x2 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NBE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x3 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NBE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x4 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NBE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x5 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NBE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x6 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnbe", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NBE, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x7 - // D8-DF - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NU, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x8 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NU, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // x9 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NU, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xA - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NU, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xB - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NU, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xC - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NU, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xD - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NU, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xE - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FPU, "fcmovnu", { OPTYPE_ST0 | OP_COND_DST, OPTYPE_STx | OP_SRC, 0 }, COND_NU, FPU_C1_MOD, OP1_DST | OP2_SRC, NOACTION }, // xF - // E0-E7 - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOGROUP, CPU_I287, ITYPE_FPU, "fnclex", { OPTYPE_FPU_STATUS | OP_DST, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FPU, "finit", { OPTYPE_FPU_STATUS | OP_DST, 0, 0 }, NOCOND, FPU_ALL_CLR, NOACTION, IGNORED }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // E8-EF - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // xF - // F0-F7 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomi", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, NOACTION, IGNORED }, // x7 - // F8-FF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR } // xF -}; - -X86_OPCODE X86_ESC_4[0x48] = // DC -{ - // - // ModRM < C0 - // Index 0x00-0x07 = opcode extension - // - - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x00 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x01 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcom", { AMODE_M | OPTYPE_sd | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // 0x02 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcomp", { AMODE_M | OPTYPE_sd | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // 0x03 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x04 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x05 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x06 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_sd | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x07 - - // - // ModRM >= C0 - // Index 0x08-0x47 = ModRM 0xC0-0xFF - // - - // C0-C7 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FADD, "fadd", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x7 - // C8-CF - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmul", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xF - // D0-D7 - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // D8-DF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - // E0-E7 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x7 - // E8-EF - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsub", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xF - // F0-F7 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivr", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x7 - // F8-FF - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdiv", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED } // xF -}; - - -X86_OPCODE X86_ESC_5[0x48] = // DD -{ - // - // ModRM < C0 - // Index 0x00-0x07 = opcode extension - // - // - - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fld", { AMODE_M | OPTYPE_sd | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_FSTORE, "fisttp", { AMODE_M | OPTYPE_d | OP_SIGNED | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { AMODE_M | OPTYPE_sd | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { AMODE_M | OPTYPE_sd | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FRESTORE, "frstor", { AMODE_M | OPTYPE_fst1 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x4 - { NOINSTR }, // x5 - { NOGROUP, CPU_I287, ITYPE_FSAVE, "fsave", { AMODE_M | OPTYPE_fst1 | OP_DST, 0 }, NOCOND, FPU_ALL_CLR, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fnstsw", { AMODE_M | OPTYPE_w | OP_DST, OPTYPE_FPU_STATUS | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x7 - - // - // ModRM >= C0 - // Index 0x08-0x47 = ModRM 0xC0-0xFF - // - - // C0-C7 - { NOGROUP, CPU_I287, ITYPE_FPU, "ffree", { OPTYPE_FPU_TAG | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FPU, "ffree", { OPTYPE_FPU_TAG | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FPU, "ffree", { OPTYPE_FPU_TAG | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FPU, "ffree", { OPTYPE_FPU_TAG | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FPU, "ffree", { OPTYPE_FPU_TAG | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FPU, "ffree", { OPTYPE_FPU_TAG | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FPU, "ffree", { OPTYPE_FPU_TAG | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FPU, "ffree", { OPTYPE_FPU_TAG | OP_DST, OPTYPE_STx | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x7 - // C8-CF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - // D0-D7 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fst", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // x7 - // D8-DF - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fstp", { OPTYPE_STx | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xF - // E0-E7 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucom", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // x7 - // E8-EF - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x8 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x9 - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fucomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xB - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xC - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xD - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xE - { NOGROUP, CPU_I387, ITYPE_FCOMP, "fucomp", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xF - // F0-F7 - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // F8-FF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR } // xF -}; - - -X86_OPCODE X86_ESC_6[0x48] = // DE -{ - // - // ModRM < C0 - // Index 0x00-0x07 = opcode extension - // - - { NOGROUP, CPU_I287, ITYPE_FADD, "fiadd", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x00 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fimul", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x01 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "ficom", { AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, NOACTION, IGNORED }, // 0x02 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "ficomp", { AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // 0x03 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fisub", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x04 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fisubr", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x05 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fidiv", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x06 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fidivr", { OPTYPE_ST0 | OP_SRC | OP_DST, AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x07 - // - // ModRM >= C0 - // Index 0x08-0x47 = ModRM 0xC0-0xFF - // - - // C0-C7 - { NOGROUP, CPU_I287, ITYPE_FADD, "faddp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FADD, "faddp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FADD, "faddp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FADD, "faddp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FADD, "faddp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FADD, "faddp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FADD, "faddp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FADD, "faddp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x7 - // C8-CF - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmulp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmulp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmulp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmulp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmulp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmulp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmulp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FMUL, "fmulp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xF - // D0-D7 - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // D8-DF - { NOINSTR }, // x8 - { NOGROUP, CPU_I287, ITYPE_FCOMP, "fcompp", { OPTYPE_ST1 | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_ALL_MOD, FPU_STACK_POP2, IGNORED }, // x9 - { NOINSTR }, // 0xA - { NOINSTR }, // 0xB - { NOINSTR }, // 0xC - { NOINSTR }, // 0xD - { NOINSTR }, // 0xE - { NOINSTR }, // 0xF - // E0-E7 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x7 - // E8-EF - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FSUB, "fsubp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xF - // F0-F7 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x0 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x1 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x2 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x3 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x4 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x5 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x6 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivrp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x7 - // F8-FF - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x8 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // x9 - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xA - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xB - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xC - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xD - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // xE - { NOGROUP, CPU_I287, ITYPE_FDIV, "fdivp", { OPTYPE_STx | OP_SRC | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED } // xF -}; - - -X86_OPCODE X86_ESC_7[0x48] = // DF -{ - // - // ModRM < C0 - // Index 0x00-0x07 = opcode extension - // - - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fild", { AMODE_M | OPTYPE_w | OP_SIGNED | OP_SRC, 0, 0}, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // 0x00 - { NOGROUP, CPU_PENTIUM4, ITYPE_FSTORE, "fisttp", { AMODE_M | OPTYPE_w | OP_SIGNED | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // 0x01 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fist", { AMODE_M | OPTYPE_w | OP_SIGNED | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, NOACTION, IGNORED }, // 0x02 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fistp", { AMODE_M | OPTYPE_w | OP_SIGNED | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // 0x03 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fbld", { AMODE_M | OPTYPE_pb | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // 0x04 - { NOGROUP, CPU_I287, ITYPE_FLOAD, "fild", { AMODE_M | OPTYPE_q | OP_SIGNED | OP_SRC, 0, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_PUSH, IGNORED }, // 0x05 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fbstp", { AMODE_M | OPTYPE_pb | OP_DST, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // 0x06 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fistp", { AMODE_M | OPTYPE_q | OP_SIGNED | OP_DST, OPTYPE_ST0 | OP_SRC, 0}, NOCOND, FPU_C1_MOD, FPU_STACK_POP, IGNORED }, // 0x07 - - // - // ModRM >= C0 - // Index 0x08-0x47 = ModRM 0xC0-0xFF - // - // C0-C7 - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // C8-CF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - // D0-D7 - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // D8-DF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - // E0-E7 - { NOGROUP, CPU_I287, ITYPE_FSTORE, "fnstsw", { OPTYPE_REG_AX | OP_DST, OPTYPE_FPU_STATUS | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - // E8-EF - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fucomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // xF - // F0-F7 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x2 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x3 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x6 - { NOGROUP, CPU_PENTIUM_PRO, ITYPE_FCOMP, "fcomip", { OPTYPE_STx | OP_SRC, OPTYPE_ST0 | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_PF_MOD | FLAG_CF_MOD | FPU_ALL_MOD, FPU_STACK_POP, IGNORED }, // x7 - // F8-FF - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR } // xF -}; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// SSE opcodes -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -X86_OPCODE X86_SSE[0x300] = -{ - // prefix 0x66 (operand size) - /* 0x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 1x */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movupd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movupd", { AMODE_W | OPTYPE_pd | OP_DST, AMODE_V | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movlpd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_M | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movlpd", { AMODE_M | OPTYPE_q | OP_DST, AMODE_V | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "unpcklpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "unpckhpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movhpd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_M | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "mpvhpd", { AMODE_M | OPTYPE_q | OP_DST, AMODE_V | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 2x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movapd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movapd", { AMODE_W | OPTYPE_o | OP_DST, AMODE_V | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtpi2pd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movntpd", { AMODE_M | OPTYPE_o | OP_DST, AMODE_V | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvttpd2pi", { AMODE_P | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtpd2pi", { AMODE_P | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_CMP, "ucomisd", { AMODE_V | OPTYPE_sd | OP_SRC, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_CF_MOD | FLAG_PF_MOD | FLAG_OF_CLR | FLAG_SF_CLR | FLAG_AF_CLR, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_CMP, "comisd", { AMODE_V | OPTYPE_pd | OP_SRC, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD | FLAG_CF_MOD | FLAG_PF_MOD | FLAG_OF_CLR | FLAG_SF_CLR | FLAG_AF_CLR, NOACTION, IGNORED }, // xF - - /* 3x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 4x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 5x */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "movmskpd", { AMODE_G | OPTYPE_d | OP_DST, AMODE_VR | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "sqrtpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_AND, "andpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_AND, "andnpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_OR, "orpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_XOR, "xorpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x7 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "addpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MUL, "mulpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtpd2ps", { AMODE_V | OPTYPE_ps | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtps2dq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "subpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "minpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_DIV, "divpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "maxpd", { AMODE_V | OPTYPE_pd | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* 6x */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "punpcklbw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "punpcklwd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "punpckldq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "packsswb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pcmpgtb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pcmpgtw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pcmpgtd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "packuswb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x7 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "punpckhbw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "punpckhwd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "punpckhdq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "packssdw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "punpcklqdq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "punpckhqdq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_E | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movdqa", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* 7x */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pshufd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { X86_SSE2_Group_13, GROUP }, // x1 - { X86_SSE2_Group_14, GROUP }, // x2 - { X86_SSE2_Group_15, GROUP }, // x3 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_CMP, "pcmpeqb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_CMP, "pcmpeqw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_CMP, "pcmpeqd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3_ADD, "haddpd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3_SUB, "hsubpd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movd", { AMODE_E | OPTYPE_dq | OP_DST, AMODE_V | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movdqa", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* 8x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 9x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Ax */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Bx */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Cx */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_CMP, "cmppd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, // x2 - { NOINSTR }, // x3 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pinsrw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_E | OPTYPE_w | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pextrw", { AMODE_G | OPTYPE_d | OP_DST, AMODE_VR| OPTYPE_o | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "shufpd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Dx */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3, "addsubpd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrlw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrld", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrlq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "paddq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MUL, "pmullw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movq", { AMODE_W | OPTYPE_q | OP_DST, AMODE_V | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pmovmskb", { AMODE_G | OPTYPE_d | OP_DST, AMODE_VR| OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x7 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "psubusb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "psubusw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pminub", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_AND, "pand", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "paddusb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "paddusw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pmaxub", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_AND, "pandn", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* Ex */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pavgb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psraw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrad", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pavgw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MUL, "pmulhuw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MUL, "pmulhw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvttpd2dq", { AMODE_V | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movntdq", { AMODE_M | OPTYPE_o | OP_DST, AMODE_V | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x7 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "psubsb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "psubsw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pminsw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_OR, "por", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "paddsb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "paddsw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pmaxuw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_XOR, "pxor", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* Fx */ - { NOINSTR }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psllw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pslld", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psllq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x3 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MUL, "pmuludq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x4 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "pmaddwd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psadbw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "maskmovdqu", { AMODE_V | OPTYPE_o | OP_DST, AMODE_VR| OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x7 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "psubb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "psubw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "psubd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "psubq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "paddb", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "paddw", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "paddd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOINSTR }, // xF - - // prefix 0xf2 (repne) - /* 0x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 1x */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movsd", { AMODE_V | OPTYPE_sdo | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movsd", { AMODE_W | OPTYPE_sd | OP_DST, AMODE_V | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3_MOV, "movddup", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 2x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtsi2sd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_E | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOINSTR }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvttsd2si", { AMODE_G | OPTYPE_dq | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtsd2si", { AMODE_G | OPTYPE_dq | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 3x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 4x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 5x */ - { NOINSTR }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "sqrtsd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "addsd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MUL, "mulsd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtsd2ss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOINSTR }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "subsd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "minsd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_DIV, "divsd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "maxsd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* 6x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movdqa", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* 7x */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pshuflw", { AMODE_V | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3_ADD, "haddps", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3_SUB, "hsubps", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 8x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 9x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Ax */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Bx */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Cx */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_CMP, "cmpsd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_sd | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Dx */ - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE3, "addsubps", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movdq2q", { AMODE_P | OPTYPE_q | OP_DST, AMODE_VR | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Ex */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtpd2dq", { AMODE_V | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_pd | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Fx */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3, "lddqu", { AMODE_V | OPTYPE_o | OP_DST, AMODE_M | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - // prefix 0xf3 (rep) - /* 0x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 1x */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movss", { AMODE_V | OPTYPE_sso | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movss", { AMODE_W | OPTYPE_ss | OP_DST, AMODE_V | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3_MOV, "movsldup", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE3_MOV, "movshdup", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 2x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "cvtsi2ss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_E | OPTYPE_dq | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOINSTR }, // xB - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "cvttss2si", { AMODE_G | OPTYPE_dq | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE, "cvtss2si", { AMODE_G | OPTYPE_dq | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 3x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 4x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 5x */ - { NOINSTR }, // x0 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "sqrtss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x1 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "rsqrtss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x2 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "rcpss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_ADD, "addss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MUL, "mulss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x9 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtss2sd", { AMODE_V | OPTYPE_sd | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xA - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvttps2dq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_ps | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xB - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_SUB, "subss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xC - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "minss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_DIV, "divss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "maxss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* 6x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movdqu", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* 7x */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pshufhw", { AMODE_V | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movq", { AMODE_V | OPTYPE_q | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xE - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movdqu", { AMODE_W | OPTYPE_o | OP_DST, AMODE_V | OPTYPE_o | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // xF - - /* 8x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* 9x */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Ax */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Bx */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Cx */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOGROUP, CPU_PENTIUM3, ITYPE_SSE_CMP, "cmpss", { AMODE_V | OPTYPE_ss | OP_DST, AMODE_W | OPTYPE_ss | OP_SRC, AMODE_I | OPTYPE_b | OP_SRC }, NOCOND, FLAG_COMMON_MOD, NOACTION, IGNORED }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Dx */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2_MOV, "movq2dq", { AMODE_V | OPTYPE_o | OP_DST, AMODE_PR | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Ex */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "cvtdq2pd", { AMODE_V | OPTYPE_o | OP_DST, AMODE_W | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR }, // xF - - /* Fx */ - { NOINSTR }, // x0 - { NOINSTR }, // x1 - { NOINSTR }, // x2 - { NOINSTR }, // x3 - { NOINSTR }, // x4 - { NOINSTR }, // x5 - { NOINSTR }, // x6 - { NOINSTR }, // x7 - { NOINSTR }, // x8 - { NOINSTR }, // x9 - { NOINSTR }, // xA - { NOINSTR }, // xB - { NOINSTR }, // xC - { NOINSTR }, // xD - { NOINSTR }, // xE - { NOINSTR } // xF -}; - -X86_OPCODE X86_SSE2_Group_13[24] = // 66/F2/F3 0F 71 -{ - // prefix 0x66 (operand size) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrlw", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psraw", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psllw", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ - - // prefix 0xf2 (repne) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ - - // prefix 0xf3 (rep) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -X86_OPCODE X86_SSE2_Group_14[24] = // 66/F2/F3 0F 72 -{ - // prefix 0x66 (operand size) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrld", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrad", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pslld", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ - - // prefix 0xf2 (repne) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ - - // prefix 0xf3 (rep) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -X86_OPCODE X86_SSE2_Group_15[24] = -{ - // prefix 0x66 (operand size) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrlq", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x02 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psrldq", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "psllq", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x06 */ - { NOGROUP, CPU_PENTIUM4, ITYPE_SSE2, "pslldq", { AMODE_VR | OPTYPE_o | OP_DST, AMODE_I | OPTYPE_b | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0x07 */ - - // prefix 0xf2 (repne) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ - - // prefix 0xf3 (rep) - { NOINSTR }, /* 0x00 */ - { NOINSTR }, /* 0x01 */ - { NOINSTR }, /* 0x02 */ - { NOINSTR }, /* 0x03 */ - { NOINSTR }, /* 0x04 */ - { NOINSTR }, /* 0x05 */ - { NOINSTR }, /* 0x06 */ - { NOINSTR }, /* 0x07 */ -}; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// 3DNow opcodes -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -X86_OPCODE X86_3DNOW_0F[0x100] = -{ - { NOINSTR }, /* 00 */ - { NOINSTR }, /* 01 */ - { NOINSTR }, /* 02 */ - { NOINSTR }, /* 03 */ - { NOINSTR }, /* 04 */ - { NOINSTR }, /* 05 */ - { NOINSTR }, /* 06 */ - { NOINSTR }, /* 07 */ - { NOINSTR }, /* 08 */ - { NOINSTR }, /* 09 */ - { NOINSTR }, /* 0A */ - { NOINSTR }, /* 0B */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pi2fw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0C */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pi2fd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 0D */ - { NOINSTR }, /* 0E */ - { NOINSTR }, /* 0F */ - { NOINSTR }, /* 10 */ - { NOINSTR }, /* 11 */ - { NOINSTR }, /* 12 */ - { NOINSTR }, /* 13 */ - { NOINSTR }, /* 14 */ - { NOINSTR }, /* 15 */ - { NOINSTR }, /* 16 */ - { NOINSTR }, /* 17 */ - { NOINSTR }, /* 18 */ - { NOINSTR }, /* 19 */ - { NOINSTR }, /* 1A */ - { NOINSTR }, /* 1B */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pf2iw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 1C */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pf2id", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 1D */ - { NOINSTR }, /* 1E */ - { NOINSTR }, /* 1F */ - { NOINSTR }, /* 20 */ - { NOINSTR }, /* 21 */ - { NOINSTR }, /* 22 */ - { NOINSTR }, /* 23 */ - { NOINSTR }, /* 24 */ - { NOINSTR }, /* 25 */ - { NOINSTR }, /* 26 */ - { NOINSTR }, /* 27 */ - { NOINSTR }, /* 28 */ - { NOINSTR }, /* 29 */ - { NOINSTR }, /* 2A */ - { NOINSTR }, /* 2B */ - { NOINSTR }, /* 2C */ - { NOINSTR }, /* 2D */ - { NOINSTR }, /* 2E */ - { NOINSTR }, /* 2F */ - { NOINSTR }, /* 30 */ - { NOINSTR }, /* 31 */ - { NOINSTR }, /* 32 */ - { NOINSTR }, /* 33 */ - { NOINSTR }, /* 34 */ - { NOINSTR }, /* 35 */ - { NOINSTR }, /* 36 */ - { NOINSTR }, /* 37 */ - { NOINSTR }, /* 38 */ - { NOINSTR }, /* 39 */ - { NOINSTR }, /* 3A */ - { NOINSTR }, /* 3B */ - { NOINSTR }, /* 3C */ - { NOINSTR }, /* 3D */ - { NOINSTR }, /* 3E */ - { NOINSTR }, /* 3F */ - { NOINSTR }, /* 40 */ - { NOINSTR }, /* 41 */ - { NOINSTR }, /* 42 */ - { NOINSTR }, /* 43 */ - { NOINSTR }, /* 44 */ - { NOINSTR }, /* 45 */ - { NOINSTR }, /* 46 */ - { NOINSTR }, /* 47 */ - { NOINSTR }, /* 48 */ - { NOINSTR }, /* 49 */ - { NOINSTR }, /* 4A */ - { NOINSTR }, /* 4B */ - { NOINSTR }, /* 4C */ - { NOINSTR }, /* 4D */ - { NOINSTR }, /* 4E */ - { NOINSTR }, /* 4F */ - { NOINSTR }, /* 50 */ - { NOINSTR }, /* 51 */ - { NOINSTR }, /* 52 */ - { NOINSTR }, /* 53 */ - { NOINSTR }, /* 54 */ - { NOINSTR }, /* 55 */ - { NOINSTR }, /* 56 */ - { NOINSTR }, /* 57 */ - { NOINSTR }, /* 58 */ - { NOINSTR }, /* 59 */ - { NOINSTR }, /* 5A */ - { NOINSTR }, /* 5B */ - { NOINSTR }, /* 5C */ - { NOINSTR }, /* 5D */ - { NOINSTR }, /* 5E */ - { NOINSTR }, /* 5F */ - { NOINSTR }, /* 60 */ - { NOINSTR }, /* 61 */ - { NOINSTR }, /* 62 */ - { NOINSTR }, /* 63 */ - { NOINSTR }, /* 64 */ - { NOINSTR }, /* 65 */ - { NOINSTR }, /* 66 */ - { NOINSTR }, /* 67 */ - { NOINSTR }, /* 68 */ - { NOINSTR }, /* 69 */ - { NOINSTR }, /* 6A */ - { NOINSTR }, /* 6B */ - { NOINSTR }, /* 6C */ - { NOINSTR }, /* 6D */ - { NOINSTR }, /* 6E */ - { NOINSTR }, /* 6F */ - { NOINSTR }, /* 70 */ - { NOINSTR }, /* 71 */ - { NOINSTR }, /* 72 */ - { NOINSTR }, /* 73 */ - { NOINSTR }, /* 74 */ - { NOINSTR }, /* 75 */ - { NOINSTR }, /* 76 */ - { NOINSTR }, /* 77 */ - { NOINSTR }, /* 78 */ - { NOINSTR }, /* 79 */ - { NOINSTR }, /* 7A */ - { NOINSTR }, /* 7B */ - { NOINSTR }, /* 7C */ - { NOINSTR }, /* 7D */ - { NOINSTR }, /* 7E */ - { NOINSTR }, /* 7F */ - { NOINSTR }, /* 80 */ - { NOINSTR }, /* 81 */ - { NOINSTR }, /* 82 */ - { NOINSTR }, /* 83 */ - { NOINSTR }, /* 84 */ - { NOINSTR }, /* 85 */ - { NOINSTR }, /* 86 */ - { NOINSTR }, /* 87 */ - { NOINSTR }, /* 88 */ - { NOINSTR }, /* 89 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfnacc", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 8A */ - { NOINSTR }, /* 8B */ - { NOINSTR }, /* 8C */ - { NOINSTR }, /* 8D */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfpnacc", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 8E */ - { NOINSTR }, /* 8F */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_CMP, "pfcmpge", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 90 */ - { NOINSTR }, /* 91 */ - { NOINSTR }, /* 92 */ - { NOINSTR }, /* 93 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfmin", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 94 */ - { NOINSTR }, /* 95 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfrcp", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 96 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfrsqrt", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 97 */ - { NOINSTR }, /* 98 */ - { NOINSTR }, /* 99 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_SUB, "pfsub", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 9A */ - { NOINSTR }, /* 9B */ - { NOINSTR }, /* 9C */ - { NOINSTR }, /* 9D */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_ADD, "pfadd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* 9E */ - { NOINSTR }, /* 9F */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_CMP, "pfcmpgt", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* A0 */ - { NOINSTR }, /* A1 */ - { NOINSTR }, /* A2 */ - { NOINSTR }, /* A3 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfmax", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* A4 */ - { NOINSTR }, /* A5 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfrcpit1", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* A6 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfrsqit1", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* A7 */ - { NOINSTR }, /* A8 */ - { NOINSTR }, /* A9 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_SUB, "pfsubr", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* AA */ - { NOINSTR }, /* AB */ - { NOINSTR }, /* AC */ - { NOINSTR }, /* AD */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfacc", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* AE */ - { NOINSTR }, /* AF */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_CMP, "pfcmpeq", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* B0 */ - { NOINSTR }, /* B1 */ - { NOINSTR }, /* B2 */ - { NOINSTR }, /* B3 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_MUL, "pfmul", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* B4 */ - { NOINSTR }, /* B5 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pfrcpit2", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* B6 */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_MUL, "pmulhrw", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* B7 */ - { NOINSTR }, /* B8 */ - { NOINSTR }, /* B9 */ - { NOINSTR }, /* BA */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW_XCHG, "pswapd", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* BB */ - { NOINSTR }, /* BC */ - { NOINSTR }, /* BD */ - { NOINSTR }, /* BE */ - { NOGROUP, CPU_AMD_K6_2, ITYPE_3DNOW, "pavgb", { AMODE_P | OPTYPE_q | OP_DST, AMODE_Q | OPTYPE_q | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, /* BF */ - { NOINSTR }, /* C0 */ - { NOINSTR }, /* C1 */ - { NOINSTR }, /* C2 */ - { NOINSTR }, /* C3 */ - { NOINSTR }, /* C4 */ - { NOINSTR }, /* C5 */ - { NOINSTR }, /* C6 */ - { NOINSTR }, /* C7 */ - { NOINSTR }, /* C8 */ - { NOINSTR }, /* C9 */ - { NOINSTR }, /* CA */ - { NOINSTR }, /* CB */ - { NOINSTR }, /* CC */ - { NOINSTR }, /* CD */ - { NOINSTR }, /* CE */ - { NOINSTR }, /* CF */ - { NOINSTR }, /* D0 */ - { NOINSTR }, /* D1 */ - { NOINSTR }, /* D2 */ - { NOINSTR }, /* D3 */ - { NOINSTR }, /* D4 */ - { NOINSTR }, /* D5 */ - { NOINSTR }, /* D6 */ - { NOINSTR }, /* D7 */ - { NOINSTR }, /* D8 */ - { NOINSTR }, /* D9 */ - { NOINSTR }, /* DA */ - { NOINSTR }, /* DB */ - { NOINSTR }, /* DC */ - { NOINSTR }, /* DD */ - { NOINSTR }, /* DE */ - { NOINSTR }, /* DF */ - { NOINSTR }, /* E0 */ - { NOINSTR }, /* E1 */ - { NOINSTR }, /* E2 */ - { NOINSTR }, /* E3 */ - { NOINSTR }, /* E4 */ - { NOINSTR }, /* E5 */ - { NOINSTR }, /* E6 */ - { NOINSTR }, /* E7 */ - { NOINSTR }, /* E8 */ - { NOINSTR }, /* E9 */ - { NOINSTR }, /* EA */ - { NOINSTR }, /* EB */ - { NOINSTR }, /* EC */ - { NOINSTR }, /* ED */ - { NOINSTR }, /* EE */ - { NOINSTR }, /* EF */ - { NOINSTR }, /* F0 */ - { NOINSTR }, /* F1 */ - { NOINSTR }, /* F2 */ - { NOINSTR }, /* F3 */ - { NOINSTR }, /* F4 */ - { NOINSTR }, /* F5 */ - { NOINSTR }, /* F6 */ - { NOINSTR }, /* F7 */ - { NOINSTR }, /* F8 */ - { NOINSTR }, /* F9 */ - { NOINSTR }, /* FA */ - { NOINSTR }, /* FB */ - { NOINSTR }, /* FC */ - { NOINSTR }, /* FD */ - { NOINSTR }, /* FE */ - { NOINSTR } /* FF */ -}; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// 64-bit replacement opcodes -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -X86_OPCODE X86_Opcode_63[2] = -{ - { NOGROUP, CPU_I386, ITYPE_SYSTEM, "arpl", { AMODE_E | OPTYPE_w | OP_SRC, AMODE_G | OPTYPE_w | OP_SRC, 0 }, NOCOND, FLAG_ZF_MOD, NOACTION, IGNORED }, // !ARCH_AMD64 - { NOGROUP, CPU_AMD64, ITYPE_MOV, "movsxd", { AMODE_G | OPTYPE_v | OP_SIGNED | OP_DST, AMODE_E | OPTYPE_d | OP_SIGNED | OP_SRC, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED } // ARCH_AMD64 -}; - -X86_OPCODE X86_Opcode_0F05[2] = -{ - { NOGROUP, CPU_AMD_K6_2, ITYPE_SYSCALL, "syscall", { OPTYPE_STAR_MSR | OP_MSR | OP_SRC, OPTYPE_CSTAR_MSR | OP_MSR | OP_SRC, OPTYPE_FMASK_MSR | OP_MSR | OP_SRC }, NOCOND, FLAG_ZF_MOD, NOACTION, IGNORED }, // !ARCH_AMD64 - { NOGROUP, CPU_AMD64, ITYPE_SYSCALL, "syscall", { OPTYPE_STAR_MSR | OP_MSR | OP_SRC, OPTYPE_LSTAR_MSR | OP_MSR | OP_SRC, OPTYPE_FMASK_MSR | OP_MSR | OP_SRC }, NOCOND, NOCHANGE, NOACTION, IGNORED } // ARCH_AMD64 -}; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// Other 3 byte opcodes -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -// Three byte opcodes where the third opcode byte is ModRM -X86_OPCODE X86_0F01_ModRM[0x100] = -{ - /* 0x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 1x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 2x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 3x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 4x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 5x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 6x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 7x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 8x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* 9x */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* Ax */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* Bx */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* Cx */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { NOGROUP, CPU_PRESCOTT, ITYPE_SYSTEM, "monitor", NOARGS, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { NOGROUP, CPU_PRESCOTT, ITYPE_SYSTEM, "mwait", NOARGS, NOCOND, NOCHANGE, SERIALIZE_ALL, IGNORED }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* Dx */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* Ex */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { X86_Group_7, GROUP }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP }, // xF - - /* Fx */ - { X86_Group_7, GROUP }, // x0 - { X86_Group_7, GROUP }, // x1 - { X86_Group_7, GROUP }, // x2 - { X86_Group_7, GROUP }, // x3 - { X86_Group_7, GROUP }, // x4 - { X86_Group_7, GROUP }, // x5 - { X86_Group_7, GROUP }, // x6 - { X86_Group_7, GROUP }, // x7 - { NOGROUP, CPU_AMD64, ITYPE_SYSTEM, "swapgs", { OPTYPE_KERNELBASE_MSR | OP_MSR | OP_SRC, 0, 0 }, NOCOND, NOCHANGE, NOACTION, IGNORED }, // x8 - { X86_Group_7, GROUP }, // x9 - { X86_Group_7, GROUP }, // xA - { X86_Group_7, GROUP }, // xB - { X86_Group_7, GROUP }, // xC - { X86_Group_7, GROUP }, // xD - { X86_Group_7, GROUP }, // xE - { X86_Group_7, GROUP } // xF -}; - -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// -// Sanity checking tables -///////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////// - -#define S2 1 // SSE2 -#define S3 2 // SSE3 -BYTE X86_ModRM_1[0x100] = -{ - // x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF - /* 0x */ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - /* 1x */ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - /* 2x */ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - /* 3x */ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 6x */ 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, - /* 7x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 8x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Cx */ 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - /* Dx */ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Fx */ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1 -}; -BYTE X86_ModRM_2[0x100] = -{ - // x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF - /* 0x */ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, - /* 1x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - /* 2x */ 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - /* 3x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 4x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* 5x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* 6x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* 7x */ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, - /* 8x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 9x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* Ax */ 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, - /* Bx */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, - /* Cx */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - /* Dx */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* Ex */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* Fx */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 -}; - -BYTE X86_SSE_2[0x100] = -{ - /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - /* 0x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 1x */ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 2x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, - /* 3x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 5x */ 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, - /* 7x */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, - /* 8x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Cx */ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Dx */ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Ex */ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Fx */ 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -// Indicates if a LOCK prefix is allowed -// The following are allowed: -// add, adc, and, btc, btr, bts, cmpxchg, cmpxchg8, dec, inc, -// neg, not, or, sbb, sub, xor, xadd, xchg -#define GR 2 -BYTE X86_LockPrefix_1[0x100] = -{ - // x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF - /* 0x */ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - /* 1x */ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - /* 2x */ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - /* 3x */ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 7x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 8x */ GR, GR, GR, GR, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Cx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Dx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Fx */ 0, 0, 0, 0, 0, 0, GR, GR, 0, 0, 0, 0, 0, 0, GR, GR -}; - -BYTE X86_LockPrefix_2[0x100] = -{ - // x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF - /* 0x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 1x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 2x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 3x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 7x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 8x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - /* Bx */ 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, GR, 1, 0, 0, 0, 0, - /* Cx */ 1, 1, 0, 0, 0, 0, 0, GR, 0, 0, 0, 0, 0, 0, 0, 0, - /* Dx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Fx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -BYTE X86_LockPrefix_Groups[17][8] = -{ -// x0 x1 x2 x3 x4 x5 x6 x7 - { 1, 1, 1, 1, 1, 1, 1, 0 }, // group 1 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 2 - { 0, 0, 1, 1, 0, 0, 0, 0 }, // group 3 - { 1, 1, 0, 0, 0, 0, 0, 0 }, // group 4 - { 1, 1, 0, 0, 0, 0, 0, 0 }, // group 5 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 6 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 7 - { 0, 0, 0, 0, 1, 1, 1, 1 }, // group 8 - { 0, 1, 0, 0, 0, 0, 0, 0 }, // group 9 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 10 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 11 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 12 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 13 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 14 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 15 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 16 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // group 17 -}; - -#define X86_MAX_GROUP 19 -BYTE X86_Groups_1[0x100] = // one-byte opcodes -{ - /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - /* 0x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ - /* 1x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ - /* 2x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - /* 3x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ - /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6x */ - /* 7x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ - /* 8x */ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, /* 8x */ - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9x */ - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ax */ - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ - /* Cx */ 2, 2, 0, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, /* Cx */ - /* Dx */ 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Dx */ - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ex */ - /* Fx */ 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 4, 5 /* Fx */ -}; - -// 19 = Group P -// 20 = 3DNow -BYTE X86_Groups_2[0x100] = // two-byte opcodes -{ - /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - /* 0x */ 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 19, /* 0x */ - /* 1x */ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, /* 1x */ - /* 2x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - /* 3x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ - /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6x */ - /* 7x */ 0, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ - /* 8x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8x */ - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9x */ - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, /* Ax */ - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 8, 0, 0, 0, 0, 0, /* Bx */ - /* Cx */ 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, /* Cx */ - /* Dx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Dx */ - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ex */ - /* Fx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* Fx */ -}; - -// Indicate which 1-byte opcodes are invalid with a 16-bit operand size -BYTE X86_Invalid_Op16_1[0x100] = -{ - /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - /* 0x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ - /* 1x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ - /* 2x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - /* 3x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ - /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6x */ - /* 7x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ - /* 8x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8x */ - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9x */ - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ax */ - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ - /* Cx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Cx */ - /* Dx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Dx */ - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ex */ - /* Fx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* Fx */ -}; - -// Indicate which 2-byte opcodes are invalid with a 16-bit operand size -BYTE X86_Invalid_Op16_2[0x100] = -{ - /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - /* 0x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ - /* 1x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ - /* 2x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - /* 3x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ - /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6x */ - /* 7x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ - /* 8x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8x */ - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9x */ - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ax */ - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ - /* Cx */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /* Cx */ - /* Dx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Dx */ - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ex */ - /* Fx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* Fx */ -}; - -// Indicate which 1-byte opcodes are invalid with a 64-bit address size -BYTE X86_Invalid_Addr64_1[0x100] = -{ - /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - /* 0x */ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, /* 0x */ - /* 1x */ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 1x */ - /* 2x */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, /* 2x */ - /* 3x */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, /* 3x */ - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ - /* 6x */ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6x */ - /* 7x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ - /* 8x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8x */ - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* 9x */ - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ax */ - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ - /* Cx */ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* Cx */ - /* Dx */ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Dx */ - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* Ex */ - /* Fx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* Fx */ -}; - -// Indicate which 2-byte opcodes are invalid with a 64-bit address size -BYTE X86_Invalid_Addr64_2[0x100] = -{ - /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - /* 0x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ - /* 1x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ - /* 2x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - /* 3x */ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ - /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ - /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ - /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6x */ - /* 7x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ - /* 8x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8x */ - /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9x */ - /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ax */ - /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ - /* Cx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Cx */ - /* Dx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Dx */ - /* Ex */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ex */ - /* Fx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* Fx */ -}; - -#endif // DISASM_X86_TABLES \ No newline at end of file diff --git a/renderdoc/3rdparty/mhook/disasm-lib/misc.c b/renderdoc/3rdparty/mhook/disasm-lib/misc.c deleted file mode 100644 index c5b0ac61a..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/misc.c +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright (C) 2002, Matt Conover (mconover@gmail.com) -#include "misc.h" - -BOOL IsHexChar(BYTE ch) -{ - switch (ch) - { - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - case '8': case '9': - case 'A': case 'a': case 'B': case 'b': - case 'C': case 'c': case 'D': case 'd': - case 'E': case 'e': case 'F': case 'f': - return TRUE; - default: - return FALSE; - } -} - -// NOTE: caller must free the buffer returned -BYTE *HexToBinary(char *Input, DWORD InputLength, DWORD *OutputLength) -{ - DWORD i, j, ByteCount = 0; - char temp_byte[3]; - BYTE *p, *ByteString = NULL; - - if (!InputLength || !OutputLength) return NULL; - else *OutputLength = 0; - - while (*Input && isspace(*Input)) { Input++; InputLength--; } - if (!*Input) return NULL; - if (Input[0] == '\"') { Input++; InputLength--; } - p = (BYTE *)strchr(Input, '\"'); - if (p) InputLength--; - - if (InputLength > 2 && Input[2] == ' ') // assume spaces - { - for (i = 0; i < InputLength; i += 3) - { - while (i < InputLength && isspace(Input[i])) i++; // skip over extra space, \r, and \n - if (i >= InputLength) break; - - if (!IsHexChar(Input[i])) - { - //fprintf(stderr, "ERROR: invalid hex character at offset %lu (0x%04x)\n", i, i); - goto abort; - } - - if (i+1 >= InputLength || !Input[i+1]) - { - //fprintf(stderr, "ERROR: hex string terminates unexpectedly at offset %lu (0x%04x)\n", i+1, i+1); - goto abort; - } - - if (i+2 < InputLength && Input[i+2] && !isspace(Input[i+2])) - { - //fprintf(stderr, "ERROR: Hex string is malformed at offset %lu (0x%04x)\n", i, i); - //fprintf(stderr, "Found '%c' (0x%02x) instead of space\n", Input[i+2], Input[i+2]); - goto abort; - } - - ByteCount++; - } - - if (!ByteCount) - { - //fprintf(stderr, "Error: no input (byte count = 0)\n"); - goto abort; - } - - ByteString = malloc(ByteCount+1); - if (!ByteString) - { - //fprintf(stderr, "ERROR: failed to allocate %lu bytes\n", ByteCount); - goto abort; - } - - memset(ByteString, 0, ByteCount+1); - for (i = 0, j = 0; j < ByteCount; i += 3, j++) - { - while (isspace(Input[i])) i++; // skip over extra space, \r, and \n - temp_byte[0] = Input[i]; - temp_byte[1] = Input[i+1]; - temp_byte[2] = 0; - ByteString[j] = (BYTE)strtoul(temp_byte, NULL, 16); - } - } - else if (InputLength > 2 && Input[0] == '\\') - { - for (i = 0; i < InputLength; i += 2) - { - if (Input[i] != '\\' || (Input[i+1] != 'x' && Input[i+1] != '0')) - { - //fprintf(stderr, "ERROR: invalid hex character at offset %lu (0x%04x)\n", i, i); - goto abort; - } - i += 2; - - if (!IsHexChar(Input[i])) - { - //fprintf(stderr, "ERROR: invalid hex character at offset %lu (0x%04x)\n", i, i); - goto abort; - } - if (i+1 >= InputLength || !Input[i+1]) - { - //fprintf(stderr, "ERROR: hex string terminates unexpectedly at offset %lu (0x%04x)\n", i+1, i+1); - goto abort; - } - - ByteCount++; - } - - if (!ByteCount) - { - //fprintf(stderr, "Error: no input (byte count = 0)\n"); - goto abort; - } - - ByteString = malloc(ByteCount+1); - if (!ByteString) - { - //fprintf(stderr, "ERROR: failed to allocate %lu bytes\n", ByteCount); - goto abort; - } - - memset(ByteString, 0, ByteCount+1); - for (i = j = 0; j < ByteCount; i += 2, j++) - { - i += 2; - temp_byte[0] = Input[i]; - temp_byte[1] = Input[i+1]; - temp_byte[2] = 0; - ByteString[j] = (BYTE)strtoul(temp_byte, NULL, 16); - } - } - else // assume it is a hex string with no spaces with 2 bytes per character - { - for (i = 0; i < InputLength; i += 2) - { - if (!IsHexChar(Input[i])) - { - //fprintf(stderr, "ERROR: invalid hex character at offset %lu (0x%04x)\n", i, i); - goto abort; - } - if (i+1 >= InputLength || !Input[i+1]) - { - //fprintf(stderr, "ERROR: hex string terminates unexpectedly at offset %lu (0x%04x)\n", i+1, i+1); - goto abort; - } - - ByteCount++; - } - - if (!ByteCount) - { - //fprintf(stderr, "Error: no input (byte count = 0)\n"); - goto abort; - } - - ByteString = malloc(ByteCount+1); - if (!ByteString) - { - //fprintf(stderr, "ERROR: failed to allocate %lu bytes\n", ByteCount); - goto abort; - } - - memset(ByteString, 0, ByteCount+1); - for (i = 0, j = 0; j < ByteCount; i += 2, j++) - { - temp_byte[0] = Input[i]; - temp_byte[1] = Input[i+1]; - temp_byte[2] = 0; - ByteString[j] = (BYTE)strtoul(temp_byte, NULL, 16); - } - } - - *OutputLength = ByteCount; - return ByteString; - -abort: - if (OutputLength) *OutputLength = 0; - if (ByteString) free(ByteString); - return NULL; -} - diff --git a/renderdoc/3rdparty/mhook/disasm-lib/misc.h b/renderdoc/3rdparty/mhook/disasm-lib/misc.h deleted file mode 100644 index b3f585b75..000000000 --- a/renderdoc/3rdparty/mhook/disasm-lib/misc.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (C) 2002, Matt Conover (mconover@gmail.com) -#ifndef MISC_H -#define MISC_H -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include -#include - -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) - -// NOTE: start is inclusive, end is exclusive (as in start <= x < end) -#define IS_IN_RANGE(x, s, e) \ -( \ - ((ULONG_PTR)(x) == (ULONG_PTR)(s) && (ULONG_PTR)(x) == (ULONG_PTR)(e)) || \ - ((ULONG_PTR)(x) >= (ULONG_PTR)(s) && (ULONG_PTR)(x) < (ULONG_PTR)(e)) \ -) - -#if _MSC_VER >= 1400 -#pragma warning(disable:4996) -#endif - -#if defined(_WIN64) - #define VALID_ADDRESS_MAX 0x7FFEFFFFFFFFFFFF // Win64 specific - typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; -#else - #define VALID_ADDRESS_MAX 0x7FFEFFFF // Win32 specific - typedef unsigned long ULONG_PTR, *PULONG_PTR; -#endif - -#ifndef DECLSPEC_ALIGN - #if (_MSC_VER >= 1300) && !defined(MIDL_PASS) - #define DECLSPEC_ALIGN(x) __declspec(align(x)) - #else - #define DECLSPEC_ALIGN(x) - #endif -#endif - -#define VALID_ADDRESS_MIN 0x10000 // Win32 specific -#define IS_VALID_ADDRESS(a) IS_IN_RANGE(a, VALID_ADDRESS_MIN, VALID_ADDRESS_MAX+1) - -BOOL IsHexChar(BYTE ch); -BYTE *HexToBinary(char *Input, DWORD InputLength, DWORD *OutputLength); - -#ifdef __cplusplus -} -#endif -#endif // MISC_H diff --git a/renderdoc/3rdparty/mhook/mhook-lib/mhook.cpp b/renderdoc/3rdparty/mhook/mhook-lib/mhook.cpp deleted file mode 100644 index c4018c0c3..000000000 --- a/renderdoc/3rdparty/mhook/mhook-lib/mhook.cpp +++ /dev/null @@ -1,936 +0,0 @@ -//Copyright (c) 2007-2008, Marton Anka -// -//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. - -#include -#include -#include -#include "mhook.h" -#include "../disasm-lib/disasm.h" - -#pragma warning(disable:4706 4310) - -//========================================================================= -#ifndef cntof -#define cntof(a) (sizeof(a)/sizeof(a[0])) -#endif - -//========================================================================= -#ifndef GOOD_HANDLE -#define GOOD_HANDLE(a) ((a!=INVALID_HANDLE_VALUE)&&(a!=NULL)) -#endif - -//========================================================================= -#ifndef gle -#define gle GetLastError -#endif - -//========================================================================= -#ifndef ODPRINTF - -#ifdef _DEBUG -#define ODPRINTF(a) odprintf a -#else -#define ODPRINTF(a) -#endif - -inline void __cdecl odprintf(PCSTR format, ...) { - va_list args; - va_start(args, format); - int len = _vscprintf(format, args); - if (len > 0) { - len += (1 + 2); - PSTR buf = (PSTR) malloc(len); - if (buf) { - len = vsprintf_s(buf, len, format, args); - if (len > 0) { - while (len && isspace(buf[len-1])) len--; - buf[len++] = '\r'; - buf[len++] = '\n'; - buf[len] = 0; - OutputDebugStringA(buf); - } - free(buf); - } - va_end(args); - } -} - -inline void __cdecl odprintf(PCWSTR format, ...) { - va_list args; - va_start(args, format); - int len = _vscwprintf(format, args); - if (len > 0) { - len += (1 + 2); - PWSTR buf = (PWSTR) malloc(sizeof(WCHAR)*len); - if (buf) { - len = vswprintf_s(buf, len, format, args); - if (len > 0) { - while (len && iswspace(buf[len-1])) len--; - buf[len++] = L'\r'; - buf[len++] = L'\n'; - buf[len] = 0; - OutputDebugStringW(buf); - } - free(buf); - } - va_end(args); - } -} - -#endif //#ifndef ODPRINTF - -//========================================================================= -#define MHOOKS_MAX_CODE_BYTES 32 -#define MHOOKS_MAX_RIPS 4 - -//========================================================================= -// The trampoline structure - stores every bit of info about a hook -struct MHOOKS_TRAMPOLINE { - PBYTE pSystemFunction; // the original system function - DWORD cbOverwrittenCode; // number of bytes overwritten by the jump - PBYTE pHookFunction; // the hook function that we provide - BYTE codeJumpToHookFunction[MHOOKS_MAX_CODE_BYTES]; // placeholder for code that jumps to the hook function - BYTE codeTrampoline[MHOOKS_MAX_CODE_BYTES]; // placeholder for code that holds the first few - // bytes from the system function and a jump to the remainder - // in the original location - BYTE codeUntouched[MHOOKS_MAX_CODE_BYTES]; // placeholder for unmodified original code - // (we patch IP-relative addressing) - MHOOKS_TRAMPOLINE* pPrevTrampoline; // When in the free list, thess are pointers to the prev and next entry. - MHOOKS_TRAMPOLINE* pNextTrampoline; // When not in the free list, this is a pointer to the prev and next trampoline in use. -}; - -//========================================================================= -// The patch data structures - store info about rip-relative instructions -// during hook placement -struct MHOOKS_RIPINFO -{ - DWORD dwOffset; - S64 nDisplacement; -}; - -struct MHOOKS_PATCHDATA -{ - S64 nLimitUp; - S64 nLimitDown; - DWORD nRipCnt; - MHOOKS_RIPINFO rips[MHOOKS_MAX_RIPS]; -}; - -//========================================================================= -// Global vars -static BOOL g_bVarsInitialized = FALSE; -static CRITICAL_SECTION g_cs; -static MHOOKS_TRAMPOLINE* g_pHooks = NULL; -static MHOOKS_TRAMPOLINE* g_pFreeList = NULL; -static DWORD g_nHooksInUse = 0; -static BOOL g_bThreadsSuspended = FALSE; -static HANDLE* g_hThreadHandles = NULL; -static DWORD g_nThreadHandles = 0; -#define MHOOK_JMPSIZE 5 -#define MHOOK_MINALLOCSIZE 4096 - -//========================================================================= -// Toolhelp defintions so the functions can be dynamically bound to -typedef HANDLE (WINAPI * _CreateToolhelp32Snapshot)( - DWORD dwFlags, - DWORD th32ProcessID - ); - -typedef BOOL (WINAPI * _Thread32First)( - HANDLE hSnapshot, - LPTHREADENTRY32 lpte - ); - -typedef BOOL (WINAPI * _Thread32Next)( - HANDLE hSnapshot, - LPTHREADENTRY32 lpte - ); - -//========================================================================= -// Bring in the toolhelp functions from kernel32 -_CreateToolhelp32Snapshot fnCreateToolhelp32Snapshot = (_CreateToolhelp32Snapshot) GetProcAddress(GetModuleHandle(L"kernel32"), "CreateToolhelp32Snapshot"); -_Thread32First fnThread32First = (_Thread32First) GetProcAddress(GetModuleHandle(L"kernel32"), "Thread32First"); -_Thread32Next fnThread32Next = (_Thread32Next) GetProcAddress(GetModuleHandle(L"kernel32"), "Thread32Next"); - -//========================================================================= -// Internal function: -// -// Remove the trampoline from the specified list, updating the head pointer -// if necessary. -//========================================================================= -static VOID ListRemove(MHOOKS_TRAMPOLINE** pListHead, MHOOKS_TRAMPOLINE* pNode) { - if (pNode->pPrevTrampoline) { - pNode->pPrevTrampoline->pNextTrampoline = pNode->pNextTrampoline; - } - - if (pNode->pNextTrampoline) { - pNode->pNextTrampoline->pPrevTrampoline = pNode->pPrevTrampoline; - } - - if ((*pListHead) == pNode) { - (*pListHead) = pNode->pNextTrampoline; - assert((*pListHead)->pPrevTrampoline == NULL); - } - - pNode->pPrevTrampoline = NULL; - pNode->pNextTrampoline = NULL; -} - -//========================================================================= -// Internal function: -// -// Prepend the trampoline from the specified list and update the head pointer. -//========================================================================= -static VOID ListPrepend(MHOOKS_TRAMPOLINE** pListHead, MHOOKS_TRAMPOLINE* pNode) { - pNode->pPrevTrampoline = NULL; - pNode->pNextTrampoline = (*pListHead); - if ((*pListHead)) { - (*pListHead)->pPrevTrampoline = pNode; - } - (*pListHead) = pNode; -} - -//========================================================================= -static VOID EnterCritSec() { - if (!g_bVarsInitialized) { - InitializeCriticalSection(&g_cs); - g_bVarsInitialized = TRUE; - } - EnterCriticalSection(&g_cs); -} - -//========================================================================= -static VOID LeaveCritSec() { - LeaveCriticalSection(&g_cs); -} - -//========================================================================= -// Internal function: -// -// Skip over jumps that lead to the real function. Gets around import -// jump tables, etc. -//========================================================================= -static PBYTE SkipJumps(PBYTE pbCode) { - PBYTE pbOrgCode = pbCode; -#ifdef _M_IX86_X64 -#ifdef _M_IX86 - //mov edi,edi: hot patch point - if (pbCode[0] == 0x8b && pbCode[1] == 0xff) - pbCode += 2; - // push ebp; mov ebp, esp; pop ebp; - // "collapsed" stackframe generated by MSVC - if (pbCode[0] == 0x55 && pbCode[1] == 0x8b && pbCode[2] == 0xec && pbCode[3] == 0x5d) - pbCode += 4; -#endif - if (pbCode[0] == 0xff && pbCode[1] == 0x25) { -#ifdef _M_IX86 - // on x86 we have an absolute pointer... - PBYTE pbTarget = *(PBYTE *)&pbCode[2]; - // ... that shows us an absolute pointer. - return SkipJumps(*(PBYTE *)pbTarget); -#elif defined _M_X64 - // on x64 we have a 32-bit offset... - INT32 lOffset = *(INT32 *)&pbCode[2]; - // ... that shows us an absolute pointer - return SkipJumps(*(PBYTE*)(pbCode + 6 + lOffset)); - } else if (pbCode[0] == 0x48 && pbCode[1] == 0xff && pbCode[2] == 0x25) { - // or we can have the same with a REX prefix - INT32 lOffset = *(INT32 *)&pbCode[3]; - // ... that shows us an absolute pointer - return SkipJumps(*(PBYTE*)(pbCode + 7 + lOffset)); -#endif - } else if (pbCode[0] == 0xe9) { - // here the behavior is identical, we have... - // ...a 32-bit offset to the destination. - return SkipJumps(pbCode + 5 + *(INT32 *)&pbCode[1]); - } else if (pbCode[0] == 0xeb) { - // and finally an 8-bit offset to the destination - return SkipJumps(pbCode + 2 + *(CHAR *)&pbCode[1]); - } -#else -#error unsupported platform -#endif - return pbOrgCode; -} - -//========================================================================= -// Internal function: -// -// Writes code at pbCode that jumps to pbJumpTo. Will attempt to do this -// in as few bytes as possible. Important on x64 where the long jump -// (0xff 0x25 ....) can take up 14 bytes. -//========================================================================= -static PBYTE EmitJump(PBYTE pbCode, PBYTE pbJumpTo) { -#ifdef _M_IX86_X64 - PBYTE pbJumpFrom = pbCode + 5; - SIZE_T cbDiff = pbJumpFrom > pbJumpTo ? pbJumpFrom - pbJumpTo : pbJumpTo - pbJumpFrom; - ODPRINTF((L"mhooks: EmitJump: Jumping from %p to %p, diff is %p", pbJumpFrom, pbJumpTo, cbDiff)); - if (cbDiff <= 0x7fff0000) { - pbCode[0] = 0xe9; - pbCode += 1; - *((PDWORD)pbCode) = (DWORD)(DWORD_PTR)(pbJumpTo - pbJumpFrom); - pbCode += sizeof(DWORD); - } else { - pbCode[0] = 0xff; - pbCode[1] = 0x25; - pbCode += 2; -#ifdef _M_IX86 - // on x86 we write an absolute address (just behind the instruction) - *((PDWORD)pbCode) = (DWORD)(DWORD_PTR)(pbCode + sizeof(DWORD)); -#elif defined _M_X64 - // on x64 we write the relative address of the same location - *((PDWORD)pbCode) = (DWORD)0; -#endif - pbCode += sizeof(DWORD); - *((PDWORD_PTR)pbCode) = (DWORD_PTR)(pbJumpTo); - pbCode += sizeof(DWORD_PTR); - } -#else -#error unsupported platform -#endif - return pbCode; -} - - -//========================================================================= -// Internal function: -// -// Round down to the next multiple of rndDown -//========================================================================= -static size_t RoundDown(size_t addr, size_t rndDown) -{ - return (addr / rndDown) * rndDown; -} - -//========================================================================= -// Internal function: -// -// Will attempt allocate a block of memory within the specified range, as -// near as possible to the specified function. -//========================================================================= -static MHOOKS_TRAMPOLINE* BlockAlloc(PBYTE pSystemFunction, PBYTE pbLower, PBYTE pbUpper) { - SYSTEM_INFO sSysInfo = {0}; - ::GetSystemInfo(&sSysInfo); - - // Always allocate in bulk, in case the system actually has a smaller allocation granularity than MINALLOCSIZE. - const ptrdiff_t cAllocSize = max(sSysInfo.dwAllocationGranularity, MHOOK_MINALLOCSIZE); - - MHOOKS_TRAMPOLINE* pRetVal = NULL; - PBYTE pModuleGuess = (PBYTE) RoundDown((size_t)pSystemFunction, cAllocSize); - int loopCount = 0; - for (PBYTE pbAlloc = pModuleGuess; pbLower < pbAlloc && pbAlloc < pbUpper; ++loopCount) { - // determine current state - MEMORY_BASIC_INFORMATION mbi; - ODPRINTF((L"mhooks: BlockAlloc: Looking at address %p", pbAlloc)); - if (!VirtualQuery(pbAlloc, &mbi, sizeof(mbi))) - break; - // free & large enough? - if (mbi.State == MEM_FREE && mbi.RegionSize >= (unsigned)cAllocSize) { - // and then try to allocate it - pRetVal = (MHOOKS_TRAMPOLINE*) VirtualAlloc(pbAlloc, cAllocSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE); - if (pRetVal) { - size_t trampolineCount = cAllocSize / sizeof(MHOOKS_TRAMPOLINE); - ODPRINTF((L"mhooks: BlockAlloc: Allocated block at %p as %d trampolines", pRetVal, trampolineCount)); - - pRetVal[0].pPrevTrampoline = NULL; - pRetVal[0].pNextTrampoline = &pRetVal[1]; - - // prepare them by having them point down the line at the next entry. - for (size_t s = 1; s < trampolineCount; ++s) { - pRetVal[s].pPrevTrampoline = &pRetVal[s - 1]; - pRetVal[s].pNextTrampoline = &pRetVal[s + 1]; - } - - // last entry points to the current head of the free list - pRetVal[trampolineCount - 1].pNextTrampoline = g_pFreeList; - break; - } - } - - // This is a spiral, should be -1, 1, -2, 2, -3, 3, etc. (* cAllocSize) - ptrdiff_t bytesToOffset = (cAllocSize * (loopCount + 1) * ((loopCount % 2 == 0) ? -1 : 1)); - pbAlloc = pbAlloc + bytesToOffset; - } - - return pRetVal; -} - -//========================================================================= -// Internal function: -// -// Will try to allocate a big block of memory inside the required range. -//========================================================================= -static MHOOKS_TRAMPOLINE* FindTrampolineInRange(PBYTE pLower, PBYTE pUpper) { - if (!g_pFreeList) { - return NULL; - } - - // This is a standard free list, except we're doubly linked to deal with soem return shenanigans. - MHOOKS_TRAMPOLINE* curEntry = g_pFreeList; - while (curEntry) { - if ((MHOOKS_TRAMPOLINE*) pLower < curEntry && curEntry < (MHOOKS_TRAMPOLINE*) pUpper) { - ListRemove(&g_pFreeList, curEntry); - - return curEntry; - } - - curEntry = curEntry->pNextTrampoline; - } - - return NULL; -} - -//========================================================================= -// Internal function: -// -// Will try to allocate the trampoline structure within 2 gigabytes of -// the target function. -//========================================================================= -static MHOOKS_TRAMPOLINE* TrampolineAlloc(PBYTE pSystemFunction, S64 nLimitUp, S64 nLimitDown) { - - MHOOKS_TRAMPOLINE* pTrampoline = NULL; - - // determine lower and upper bounds for the allocation locations. - // in the basic scenario this is +/- 2GB but IP-relative instructions - // found in the original code may require a smaller window. - PBYTE pLower = pSystemFunction + nLimitUp; - pLower = pLower < (PBYTE)(DWORD_PTR)0x0000000080000000 ? - (PBYTE)(0x1) : (PBYTE)(pLower - (PBYTE)0x7fff0000); - PBYTE pUpper = pSystemFunction + nLimitDown; - pUpper = pUpper < (PBYTE)(DWORD_PTR)0xffffffff80000000 ? - (PBYTE)(pUpper + (DWORD_PTR)0x7ff80000) : (PBYTE)(DWORD_PTR)0xfffffffffff80000; - ODPRINTF((L"mhooks: TrampolineAlloc: Allocating for %p between %p and %p", pSystemFunction, pLower, pUpper)); - - // try to find a trampoline in the specified range - pTrampoline = FindTrampolineInRange(pLower, pUpper); - if (!pTrampoline) { - // if it we can't find it, then we need to allocate a new block and - // try again. Just fail if that doesn't work - g_pFreeList = BlockAlloc(pSystemFunction, pLower, pUpper); - pTrampoline = FindTrampolineInRange(pLower, pUpper); - } - - // found and allocated a trampoline? - if (pTrampoline) { - ListPrepend(&g_pHooks, pTrampoline); - } - - return pTrampoline; -} - -//========================================================================= -// Internal function: -// -// Return the internal trampoline structure that belongs to a hooked function. -//========================================================================= -static MHOOKS_TRAMPOLINE* TrampolineGet(PBYTE pHookedFunction) { - MHOOKS_TRAMPOLINE* pCurrent = g_pHooks; - - while (pCurrent) { - if (pCurrent->pHookFunction == pHookedFunction) { - return pCurrent; - } - - pCurrent = pCurrent->pNextTrampoline; - } - - return NULL; -} - -//========================================================================= -// Internal function: -// -// Free a trampoline structure. -//========================================================================= -static VOID TrampolineFree(MHOOKS_TRAMPOLINE* pTrampoline, BOOL bNeverUsed) { - ListRemove(&g_pHooks, pTrampoline); - - // If a thread could feasinbly have some of our trampoline code - // on its stack and we yank the region from underneath it then it will - // surely crash upon returning. So instead of freeing the - // memory we just let it leak. Ugly, but safe. - if (bNeverUsed) { - ListPrepend(&g_pFreeList, pTrampoline); - } - - g_nHooksInUse--; -} - -//========================================================================= -// Internal function: -// -// Suspend a given thread and try to make sure that its instruction -// pointer is not in the given range. -//========================================================================= -static HANDLE SuspendOneThread(DWORD dwThreadId, PBYTE pbCode, DWORD cbBytes) { - // open the thread - HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, dwThreadId); - if (GOOD_HANDLE(hThread)) { - // attempt suspension - DWORD dwSuspendCount = SuspendThread(hThread); - if (dwSuspendCount != -1) { - // see where the IP is - CONTEXT ctx; - ctx.ContextFlags = CONTEXT_CONTROL; - int nTries = 0; - while (GetThreadContext(hThread, &ctx)) { -#ifdef _M_IX86 - PBYTE pIp = (PBYTE)(DWORD_PTR)ctx.Eip; -#elif defined _M_X64 - PBYTE pIp = (PBYTE)(DWORD_PTR)ctx.Rip; -#endif - if (pbCode != NULL && pIp >= pbCode && pIp < (pbCode + cbBytes)) { - if (nTries < 3) { - // oops - we should try to get the instruction pointer out of here. - ODPRINTF((L"mhooks: SuspendOneThread: suspended thread %d - IP is at %p - IS COLLIDING WITH CODE", dwThreadId, pIp)); - ResumeThread(hThread); - Sleep(100); - SuspendThread(hThread); - nTries++; - } else { - // we gave it all we could. (this will probably never - // happen - unless the thread has already been suspended - // to begin with) - ODPRINTF((L"mhooks: SuspendOneThread: suspended thread %d - IP is at %p - IS COLLIDING WITH CODE - CAN'T FIX", dwThreadId, pIp)); - ResumeThread(hThread); - CloseHandle(hThread); - hThread = NULL; - break; - } - } else { - // success, the IP is not conflicting - ODPRINTF((L"mhooks: SuspendOneThread: Successfully suspended thread %d - IP is at %p", dwThreadId, pIp)); - break; - } - } - } else { - // couldn't suspend - CloseHandle(hThread); - hThread = NULL; - } - } - return hThread; -} - -//========================================================================= -// Internal function: -// -// Resumes all previously suspended threads in the current process. -//========================================================================= -static VOID ResumeOtherThreads() { - // make sure things go as fast as possible - INT nOriginalPriority = GetThreadPriority(GetCurrentThread()); - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); - // go through our list - for (DWORD i=0; inRipCnt; i++) { - DWORD dwNewDisplacement = (DWORD)(pdata->rips[i].nDisplacement - diff); - ODPRINTF((L"mhooks: fixing up RIP instruction operand for code at 0x%p: " - L"old displacement: 0x%8.8x, new displacement: 0x%8.8x", - pbNew + pdata->rips[i].dwOffset, - (DWORD)pdata->rips[i].nDisplacement, - dwNewDisplacement)); - *(PDWORD)(pbNew + pdata->rips[i].dwOffset) = dwNewDisplacement; - } -#endif -} - -//========================================================================= -// Examine the machine code at the target function's entry point, and -// skip bytes in a way that we'll always end on an instruction boundary. -// We also detect branches and subroutine calls (as well as returns) -// at which point disassembly must stop. -// Finally, detect and collect information on IP-relative instructions -// that we can patch. -static DWORD DisassembleAndSkip(PVOID pFunction, DWORD dwMinLen, MHOOKS_PATCHDATA* pdata) { - DWORD dwRet = 0; - pdata->nLimitDown = 0; - pdata->nLimitUp = 0; - pdata->nRipCnt = 0; -#ifdef _M_IX86 - ARCHITECTURE_TYPE arch = ARCH_X86; -#elif defined _M_X64 - ARCHITECTURE_TYPE arch = ARCH_X64; -#else - #error unsupported platform -#endif - DISASSEMBLER dis; - if (InitDisassembler(&dis, arch)) { - INSTRUCTION* pins = NULL; - U8* pLoc = (U8*)pFunction; - DWORD dwFlags = DISASM_DECODE | DISASM_DISASSEMBLE | DISASM_ALIGNOUTPUT; - - ODPRINTF((L"mhooks: DisassembleAndSkip: Disassembling %p", pLoc)); - while ( (dwRet < dwMinLen) && (pins = GetInstruction(&dis, (ULONG_PTR)pLoc, pLoc, dwFlags)) ) { - ODPRINTF(("mhooks: DisassembleAndSkip: %p:(0x%2.2x) %s", pLoc, pins->Length, pins->String)); - if (pins->Type == ITYPE_RET ) break; - if (pins->Type == ITYPE_BRANCH ) break; - if (pins->Type == ITYPE_BRANCHCC) break; - if (pins->Type == ITYPE_CALL ) break; - if (pins->Type == ITYPE_CALLCC ) break; - - #if defined _M_X64 - BOOL bProcessRip = FALSE; - // mov or lea to register from rip+imm32 - if ((pins->Type == ITYPE_MOV || pins->Type == ITYPE_LEA) && (pins->X86.Relative) && - (pins->X86.OperandSize == 8) && (pins->OperandCount == 2) && - (pins->Operands[1].Flags & OP_IPREL) && (pins->Operands[1].Register == AMD64_REG_RIP)) - { - // rip-addressing "mov reg, [rip+imm32]" - ODPRINTF((L"mhooks: DisassembleAndSkip: found OP_IPREL on operand %d with displacement 0x%x (in memory: 0x%x)", 1, pins->X86.Displacement, *(PDWORD)(pLoc+3))); - bProcessRip = TRUE; - } - // mov or lea to rip+imm32 from register - else if ((pins->Type == ITYPE_MOV || pins->Type == ITYPE_LEA) && (pins->X86.Relative) && - (pins->X86.OperandSize == 8) && (pins->OperandCount == 2) && - (pins->Operands[0].Flags & OP_IPREL) && (pins->Operands[0].Register == AMD64_REG_RIP)) - { - // rip-addressing "mov [rip+imm32], reg" - ODPRINTF((L"mhooks: DisassembleAndSkip: found OP_IPREL on operand %d with displacement 0x%x (in memory: 0x%x)", 0, pins->X86.Displacement, *(PDWORD)(pLoc+3))); - bProcessRip = TRUE; - } - else if ( (pins->OperandCount >= 1) && (pins->Operands[0].Flags & OP_IPREL) ) - { - // unsupported rip-addressing - ODPRINTF((L"mhooks: DisassembleAndSkip: found unsupported OP_IPREL on operand %d", 0)); - // dump instruction bytes to the debug output - for (DWORD i=0; iLength; i++) { - ODPRINTF((L"mhooks: DisassembleAndSkip: instr byte %2.2d: 0x%2.2x", i, pLoc[i])); - } - break; - } - else if ( (pins->OperandCount >= 2) && (pins->Operands[1].Flags & OP_IPREL) ) - { - // unsupported rip-addressing - ODPRINTF((L"mhooks: DisassembleAndSkip: found unsupported OP_IPREL on operand %d", 1)); - // dump instruction bytes to the debug output - for (DWORD i=0; iLength; i++) { - ODPRINTF((L"mhooks: DisassembleAndSkip: instr byte %2.2d: 0x%2.2x", i, pLoc[i])); - } - break; - } - else if ( (pins->OperandCount >= 3) && (pins->Operands[2].Flags & OP_IPREL) ) - { - // unsupported rip-addressing - ODPRINTF((L"mhooks: DisassembleAndSkip: found unsupported OP_IPREL on operand %d", 2)); - // dump instruction bytes to the debug output - for (DWORD i=0; iLength; i++) { - ODPRINTF((L"mhooks: DisassembleAndSkip: instr byte %2.2d: 0x%2.2x", i, pLoc[i])); - } - break; - } - // follow through with RIP-processing if needed - if (bProcessRip) { - // calculate displacement relative to function start - S64 nAdjustedDisplacement = pins->X86.Displacement + (pLoc - (U8*)pFunction); - // store displacement values furthest from zero (both positive and negative) - if (nAdjustedDisplacement < pdata->nLimitDown) - pdata->nLimitDown = nAdjustedDisplacement; - if (nAdjustedDisplacement > pdata->nLimitUp) - pdata->nLimitUp = nAdjustedDisplacement; - // store patch info - if (pdata->nRipCnt < MHOOKS_MAX_RIPS) { - pdata->rips[pdata->nRipCnt].dwOffset = dwRet + 3; - pdata->rips[pdata->nRipCnt].nDisplacement = pins->X86.Displacement; - pdata->nRipCnt++; - } else { - // no room for patch info, stop disassembly - break; - } - } - #endif - - dwRet += pins->Length; - pLoc += pins->Length; - } - - CloseDisassembler(&dis); - } - - return dwRet; -} - -//========================================================================= -void Mhook_SuspendOtherThreads() { - SuspendOtherThreads(NULL, 0); - g_bThreadsSuspended = TRUE; -} -void Mhook_ResumeOtherThreads() { - ResumeOtherThreads(); - g_bThreadsSuspended = FALSE; -} -//========================================================================= - -//========================================================================= -bool Mhook_SetHook(PVOID *ppSystemFunction, PVOID pHookFunction) { - MHOOKS_TRAMPOLINE* pTrampoline = NULL; - PVOID pSystemFunction = *ppSystemFunction; - // ensure thread-safety - EnterCritSec(); - ODPRINTF((L"mhooks: Mhook_SetHook: Started on the job: %p / %p", pSystemFunction, pHookFunction)); - // find the real functions (jump over jump tables, if any) - pSystemFunction = SkipJumps((PBYTE)pSystemFunction); - pHookFunction = SkipJumps((PBYTE)pHookFunction); - ODPRINTF((L"mhooks: Mhook_SetHook: Started on the job: %p / %p", pSystemFunction, pHookFunction)); - // figure out the length of the overwrite zone - MHOOKS_PATCHDATA patchdata = {0}; - DWORD dwInstructionLength = DisassembleAndSkip(pSystemFunction, MHOOK_JMPSIZE, &patchdata); - if (dwInstructionLength >= MHOOK_JMPSIZE) { - ODPRINTF((L"mhooks: Mhook_SetHook: disassembly signals %d bytes", dwInstructionLength)); - // suspend every other thread in this process, and make sure their IP - // is not in the code we're about to overwrite. - SuspendOtherThreads((PBYTE)pSystemFunction, dwInstructionLength); - // allocate a trampoline structure (TODO: it is pretty wasteful to get - // VirtualAlloc to grab chunks of memory smaller than 100 bytes) - pTrampoline = TrampolineAlloc((PBYTE)pSystemFunction, patchdata.nLimitUp, patchdata.nLimitDown); - if (pTrampoline) { - ODPRINTF((L"mhooks: Mhook_SetHook: allocated structure at %p", pTrampoline)); - DWORD dwOldProtectSystemFunction = 0; - DWORD dwOldProtectTrampolineFunction = 0; - // set the system function to PAGE_EXECUTE_READWRITE - if (VirtualProtect(pSystemFunction, dwInstructionLength, PAGE_EXECUTE_READWRITE, &dwOldProtectSystemFunction)) { - ODPRINTF((L"mhooks: Mhook_SetHook: readwrite set on system function")); - // mark our trampoline buffer to PAGE_EXECUTE_READWRITE - if (VirtualProtect(pTrampoline, sizeof(MHOOKS_TRAMPOLINE), PAGE_EXECUTE_READWRITE, &dwOldProtectTrampolineFunction)) { - ODPRINTF((L"mhooks: Mhook_SetHook: readwrite set on trampoline structure")); - - // create our trampoline function - PBYTE pbCode = pTrampoline->codeTrampoline; - // save original code.. - for (DWORD i = 0; icodeUntouched[i] = pbCode[i] = ((PBYTE)pSystemFunction)[i]; - } - pbCode += dwInstructionLength; - // plus a jump to the continuation in the original location - pbCode = EmitJump(pbCode, ((PBYTE)pSystemFunction) + dwInstructionLength); - ODPRINTF((L"mhooks: Mhook_SetHook: updated the trampoline")); - - // fix up any IP-relative addressing in the code - FixupIPRelativeAddressing(pTrampoline->codeTrampoline, (PBYTE)pSystemFunction, &patchdata); - - DWORD_PTR dwDistance = (PBYTE)pHookFunction < (PBYTE)pSystemFunction ? - (PBYTE)pSystemFunction - (PBYTE)pHookFunction : (PBYTE)pHookFunction - (PBYTE)pSystemFunction; - if (dwDistance > 0x7fff0000) { - // create a stub that jumps to the replacement function. - // we need this because jumping from the API to the hook directly - // will be a long jump, which is 14 bytes on x64, and we want to - // avoid that - the API may or may not have room for such stuff. - // (remember, we only have 5 bytes guaranteed in the API.) - // on the other hand we do have room, and the trampoline will always be - // within +/- 2GB of the API, so we do the long jump in there. - // the API will jump to the "reverse trampoline" which - // will jump to the user's hook code. - pbCode = pTrampoline->codeJumpToHookFunction; - pbCode = EmitJump(pbCode, (PBYTE)pHookFunction); - ODPRINTF((L"mhooks: Mhook_SetHook: created reverse trampoline")); - FlushInstructionCache(GetCurrentProcess(), pTrampoline->codeJumpToHookFunction, - pbCode - pTrampoline->codeJumpToHookFunction); - - // update the API itself - pbCode = (PBYTE)pSystemFunction; - pbCode = EmitJump(pbCode, pTrampoline->codeJumpToHookFunction); - } else { - // the jump will be at most 5 bytes so we can do it directly - // update the API itself - pbCode = (PBYTE)pSystemFunction; - pbCode = EmitJump(pbCode, (PBYTE)pHookFunction); - } - - // update data members - pTrampoline->cbOverwrittenCode = dwInstructionLength; - pTrampoline->pSystemFunction = (PBYTE)pSystemFunction; - pTrampoline->pHookFunction = (PBYTE)pHookFunction; - - // flush instruction cache and restore original protection - FlushInstructionCache(GetCurrentProcess(), pTrampoline->codeTrampoline, dwInstructionLength); - VirtualProtect(pTrampoline, sizeof(MHOOKS_TRAMPOLINE), dwOldProtectTrampolineFunction, &dwOldProtectTrampolineFunction); - } else { - ODPRINTF((L"mhooks: Mhook_SetHook: failed VirtualProtect 2: %d", gle())); - } - // flush instruction cache and restore original protection - FlushInstructionCache(GetCurrentProcess(), pSystemFunction, dwInstructionLength); - VirtualProtect(pSystemFunction, dwInstructionLength, dwOldProtectSystemFunction, &dwOldProtectSystemFunction); - } else { - ODPRINTF((L"mhooks: Mhook_SetHook: failed VirtualProtect 1: %d", gle())); - } - if (pTrampoline->pSystemFunction) { - // this is what the application will use as the entry point - // to the "original" unhooked function. - *ppSystemFunction = pTrampoline->codeTrampoline; - ODPRINTF((L"mhooks: Mhook_SetHook: Hooked the function!")); - } else { - // if we failed discard the trampoline (forcing VirtualFree) - TrampolineFree(pTrampoline, TRUE); - pTrampoline = NULL; - } - } - // resume everybody else - ResumeOtherThreads(); - } else { - ODPRINTF((L"mhooks: disassembly signals %d bytes (unacceptable)", dwInstructionLength)); - } - LeaveCritSec(); - return (pTrampoline != NULL); -} - -//========================================================================= -bool Mhook_Unhook(PVOID *ppHookedFunction) { - ODPRINTF((L"mhooks: Mhook_Unhook: %p", *ppHookedFunction)); - bool bRet = false; - EnterCritSec(); - // get the trampoline structure that corresponds to our function - MHOOKS_TRAMPOLINE* pTrampoline = TrampolineGet((PBYTE)*ppHookedFunction); - if (pTrampoline) { - // make sure nobody's executing code where we're about to overwrite a few bytes - SuspendOtherThreads(pTrampoline->pSystemFunction, pTrampoline->cbOverwrittenCode); - ODPRINTF((L"mhooks: Mhook_Unhook: found struct at %p", pTrampoline)); - DWORD dwOldProtectSystemFunction = 0; - // make memory writable - if (VirtualProtect(pTrampoline->pSystemFunction, pTrampoline->cbOverwrittenCode, PAGE_EXECUTE_READWRITE, &dwOldProtectSystemFunction)) { - ODPRINTF((L"mhooks: Mhook_Unhook: readwrite set on system function")); - PBYTE pbCode = (PBYTE)pTrampoline->pSystemFunction; - for (DWORD i = 0; icbOverwrittenCode; i++) { - pbCode[i] = pTrampoline->codeUntouched[i]; - } - // flush instruction cache and make memory unwritable - FlushInstructionCache(GetCurrentProcess(), pTrampoline->pSystemFunction, pTrampoline->cbOverwrittenCode); - VirtualProtect(pTrampoline->pSystemFunction, pTrampoline->cbOverwrittenCode, dwOldProtectSystemFunction, &dwOldProtectSystemFunction); - // return the original function pointer - *ppHookedFunction = pTrampoline->pSystemFunction; - bRet = true; - ODPRINTF((L"mhooks: Mhook_Unhook: sysfunc: %p", *ppHookedFunction)); - // free the trampoline while not really discarding it from memory - TrampolineFree(pTrampoline, FALSE); - ODPRINTF((L"mhooks: Mhook_Unhook: unhook successful")); - } else { - ODPRINTF((L"mhooks: Mhook_Unhook: failed VirtualProtect 1: %d", gle())); - } - // make the other guys runnable - ResumeOtherThreads(); - } - LeaveCritSec(); - return bRet; -} - -//========================================================================= diff --git a/renderdoc/3rdparty/mhook/mhook-lib/mhook.h b/renderdoc/3rdparty/mhook/mhook-lib/mhook.h deleted file mode 100644 index a0acfa6ac..000000000 --- a/renderdoc/3rdparty/mhook/mhook-lib/mhook.h +++ /dev/null @@ -1,40 +0,0 @@ -//Copyright (c) 2007-2008, Marton Anka -// -//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. - -#ifdef _M_IX86 -#define _M_IX86_X64 -#elif defined _M_X64 -#define _M_IX86_X64 -#endif - -bool Mhook_SetHook(void **ppSystemFunction, void *pHookFunction); -bool Mhook_Unhook(void **ppHookedFunction); - -// optimisation - when setting many hooks CreateToolHelp32Snapshot to enumerate threads -// can become a bottleneck, allow apps to suspend threads across multiple hooks -// -// note - it's the responsibility of user code to ensure that the threads don't have -// their instruction pointer near any of the hooks - as this would normally be handled -// on a per-hook basis. -// -// these functions are also not thread safe. -void Mhook_SuspendOtherThreads(); -void Mhook_ResumeOtherThreads(); - diff --git a/renderdoccmd/miniz.c b/renderdoc/3rdparty/miniz/miniz.c similarity index 100% rename from renderdoccmd/miniz.c rename to renderdoc/3rdparty/miniz/miniz.c diff --git a/renderdoccmd/miniz.h b/renderdoc/3rdparty/miniz/miniz.h similarity index 100% rename from renderdoccmd/miniz.h rename to renderdoc/3rdparty/miniz/miniz.h diff --git a/renderdoc/core/crash_handler.h b/renderdoc/core/crash_handler.h index 234f71de0..721605fe4 100644 --- a/renderdoc/core/crash_handler.h +++ b/renderdoc/core/crash_handler.h @@ -29,8 +29,8 @@ #define CRASH_HANDLER_ENABLED // breakpad -#include "client/windows/handler/exception_handler.h" -#include "client/windows/common/ipc_protocol.h" +#include "breakpad/client/windows/handler/exception_handler.h" +#include "breakpad/client/windows/common/ipc_protocol.h" class CrashHandler : public ICrashHandler { diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 1f51f7452..6678be869 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -24,7 +24,7 @@ #include "replay_proxy.h" -#include "3rdparty/lz4/lz4.h" +#include "lz4/lz4.h" template<> string ToStrHelper::Get(const SystemAttribute &el) diff --git a/renderdoc/data/resource.h b/renderdoc/data/resource.h index 0ac4ca753..b4bfe186c 100644 --- a/renderdoc/data/resource.h +++ b/renderdoc/data/resource.h @@ -25,7 +25,7 @@ #endif #define GIT_COMMIT_HASH "NO_GIT_COMMIT_HASH_DEFINED" -//#define RENDERDOC_OFFICIAL_BUILD // used to determine whether to submit auto crash reports +#define RENDERDOC_OFFICIAL_BUILD // used to determine whether to submit auto crash reports // Next default values for new objects // diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index f691e585a..dd928eed8 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -35,7 +35,7 @@ #include "driver/d3d11/d3d11_renderstate.h" #include "driver/d3d11/d3d11_context.h" -#include "3rdparty/jpeg-compressor/jpge.h" +#include "jpeg-compressor/jpge.h" #if defined(INCLUDE_D3D_11_1) #include diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index baa620f49..725baf5a0 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -32,7 +32,7 @@ #include "maths/vec.h" -#include "3rdparty/jpeg-compressor/jpge.h" +#include "jpeg-compressor/jpge.h" const char *GLChunkNames[] = { diff --git a/renderdoc/hooks/d3d11_hooks.cpp b/renderdoc/hooks/d3d11_hooks.cpp index 1cf744a57..d105b6dd5 100644 --- a/renderdoc/hooks/d3d11_hooks.cpp +++ b/renderdoc/hooks/d3d11_hooks.cpp @@ -39,15 +39,6 @@ public: { bool success = true; -#if USE_MHOOK - // require dxgi.dll hooked as well for proper operation - if(GetModuleHandleA("dxgi.dll") == NULL) - { - RDCWARN("Failed to load dxgi.dll - not inserting D3D11 hooks."); - return false; - } -#endif - // also require d3dcompiler_??.dll if(GetD3DCompiler() == NULL) { @@ -60,19 +51,6 @@ public: if(!success) return false; -#if USE_MHOOK - // FRAPS compatibility. Save out the first 16 bytes (arbitrary number) of the 'real' function code. - // this should be - // jmp D3D11CreateDeviceAndSwapChain_hook - // push r12 <- this is where our trampoline jumps back to - // push r13 - // - // FRAPS stomps over this with its own hook that we detect and handle later. - void *hooked_func_ptr = GetProcAddress(GetModuleHandleA("d3d11.dll"), "D3D11CreateDeviceAndSwapChain"); - if(hooked_func_ptr == NULL) return false; - memcpy(CreateDeviceAndSwapChain_ident, hooked_func_ptr, 16); -#endif - m_HasHooks = true; m_EnabledHooks = true; @@ -192,32 +170,6 @@ private: PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN createFunc = (PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN)GetProcAddress(GetModuleHandleA("d3d11.dll"), "D3D11CreateDeviceAndSwapChain"); -#if USE_MHOOK - if(createFunc) - { - byte ident[16]; - memcpy(ident, createFunc, 16); - - // FRAPS compatibility. If FRAPS has come in and modified the real code to something like - // mov rax, [ptrintofraps] - // jmp rax - // then we just jump straight there. If we jump to the trampoline, we'll come in half way through - // those instructions and things will go boom very quickly. - // - // Note that when we call this function FRAPS then restores the asm from before it got here, which is our - // trampolined code, so FRAPS is going to call back into this function. We detect this re-entrancy - // at the top and just go straight into the real d3d function now that FRAPS has restored our trampoline, - // and return right back here - // What a headache! - // - // in the non-fraps case no-one else has messed with this code so the idents will be the same and we - // will use our trampolines. - - if(!memcmp(ident, CreateDeviceAndSwapChain_ident, 16) && m_HasHooks) - createFunc = CreateDeviceAndSwapChain(); - } -#endif - // shouldn't ever get here, we should either have it from procaddress or the trampoline, but let's be // safe. if(createFunc == NULL) diff --git a/renderdoc/hooks/dxgi_hooks.cpp b/renderdoc/hooks/dxgi_hooks.cpp index d7a5e6c5e..1238f79ed 100644 --- a/renderdoc/hooks/dxgi_hooks.cpp +++ b/renderdoc/hooks/dxgi_hooks.cpp @@ -40,11 +40,6 @@ public: { bool success = true; -#if USE_MHOOK - // require d3d11.dll hooked as well for proper operation - if(GetModuleHandleA("d3d11.dll") == NULL) return false; -#endif - success &= CreateDXGIFactory.Initialize("CreateDXGIFactory", DLL_NAME, CreateDXGIFactory_hook); success &= CreateDXGIFactory1.Initialize("CreateDXGIFactory1", DLL_NAME, CreateDXGIFactory1_hook); diff --git a/renderdoc/hooks/gl_win32_hooks.cpp b/renderdoc/hooks/gl_win32_hooks.cpp index db1ec37fd..6e17d6347 100644 --- a/renderdoc/hooks/gl_win32_hooks.cpp +++ b/renderdoc/hooks/gl_win32_hooks.cpp @@ -228,14 +228,6 @@ class OpenGLHook : LibraryHook if(!m_EnabledHooks) return false; -#if USE_MHOOK - if(GetModuleHandleA(DLL_NAME) == NULL) - { - RDCWARN("Failed to load %hs - not inserting OpenGL hooks.", DLL_NAME); - return false; - } -#endif - bool success = SetupHooks(GL); if(!success) return false; diff --git a/renderdoc/hooks/hooks.h b/renderdoc/hooks/hooks.h index e60da3b68..061004643 100644 --- a/renderdoc/hooks/hooks.h +++ b/renderdoc/hooks/hooks.h @@ -35,13 +35,7 @@ using std::map; #if defined(WIN32) -#if USE_MHOOK - #include "3rdparty/mhook/mhook-lib/mhook.h" -#elif USE_IAT_HOOK - #include "os/win32/win32_hook.h" -#else - #error "No hook method enabled" -#endif +#include "os/win32/win32_hook.h" template class Hook @@ -53,9 +47,6 @@ class Hook } ~Hook() { -#if USE_MHOOK - Mhook_Unhook(&orig_funcptr); -#endif } FuncType operator()() @@ -67,29 +58,15 @@ class Hook { orig_funcptr = Process::GetFunctionAddress(module_name, function); -#if USE_MHOOK - if(orig_funcptr == NULL) - return false; - - return Mhook_SetHook(&orig_funcptr, destination_function_ptr); -#elif USE_IAT_HOOK return Win32_IAT_Hook(&orig_funcptr, module_name, function, destination_function_ptr); -#else - #error "No hook method enabled" -#endif } private: void *orig_funcptr; }; -#if USE_MHOOK - #define HOOKS_BEGIN() Mhook_SuspendOtherThreads() - #define HOOKS_END() Mhook_ResumeOtherThreads() -#else - #define HOOKS_BEGIN() Win32_IAT_BeginHooks() - #define HOOKS_END() Win32_IAT_EndHooks() -#endif +#define HOOKS_BEGIN() Win32_IAT_BeginHooks() +#define HOOKS_END() Win32_IAT_EndHooks() #elif defined(LINUX) diff --git a/renderdoc/os/win32/win32_process.cpp b/renderdoc/os/win32/win32_process.cpp index a8aef6412..6435a4897 100644 --- a/renderdoc/os/win32/win32_process.cpp +++ b/renderdoc/os/win32/win32_process.cpp @@ -292,20 +292,6 @@ uint32_t Process::InjectIntoProcess(uint32_t pid, const wchar_t *logfile, const } #endif -#if USE_MHOOK - // misc - InjectDLL(hProcess, L"kernel32.dll"); - - // D3D11 - InjectDLL(hProcess, L"d3d9.dll"); - InjectDLL(hProcess, L"d3d11.dll"); - InjectDLL(hProcess, L"dxgi.dll"); - - // OpenGL - InjectDLL(hProcess, L"opengl32.dll"); - InjectDLL(hProcess, L"gdi32.dll"); -#endif - InjectDLL(hProcess, renderdocPath); uintptr_t loc = FindRemoteDLL(pid, L"renderdoc.dll"); diff --git a/renderdoc/os/win32/win32_shellext.cpp b/renderdoc/os/win32/win32_shellext.cpp index 804d92c72..3c4c53c66 100644 --- a/renderdoc/os/win32/win32_shellext.cpp +++ b/renderdoc/os/win32/win32_shellext.cpp @@ -32,7 +32,7 @@ #include "core/core.h" #include "serialise/serialiser.h" -#include "3rdparty/jpeg-compressor/jpgd.h" +#include "jpeg-compressor/jpgd.h" // {5D6BF029-A6BA-417A-8523-120492B1DCE3} static const GUID CLSID_RDCThumbnailProvider = { 0x5d6bf029, 0xa6ba, 0x417a, { 0x85, 0x23, 0x12, 0x4, 0x92, 0xb1, 0xdc, 0xe3 } }; diff --git a/renderdoc/os/win32_specific.h b/renderdoc/os/win32_specific.h index caa19cde7..4300aa8f8 100644 --- a/renderdoc/os/win32_specific.h +++ b/renderdoc/os/win32_specific.h @@ -47,8 +47,3 @@ namespace Threading { typedef CriticalSectionTemplate CriticalSection; }; - -// Hooking configuration -#define USE_MHOOK 0 -#define USE_IAT_HOOK 1 - diff --git a/renderdoc/renderdoc.vcxproj b/renderdoc/renderdoc.vcxproj index cbd2cdc79..a5e656288 100644 --- a/renderdoc/renderdoc.vcxproj +++ b/renderdoc/renderdoc.vcxproj @@ -69,15 +69,16 @@ false $(SolutionDir)$(Platform)\$(Configuration)\ $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) - $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x86;$(SolutionDir)\breakpad\$(PlatformToolset)\lib32;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x86;$(LibraryPath) $(ProgramFiles)\Windows Kits\8.1\bin\x86;$(ExecutablePath) $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) + $(Platform)\$(Configuration)\ false - $(SolutionDir)\$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) - $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x64;$(SolutionDir)\breakpad\$(PlatformToolset)\lib64;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x64;$(LibraryPath) $(ProgramFiles)\Windows Kits\8.1\bin;$(ExecutablePath) $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) @@ -85,15 +86,16 @@ false $(SolutionDir)$(Platform)\$(Configuration)\ $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) - $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x86;$(SolutionDir)\breakpad\$(PlatformToolset)\lib32;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x86;$(LibraryPath) $(ProgramFiles)\Windows Kits\8.1\bin\x86;$(ExecutablePath) $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) + $(Platform)\$(Configuration)\ false - $(SolutionDir)\$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) - $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x64;$(SolutionDir)\breakpad\$(PlatformToolset)\lib64;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x64;$(LibraryPath) $(ProgramFiles)\Windows Kits\8.1\bin;$(ExecutablePath) $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) @@ -108,7 +110,7 @@ /wd4100 /wd4189 /wd4127 /DRENDERDOC_PLATFORM=win32 %(AdditionalOptions) - $(ProjectDir) + $(ProjectDir);$(SolutionDir)renderdoc\3rdparty\ false true true @@ -119,7 +121,7 @@ true true $(ProjectDir)os\win32\comexport.def - breakpad_common.lib;exception_handler.lib;crash_generation_client.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;psapi.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\breakpad_common.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\crash_generation_client.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\exception_handler.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;psapi.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) @@ -137,7 +139,7 @@ /wd4100 /wd4189 /wd4127 /DRENDERDOC_PLATFORM=win32 %(AdditionalOptions) - $(ProjectDir) + $(ProjectDir);$(SolutionDir)renderdoc\3rdparty\ false true true @@ -148,7 +150,7 @@ true true $(ProjectDir)os\win32\comexport.def - breakpad_common.lib;exception_handler.lib;crash_generation_client.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;psapi.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\breakpad_common.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\crash_generation_client.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\exception_handler.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;psapi.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) xcopy /Y /Q /S "$(SolutionDir)\Win32\$(ConfigurationName)\pdblocate" "$(OutputPath)\pdblocate\" @@ -167,7 +169,7 @@ /wd4100 /wd4189 /wd4127 %(AdditionalOptions) false EnableFastChecks - $(ProjectDir) + $(ProjectDir);$(SolutionDir)renderdoc\3rdparty\ false false true @@ -179,7 +181,7 @@ false false $(ProjectDir)os\win32\comexport.def - breakpad_common.lib;exception_handler.lib;crash_generation_client.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;psapi.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;psapi.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) Default @@ -200,7 +202,7 @@ /wd4100 /wd4189 /wd4127 /DRENDERDOC_PLATFORM=win32 %(AdditionalOptions) false EnableFastChecks - $(ProjectDir) + $(ProjectDir);$(SolutionDir)renderdoc\3rdparty\ false true true @@ -211,7 +213,7 @@ false false $(ProjectDir)os\win32\comexport.def - breakpad_common.lib;exception_handler.lib;crash_generation_client.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;psapi.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;psapi.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) Default @@ -222,12 +224,6 @@ - - - - - - @@ -300,11 +296,6 @@ - - - - - diff --git a/renderdoc/renderdoc.vcxproj.filters b/renderdoc/renderdoc.vcxproj.filters index eea95cd14..ec5ae44b9 100644 --- a/renderdoc/renderdoc.vcxproj.filters +++ b/renderdoc/renderdoc.vcxproj.filters @@ -46,12 +46,6 @@ {36ccf267-d6c1-41c9-87c3-92c1dfcbe88b} - - {62242fef-51cb-419e-bbe9-3347653ece06} - - - {880a29ed-1f7d-46f2-9bcd-c4a9b73b7be5} - {dfe56374-9726-4919-8529-123cf5ba6ef5} @@ -61,9 +55,6 @@ {1d17fb69-fd1a-44a6-a530-05642d97ddc6} - - {911d2076-eaea-4783-b0c3-789e5b6eff1f} - {0ecdcd74-a30b-457e-8b22-92bd58405c56} @@ -73,9 +64,6 @@ {5e7e0e62-aba4-4256-b0ec-a1a7fbcba715} - - {f22a6629-346c-400d-9706-7f999d539f6b} - {7d6b0f22-1180-4767-b284-cc87f54ec012} @@ -88,6 +76,15 @@ {eb0686f4-bcb3-4edd-b488-937b1491909b} + + {5f5e3b49-5091-4a26-b24b-723ebb95ba78} + + + {d7a4190d-f68a-4e08-877f-04be35995e03} + + + {043f5a32-683e-4b56-bcc6-512444b40d70} + @@ -198,30 +195,6 @@ Drivers\OpenGL - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\jpeg-compressor - - - 3rdparty\jpeg-compressor - Common\Maths @@ -234,9 +207,6 @@ Core\networking - - 3rdparty\lz4 - Core @@ -279,12 +249,6 @@ Drivers\OpenGL - - 3rdparty\stb - - - 3rdparty\stb - Resources @@ -318,6 +282,21 @@ Common\File Formats + + 3rdparty\jpeg-compressor + + + 3rdparty\jpeg-compressor + + + 3rdparty\lz4 + + + 3rdparty\stb + + + 3rdparty\stb + @@ -425,27 +404,6 @@ OS\Win32 - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\mhook - - - 3rdparty\jpeg-compressor - - - 3rdparty\jpeg-compressor - OS\Win32 @@ -464,9 +422,6 @@ Core\networking - - 3rdparty\lz4 - Replay @@ -539,12 +494,21 @@ Drivers\OpenGL - - 3rdparty\stb - Common\File Formats + + 3rdparty\jpeg-compressor + + + 3rdparty\jpeg-compressor + + + 3rdparty\lz4 + + + 3rdparty\stb + @@ -592,4 +556,4 @@ Resources - \ No newline at end of file + diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 9b0651584..4d9808846 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -34,10 +34,10 @@ #include "serialise/serialiser.h" -#include "3rdparty/jpeg-compressor/jpgd.h" -#include "3rdparty/jpeg-compressor/jpge.h" -#include "3rdparty/stb/stb_image.h" -#include "3rdparty/stb/stb_image_write.h" +#include "jpeg-compressor/jpgd.h" +#include "jpeg-compressor/jpge.h" +#include "stb/stb_image.h" +#include "stb/stb_image_write.h" #include "common/dds_readwrite.h" static inline float ConvertComponent(ResourceFormat fmt, byte *data) diff --git a/renderdoccmd/renderdoccmd.vcxproj b/renderdoccmd/renderdoccmd.vcxproj index 9d23312c2..fbe0c0d3d 100644 --- a/renderdoccmd/renderdoccmd.vcxproj +++ b/renderdoccmd/renderdoccmd.vcxproj @@ -64,26 +64,26 @@ true - $(SolutionDir)\breakpad;$(IncludePath) - $(SolutionDir)\breakpad\$(PlatformToolset)\lib32;$(LibraryPath) + $(IncludePath) + $(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\ true - $(SolutionDir)\breakpad;$(IncludePath) - $(SolutionDir)\breakpad\$(PlatformToolset)\lib64;$(LibraryPath) + $(IncludePath) + $(LibraryPath) $(SolutionDir)\$(Platform)\$(Configuration)\ false - $(SolutionDir)\breakpad;$(IncludePath) - $(SolutionDir)\breakpad\$(PlatformToolset)\lib32;$(LibraryPath) + $(IncludePath) + $(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\ false - $(SolutionDir)\breakpad;$(IncludePath) - $(SolutionDir)\breakpad\$(PlatformToolset)\lib64;$(LibraryPath) + $(IncludePath) + $(LibraryPath) $(SolutionDir)\$(Platform)\$(Configuration)\ @@ -93,14 +93,14 @@ Level3 Disabled WIN32;RENDERDOC_PLATFORM=win32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - ..\renderdoc\api\ + ..\renderdoc\api\;$(SolutionDir)renderdoc\3rdparty\ MultiThreadedDLL true Windows true - $(OutDir)\renderdoc.lib;breakpad_common.lib;crash_generation_server.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) + ws2_32.lib;Wininet.lib;%(AdditionalDependencies) @@ -110,14 +110,14 @@ Level3 Disabled WIN32;RENDERDOC_PLATFORM=win32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - ..\renderdoc\api\ + ..\renderdoc\api\;$(SolutionDir)renderdoc\3rdparty\ MultiThreadedDLL true Windows true - $(OutDir)\renderdoc.lib;breakpad_common.lib;crash_generation_server.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) + ws2_32.lib;Wininet.lib;%(AdditionalDependencies) @@ -128,8 +128,8 @@ MaxSpeed true true - WIN32;RENDERDOC_PLATFORM=win32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - ..\renderdoc\api\ + WIN32;RENDERDOC_PLATFORM=win32;NDEBUG;RELEASE;_CONSOLE;%(PreprocessorDefinitions) + ..\renderdoc\api\;$(SolutionDir)renderdoc\3rdparty\ true @@ -137,7 +137,7 @@ true true true - $(OutDir)\renderdoc.lib;breakpad_common.lib;crash_generation_server.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) + $(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\breakpad_common.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\crash_generation_server.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) @@ -148,8 +148,8 @@ MaxSpeed true true - WIN32;RENDERDOC_PLATFORM=win32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - ..\renderdoc\api\ + WIN32;RENDERDOC_PLATFORM=win32;NDEBUG;RELEASE;_CONSOLE;%(PreprocessorDefinitions) + ..\renderdoc\api\;$(SolutionDir)renderdoc\3rdparty\ true @@ -157,11 +157,11 @@ true true true - $(OutDir)\renderdoc.lib;breakpad_common.lib;crash_generation_server.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) + $(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\breakpad_common.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\crash_generation_server.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) - + @@ -169,13 +169,23 @@ - + + + + {e2b46d67-90e2-40b6-9597-72930e7845e5} + false + true + false + true + false + + diff --git a/renderdoccmd/renderdoccmd.vcxproj.filters b/renderdoccmd/renderdoccmd.vcxproj.filters index 8b3124ff2..1625b4795 100644 --- a/renderdoccmd/renderdoccmd.vcxproj.filters +++ b/renderdoccmd/renderdoccmd.vcxproj.filters @@ -2,8 +2,10 @@ - + + 3rdparty + @@ -12,12 +14,17 @@ Resources - + + 3rdparty + {3979a11e-8029-4886-a51e-a2a9bb91d69f} + + {a8ca84b9-239b-4640-95e9-f9bd141ef465} + diff --git a/renderdoccmd/renderdoccmd_win32.cpp b/renderdoccmd/renderdoccmd_win32.cpp index d824a31f6..577cf201f 100644 --- a/renderdoccmd/renderdoccmd_win32.cpp +++ b/renderdoccmd/renderdoccmd_win32.cpp @@ -31,17 +31,20 @@ #include "resource.h" -// breakpad -#include "common/windows/http_upload.h" -#include "client/windows/crash_generation/client_info.h" -#include "client/windows/crash_generation/crash_generation_server.h" - -#include "miniz.h" +#include "miniz/miniz.h" using std::string; using std::wstring; using std::vector; +HINSTANCE hInstance = NULL; + +#if defined(RELEASE) +// breakpad +#include "breakpad/common/windows/http_upload.h" +#include "breakpad/client/windows/crash_generation/client_info.h" +#include "breakpad/client/windows/crash_generation/crash_generation_server.h" + using google_breakpad::ClientInfo; using google_breakpad::CrashGenerationServer; @@ -59,8 +62,6 @@ wstring dump = L""; vector customInfo; wstring logpath = L""; -HINSTANCE hInstance = NULL; - INT_PTR CALLBACK CrashHandlerProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) @@ -186,6 +187,7 @@ static void _cdecl OnClientExited(void* context, const ClientInfo* client_info) { exitServer = true; } +#endif LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -319,7 +321,8 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, { return 1; } - + +#if defined(RELEASE) CrashGenerationServer *crashServer = NULL; // special WIN32 option for launching the crash handler @@ -494,6 +497,7 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, return 0; } +#endif return renderdoccmd(argc, argv); }