* defs.h (strlen_paddr, paddr, paddr_nz): Remove.
[deliverable/binutils-gdb.git] / gdb / dwarf2-frame.c
index ce11d89ed42932a8a3ce7b59815399a59109bb28..fb5b08b6cb4d393a4c5b185a7ce5c803afa6440a 100644 (file)
@@ -130,7 +130,7 @@ struct comp_unit
   gdb_byte *dwarf_frame_buffer;
 
   /* Length of the loaded .debug_frame section.  */
-  unsigned long dwarf_frame_size;
+  bfd_size_type dwarf_frame_size;
 
   /* Pointer to the .debug_frame section.  */
   asection *dwarf_frame_section;
@@ -164,19 +164,19 @@ struct dwarf2_frame_state
     struct dwarf2_frame_state_reg *reg;
     int num_regs;
 
+    LONGEST cfa_offset;
+    ULONGEST cfa_reg;
+    enum {
+      CFA_UNSET,
+      CFA_REG_OFFSET,
+      CFA_EXP
+    } cfa_how;
+    gdb_byte *cfa_exp;
+
     /* Used to implement DW_CFA_remember_state.  */
     struct dwarf2_frame_state_reg_info *prev;
   } regs;
 
-  LONGEST cfa_offset;
-  ULONGEST cfa_reg;
-  gdb_byte *cfa_exp;
-  enum {
-    CFA_UNSET,
-    CFA_REG_OFFSET,
-    CFA_EXP
-  } cfa_how;
-
   /* The PC described by the current frame state.  */
   CORE_ADDR pc;
 
@@ -334,11 +334,11 @@ dwarf2_restore_rule (struct gdbarch *gdbarch, ULONGEST reg_num,
   if (fs->regs.reg[reg].how == DWARF2_FRAME_REG_UNSPECIFIED)
     complaint (&symfile_complaints, _("\
 incomplete CFI data; DW_CFA_restore unspecified\n\
-register %s (#%d) at 0x%s"),
+register %s (#%d) at %s"),
                       gdbarch_register_name
                       (gdbarch, gdbarch_dwarf2_reg_to_regnum (gdbarch, reg)),
                       gdbarch_dwarf2_reg_to_regnum (gdbarch, reg),
-                      paddr (fs->pc));
+                      paddress (gdbarch, fs->pc));
 }
 
 static CORE_ADDR
@@ -490,7 +490,8 @@ execute_cfa_program (struct dwarf2_fde *fde, gdb_byte *insn_ptr,
                if (old_rs == NULL)
                  {
                    complaint (&symfile_complaints, _("\
-bad CFI data; mismatched DW_CFA_restore_state at 0x%s"), paddr (fs->pc));
+bad CFI data; mismatched DW_CFA_restore_state at %s"),
+                              paddress (gdbarch, fs->pc));
                  }
                else
                  {
@@ -502,21 +503,22 @@ bad CFI data; mismatched DW_CFA_restore_state at 0x%s"), paddr (fs->pc));
              break;
 
            case DW_CFA_def_cfa:
-             insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_reg);
+             insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->regs.cfa_reg);
              insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
 
              if (fs->armcc_cfa_offsets_sf)
                utmp *= fs->data_align;
 
-             fs->cfa_offset = utmp;
-             fs->cfa_how = CFA_REG_OFFSET;
+             fs->regs.cfa_offset = utmp;
+             fs->regs.cfa_how = CFA_REG_OFFSET;
              break;
 
            case DW_CFA_def_cfa_register:
-             insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_reg);
-             fs->cfa_reg = dwarf2_frame_adjust_regnum (gdbarch, fs->cfa_reg,
-                                                       eh_frame_p);
-             fs->cfa_how = CFA_REG_OFFSET;
+             insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->regs.cfa_reg);
+             fs->regs.cfa_reg = dwarf2_frame_adjust_regnum (gdbarch,
+                                                             fs->regs.cfa_reg,
+                                                             eh_frame_p);
+             fs->regs.cfa_how = CFA_REG_OFFSET;
              break;
 
            case DW_CFA_def_cfa_offset:
@@ -525,7 +527,7 @@ bad CFI data; mismatched DW_CFA_restore_state at 0x%s"), paddr (fs->pc));
              if (fs->armcc_cfa_offsets_sf)
                utmp *= fs->data_align;
 
-             fs->cfa_offset = utmp;
+             fs->regs.cfa_offset = utmp;
              /* cfa_how deliberately not set.  */
              break;
 
@@ -533,10 +535,11 @@ bad CFI data; mismatched DW_CFA_restore_state at 0x%s"), paddr (fs->pc));
              break;
 
            case DW_CFA_def_cfa_expression:
-             insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_exp_len);
-             fs->cfa_exp = insn_ptr;
-             fs->cfa_how = CFA_EXP;
-             insn_ptr += fs->cfa_exp_len;
+             insn_ptr = read_uleb128 (insn_ptr, insn_end,
+                                       &fs->regs.cfa_exp_len);
+             fs->regs.cfa_exp = insn_ptr;
+             fs->regs.cfa_how = CFA_EXP;
+             insn_ptr += fs->regs.cfa_exp_len;
              break;
 
            case DW_CFA_expression:
@@ -589,17 +592,18 @@ bad CFI data; mismatched DW_CFA_restore_state at 0x%s"), paddr (fs->pc));
              break;
 
            case DW_CFA_def_cfa_sf:
-             insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_reg);
-             fs->cfa_reg = dwarf2_frame_adjust_regnum (gdbarch, fs->cfa_reg,
-                                                       eh_frame_p);
+             insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->regs.cfa_reg);
+             fs->regs.cfa_reg = dwarf2_frame_adjust_regnum (gdbarch,
+                                                             fs->regs.cfa_reg,
+                                                             eh_frame_p);
              insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset);
-             fs->cfa_offset = offset * fs->data_align;
-             fs->cfa_how = CFA_REG_OFFSET;
+             fs->regs.cfa_offset = offset * fs->data_align;
+             fs->regs.cfa_how = CFA_REG_OFFSET;
              break;
 
            case DW_CFA_def_cfa_offset_sf:
              insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset);
-             fs->cfa_offset = offset * fs->data_align;
+             fs->regs.cfa_offset = offset * fs->data_align;
              /* cfa_how deliberately not set.  */
              break;
 
@@ -932,19 +936,19 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache)
   execute_cfa_program (fde, fde->instructions, fde->end, this_frame, fs);
 
   /* Calculate the CFA.  */
-  switch (fs->cfa_how)
+  switch (fs->regs.cfa_how)
     {
     case CFA_REG_OFFSET:
-      cache->cfa = read_reg (this_frame, fs->cfa_reg);
+      cache->cfa = read_reg (this_frame, fs->regs.cfa_reg);
       if (fs->armcc_cfa_offsets_reversed)
-       cache->cfa -= fs->cfa_offset;
+       cache->cfa -= fs->regs.cfa_offset;
       else
-       cache->cfa += fs->cfa_offset;
+       cache->cfa += fs->regs.cfa_offset;
       break;
 
     case CFA_EXP:
       cache->cfa =
-       execute_stack_op (fs->cfa_exp, fs->cfa_exp_len,
+       execute_stack_op (fs->regs.cfa_exp, fs->regs.cfa_exp_len,
                          cache->addr_size, this_frame, 0);
       break;
 
@@ -994,9 +998,9 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache)
          {
            if (cache->reg[regnum].how == DWARF2_FRAME_REG_UNSPECIFIED)
              complaint (&symfile_complaints, _("\
-incomplete CFI data; unspecified registers (e.g., %s) at 0x%s"),
+incomplete CFI data; unspecified registers (e.g., %s) at %s"),
                         gdbarch_register_name (gdbarch, regnum),
-                        paddr_nz (fs->pc));
+                        paddress (gdbarch, fs->pc));
          }
        else
          cache->reg[regnum] = fs->regs.reg[column];
@@ -1896,15 +1900,9 @@ decode_frame_entry (struct comp_unit *unit, gdb_byte *start, int eh_frame_p)
 }
 \f
 
-/* FIXME: kettenis/20030504: This still needs to be integrated with
-   dwarf2read.c in a better way.  */
-
 /* Imported from dwarf2read.c.  */
-extern asection *dwarf_frame_section;
-extern asection *dwarf_eh_frame_section;
-
-/* Imported from dwarf2read.c.  */
-extern gdb_byte *dwarf2_read_section (struct objfile *objfile, asection *sectp);
+extern void dwarf2_get_section_info (struct objfile *, const char *, asection **,
+                                     gdb_byte **, bfd_size_type *);
 
 void
 dwarf2_build_frame_info (struct objfile *objfile)
@@ -1922,17 +1920,15 @@ dwarf2_build_frame_info (struct objfile *objfile)
 
   /* First add the information from the .eh_frame section.  That way,
      the FDEs from that section are searched last.  */
-  if (dwarf_eh_frame_section)
+  dwarf2_get_section_info (objfile, ".eh_frame",
+                           &unit->dwarf_frame_section,
+                           &unit->dwarf_frame_buffer,
+                           &unit->dwarf_frame_size);
+  if (unit->dwarf_frame_size)
     {
       asection *got, *txt;
 
       unit->cie = NULL;
-      unit->dwarf_frame_buffer = dwarf2_read_section (objfile,
-                                                     dwarf_eh_frame_section);
-
-      unit->dwarf_frame_size = bfd_get_section_size (dwarf_eh_frame_section);
-      unit->dwarf_frame_section = dwarf_eh_frame_section;
-
       /* FIXME: kettenis/20030602: This is the DW_EH_PE_datarel base
         that is used for the i386/amd64 target, which currently is
         the only target in GCC that supports/uses the
@@ -1952,13 +1948,13 @@ dwarf2_build_frame_info (struct objfile *objfile)
        frame_ptr = decode_frame_entry (unit, frame_ptr, 1);
     }
 
-  if (dwarf_frame_section)
+  dwarf2_get_section_info (objfile, ".debug_frame",
+                           &unit->dwarf_frame_section,
+                           &unit->dwarf_frame_buffer,
+                           &unit->dwarf_frame_size);
+  if (unit->dwarf_frame_size)
     {
       unit->cie = NULL;
-      unit->dwarf_frame_buffer = dwarf2_read_section (objfile,
-                                                     dwarf_frame_section);
-      unit->dwarf_frame_size = bfd_get_section_size (dwarf_frame_section);
-      unit->dwarf_frame_section = dwarf_frame_section;
 
       frame_ptr = unit->dwarf_frame_buffer;
       while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size)
This page took 0.034823 seconds and 4 git commands to generate.