range-stepping.c revision 1.9
1/* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2013-2020 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#elif (defined __aarch64__) 30# define NOP " nop\n" 31#else 32# define NOP "" /* port me */ 33#endif 34 35int 36main(void) 37{ 38 /* Note: 'volatile' is used to make sure the compiler doesn't 39 optimize out these variables. We want to be sure instructions 40 are generated for accesses. */ 41 volatile int i = 0; 42 43 /* Generate a single line with a label in the middle where we can 44 place either a trap tracepoint or a fast tracepoint. */ 45#define LINE_WITH_FAST_TRACEPOINT \ 46 do { \ 47 i = 1; \ 48 asm (" .global " SYMBOL (set_point) "\n" \ 49 SYMBOL (set_point) ":\n" \ 50 NOP \ 51 ); \ 52 i = 2; \ 53 } while (0) 54 55 LINE_WITH_FAST_TRACEPOINT; /* location 1 */ 56 57 return 0; 58} 59