1 1.1 christos /* Unwinder test program. 2 1.1 christos 3 1.11 christos Copyright (C) 2003-2024 Free Software Foundation, Inc. 4 1.1 christos 5 1.1 christos This file is part of GDB. 6 1.1 christos 7 1.1 christos This program is free software; you can redistribute it and/or modify 8 1.1 christos it under the terms of the GNU General Public License as published by 9 1.1 christos the Free Software Foundation; either version 3 of the License, or 10 1.1 christos (at your option) any later version. 11 1.1 christos 12 1.1 christos This program is distributed in the hope that it will be useful, 13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 christos GNU General Public License for more details. 16 1.1 christos 17 1.1 christos You should have received a copy of the GNU General Public License 18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 1.1 christos 20 1.1 christos #ifdef SYMBOL_PREFIX 21 1.1 christos #define SYMBOL(str) SYMBOL_PREFIX #str 22 1.1 christos #else 23 1.1 christos #define SYMBOL(str) #str 24 1.1 christos #endif 25 1.1 christos 26 1.1 christos void gdb1253 (void); 27 1.1 christos void gdb1718 (void); 28 1.1 christos void gdb1338 (void); 29 1.1 christos void jump_at_beginning (void); 30 1.6 christos void standard (void); 31 1.6 christos void stack_align_ecx (void); 32 1.6 christos void stack_align_edx (void); 33 1.6 christos void stack_align_eax (void); 34 1.1 christos 35 1.1 christos int 36 1.1 christos main (void) 37 1.1 christos { 38 1.1 christos standard (); 39 1.1 christos stack_align_ecx (); 40 1.1 christos stack_align_edx (); 41 1.1 christos stack_align_eax (); 42 1.1 christos gdb1253 (); 43 1.1 christos gdb1718 (); 44 1.1 christos gdb1338 (); 45 1.1 christos jump_at_beginning (); 46 1.1 christos return 0; 47 1.1 christos } 48 1.1 christos 49 1.1 christos /* A normal prologue. */ 50 1.1 christos 51 1.1 christos asm(".text\n" 52 1.1 christos " .align 8\n" 53 1.1 christos SYMBOL (standard) ":\n" 54 1.1 christos " pushl %ebp\n" 55 1.1 christos " movl %esp, %ebp\n" 56 1.1 christos " pushl %edi\n" 57 1.1 christos " int $0x03\n" 58 1.1 christos " leave\n" 59 1.1 christos " ret\n"); 60 1.1 christos 61 1.1 christos /* Relevant part of the prologue from symtab/1253. */ 62 1.1 christos 63 1.1 christos asm(".text\n" 64 1.1 christos " .align 8\n" 65 1.1 christos SYMBOL (gdb1253) ":\n" 66 1.1 christos " pushl %ebp\n" 67 1.1 christos " xorl %ecx, %ecx\n" 68 1.1 christos " movl %esp, %ebp\n" 69 1.1 christos " pushl %edi\n" 70 1.1 christos " int $0x03\n" 71 1.1 christos " leave\n" 72 1.1 christos " ret\n"); 73 1.1 christos 74 1.1 christos /* Relevant part of the prologue from backtrace/1718. */ 75 1.1 christos 76 1.1 christos asm(".text\n" 77 1.1 christos " .align 8\n" 78 1.1 christos SYMBOL (gdb1718) ":\n" 79 1.1 christos " pushl %ebp\n" 80 1.1 christos " movl $0x11111111, %eax\n" 81 1.1 christos " movl %esp, %ebp\n" 82 1.1 christos " pushl %esi\n" 83 1.1 christos " movl $0x22222222, %esi\n" 84 1.1 christos " pushl %ebx\n" 85 1.1 christos " int $0x03\n" 86 1.1 christos " leave\n" 87 1.1 christos " ret\n"); 88 1.1 christos 89 1.1 christos /* Relevant part of the prologue from backtrace/1338. */ 90 1.1 christos 91 1.1 christos asm(".text\n" 92 1.1 christos " .align 8\n" 93 1.1 christos SYMBOL (gdb1338) ":\n" 94 1.1 christos " pushl %edi\n" 95 1.1 christos " pushl %esi\n" 96 1.1 christos " pushl %ebx\n" 97 1.1 christos " int $0x03\n" 98 1.1 christos " popl %ebx\n" 99 1.1 christos " popl %esi\n" 100 1.1 christos " popl %edi\n" 101 1.1 christos " ret\n"); 102 1.1 christos 103 1.1 christos /* The purpose of this function is to verify that, during prologue 104 1.1 christos skip, GDB does not follow a jump at the beginnning of the "real" 105 1.1 christos code. */ 106 1.1 christos 107 1.1 christos asm(".text\n" 108 1.1 christos " .align 8\n" 109 1.1 christos SYMBOL (jump_at_beginning) ":\n" 110 1.1 christos " pushl %ebp\n" 111 1.1 christos " movl %esp,%ebp\n" 112 1.1 christos " jmp .gdbjump\n" 113 1.1 christos " nop\n" 114 1.1 christos ".gdbjump:\n" 115 1.1 christos " movl %ebp,%esp\n" 116 1.1 christos " popl %ebp\n" 117 1.1 christos " ret\n"); 118 1.1 christos 119 1.1 christos asm(".text\n" 120 1.1 christos " .align 8\n" 121 1.1 christos SYMBOL (stack_align_ecx) ":\n" 122 1.1 christos " leal 4(%esp), %ecx\n" 123 1.1 christos " andl $-16, %esp\n" 124 1.1 christos " pushl -4(%ecx)\n" 125 1.1 christos " pushl %ebp\n" 126 1.1 christos " movl %esp, %ebp\n" 127 1.1 christos " pushl %edi\n" 128 1.1 christos " pushl %ecx\n" 129 1.1 christos " int $0x03\n" 130 1.1 christos " popl %ecx\n" 131 1.1 christos " popl %edi\n" 132 1.1 christos " popl %ebp\n" 133 1.1 christos " leal -4(%ecx), %esp\n" 134 1.1 christos " ret\n"); 135 1.1 christos 136 1.1 christos asm(".text\n" 137 1.1 christos " .align 8\n" 138 1.1 christos SYMBOL (stack_align_edx) ":\n" 139 1.1 christos " leal 4(%esp), %edx\n" 140 1.1 christos " andl $-16, %esp\n" 141 1.1 christos " pushl -4(%edx)\n" 142 1.1 christos " pushl %ebp\n" 143 1.1 christos " movl %esp, %ebp\n" 144 1.1 christos " pushl %edi\n" 145 1.1 christos " pushl %ecx\n" 146 1.1 christos " int $0x03\n" 147 1.1 christos " popl %ecx\n" 148 1.1 christos " popl %edi\n" 149 1.1 christos " popl %ebp\n" 150 1.1 christos " leal -4(%edx), %esp\n" 151 1.1 christos " ret\n"); 152 1.1 christos 153 1.1 christos asm(".text\n" 154 1.1 christos " .align 8\n" 155 1.1 christos SYMBOL (stack_align_eax) ":\n" 156 1.1 christos " leal 4(%esp), %eax\n" 157 1.1 christos " andl $-16, %esp\n" 158 1.1 christos " pushl -4(%eax)\n" 159 1.1 christos " pushl %ebp\n" 160 1.1 christos " movl %esp, %ebp\n" 161 1.1 christos " pushl %edi\n" 162 1.1 christos " pushl %ecx\n" 163 1.1 christos " int $0x03\n" 164 1.1 christos " popl %ecx\n" 165 1.1 christos " popl %edi\n" 166 1.1 christos " popl %ebp\n" 167 1.1 christos " leal -4(%eax), %esp\n" 168 1.1 christos " ret\n"); 169 1.1 christos 170