* dwarf2.c (parse_comp_unit): Add ABBREV_LENGTH parameter.
authorMark Mitchell <mark@codesourcery.com>
Fri, 2 Jul 1999 21:03:56 +0000 (21:03 +0000)
committerMark Mitchell <mark@codesourcery.com>
Fri, 2 Jul 1999 21:03:56 +0000 (21:03 +0000)
(_bfd_dwarf2_find_nearest_line): Add ADDR_SIZE parameter.
* elf.c (_bfd_elf_find_nearest_line): Pass it.
* elf32-arm.h (elf32_arm_find_nearest_line): Likewise.
* elf32-mips.c (ABI_64_P): New macro.
(IRIX_COMPAT): We are IRIX6-compatible if ABI_64_P.
(_bfd_mips_elf_find_nearest_line): Adjust call to
_bfd_dwarf2_find_nearest_line.
* libbfd-in.h (_bfd_dwarf2_find_nearest_line): Update prototype.
* libbfd.h: Regenerated.

bfd/ChangeLog
bfd/dwarf2.c
bfd/elf.c
bfd/elf32-arm.h
bfd/elf32-mips.c
bfd/libbfd-in.h
bfd/libbfd.h

index c3cc02119520e59520b4db7fc2078b769eb4530a..3ce3af0abd24a80fe320720a26c0d421dd8005ee 100644 (file)
@@ -1,3 +1,16 @@
+1999-07-02  Mark Mitchell  <mark@codesourcery.com>
+
+       * dwarf2.c (parse_comp_unit): Add ABBREV_LENGTH parameter.
+       (_bfd_dwarf2_find_nearest_line): Add ADDR_SIZE parameter.
+       * elf.c (_bfd_elf_find_nearest_line): Pass it.
+       * elf32-arm.h (elf32_arm_find_nearest_line): Likewise.
+       * elf32-mips.c (ABI_64_P): New macro.
+       (IRIX_COMPAT): We are IRIX6-compatible if ABI_64_P.
+       (_bfd_mips_elf_find_nearest_line): Adjust call to
+       _bfd_dwarf2_find_nearest_line.
+       * libbfd-in.h (_bfd_dwarf2_find_nearest_line): Update prototype.
+       * libbfd.h: Regenerated.
+
 1999-07-02  Ian Lance Taylor  <ian@zembu.com>
 
        * config.bfd: Add * at the end of i[3456]86-*-unixware.
index e05dac6cf10da664cd411fe23f5af488cd2858b4..16986ad38eaccb697074f0b360ab7bc02d77328c 100644 (file)
@@ -1216,19 +1216,22 @@ scan_unit_for_functions (unit)
 
 
 
-/* Parse a DWARF2 compilation unit starting at INFO_PTR.  This includes
-   the compilation unit header that proceeds the DIE's, but does not
-   include the length field that preceeds each compilation unit header.
-   END_PTR points one past the end of this comp unit.
+/* Parse a DWARF2 compilation unit starting at INFO_PTR.  This
+   includes the compilation unit header that proceeds the DIE's, but
+   does not include the length field that preceeds each compilation
+   unit header.  END_PTR points one past the end of this comp unit.
+   If ABBREV_LENGTH is 0, then the length of the abbreviation offset
+   is assumed to be four bytes.  Otherwise, it it is the size given.
 
    This routine does not read the whole compilation unit; only enough
    to get to the line number information for the compilation unit.  */
 
 static struct comp_unit *
-parse_comp_unit (abfd, info_ptr, end_ptr)
+parse_comp_unit (abfd, info_ptr, end_ptr, abbrev_length)
      bfd* abfd;
      char* info_ptr;
      char* end_ptr;
+     unsigned int abbrev_length;
 {
   struct comp_unit* unit;
 
@@ -1243,8 +1246,14 @@ parse_comp_unit (abfd, info_ptr, end_ptr)
 
   version = read_2_bytes (abfd, info_ptr);
   info_ptr += 2;
-  abbrev_offset = read_4_bytes (abfd, info_ptr);
-  info_ptr += 4;
+  BFD_ASSERT (abbrev_length == 0
+             || abbrev_length == 4
+             || abbrev_length == 8);
+  if (abbrev_length == 0 || abbrev_length == 4)
+    abbrev_offset = read_4_bytes (abfd, info_ptr);
+  else if (abbrev_length == 8)
+    abbrev_offset = read_8_bytes (abfd, info_ptr);
+  info_ptr += abbrev_length;
   addr_size = read_1_byte (abfd, info_ptr);
   info_ptr += 1;
 
@@ -1435,12 +1444,17 @@ comp_unit_find_nearest_line (unit, addr,
   return line_p || func_p;
 }
 
-/* The DWARF2 version of find_nearest line.
-   Return true if the line is found without error. */
+/* The DWARF2 version of find_nearest line.  Return true if the line
+   is found without error.  ADDR_SIZE is the number of bytes in the
+   initial .debug_info length field and in the abbreviation offset.
+   You may use zero to indicate that the default value should be
+   used.  */
 
 boolean
 _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
-                         filename_ptr, functionname_ptr, linenumber_ptr)
+                              filename_ptr, functionname_ptr,
+                              linenumber_ptr,
+                              addr_size)
      bfd *abfd;
      asection *section;
      asymbol **symbols;
@@ -1448,6 +1462,7 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
      const char **filename_ptr;
      const char **functionname_ptr;
      unsigned int *linenumber_ptr;
+     unsigned int addr_size;
 {
   /* Read each compilation unit from the section .debug_info, and check
      to see if it contains the address we are searching for.  If yes,
@@ -1470,6 +1485,13 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
   *functionname_ptr = NULL;
   *linenumber_ptr = 0;
 
+  /* The DWARF2 spec says that the initial length field, and the
+     offset of the abbreviation table, should both be 4-byte values.
+     However, some compilers do things differently.  */
+  if (addr_size == 0)
+    addr_size = 4;
+  BFD_ASSERT (addr_size == 4 || addr_size == 8);
+    
   if (! stash)
     {
       asection *msec;
@@ -1540,16 +1562,20 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
   while (stash->info_ptr < stash->info_ptr_end)
     {
       struct comp_unit* each;
-      unsigned int length;
+      bfd_vma length;
       boolean found;
 
-      length = read_4_bytes (abfd, stash->info_ptr);
-      stash->info_ptr += 4;
+      if (addr_size == 4)
+       length = read_4_bytes (abfd, stash->info_ptr);
+      else
+       length = read_8_bytes (abfd, stash->info_ptr);
+      stash->info_ptr += addr_size;
 
       if (length > 0)
         {
          each = parse_comp_unit (abfd, stash->info_ptr, 
-                                 stash->info_ptr + length);
+                                 stash->info_ptr + length,
+                                 addr_size);
          stash->info_ptr += length;
 
          if (each)
index 8ff02e498001b04ad1c3bbd7ae62ab5482969534..f3d23c4d0f124ce10b89edd3f0151a75e080d5ac 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4616,7 +4616,7 @@ _bfd_elf_find_nearest_line (abfd,
 
   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
                                     filename_ptr, functionname_ptr,
-                                    line_ptr))
+                                    line_ptr, 0))
     return true;
 
   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
index b0de6114cf22aef92b9b0204ad20054f5a92b19b..ce2eea788f3a02b9427a6f69db9ca280eccb907a 100644 (file)
@@ -2396,7 +2396,7 @@ elf32_arm_find_nearest_line
 
   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
                                     filename_ptr, functionname_ptr,
-                                    line_ptr))
+                                    line_ptr, 0))
     return true;
 
   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
index 50d2f233917c0046140c7076e6dba50bce72c894..8800423ab0784ab5c106078dc66572db37d92f00 100644 (file)
@@ -235,12 +235,17 @@ typedef enum {
 #define ABI_N32_P(abfd) \
   ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
 
+/* Nonzero if ABFD is using the 64-bit ABI.  FIXME: This is never
+   true, yet.  */
+#define ABI_64_P(abfd) \
+  ((elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64) != 0)
+
 /* What version of Irix we are trying to be compatible with.  FIXME:
    At the moment, we never generate "normal" MIPS ELF ABI executables;
    we always use some version of Irix.  */
 
 #define IRIX_COMPAT(abfd) \
-  (ABI_N32_P (abfd) ? ict_irix6 : ict_irix5)
+  ((ABI_N32_P (abfd) || ABI_64_P (abfd)) ? ict_irix6 : ict_irix5)
 
 /* Whether we are trying to be compatible with IRIX at all.  */
 
@@ -3517,7 +3522,8 @@ _bfd_mips_elf_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
 
   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
                                     filename_ptr, functionname_ptr,
-                                    line_ptr))
+                                    line_ptr, 
+                                    ABI_64_P (abfd) ? 8 : 0))
     return true;
 
   msec = bfd_get_section_by_name (abfd, ".mdebug");
index dd6b72c6c86d3f07115dadb9dd5e2efb0729f343..f2ac82309954b85bd4995658e0d2c6c261a68c3b 100644 (file)
@@ -365,7 +365,7 @@ extern boolean _bfd_dwarf1_find_nearest_line
 /* Find the nearest line using DWARF 2 debugging information.  */
 extern boolean _bfd_dwarf2_find_nearest_line
   PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
-          const char **, unsigned int *));
+          const char **, unsigned int *, unsigned int));
 
 /* A routine to create entries for a bfd_link_hash_table.  */
 extern struct bfd_hash_entry *_bfd_link_hash_newfunc
index c2f0a1558c60f260f575fff33223f356b8e4aa84..45bf9d79649ccb5f408dafae8b53f4142b3176ed 100644 (file)
@@ -365,7 +365,7 @@ extern boolean _bfd_dwarf1_find_nearest_line
 /* Find the nearest line using DWARF 2 debugging information.  */
 extern boolean _bfd_dwarf2_find_nearest_line
   PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
-          const char **, unsigned int *));
+          const char **, unsigned int *, unsigned int));
 
 /* A routine to create entries for a bfd_link_hash_table.  */
 extern struct bfd_hash_entry *_bfd_link_hash_newfunc