Remove trailing white spaces in bfd
[deliverable/binutils-gdb.git] / bfd / dwarf2.c
index 66fd16f2f412e9fd564f7d9ccfabf796bdc411dc..7a1a4aea0d6398c17489062bd7b867a9258a31cf 100644 (file)
@@ -173,6 +173,9 @@ struct dwarf2_debug
 #define STASH_INFO_HASH_OFF        0
 #define STASH_INFO_HASH_ON         1
 #define STASH_INFO_HASH_DISABLED   2
+
+  /* True if we opened bfd_ptr.  */
+  bfd_boolean close_on_cleanup;
 };
 
 struct arange
@@ -405,8 +408,8 @@ create_info_hash_table (bfd *abfd)
 {
   struct info_hash_table *hash_table;
 
-  hash_table = (struct info_hash_table *)
-      bfd_alloc (abfd, sizeof (struct info_hash_table));
+  hash_table = ((struct info_hash_table *)
+               bfd_alloc (abfd, sizeof (struct info_hash_table)));
   if (!hash_table)
     return hash_table;
 
@@ -503,7 +506,7 @@ read_section (bfd *           abfd,
       if (syms)
        {
          *section_buffer
-             = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
+           = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
          if (! *section_buffer)
            return FALSE;
        }
@@ -522,7 +525,8 @@ read_section (bfd *           abfd,
      that the client wants.  Validate it here to avoid trouble later.  */
   if (offset != 0 && offset >= *section_size)
     {
-      (*_bfd_error_handler) (_("Dwarf Error: Offset (%lu) greater than or equal to %s size (%lu)."),
+      (*_bfd_error_handler) (_("Dwarf Error: Offset (%lu)"
+                              " greater than or equal to %s size (%lu)."),
                             (long) offset, section_name, *section_size);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
@@ -979,6 +983,7 @@ struct line_info
   char *filename;
   unsigned int line;
   unsigned int column;
+  unsigned int discriminator;
   unsigned char op_index;
   unsigned char end_sequence;          /* End of (sequential) code sequence.  */
 };
@@ -1014,20 +1019,27 @@ struct line_info_table
 /* Remember some information about each function.  If the function is
    inlined (DW_TAG_inlined_subroutine) it may have two additional
    attributes, DW_AT_call_file and DW_AT_call_line, which specify the
-   source code location where this function was inlined. */
+   source code location where this function was inlined.  */
 
 struct funcinfo
 {
-  struct funcinfo *prev_func;          /* Pointer to previous function in list of all functions */
-  struct funcinfo *caller_func;                /* Pointer to function one scope higher */
-  char *caller_file;                   /* Source location file name where caller_func inlines this func */
-  int caller_line;                     /* Source location line number where caller_func inlines this func */
-  char *file;                          /* Source location file name */
-  int line;                            /* Source location line number */
+  /* Pointer to previous function in list of all functions.  */
+  struct funcinfo *prev_func;
+  /* Pointer to function one scope higher.  */
+  struct funcinfo *caller_func;
+  /* Source location file name where caller_func inlines this func.  */
+  char *caller_file;
+  /* Source location line number where caller_func inlines this func.  */
+  int caller_line;
+  /* Source location file name.  */
+  char *file;
+  /* Source location line number.  */
+  int line;
   int tag;
   char *name;
   struct arange arange;
-  asection *sec;                       /* Where the symbol is defined */
+  /* Where the symbol is defined.  */
+  asection *sec;
 };
 
 struct varinfo
@@ -1072,6 +1084,7 @@ add_line_info (struct line_info_table *table,
               char *filename,
               unsigned int line,
               unsigned int column,
+              unsigned int discriminator,
               int end_sequence)
 {
   bfd_size_type amt = sizeof (struct line_info);
@@ -1087,6 +1100,7 @@ add_line_info (struct line_info_table *table,
   info->op_index = op_index;
   info->line = line;
   info->column = column;
+  info->discriminator = discriminator;
   info->end_sequence = end_sequence;
 
   if (filename && filename[0])
@@ -1248,12 +1262,16 @@ concat_filename (struct line_info_table *table, unsigned int file)
 }
 
 static bfd_boolean
-arange_add (bfd *abfd, struct arange *first_arange,
+arange_add (const struct comp_unit *unit, struct arange *first_arange,
            bfd_vma low_pc, bfd_vma high_pc)
 {
   struct arange *arange;
 
-  /* If the first arange is empty, use it. */
+  /* Ignore empty ranges.  */
+  if (low_pc == high_pc)
+    return TRUE;
+
+  /* If the first arange is empty, use it.  */
   if (first_arange->high == 0)
     {
       first_arange->low = low_pc;
@@ -1281,7 +1299,7 @@ arange_add (bfd *abfd, struct arange *first_arange,
 
   /* Need to allocate a new arange and insert it into the arange list.
      Order isn't significant, so just insert after the first arange. */
-  arange = (struct arange *) bfd_zalloc (abfd, sizeof (*arange));
+  arange = (struct arange *) bfd_alloc (unit->abfd, sizeof (*arange));
   if (arange == NULL)
     return FALSE;
   arange->low = low_pc;
@@ -1401,6 +1419,7 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
   unsigned int i, bytes_read, offset_size;
   char *cur_file, *cur_dir;
   unsigned char op_code, extended_op, adj_opcode;
+  unsigned int exop_len;
   bfd_size_type amt;
 
   if (! read_section (abfd, &stash->debug_sections[debug_line],
@@ -1560,6 +1579,7 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
       char * filename = table->num_files ? concat_filename (table, 1) : NULL;
       unsigned int line = 1;
       unsigned int column = 0;
+      unsigned int discriminator = 0;
       int is_stmt = lh.default_is_stmt;
       int end_sequence = 0;
       /* eraxxon@alumni.rice.edu: Against the DWARF2 specs, some
@@ -1581,21 +1601,22 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
              /* Special operand.  */
              adj_opcode = op_code - lh.opcode_base;
              if (lh.maximum_ops_per_insn == 1)
-               address += (adj_opcode / lh.line_range)
-                          * lh.minimum_instruction_length;
+               address += (adj_opcode / lh.line_range
+                           * lh.minimum_instruction_length);
              else
                {
-                 address += ((op_index + (adj_opcode / lh.line_range))
-                             / lh.maximum_ops_per_insn)
-                            * lh.minimum_instruction_length;
-                 op_index = (op_index + (adj_opcode / lh.line_range))
-                            % lh.maximum_ops_per_insn;
+                 address += ((op_index + adj_opcode / lh.line_range)
+                             / lh.maximum_ops_per_insn
+                             * lh.minimum_instruction_length);
+                 op_index = ((op_index + adj_opcode / lh.line_range)
+                             % lh.maximum_ops_per_insn);
                }
              line += lh.line_base + (adj_opcode % lh.line_range);
              /* Append row to matrix using current values.  */
              if (!add_line_info (table, address, op_index, filename,
-                                 line, column, 0))
+                                 line, column, discriminator, 0))
                goto line_fail;
+              discriminator = 0;
              if (address < low_pc)
                low_pc = address;
              if (address > high_pc)
@@ -1604,8 +1625,8 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
          else switch (op_code)
            {
            case DW_LNS_extended_op:
-             /* Ignore length.  */
-             line_ptr += 1;
+             exop_len = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
+             line_ptr += bytes_read;
              extended_op = read_1_byte (abfd, line_ptr);
              line_ptr += 1;
 
@@ -1613,14 +1634,15 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
                {
                case DW_LNE_end_sequence:
                  end_sequence = 1;
-                 if (!add_line_info (table, address, op_index, filename,
-                                     line, column, end_sequence))
+                 if (!add_line_info (table, address, op_index, filename, line,
+                                     column, discriminator, end_sequence))
                    goto line_fail;
+                  discriminator = 0;
                  if (address < low_pc)
                    low_pc = address;
                  if (address > high_pc)
                    high_pc = address;
-                 if (!arange_add (unit->abfd, &unit->arange, low_pc, high_pc))
+                 if (!arange_add (unit, &unit->arange, low_pc, high_pc))
                    goto line_fail;
                  break;
                case DW_LNE_set_address:
@@ -1655,11 +1677,16 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
                  table->num_files++;
                  break;
                case DW_LNE_set_discriminator:
-                 (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
+                 discriminator =
+                      read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
                  line_ptr += bytes_read;
                  break;
+               case DW_LNE_HP_source_file_correlation:
+                 line_ptr += exop_len - 1;
+                 break;
                default:
-                 (*_bfd_error_handler) (_("Dwarf Error: mangled line number section."));
+                 (*_bfd_error_handler)
+                   (_("Dwarf Error: mangled line number section."));
                  bfd_set_error (bfd_error_bad_value);
                line_fail:
                  if (filename != NULL)
@@ -1669,8 +1696,9 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
              break;
            case DW_LNS_copy:
              if (!add_line_info (table, address, op_index,
-                                 filename, line, column, 0))
+                                 filename, line, column, discriminator, 0))
                goto line_fail;
+              discriminator = 0;
              if (address < low_pc)
                low_pc = address;
              if (address > high_pc)
@@ -1678,15 +1706,15 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
              break;
            case DW_LNS_advance_pc:
              if (lh.maximum_ops_per_insn == 1)
-               address += lh.minimum_instruction_length
-                          * read_unsigned_leb128 (abfd, line_ptr,
-                                                  &bytes_read);
+               address += (lh.minimum_instruction_length
+                           * read_unsigned_leb128 (abfd, line_ptr,
+                                                   &bytes_read));
              else
                {
                  bfd_vma adjust = read_unsigned_leb128 (abfd, line_ptr,
                                                         &bytes_read);
-                 address = ((op_index + adjust) / lh.maximum_ops_per_insn)
-                           * lh.minimum_instruction_length;
+                 address = ((op_index + adjust) / lh.maximum_ops_per_insn
+                            * lh.minimum_instruction_length);
                  op_index = (op_index + adjust) % lh.maximum_ops_per_insn;
                }
              line_ptr += bytes_read;
@@ -1719,13 +1747,14 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
              break;
            case DW_LNS_const_add_pc:
              if (lh.maximum_ops_per_insn == 1)
-               address += lh.minimum_instruction_length
-                          * ((255 - lh.opcode_base) / lh.line_range);
+               address += (lh.minimum_instruction_length
+                           * ((255 - lh.opcode_base) / lh.line_range));
              else
                {
                  bfd_vma adjust = ((255 - lh.opcode_base) / lh.line_range);
-                 address += lh.minimum_instruction_length
-                            * ((op_index + adjust) / lh.maximum_ops_per_insn);
+                 address += (lh.minimum_instruction_length
+                             * ((op_index + adjust)
+                                / lh.maximum_ops_per_insn));
                  op_index = (op_index + adjust) % lh.maximum_ops_per_insn;
                }
              break;
@@ -1770,7 +1799,8 @@ static bfd_boolean
 lookup_address_in_line_info_table (struct line_info_table *table,
                                   bfd_vma addr,
                                   const char **filename_ptr,
-                                  unsigned int *linenumber_ptr)
+                                  unsigned int *linenumber_ptr,
+                                  unsigned int *discriminator_ptr)
 {
   struct line_sequence *seq = NULL;
   struct line_info *each_line;
@@ -1805,6 +1835,8 @@ lookup_address_in_line_info_table (struct line_info_table *table,
         {
           *filename_ptr = each_line->filename;
           *linenumber_ptr = each_line->line;
+          if (discriminator_ptr)
+            *discriminator_ptr = each_line->discriminator;
           return TRUE;
         }
     }
@@ -1851,8 +1883,9 @@ lookup_address_in_function_table (struct comp_unit *unit,
        {
          if (addr >= arange->low && addr < arange->high)
            {
-             if (!best_fit ||
-                 ((arange->high - arange->low) < (best_fit->arange.high - best_fit->arange.low)))
+             if (!best_fit
+                 || (arange->high - arange->low
+                     < best_fit->arange.high - best_fit->arange.low))
                best_fit = each_func;
            }
        }
@@ -1900,8 +1933,8 @@ lookup_symbol_in_function_table (struct comp_unit *unit,
              && each_func->name
              && strcmp (name, each_func->name) == 0
              && (!best_fit
-                 || ((arange->high - arange->low)
-                     < (best_fit->arange.high - best_fit->arange.low))))
+                 || (arange->high - arange->low
+                     < best_fit->arange.high - best_fit->arange.low)))
            best_fit = each_func;
        }
     }
@@ -1976,7 +2009,7 @@ find_abstract_instance_name (struct comp_unit *unit,
 
       info_ptr = unit->sec_info_ptr + die_ref;
     }
-  else 
+  else
     info_ptr = unit->info_ptr_unit + die_ref;
   abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
   info_ptr += bytes_read;
@@ -1986,8 +2019,8 @@ find_abstract_instance_name (struct comp_unit *unit,
       abbrev = lookup_abbrev (abbrev_number, unit->abbrevs);
       if (! abbrev)
        {
-         (*_bfd_error_handler) (_("Dwarf Error: Could not find abbrev number %u."),
-                                abbrev_number);
+         (*_bfd_error_handler)
+           (_("Dwarf Error: Could not find abbrev number %u."), abbrev_number);
          bfd_set_error (bfd_error_bad_value);
        }
       else
@@ -2052,7 +2085,7 @@ read_rangelist (struct comp_unit *unit, struct arange *arange,
        base_address = high_pc;
       else
        {
-         if (!arange_add (unit->abfd, arange,
+         if (!arange_add (unit, arange,
                           base_address + low_pc, base_address + high_pc))
            return FALSE;
        }
@@ -2078,7 +2111,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
      can use to set the caller_func field.  */
   nested_funcs_size = 32;
   nested_funcs = (struct funcinfo **)
-      bfd_malloc (nested_funcs_size * sizeof (struct funcinfo *));
+    bfd_malloc (nested_funcs_size * sizeof (struct funcinfo *));
   if (nested_funcs == NULL)
     return FALSE;
   nested_funcs[nesting_level] = 0;
@@ -2092,6 +2125,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
       struct varinfo *var;
       bfd_vma low_pc = 0;
       bfd_vma high_pc = 0;
+      bfd_boolean high_pc_relative = FALSE;
 
       abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
       info_ptr += bytes_read;
@@ -2197,6 +2231,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
 
                case DW_AT_high_pc:
                  high_pc = attr.u.val;
+                 high_pc_relative = attr.form != DW_FORM_addr;
                  break;
 
                case DW_AT_ranges:
@@ -2275,9 +2310,12 @@ scan_unit_for_symbols (struct comp_unit *unit)
            }
        }
 
+      if (high_pc_relative)
+       high_pc += low_pc;
+
       if (func && high_pc != 0)
        {
-         if (!arange_add (unit->abfd, &func->arange, low_pc, high_pc))
+         if (!arange_add (unit, &func->arange, low_pc, high_pc))
            goto fail;
        }
 
@@ -2291,8 +2329,8 @@ scan_unit_for_symbols (struct comp_unit *unit)
 
              nested_funcs_size *= 2;
              tmp = (struct funcinfo **)
-                 bfd_realloc (nested_funcs,
-                              (nested_funcs_size * sizeof (struct funcinfo *)));
+               bfd_realloc (nested_funcs,
+                            nested_funcs_size * sizeof (struct funcinfo *));
              if (tmp == NULL)
                goto fail;
              nested_funcs = tmp;
@@ -2338,6 +2376,7 @@ parse_comp_unit (struct dwarf2_debug *stash,
   bfd_vma low_pc = 0;
   bfd_vma high_pc = 0;
   bfd *abfd = stash->bfd_ptr;
+  bfd_boolean high_pc_relative = FALSE;
 
   version = read_2_bytes (abfd, info_ptr);
   info_ptr += 2;
@@ -2352,23 +2391,29 @@ parse_comp_unit (struct dwarf2_debug *stash,
 
   if (version != 2 && version != 3 && version != 4)
     {
-      (*_bfd_error_handler) (_("Dwarf Error: found dwarf version '%u', this reader only handles version 2, 3 and 4 information."), version);
+      (*_bfd_error_handler)
+       (_("Dwarf Error: found dwarf version '%u', this reader"
+          " only handles version 2, 3 and 4 information."), version);
       bfd_set_error (bfd_error_bad_value);
       return 0;
     }
 
   if (addr_size > sizeof (bfd_vma))
     {
-      (*_bfd_error_handler) (_("Dwarf Error: found address size '%u', this reader can not handle sizes greater than '%u'."),
-                        addr_size,
-                        (unsigned int) sizeof (bfd_vma));
+      (*_bfd_error_handler)
+       (_("Dwarf Error: found address size '%u', this reader"
+          " can not handle sizes greater than '%u'."),
+        addr_size,
+        (unsigned int) sizeof (bfd_vma));
       bfd_set_error (bfd_error_bad_value);
       return 0;
     }
 
   if (addr_size != 2 && addr_size != 4 && addr_size != 8)
     {
-      (*_bfd_error_handler) ("Dwarf Error: found address size '%u', this reader can only handle address sizes '2', '4' and '8'.", addr_size);
+      (*_bfd_error_handler)
+       ("Dwarf Error: found address size '%u', this reader"
+        " can only handle address sizes '2', '4' and '8'.", addr_size);
       bfd_set_error (bfd_error_bad_value);
       return 0;
     }
@@ -2376,14 +2421,14 @@ parse_comp_unit (struct dwarf2_debug *stash,
   /* Read the abbrevs for this compilation unit into a table.  */
   abbrevs = read_abbrevs (abfd, abbrev_offset, stash);
   if (! abbrevs)
-      return 0;
+    return 0;
 
   abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
   info_ptr += bytes_read;
   if (! abbrev_number)
     {
       (*_bfd_error_handler) (_("Dwarf Error: Bad abbrev number: %u."),
-                        abbrev_number);
+                            abbrev_number);
       bfd_set_error (bfd_error_bad_value);
       return 0;
     }
@@ -2392,7 +2437,7 @@ parse_comp_unit (struct dwarf2_debug *stash,
   if (! abbrev)
     {
       (*_bfd_error_handler) (_("Dwarf Error: Could not find abbrev number %u."),
-                        abbrev_number);
+                            abbrev_number);
       bfd_set_error (bfd_error_bad_value);
       return 0;
     }
@@ -2435,11 +2480,13 @@ parse_comp_unit (struct dwarf2_debug *stash,
          /* If the compilation unit DIE has a DW_AT_low_pc attribute,
             this is the base address to use when reading location
             lists or range lists. */
-         unit->base_address = low_pc;
+         if (abbrev->tag == DW_TAG_compile_unit)
+           unit->base_address = low_pc;
          break;
 
        case DW_AT_high_pc:
          high_pc = attr.u.val;
+         high_pc_relative = attr.form != DW_FORM_addr;
          break;
 
        case DW_AT_ranges:
@@ -2467,9 +2514,11 @@ parse_comp_unit (struct dwarf2_debug *stash,
          break;
        }
     }
+  if (high_pc_relative)
+    high_pc += low_pc;
   if (high_pc != 0)
     {
-      if (!arange_add (unit->abfd, &unit->arange, low_pc, high_pc))
+      if (!arange_add (unit, &unit->arange, low_pc, high_pc))
        return NULL;
     }
 
@@ -2517,6 +2566,7 @@ comp_unit_find_nearest_line (struct comp_unit *unit,
                             const char **filename_ptr,
                             const char **functionname_ptr,
                             unsigned int *linenumber_ptr,
+                            unsigned int *discriminator_ptr,
                             struct dwarf2_debug *stash)
 {
   bfd_boolean line_p;
@@ -2557,7 +2607,8 @@ comp_unit_find_nearest_line (struct comp_unit *unit,
     stash->inliner_chain = function;
   line_p = lookup_address_in_line_info_table (unit->line_table, addr,
                                              filename_ptr,
-                                             linenumber_ptr);
+                                             linenumber_ptr,
+                                             discriminator_ptr);
   return line_p || func_p;
 }
 
@@ -2739,25 +2790,43 @@ static asection *
 find_debug_info (bfd *abfd, const struct dwarf_debug_section *debug_sections,
                  asection *after_sec)
 {
-  asection * msec;
+  asection *msec;
+  const char *look;
 
-  msec = after_sec != NULL ? after_sec->next : abfd->sections;
+  if (after_sec == NULL)
+    {
+      look = debug_sections[debug_info].uncompressed_name;
+      msec = bfd_get_section_by_name (abfd, look);
+      if (msec != NULL)
+       return msec;
+
+      look = debug_sections[debug_info].compressed_name;
+      if (look != NULL)
+       {
+         msec = bfd_get_section_by_name (abfd, look);
+         if (msec != NULL)
+           return msec;
+       }
+
+      for (msec = abfd->sections; msec != NULL; msec = msec->next)
+       if (CONST_STRNEQ (msec->name, GNU_LINKONCE_INFO))
+         return msec;
+
+      return NULL;
+    }
 
-  while (msec)
+  for (msec = after_sec->next; msec != NULL; msec = msec->next)
     {
-      if (strcmp (msec->name,
-                  debug_sections[debug_info].uncompressed_name) == 0)
+      look = debug_sections[debug_info].uncompressed_name;
+      if (strcmp (msec->name, look) == 0)
        return msec;
 
-      if (debug_sections[debug_info].compressed_name != NULL
-          && strcmp (msec->name,
-                     debug_sections[debug_info].compressed_name) == 0)
+      look = debug_sections[debug_info].compressed_name;
+      if (look != NULL && strcmp (msec->name, look) == 0)
        return msec;
 
       if (CONST_STRNEQ (msec->name, GNU_LINKONCE_INFO))
        return msec;
-
-      msec = msec->next;
     }
 
   return NULL;
@@ -2831,7 +2900,7 @@ place_sections (bfd *abfd, struct dwarf2_debug *stash)
        }
 
       amt = i * sizeof (struct adjusted_section);
-      p = (struct adjusted_section *) bfd_zalloc (abfd, amt);
+      p = (struct adjusted_section *) bfd_alloc (abfd, amt);
       if (! p)
        return FALSE;
 
@@ -2925,8 +2994,8 @@ info_hash_lookup_funcinfo (struct info_hash_table *hash_table,
              && addr >= arange->low
              && addr < arange->high
              && (!best_fit
-                 || ((arange->high - arange->low)
-                     < (best_fit->arange.high - best_fit->arange.low))))
+                 || (arange->high - arange->low
+                     < best_fit->arange.high - best_fit->arange.low)))
            best_fit = each_func;
        }
     }
@@ -3140,6 +3209,7 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
   if (! stash)
     return FALSE;
   stash->debug_sections = debug_sections;
+  stash->syms = symbols;
 
   *pinfo = stash;
 
@@ -3169,7 +3239,9 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
          free (debug_filename);
          return FALSE;
        }
+      stash->close_on_cleanup = TRUE;
     }
+  stash->bfd_ptr = debug_bfd;
 
   /* There can be more than one DWARF2 info section in a BFD these
      days.  First handle the easy case when there's only one.  If
@@ -3227,9 +3299,6 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
   stash->info_ptr_end = stash->info_ptr + total_size;
   stash->sec = find_debug_info (debug_bfd, debug_sections, NULL);
   stash->sec_info_ptr = stash->info_ptr;
-  stash->syms = symbols;
-  stash->bfd_ptr = debug_bfd;
-
   return TRUE;
 }
 
@@ -3255,6 +3324,7 @@ find_line (bfd *abfd,
           const char **filename_ptr,
           const char **functionname_ptr,
           unsigned int *linenumber_ptr,
+          unsigned int *discriminator_ptr,
           unsigned int addr_size,
           void **pinfo)
 {
@@ -3277,6 +3347,8 @@ find_line (bfd *abfd,
   if (functionname_ptr != NULL)
     *functionname_ptr = NULL;
   *linenumber_ptr = 0;
+  if (discriminator_ptr)
+    *discriminator_ptr = 0;
 
   if (! _bfd_dwarf2_slurp_debug_info (abfd, NULL,
                                      debug_sections, symbols, pinfo))
@@ -3346,6 +3418,7 @@ find_line (bfd *abfd,
          /* Check the previously read comp. units first.  */
          for (each = stash->all_comp_units; each; each = each->next_unit)
            if ((symbol->flags & BSF_FUNCTION) == 0
+               || each->arange.high == 0
                || comp_unit_contains_address (each, addr))
              {
                found = comp_unit_find_line (each, symbol, addr, filename_ptr,
@@ -3359,11 +3432,13 @@ find_line (bfd *abfd,
     {
       for (each = stash->all_comp_units; each; each = each->next_unit)
        {
-         found = (comp_unit_contains_address (each, addr)
+         found = ((each->arange.high == 0
+                   || comp_unit_contains_address (each, addr))
                   && comp_unit_find_nearest_line (each, addr,
                                                   filename_ptr,
                                                   functionname_ptr,
                                                   linenumber_ptr,
+                                                  discriminator_ptr,
                                                   stash));
          if (found)
            goto done;
@@ -3433,10 +3508,10 @@ find_line (bfd *abfd,
            stash->all_comp_units->prev_unit = each;
          else
            stash->last_comp_unit = each;
-         
+
          each->next_unit = stash->all_comp_units;
          stash->all_comp_units = each;
-         
+
          /* DW_AT_low_pc and DW_AT_high_pc are optional for
             compilation units.  If we don't have them (i.e.,
             unit->high == 0), we need to consult the line info table
@@ -3457,6 +3532,7 @@ find_line (bfd *abfd,
                                                     filename_ptr,
                                                     functionname_ptr,
                                                     linenumber_ptr,
+                                                    discriminator_ptr,
                                                     stash));
 
          if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr)
@@ -3472,7 +3548,7 @@ find_line (bfd *abfd,
        }
     }
 
-done:
+ done:
   if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
     unset_sections (stash);
 
@@ -3491,12 +3567,13 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
                               const char **filename_ptr,
                               const char **functionname_ptr,
                               unsigned int *linenumber_ptr,
+                               unsigned int *discriminator_ptr,
                               unsigned int addr_size,
                               void **pinfo)
 {
   return find_line (abfd, debug_sections, section, offset, NULL, symbols,
-                    filename_ptr, functionname_ptr, linenumber_ptr, addr_size,
-                   pinfo);
+                    filename_ptr, functionname_ptr, linenumber_ptr,
+                    discriminator_ptr, addr_size, pinfo);
 }
 
 /* The DWARF2 version of find_line.
@@ -3508,11 +3585,13 @@ _bfd_dwarf2_find_line (bfd *abfd,
                       asymbol *symbol,
                       const char **filename_ptr,
                       unsigned int *linenumber_ptr,
+                       unsigned int *discriminator_ptr,
                       unsigned int addr_size,
                       void **pinfo)
 {
   return find_line (abfd, dwarf_debug_sections, NULL, 0, symbol, symbols,
-                    filename_ptr, NULL, linenumber_ptr, addr_size, pinfo);
+                    filename_ptr, NULL, linenumber_ptr, discriminator_ptr,
+                    addr_size, pinfo);
 }
 
 bfd_boolean
@@ -3545,7 +3624,7 @@ _bfd_dwarf2_find_inliner_info (bfd *abfd ATTRIBUTE_UNUSED,
 void
 _bfd_dwarf2_cleanup_debug_info (bfd *abfd, void **pinfo)
 {
-  struct dwarf2_debug *stash = (struct dwarf2_debug *) *pinfo;;
+  struct dwarf2_debug *stash = (struct dwarf2_debug *) *pinfo;
   struct comp_unit *each;
 
   if (abfd == NULL || stash == NULL)
@@ -3613,4 +3692,6 @@ _bfd_dwarf2_cleanup_debug_info (bfd *abfd, void **pinfo)
     free (stash->dwarf_ranges_buffer);
   if (stash->info_ptr_memory)
     free (stash->info_ptr_memory);
+  if (stash->close_on_cleanup)
+    bfd_close (stash->bfd_ptr);
 }
This page took 0.044924 seconds and 4 git commands to generate.