]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR symtab/8423:
authorTom Tromey <tromey@redhat.com>
Mon, 8 Apr 2013 20:08:21 +0000 (20:08 +0000)
committerTom Tromey <tromey@redhat.com>
Mon, 8 Apr 2013 20:08:21 +0000 (20:08 +0000)
* solib-som.c (som_solib_section_offsets): Use BFD section
indices.  Set offsets for all sections.
* somread.c (som_symtab_read): Compute BFD section for
symbol.  Use prim_record_minimal_symbol_and_info.
(som_symfile_read): Fix comment.
(struct find_section_offset_arg): New.
(find_section_offset, set_section_index): New functions.
(som_symfile_offsets): Use set_section_index to compute
section indices.
bfd/
* som.c (bfd_section_from_som_symbol): No longer static.
* som.h (bfd_section_from_som_symbol): Declare.

bfd/ChangeLog
bfd/som.c
bfd/som.h
gdb/ChangeLog
gdb/solib-som.c
gdb/somread.c

index e32a80c9af586ab7c6a763b8facd83354895f757..f1ea9c47c4fd705deac259f8de89e794bc7f385f 100644 (file)
@@ -1,3 +1,8 @@
+2013-04-08  Tom Tromey  <tromey@redhat.com>
+
+       * som.c (bfd_section_from_som_symbol): No longer static.
+       * som.h (bfd_section_from_som_symbol): Declare.
+
 2013-04-06  Alan Modra  <amodra@gmail.com>
 
        * elf32-ppc.c (ppc_elf_check_relocs): Use SYMBOLIC_BIND.
index 87aa88f971b20305a6a5e48e2eb3d98c253356a2..0ddbb6f0c97780e815aea4cb63f937ca1cf746da 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -1,7 +1,7 @@
 /* bfd back-end for HP PA-RISC SOM objects.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
-   2012  Free Software Foundation, Inc.
+   2012, 2013  Free Software Foundation, Inc.
 
    Contributed by the Center for Software Science at the
    University of Utah.
@@ -4572,7 +4572,7 @@ som_get_symtab_upper_bound (bfd *abfd)
 
 /* Convert from a SOM subspace index to a BFD section.  */
 
-static asection *
+asection *
 bfd_section_from_som_symbol
   (bfd *abfd, struct som_external_symbol_dictionary_record *symbol)
 {
index cf8dcbfd542d4a481a91d73a3ad7358395edd67e..7a542493149dc0dc89e460307f8d852b0124b11e 100644 (file)
--- a/bfd/som.h
+++ b/bfd/som.h
@@ -1,6 +1,6 @@
 /* HP PA-RISC SOM object file format:  definitions internal to BFD.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001,
-   2002, 2003, 2004, 2005, 2007, 2008, 2012 Free Software Foundation, Inc.
+   2002, 2003, 2004, 2005, 2007, 2008, 2012, 2013 Free Software Foundation, Inc.
 
    Contributed by the Center for Software Science at the
    University of Utah (pa-gdb-bugs@cs.utah.edu).
@@ -234,5 +234,6 @@ void         bfd_som_set_symbol_type           (asymbol *, unsigned int);
 bfd_boolean  bfd_som_attach_aux_hdr            (bfd *, int, char *);
 int **       hppa_som_gen_reloc_type           (bfd *, int, int, enum hppa_reloc_field_selector_type_alt, int, asymbol *);
 bfd_boolean  bfd_som_attach_compilation_unit   (bfd *, const char *, const char *, const char *, const char *);
+asection *   bfd_section_from_som_symbol       (bfd *abfd, struct som_external_symbol_dictionary_record *symbol);
 
 #endif /* _SOM_H */
index bfb7c6b0471bade85ce54233831b4cca66284ec0..edc4d0a5a9f1b21ca78e2484bca0d95ac15890a0 100644 (file)
@@ -1,3 +1,16 @@
+2013-04-08  Tom Tromey  <tromey@redhat.com>
+
+       PR symtab/8423:
+       * solib-som.c (som_solib_section_offsets): Use BFD section
+       indices.  Set offsets for all sections.
+       * somread.c (som_symtab_read): Compute BFD section for
+       symbol.  Use prim_record_minimal_symbol_and_info.
+       (som_symfile_read): Fix comment.
+       (struct find_section_offset_arg): New.
+       (find_section_offset, set_section_index): New functions.
+       (som_symfile_offsets): Use set_section_index to compute
+       section indices.
+
 2013-04-08  Tom Tromey  <tromey@redhat.com>
 
        * coffread.c (cs_to_section): Use gdb_bfd_section_index.
index ff7fbaa1ffb8699232810d5ab0c6a4ca4936a501..650e3dfead4c53448d791bf8f791e25be339843d 100644 (file)
@@ -840,13 +840,12 @@ som_solib_section_offsets (struct objfile *objfile,
       if (strstr (objfile->name, so_list->so_name))
        {
          asection *private_section;
+         struct obj_section *sect;
 
          /* The text offset is easy.  */
          offsets->offsets[SECT_OFF_TEXT (objfile)]
            = (so_list->lm_info->text_addr
               - so_list->lm_info->text_link_addr);
-         offsets->offsets[SECT_OFF_RODATA (objfile)]
-           = ANOFFSET (offsets, SECT_OFF_TEXT (objfile));
 
          /* We should look at presumed_dp in the SOM header, but
             that's not easily available.  This should be OK though.  */
@@ -859,10 +858,28 @@ som_solib_section_offsets (struct objfile *objfile,
              offsets->offsets[SECT_OFF_BSS (objfile)] = 0;
              return 1;
            }
-         offsets->offsets[SECT_OFF_DATA (objfile)]
-           = (so_list->lm_info->data_start - private_section->vma);
-         offsets->offsets[SECT_OFF_BSS (objfile)]
-           = ANOFFSET (offsets, SECT_OFF_DATA (objfile));
+         if (objfile->sect_index_data != -1)
+           {
+             offsets->offsets[SECT_OFF_DATA (objfile)]
+               = (so_list->lm_info->data_start - private_section->vma);
+             if (objfile->sect_index_bss != -1)
+               offsets->offsets[SECT_OFF_BSS (objfile)]
+                 = ANOFFSET (offsets, SECT_OFF_DATA (objfile));
+           }
+
+         ALL_OBJFILE_OSECTIONS (objfile, sect)
+           {
+             flagword flags = bfd_get_section_flags (objfile->obfd,
+                                                     sect->the_bfd_section);
+
+             if ((flags & SEC_CODE) != 0)
+               offsets->offsets[sect->the_bfd_section->index]
+                 = offsets->offsets[SECT_OFF_TEXT (objfile)];
+             else
+               offsets->offsets[sect->the_bfd_section->index]
+                 = offsets->offsets[SECT_OFF_DATA (objfile)];
+           }
+
          return 1;
        }
       so_list = so_list->next;
index 0aa3dce686e70500341ec180fcc46435093e6ea4..44b0c85c8d689f5a7bea9aaa91749d792bbc30ba 100644 (file)
@@ -54,11 +54,10 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
   struct som_external_symbol_dictionary_record *buf, *bufp, *endbufp;
   char *symname;
   CONST int symsize = sizeof (struct som_external_symbol_dictionary_record);
-  CORE_ADDR text_offset, data_offset;
 
 
-  text_offset = ANOFFSET (section_offsets, 0);
-  data_offset = ANOFFSET (section_offsets, 1);
+#define text_offset ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile))
+#define data_offset ANOFFSET (section_offsets, SECT_OFF_DATA (objfile))
 
   number_of_symbols = bfd_get_symcount (abfd);
 
@@ -106,9 +105,36 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
       unsigned int symbol_scope
        = (flags >> SOM_SYMBOL_SCOPE_SH) & SOM_SYMBOL_SCOPE_MASK;
       CORE_ADDR symbol_value = bfd_getb32 (bufp->symbol_value);
+      asection *section = NULL;
 
       QUIT;
 
+      /* Compute the section.  */
+      switch (symbol_scope)
+       {
+       case SS_EXTERNAL:
+         if (symbol_type != ST_STORAGE)
+           section = bfd_und_section_ptr;
+         else
+           section = bfd_com_section_ptr;
+         break;
+
+       case SS_UNSAT:
+         if (symbol_type != ST_STORAGE)
+           section = bfd_und_section_ptr;
+         else
+           section = bfd_com_section_ptr;
+         break;
+
+       case SS_UNIVERSAL:
+         section = bfd_section_from_som_symbol (abfd, bufp);
+         break;
+
+       case SS_LOCAL:
+         section = bfd_section_from_som_symbol (abfd, bufp);
+         break;
+       }
+
       switch (symbol_scope)
        {
        case SS_UNIVERSAL:
@@ -267,7 +293,29 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
        error (_("Invalid symbol data; bad HP string table offset: %s"),
               plongest (bfd_getb32 (bufp->name)));
 
-      prim_record_minimal_symbol (symname, symbol_value, ms_type, objfile);
+      if (bfd_is_const_section (section))
+       {
+         struct obj_section *iter;
+
+         ALL_OBJFILE_OSECTIONS (objfile, iter)
+           {
+             if (bfd_is_const_section (iter->the_bfd_section))
+               continue;
+
+             if (obj_section_addr (iter) <= symbol_value
+                 && symbol_value < obj_section_endaddr (iter))
+               {
+                 section = iter->the_bfd_section;
+                 break;
+               }
+           }
+       }
+
+      prim_record_minimal_symbol_and_info (symname, symbol_value, ms_type,
+                                          gdb_bfd_section_index (objfile->obfd,
+                                                                 section),
+                                          section,
+                                          objfile);
     }
 }
 
@@ -287,7 +335,7 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
    for real.
 
    We look for sections with specific names, to tell us what debug
-   format to look for:  FIXME!!!
+   format to look for.
 
    somstab_build_psymtabs() handles STABS symbols.
 
@@ -361,6 +409,80 @@ som_symfile_init (struct objfile *objfile)
   objfile->flags |= OBJF_REORDERED;
 }
 
+/* An object of this type is passed to find_section_offset.  */
+
+struct find_section_offset_arg
+{
+  /* The objfile.  */
+
+  struct objfile *objfile;
+
+  /* Flags to invert.  */
+
+  flagword invert;
+
+  /* Flags to look for.  */
+
+  flagword flags;
+
+  /* A text section with non-zero size, if any.  */
+
+  asection *best_section;
+
+  /* An empty text section, if any.  */
+
+  asection *empty_section;
+};
+
+/* A callback for bfd_map_over_sections that tries to find a section
+   with particular flags in an objfile.  */
+
+static void
+find_section_offset (bfd *abfd, asection *sect, void *arg)
+{
+  struct find_section_offset_arg *info = arg;
+  flagword aflag;
+
+  aflag = bfd_get_section_flags (abfd, sect);
+
+  aflag ^= info->invert;
+
+  if ((aflag & info->flags) == info->flags)
+    {
+      if (bfd_section_size (abfd, sect) > 0)
+       {
+         if (info->best_section == NULL)
+           info->best_section = sect;
+       }
+      else
+       {
+         if (info->empty_section == NULL)
+           info->empty_section = sect;
+       }
+    }
+}
+
+/* Set a section index from a BFD.  */
+
+static void
+set_section_index (struct objfile *objfile, flagword invert, flagword flags,
+                  int *index_ptr)
+{
+  struct find_section_offset_arg info;
+
+  info.objfile = objfile;
+  info.best_section = NULL;
+  info.empty_section = NULL;
+  info.invert = invert;
+  info.flags = flags;
+  bfd_map_over_sections (objfile->obfd, find_section_offset, &info);
+
+  if (info.best_section)
+    *index_ptr = info.best_section->index;
+  else if (info.empty_section)
+    *index_ptr = info.empty_section->index;
+}
+
 /* SOM specific parsing routine for section offsets.
 
    Plain and simple for now.  */
@@ -370,22 +492,21 @@ som_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
 {
   int i;
   CORE_ADDR text_addr;
+  asection *sect;
 
   objfile->num_sections = bfd_count_sections (objfile->obfd);
   objfile->section_offsets = (struct section_offsets *)
     obstack_alloc (&objfile->objfile_obstack, 
                   SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
 
-  /* FIXME: ezannoni 2000-04-20 The section names in SOM are not
-     .text, .data, etc, but $TEXT$, $DATA$,...  We should initialize
-     SET_OFF_* from bfd.  (See default_symfile_offsets()).  But I don't
-     know the correspondence between SOM sections and GDB's idea of
-     section names.  So for now we default to what is was before these
-     changes.  */
-  objfile->sect_index_text = 0;
-  objfile->sect_index_data = 1;
-  objfile->sect_index_bss = 2;
-  objfile->sect_index_rodata = 3;
+  set_section_index (objfile, 0, SEC_ALLOC | SEC_CODE,
+                    &objfile->sect_index_text);
+  set_section_index (objfile, 0, SEC_ALLOC | SEC_DATA,
+                    &objfile->sect_index_data);
+  set_section_index (objfile, SEC_LOAD, SEC_ALLOC | SEC_LOAD,
+                    &objfile->sect_index_bss);
+  set_section_index (objfile, 0, SEC_ALLOC | SEC_READONLY,
+                    &objfile->sect_index_rodata);
 
   /* First see if we're a shared library.  If so, get the section
      offsets from the library, else get them from addrs.  */