range-stepping.c revision 1.3
1/* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2013-2015 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18#ifdef SYMBOL_PREFIX 19#define SYMBOL(str) SYMBOL_PREFIX #str 20#else 21#define SYMBOL(str) #str 22#endif 23 24/* `set_point' further below is the label where we'll set tracepoints 25 at. The insn at the label must the large enough to fit a fast 26 tracepoint jump. */ 27#if (defined __x86_64__ || defined __i386__) 28# define NOP " .byte 0xe9,0x00,0x00,0x00,0x00\n" /* jmp $+5 (5-byte nop) */ 29#else 30# define NOP "" /* port me */ 31#endif 32 33int 34main(void) 35{ 36 /* Note: 'volatile' is used to make sure the compiler doesn't 37 optimize out these variables. We want to be sure instructions 38 are generated for accesses. */ 39 volatile int i = 0; 40 41 /* Generate a single line with a label in the middle where we can 42 place either a trap tracepoint or a fast tracepoint. */ 43#define LINE_WITH_FAST_TRACEPOINT \ 44 do { \ 45 i = 1; \ 46 asm (" .global " SYMBOL (set_point) "\n" \ 47 SYMBOL (set_point) ":\n" \ 48 NOP \ 49 ); \ 50 i = 2; \ 51 } while (0) 52 53 LINE_WITH_FAST_TRACEPOINT; /* location 1 */ 54 55 return 0; 56} 57