Detect the absence of a symbol hash table.
[deliverable/binutils-gdb.git] / gdb / alpha-tdep.c
index b19d85feb1902963647fc3d558c393e6d88e8e51..2382be1453485a8938c315246fc530c6b0d6f00a 100644 (file)
@@ -1,5 +1,5 @@
 /* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger.
-   Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+   Copyright 1993, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -35,7 +35,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 extern struct obstack frame_cache_obstack;
 \f
 
-/* Forward declarations.  */
+/* Prototypes for local functions. */
 
 static alpha_extra_func_info_t push_sigtramp_desc PARAMS ((CORE_ADDR low_addr));
 
@@ -134,7 +134,7 @@ struct linked_proc_info
 } *linked_proc_desc_table = NULL;
 
 \f
-/* Under Linux, signal handler invocations can be identified by the
+/* Under GNU/Linux, signal handler invocations can be identified by the
    designated code sequence that is used to return from a signal
    handler.  In particular, the return address of a signal handler
    points to the following sequence (the first instruction is quadword
@@ -399,6 +399,18 @@ alpha_saved_pc_after_call (frame)
 static struct alpha_extra_func_info temp_proc_desc;
 static struct frame_saved_regs temp_saved_regs;
 
+/* Nonzero if instruction at PC is a return instruction.  "ret
+   $zero,($ra),1" on alpha. */
+
+static int
+alpha_about_to_return (pc)
+     CORE_ADDR pc;
+{
+  return read_memory_integer (pc, 4) == 0x6bfa8001;
+}
+
+
+
 /* This fencepost looks highly suspicious to me.  Removing it also
    seems suspicious as it could affect remote debugging across serial
    lines.  */
@@ -449,8 +461,8 @@ Otherwise, you told GDB there was a function where there isn't one, or\n\
 
            return 0; 
          }
-       else if (ABOUT_TO_RETURN(start_pc))
-           break;
+       else if (alpha_about_to_return (start_pc))
+         break;
 
     start_pc += 4; /* skip return */
     return start_pc;
@@ -519,14 +531,18 @@ heuristic_proc_desc(start_pc, limit_pc, next_frame)
               rearrange the register saves.
               So we recognize only a few registers (t7, t9, ra) within
               the procedure prologue as valid return address registers.
+              If we encounter a return instruction, we extract the
+              the return address register from it.
 
               FIXME: Rewriting GDB to access the procedure descriptors,
               e.g. via the minimal symbol table, might obviate this hack.  */
            if (pcreg == -1
-               && cur_pc < (start_pc + 20)
+               && cur_pc < (start_pc + 80)
                && (reg == T7_REGNUM || reg == T9_REGNUM || reg == RA_REGNUM))
              pcreg = reg;
          }
+       else if ((word & 0xffe0ffff) == 0x6be08001)     /* ret zero,reg,1 */
+         pcreg = (word >> 16) & 0x1f;
        else if (word == 0x47de040f)                    /* bis sp,sp fp */
          has_frame_reg = 1;
       }
@@ -534,15 +550,13 @@ heuristic_proc_desc(start_pc, limit_pc, next_frame)
       {
        /* If we haven't found a valid return address register yet,
           keep searching in the procedure prologue.  */
-       while (cur_pc < (limit_pc + 20) && cur_pc < (start_pc + 20))
+       while (cur_pc < (limit_pc + 80) && cur_pc < (start_pc + 80))
          {
            char buf[4];
            unsigned long word;
-           int status;
 
-           status = read_memory_nobpt (cur_pc, buf, 4); 
-           if (status)
-             memory_error (status, cur_pc);
+           if (read_memory_nobpt (cur_pc, buf, 4))
+             break;
            cur_pc += 4;
            word = extract_unsigned_integer (buf, 4);
 
@@ -556,6 +570,11 @@ heuristic_proc_desc(start_pc, limit_pc, next_frame)
                    break;
                  }
              }
+           else if ((word & 0xffe0ffff) == 0x6be08001) /* ret zero,reg,1 */
+             {
+               pcreg = (word >> 16) & 0x1f;
+               break;
+             }
          }
       }
 
@@ -1001,7 +1020,7 @@ alpha_push_dummy_frame()
    */
 
 /* MASK(i,j) == (1<<i) + (1<<(i+1)) + ... + (1<<j)). Assume i<=j<31. */
-#define MASK(i,j) (((1L << ((j)+1)) - 1) ^ ((1L << (i)) - 1))
+#define MASK(i,j) ((((LONGEST)1 << ((j)+1)) - 1) ^ (((LONGEST)1 << (i)) - 1))
 #define GEN_REG_SAVE_MASK (MASK(0,8) | MASK(16,29))
 #define GEN_REG_SAVE_COUNT 24
 #define FLOAT_REG_SAVE_MASK (MASK(0,1) | MASK(10,30))
This page took 0.026953 seconds and 4 git commands to generate.