From e0cad4e732222528e8ebc05921c1f49d0f9a952d Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sun, 20 Sep 2015 13:20:21 +0300 Subject: [PATCH] Fix for support win64. --HG-- branch : develop --- src/libs/vmisc/debugbreak.h | 84 +++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/src/libs/vmisc/debugbreak.h b/src/libs/vmisc/debugbreak.h index 914105e9d..22bd46d59 100644 --- a/src/libs/vmisc/debugbreak.h +++ b/src/libs/vmisc/debugbreak.h @@ -1,16 +1,16 @@ /* Copyright (c) 2011-2015, Scott Tsai - * + * * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -40,9 +40,9 @@ extern "C" { #endif enum { - /* gcc optimizers consider code after __builtin_trap() dead. - * Making __builtin_trap() unsuitable for breaking into the debugger */ - DEBUG_BREAK_PREFER_BUILTIN_TRAP_TO_SIGTRAP = 0, + /* gcc optimizers consider code after __builtin_trap() dead. + * Making __builtin_trap() unsuitable for breaking into the debugger */ + DEBUG_BREAK_PREFER_BUILTIN_TRAP_TO_SIGTRAP = 0, }; #if defined(__i386__) || defined(__x86_64__) @@ -50,7 +50,7 @@ enum { HAVE_TRAP_INSTRUCTION = 1, }; __attribute__((gnu_inline, always_inline)) static void __inline__ trap_instruction(void) { - __asm__ volatile("int $0x03"); + __asm__ volatile("int $0x03"); } #elif defined(__thumb__) enum { HAVE_TRAP_INSTRUCTION = 1, }; @@ -58,47 +58,47 @@ enum { HAVE_TRAP_INSTRUCTION = 1, }; __attribute__((gnu_inline, always_inline)) static void __inline__ trap_instruction(void) { - /* See 'arm-linux-tdep.c' in GDB source. - * Both instruction sequences below work. */ + /* See 'arm-linux-tdep.c' in GDB source. + * Both instruction sequences below work. */ #if 1 - /* 'eabi_linux_thumb_le_breakpoint' */ - __asm__ volatile(".inst 0xde01"); + /* 'eabi_linux_thumb_le_breakpoint' */ + __asm__ volatile(".inst 0xde01"); #else - /* 'eabi_linux_thumb2_le_breakpoint' */ - __asm__ volatile(".inst.w 0xf7f0a000"); + /* 'eabi_linux_thumb2_le_breakpoint' */ + __asm__ volatile(".inst.w 0xf7f0a000"); #endif - /* Known problem: - * After a breakpoint hit, can't stepi, step, or continue in GDB. - * 'step' stuck on the same instruction. - * - * Workaround: a new GDB command, - * 'debugbreak-step' is defined in debugbreak-gdb.py - * that does: - * (gdb) set $instruction_len = 2 - * (gdb) tbreak *($pc + $instruction_len) - * (gdb) jump *($pc + $instruction_len) - */ + /* Known problem: + * After a breakpoint hit, can't stepi, step, or continue in GDB. + * 'step' stuck on the same instruction. + * + * Workaround: a new GDB command, + * 'debugbreak-step' is defined in debugbreak-gdb.py + * that does: + * (gdb) set $instruction_len = 2 + * (gdb) tbreak *($pc + $instruction_len) + * (gdb) jump *($pc + $instruction_len) + */ } #elif defined(__arm__) && !defined(__thumb__) enum { HAVE_TRAP_INSTRUCTION = 1, }; __attribute__((gnu_inline, always_inline)) static void __inline__ trap_instruction(void) { - /* See 'arm-linux-tdep.c' in GDB source, - * 'eabi_linux_arm_le_breakpoint' */ - __asm__ volatile(".inst 0xe7f001f0"); - /* Has same known problem and workaround - * as Thumb mode */ + /* See 'arm-linux-tdep.c' in GDB source, + * 'eabi_linux_arm_le_breakpoint' */ + __asm__ volatile(".inst 0xe7f001f0"); + /* Has same known problem and workaround + * as Thumb mode */ } #elif defined(__aarch64__) enum { HAVE_TRAP_INSTRUCTION = 1, }; __attribute__((gnu_inline, always_inline)) static void __inline__ trap_instruction(void) { - /* See 'aarch64-tdep.c' in GDB source, - * 'aarch64_default_breakpoint' */ - __asm__ volatile(".inst 0xd4200000"); + /* See 'aarch64-tdep.c' in GDB source, + * 'aarch64_default_breakpoint' */ + __asm__ volatile(".inst 0xd4200000"); } #else enum { HAVE_TRAP_INSTRUCTION = 0, }; @@ -107,15 +107,17 @@ enum { HAVE_TRAP_INSTRUCTION = 0, }; __attribute__((gnu_inline, always_inline)) static void __inline__ debug_break(void) { - if (HAVE_TRAP_INSTRUCTION) { - trap_instruction(); - } else if (DEBUG_BREAK_PREFER_BUILTIN_TRAP_TO_SIGTRAP) { - /* raises SIGILL on Linux x86{,-64}, to continue in gdb: - * (gdb) handle SIGILL stop nopass - * */ - __builtin_trap(); + if (HAVE_TRAP_INSTRUCTION) { + trap_instruction(); + } else if (DEBUG_BREAK_PREFER_BUILTIN_TRAP_TO_SIGTRAP) { + /* raises SIGILL on Linux x86{,-64}, to continue in gdb: + * (gdb) handle SIGILL stop nopass + * */ + __builtin_trap(); } else { - #ifdef _WIN32 + #if defined(_WIN32) || defined(_WIN64) + /* SIGTRAP available only on POSIX-compliant operating systems + * use builtin trap instead */ __builtin_trap(); #else raise(SIGTRAP);