* spu-tdep.c (spu_analyze_prologue): Track instruction to
authorUlrich Weigand <uweigand@de.ibm.com>
Tue, 2 Mar 2010 20:21:08 +0000 (20:21 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Tue, 2 Mar 2010 20:21:08 +0000 (20:21 +0000)
store backchain as part of prologue.

gdb/ChangeLog
gdb/spu-tdep.c

index 2f5bbdf2fa2b4781f8fba57530082393109f356e..c41c38dfd5e0d1e90784e585680def29091afffe 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-02  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * spu-tdep.c (spu_analyze_prologue): Track instruction to
+       store backchain as part of prologue.
+
 2010-03-02  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * progspace.c (update_address_spaces): Update inferior address spaces
index c6db8dc5abf2c68d319b9dec0548ca49be2a7946..269ad2897b3f480da963e2a84f4659eb33ddad4e 100644 (file)
@@ -633,6 +633,7 @@ spu_analyze_prologue (struct gdbarch *gdbarch,
   int found_sp = 0;
   int found_fp = 0;
   int found_lr = 0;
+  int found_bc = 0;
   int reg_immed[SPU_NUM_GPRS];
   gdb_byte buf[16];
   CORE_ADDR prolog_pc = start_pc;
@@ -661,8 +662,9 @@ spu_analyze_prologue (struct gdbarch *gdbarch,
        - The first instruction to set up the stack pointer.
        - The first instruction to set up the frame pointer.
        - The first instruction to save the link register.
+       - The first instruction to save the backchain.
 
-     We return the instruction after the latest of these three,
+     We return the instruction after the latest of these four,
      or the incoming PC if none is found.  The first instruction
      to set up the stack pointer also defines the frame size.
 
@@ -771,6 +773,14 @@ spu_analyze_prologue (struct gdbarch *gdbarch,
              found_lr = 1;
              prolog_pc = pc + 4;
            }
+
+         if (ra == SPU_RAW_SP_REGNUM
+             && (found_sp? immed == 0 : rt == SPU_RAW_SP_REGNUM)
+             && !found_bc)
+           {
+             found_bc = 1;
+             prolog_pc = pc + 4;
+           }
        }
 
       /* _start uses SELB to set up the stack pointer.  */