* target.h (struct thread_resume): Delete leave_stopped member.
[deliverable/binutils-gdb.git] / gdb / dbxread.c
index f55a623acd049dba3bab2ba84f69f84c3396871c..d520266d54cdd170b88c4708e7d772c9ddfe4225 100644 (file)
@@ -54,6 +54,7 @@
 #include "demangle.h"
 #include "complaints.h"
 #include "cp-abi.h"
+#include "cp-support.h"
 
 #include "gdb_assert.h"
 #include "gdb_string.h"
@@ -513,7 +514,7 @@ record_minimal_symbol (char *name, CORE_ADDR address, int type,
     lowest_text_address = address;
 
   prim_record_minimal_symbol_and_info
-    (name, address, ms_type, NULL, section, bfd_section, objfile);
+    (name, address, ms_type, section, bfd_section, objfile);
 }
 \f
 /* Scan and build partial symbols for a symbol file.
@@ -850,8 +851,9 @@ stabs_seek (int sym_offset)
 
 #define INTERNALIZE_SYMBOL(intern, extern, abfd)                       \
   {                                                                    \
-    (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);            \
     (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);           \
+    (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);            \
+    (intern).n_other = 0;                                              \
     (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);           \
     if (bfd_get_sign_extend_vma (abfd))                                        \
       (intern).n_value = bfd_h_get_signed_32 (abfd, (extern)->e_value);        \
@@ -959,20 +961,20 @@ make_cleanup_free_bincl_list (struct objfile *objfile)
    rather than abort the symbol reading or flood the user with messages.  */
 
 static char *
-set_namestring (struct objfile *objfile, struct internal_nlist nlist)
+set_namestring (struct objfile *objfile, const struct internal_nlist *nlist)
 {
   char *namestring;
 
-  if (((unsigned) nlist.n_strx + file_string_table_offset) >=
-      DBX_STRINGTAB_SIZE (objfile))
+  if (((unsigned) nlist->n_strx + file_string_table_offset)
+      >= DBX_STRINGTAB_SIZE (objfile))
     {
       complaint (&symfile_complaints, _("bad string table offset in symbol %d"),
                 symnum);
       namestring = "<bad string table offset>";
     } 
   else
-    namestring = nlist.n_strx + file_string_table_offset +
-      DBX_STRINGTAB (objfile);
+    namestring = (nlist->n_strx + file_string_table_offset
+                 + DBX_STRINGTAB (objfile));
   return namestring;
 }
 
@@ -1181,10 +1183,13 @@ units"),
 static void
 read_dbx_symtab (struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   struct external_nlist *bufp = 0;     /* =0 avoids gcc -Wall glitch */
   struct internal_nlist nlist;
   CORE_ADDR text_addr;
   int text_size;
+  char *sym_name;
+  int sym_len;
 
   char *namestring;
   int nsl;
@@ -1338,7 +1343,7 @@ read_dbx_symtab (struct objfile *objfile)
 
        case N_ABS | N_EXT:
          record_it:
-         namestring = set_namestring (objfile, nlist);
+         namestring = set_namestring (objfile, &nlist);
 
        bss_ext_symbol:
          record_minimal_symbol (namestring, nlist.n_value,
@@ -1359,7 +1364,7 @@ read_dbx_symtab (struct objfile *objfile)
        case N_TEXT:
          nlist.n_value += ANOFFSET (objfile->section_offsets,
                                     SECT_OFF_TEXT (objfile));
-         namestring = set_namestring (objfile, nlist);
+         namestring = set_namestring (objfile, &nlist);
 
          if ((namestring[0] == '-' && namestring[1] == 'l')
              || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
@@ -1401,7 +1406,7 @@ read_dbx_symtab (struct objfile *objfile)
 
              CORE_ADDR reladdr;
 
-             namestring = set_namestring (objfile, nlist);
+             namestring = set_namestring (objfile, &nlist);
              if (target_lookup_symbol (namestring, &reladdr))
                {
                  continue;     /* Error in lookup; ignore symbol for now.  */
@@ -1479,7 +1484,7 @@ read_dbx_symtab (struct objfile *objfile)
               don't relocate it.  */
 
            if (nlist.n_value == 0
-               && gdbarch_sofun_address_maybe_missing (current_gdbarch))
+               && gdbarch_sofun_address_maybe_missing (gdbarch))
              {
                textlow_not_set = 1;
                valu = 0;
@@ -1510,7 +1515,7 @@ read_dbx_symtab (struct objfile *objfile)
 
            /* End the current partial symtab and start a new one */
 
-           namestring = set_namestring (objfile, nlist);
+           namestring = set_namestring (objfile, &nlist);
 
            /* Null name means end of .o file.  Don't start a new one. */
            if (*namestring == '\000')
@@ -1554,7 +1559,7 @@ read_dbx_symtab (struct objfile *objfile)
               need to save the string; it'll be around until
               read_dbx_symtab function returns */
 
-           namestring = set_namestring (objfile, nlist);
+           namestring = set_namestring (objfile, &nlist);
            tmp_language = deduce_language_from_filename (namestring);
 
            /* Only change the psymtab's language if we've learned
@@ -1588,7 +1593,7 @@ pos %d"),
            enum language tmp_language;
            /* Mark down an include file in the current psymtab */
 
-           namestring = set_namestring (objfile, nlist);
+           namestring = set_namestring (objfile, &nlist);
            tmp_language = deduce_language_from_filename (namestring);
 
            /* Only change the psymtab's language if we've learned
@@ -1632,8 +1637,7 @@ pos %d"),
                char **orig = psymtab_include_list;
 
                psymtab_include_list = (char **)
-                 alloca ((includes_allocated *= 2) *
-                         sizeof (char *));
+                 alloca ((includes_allocated *= 2) * sizeof (char *));
                memcpy (psymtab_include_list, orig,
                        includes_used * sizeof (char *));
              }
@@ -1659,7 +1663,7 @@ pos %d"),
        {
          char *p;
 
-         namestring = set_namestring (objfile, nlist);
+         namestring = set_namestring (objfile, &nlist);
 
          /* See if this is an end of function stab.  */
          if (pst && nlist.n_type == N_FUN && *namestring == '\000')
@@ -1679,6 +1683,28 @@ pos %d"),
          if (!p)
            continue;                   /* Not a debugging symbol.   */
 
+         sym_len = 0;
+         if (psymtab_language == language_cplus)
+           {
+             char *new_name, *name = alloca (p - namestring + 1);
+             memcpy (name, namestring, p - namestring);
+             name[p - namestring] = '\0';
+             new_name = cp_canonicalize_string (name);
+             if (new_name != NULL)
+               {
+                 sym_len = strlen (new_name);
+                 sym_name = obsavestring (new_name, sym_len,
+                                          &objfile->objfile_obstack);
+                 xfree (new_name);
+               }
+           }
+
+         if (sym_len == 0)
+           {
+             sym_name = namestring;
+             sym_len = p - namestring;
+           }
+
          /* Main processing section for debugging symbols which
             the initial read through the symbol tables needs to worry
             about.  If we reach this point, the symbol which we are
@@ -1692,11 +1718,11 @@ pos %d"),
              nlist.n_value += ANOFFSET (objfile->section_offsets,
                                         data_sect_index);
 
-             if (gdbarch_static_transform_name_p (current_gdbarch))
-               namestring = gdbarch_static_transform_name
-                 (current_gdbarch, namestring);
+             if (gdbarch_static_transform_name_p (gdbarch))
+               namestring = gdbarch_static_transform_name (gdbarch,
+                                                           namestring);
 
-             add_psymbol_to_list (namestring, p - namestring,
+             add_psymbol_to_list (sym_name, sym_len,
                                   VAR_DOMAIN, LOC_STATIC,
                                   &objfile->static_psymbols,
                                   0, nlist.n_value,
@@ -1708,7 +1734,7 @@ pos %d"),
                                         data_sect_index);
              /* The addresses in these entries are reported to be
                 wrong.  See the code that reads 'G's for symtabs. */
-             add_psymbol_to_list (namestring, p - namestring,
+             add_psymbol_to_list (sym_name, sym_len,
                                   VAR_DOMAIN, LOC_STATIC,
                                   &objfile->global_psymbols,
                                   0, nlist.n_value,
@@ -1726,7 +1752,7 @@ pos %d"),
                  || (p == namestring + 1
                      && namestring[0] != ' '))
                {
-                 add_psymbol_to_list (namestring, p - namestring,
+                 add_psymbol_to_list (sym_name, sym_len,
                                       STRUCT_DOMAIN, LOC_TYPEDEF,
                                       &objfile->static_psymbols,
                                       nlist.n_value, 0,
@@ -1734,7 +1760,7 @@ pos %d"),
                  if (p[2] == 't')
                    {
                      /* Also a typedef with the same name.  */
-                     add_psymbol_to_list (namestring, p - namestring,
+                     add_psymbol_to_list (sym_name, sym_len,
                                           VAR_DOMAIN, LOC_TYPEDEF,
                                           &objfile->static_psymbols,
                                           nlist.n_value, 0,
@@ -1747,7 +1773,7 @@ pos %d"),
            case 't':
              if (p != namestring)      /* a name is there, not just :T... */
                {
-                 add_psymbol_to_list (namestring, p - namestring,
+                 add_psymbol_to_list (sym_name, sym_len,
                                       VAR_DOMAIN, LOC_TYPEDEF,
                                       &objfile->static_psymbols,
                                       nlist.n_value, 0,
@@ -1827,7 +1853,7 @@ pos %d"),
 
            case 'c':
              /* Constant, e.g. from "const" in Pascal.  */
-             add_psymbol_to_list (namestring, p - namestring,
+             add_psymbol_to_list (sym_name, sym_len,
                                   VAR_DOMAIN, LOC_CONST,
                                   &objfile->static_psymbols, nlist.n_value,
                                   0, psymtab_language, objfile);
@@ -1851,7 +1877,7 @@ pos %d"),
                 value for the bottom of the text seg in those cases. */
              if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
                                             SECT_OFF_TEXT (objfile))
-                 && gdbarch_sofun_address_maybe_missing (current_gdbarch))
+                 && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
                  CORE_ADDR minsym_valu = 
                    find_stab_function_addr (namestring, 
@@ -1866,7 +1892,7 @@ pos %d"),
                    nlist.n_value = minsym_valu;
                }
              if (pst && textlow_not_set
-                 && gdbarch_sofun_address_maybe_missing (current_gdbarch))
+                 && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
                  pst->textlow = nlist.n_value;
                  textlow_not_set = 0;
@@ -1891,7 +1917,7 @@ pos %d"),
                  pst->textlow = nlist.n_value;
                  textlow_not_set = 0;
                }
-             add_psymbol_to_list (namestring, p - namestring,
+             add_psymbol_to_list (sym_name, sym_len,
                                   VAR_DOMAIN, LOC_BLOCK,
                                   &objfile->static_psymbols,
                                   0, nlist.n_value,
@@ -1919,7 +1945,7 @@ pos %d"),
                 value for the bottom of the text seg in those cases. */
              if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
                                             SECT_OFF_TEXT (objfile))
-                 && gdbarch_sofun_address_maybe_missing (current_gdbarch))
+                 && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
                  CORE_ADDR minsym_valu = 
                    find_stab_function_addr (namestring, 
@@ -1934,7 +1960,7 @@ pos %d"),
                    nlist.n_value = minsym_valu;
                }
              if (pst && textlow_not_set
-                 && gdbarch_sofun_address_maybe_missing (current_gdbarch))
+                 && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
                  pst->textlow = nlist.n_value;
                  textlow_not_set = 0;
@@ -1959,7 +1985,7 @@ pos %d"),
                  pst->textlow = nlist.n_value;
                  textlow_not_set = 0;
                }
-             add_psymbol_to_list (namestring, p - namestring,
+             add_psymbol_to_list (sym_name, sym_len,
                                   VAR_DOMAIN, LOC_BLOCK,
                                   &objfile->global_psymbols,
                                   0, nlist.n_value,
@@ -2014,7 +2040,7 @@ pos %d"),
 
        case N_EXCL:
 
-         namestring = set_namestring (objfile, nlist);
+         namestring = set_namestring (objfile, &nlist);
 
          /* Find the corresponding bincl and mark that psymtab on the
             psymtab dependency list */
@@ -2071,7 +2097,7 @@ pos %d"),
             end_psymtab will set pst->texthigh to the proper value, which
             is necessary if a module compiled without debugging info
             follows this module.  */
-         if (pst && gdbarch_sofun_address_maybe_missing (current_gdbarch))
+         if (pst && gdbarch_sofun_address_maybe_missing (gdbarch))
            {
              end_psymtab (pst, psymtab_include_list, includes_used,
                           symnum * symbol_size,
@@ -2197,6 +2223,7 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
 {
   int i;
   struct objfile *objfile = pst->objfile;
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
 
   if (capping_symbol_offset != -1)
     LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
@@ -2218,7 +2245,7 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
      last function in the file.  */
 
   if (pst->texthigh == 0 && last_function_name
-      && gdbarch_sofun_address_maybe_missing (current_gdbarch))
+      && gdbarch_sofun_address_maybe_missing (gdbarch))
     {
       char *p;
       int n;
@@ -2249,7 +2276,7 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
       last_function_name = NULL;
     }
 
-  if (!gdbarch_sofun_address_maybe_missing (current_gdbarch))
+  if (!gdbarch_sofun_address_maybe_missing (gdbarch))
     ;
   /* this test will be true if the last .o file is only data */
   else if (textlow_not_set)
@@ -2290,7 +2317,7 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
     {
       pst->dependencies = (struct partial_symtab **)
        obstack_alloc (&objfile->objfile_obstack,
-                   number_dependencies * sizeof (struct partial_symtab *));
+                      number_dependencies * sizeof (struct partial_symtab *));
       memcpy (pst->dependencies, dependency_list,
              number_dependencies * sizeof (struct partial_symtab *));
     }
@@ -2528,7 +2555,7 @@ read_ofile_symtab (struct partial_symtab *pst)
       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
       OBJSTAT (objfile, n_stabs++);
 
-      namestring = set_namestring (objfile, nlist);
+      namestring = set_namestring (objfile, &nlist);
 
       processing_gcc_compilation = 0;
       if (nlist.n_type == N_TEXT)
@@ -2590,10 +2617,23 @@ read_ofile_symtab (struct partial_symtab *pst)
 
       type = bfd_h_get_8 (abfd, bufp->e_type);
 
-      namestring = set_namestring (objfile, nlist);
+      namestring = set_namestring (objfile, &nlist);
 
       if (type & N_STAB)
        {
+         if (sizeof (nlist.n_value) > 4
+             /* We are a 64-bit debugger debugging a 32-bit program.  */
+             && (type == N_LSYM || type == N_PSYM))
+             /* We have to be careful with the n_value in the case of N_LSYM
+                and N_PSYM entries, because they are signed offsets from frame
+                pointer, but we actually read them as unsigned 32-bit values.
+                This is not a problem for 32-bit debuggers, for which negative
+                values end up being interpreted correctly (as negative
+                offsets) due to integer overflow.
+                But we need to sign-extend the value for 64-bit debuggers,
+                or we'll end up interpreting negative values as very large
+                positive offsets.  */
+           nlist.n_value = (nlist.n_value ^ 0x80000000) - 0x80000000;
          process_one_symbol (type, nlist.n_desc, nlist.n_value,
                              namestring, section_offsets, objfile);
        }
@@ -2679,6 +2719,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
                    struct section_offsets *section_offsets,
                    struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   struct context_stack *new;
   /* This remembers the address of the start of a function.  It is
      used because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries
@@ -2735,6 +2776,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
        {
          /* This N_FUN marks the end of a function.  This closes off
             the current block.  */
+         struct block *block;
 
          if (context_stack_depth <= 0)
            {
@@ -2753,9 +2795,14 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
          new = pop_context ();
 
          /* Make a block for the local symbols within.  */
-         finish_block (new->name, &local_symbols, new->old_blocks,
-                       new->start_addr, new->start_addr + valu,
-                       objfile);
+         block = finish_block (new->name, &local_symbols, new->old_blocks,
+                               new->start_addr, new->start_addr + valu,
+                               objfile);
+
+         /* For C++, set the block's scope.  */
+         if (SYMBOL_LANGUAGE (new->name) == language_cplus)
+           cp_set_block_scope (new->name, block, &objfile->objfile_obstack,
+                               "", 0);
 
          /* May be switching to an assembler file which may not be using
             block relative stabs, so reset the offset.  */
@@ -2769,7 +2816,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 
       /* Relocate for dynamic loading.  */
       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
-      valu = gdbarch_smash_text_address (current_gdbarch, valu);
+      valu = gdbarch_smash_text_address (gdbarch, valu);
       last_function_start = valu;
 
       goto define_a_symbol;
@@ -3109,7 +3156,7 @@ no enclosing block"));
              if (type == N_FUN
                  && valu == ANOFFSET (section_offsets,
                                       SECT_OFF_TEXT (objfile))
-                 && gdbarch_sofun_address_maybe_missing (current_gdbarch))
+                 && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
                  CORE_ADDR minsym_valu = 
                    find_stab_function_addr (name, last_source_file, objfile);
@@ -3145,10 +3192,19 @@ no enclosing block"));
 
              if (context_stack_depth > 0)
                {
+                 struct block *block;
+
                  new = pop_context ();
                  /* Make a block for the local symbols within.  */
-                 finish_block (new->name, &local_symbols, new->old_blocks,
-                               new->start_addr, valu, objfile);
+                 block = finish_block (new->name, &local_symbols,
+                                       new->old_blocks, new->start_addr,
+                                       valu, objfile);
+
+                 /* For C++, set the block's scope.  */
+                 if (SYMBOL_LANGUAGE (new->name) == language_cplus)
+                   cp_set_block_scope (new->name, block,
+                                       &objfile->objfile_obstack,
+                                       "", 0);
                }
 
              new = push_context (0, valu);
This page took 0.030786 seconds and 4 git commands to generate.