Home | History | Annotate | Line # | Download | only in gdb.arch
      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