* symtab.h (DESTRUCTOR_PREFIX_P): New macro to check if physname
authorPeter Schauer <Peter.Schauer@mytum.de>
Thu, 8 Apr 1993 17:37:24 +0000 (17:37 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Thu, 8 Apr 1993 17:37:24 +0000 (17:37 +0000)
        is a C++ destructor.
        * symtab.c (gdb_mangle_name): Use it.
        * symtab.c (find_methods): Do not add destructors to choice list
        for constructors.
        * symtab.c (decode_line_1): Make breakpoints on destructors work
        for gcc-2.x again.

gdb/ChangeLog
gdb/symtab.c
gdb/symtab.h

index 7eee3bed16565282c786d718a97e8371328ff4b9..3c6008c63e2fd8a5cd3c62c51bce0c574772d852 100644 (file)
@@ -1,3 +1,13 @@
+Thu Apr  8 10:34:37 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
+
+       * symtab.h (DESTRUCTOR_PREFIX_P): New macro to check if physname
+       is a C++ destructor.
+       * symtab.c (gdb_mangle_name): Use it.
+       * symtab.c (find_methods): Do not add destructors to choice list
+       for constructors.
+       * symtab.c (decode_line_1): Make breakpoints on destructors work
+       for gcc-2.x again.
+
 Wed Apr  7 18:43:09 1993  Stu Grossman  (grossman@cygnus.com)
 
        * ser-go32.c:  Make it use serial port name.
index c7a2178596a155ffb3ad2bdb45a43bdf08274938..7f74661556f8a2f6cfd489e67177914f5693e1bf 100644 (file)
@@ -255,8 +255,7 @@ gdb_mangle_name (type, i, j)
   char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
   char *newname = type_name_no_tag (type);
   int is_constructor = STREQ (field_name, newname);
-  int is_destructor = is_constructor && physname[0] == '_'
-      && physname[1] == CPLUS_MARKER && physname[2] == '_';
+  int is_destructor = is_constructor && DESTRUCTOR_PREFIX_P (physname);
   /* Need a new type prefix.  */
   char *const_prefix = method->is_const ? "C" : "";
   char *volatile_prefix = method->is_volatile ? "V" : "";
@@ -920,8 +919,11 @@ find_pc_symtab (pc)
   register struct block *b;
   struct blockvector *bv;
   register struct symtab *s = NULL;
+  register struct symtab *best_s = NULL;
   register struct partial_symtab *ps;
   register struct objfile *objfile;
+  int distance = 0;;
+
 
   /* Search all symtabs for one whose file contains our pc */
 
@@ -930,10 +932,18 @@ find_pc_symtab (pc)
       bv = BLOCKVECTOR (s);
       b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
       if (BLOCK_START (b) <= pc
-         && BLOCK_END (b) > pc)
-       return (s);
+         && BLOCK_END (b) > pc
+         && (distance == 0
+             || BLOCK_END (b) - BLOCK_START (b) < distance))
+       {
+         distance = BLOCK_END (b) - BLOCK_START (b);
+         best_s = s;
+       }
     }
 
+  if (best_s != NULL)
+    return(best_s);
+
   s = NULL;
   ps = find_pc_psymtab (pc);
   if (ps)
@@ -1380,6 +1390,9 @@ find_methods (t, name, sym_arr)
                if (TYPE_FN_FIELD_STUB (f, field_counter))
                  check_stub_method (t, method_counter, field_counter);
                phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
+               /* Destructor is handled by caller, dont add it to the list */
+               if (DESTRUCTOR_PREFIX_P (phys_name))
+                 continue;
                sym_arr[i1] = lookup_symbol (phys_name,
                                             SYMBOL_BLOCK_VALUE (sym_class),
                                             VAR_NAMESPACE,
@@ -1599,7 +1612,15 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
                  /* destructors are a special case.  */
                  struct fn_field *f = TYPE_FN_FIELDLIST1 (t, 0);
                  int len = TYPE_FN_FIELDLIST_LENGTH (t, 0) - 1;
+                 /* gcc 1.x puts destructor in last field,
+                    gcc 2.x puts destructor in first field.  */
                  char *phys_name = TYPE_FN_FIELD_PHYSNAME (f, len);
+                 if (!DESTRUCTOR_PREFIX_P (phys_name))
+                   {
+                     phys_name = TYPE_FN_FIELD_PHYSNAME (f, 0);
+                     if (!DESTRUCTOR_PREFIX_P (phys_name))
+                       phys_name = "";
+                   }
                  sym_arr[i1] =
                    lookup_symbol (phys_name, SYMBOL_BLOCK_VALUE (sym_class),
                                   VAR_NAMESPACE, 0, (struct symtab **)NULL);
@@ -2258,7 +2279,21 @@ list_symbols (regexp, class, bpt)
                      {
                        /* Set a breakpoint here, if it's a function */
                        if (class == 1)
-                         break_command (SYMBOL_NAME(sym), 0);
+                         {
+                           /* There may be more than one function with the
+                              same name but in different files.  In order to
+                              set breakpoints on all of them, we must give
+                              both the file name and the function name to
+                              break_command.  */
+                           char *string =
+                             (char *) alloca (strlen (s->filename)
+                                              + strlen (SYMBOL_NAME(sym))
+                                              + 2);
+                           strcpy (string, s->filename);
+                           strcat (string, ":");
+                           strcat (string, SYMBOL_NAME(sym));
+                           break_command (string, 0);
+                         }
                      }
                    else if (!found_in_file)
                      {
index 304e8c72bcf01bb951bc0dbb77a6636bd335538d..a00b3b1a21f30d873f452d5c507e5d46426fc8ae 100644 (file)
@@ -100,6 +100,13 @@ struct general_symbol_info
          /* end-sanitize-chill */
        } lang_u;
     } lang_specific;
+
+  /* Which section is this symbol in?  This is an index into
+     section_offsets for this objfile.  Negative means that the symbol
+     does not get relocated relative to a section.  */
+  /* Disclaimer: currently this is just used for xcoff, so don't expect
+     all symbol-reading code to set it correctly.  */
+  int section;
 };
 
 #define SYMBOL_NAME(symbol)            (symbol)->ginfo.name
@@ -109,6 +116,7 @@ struct general_symbol_info
 #define SYMBOL_BLOCK_VALUE(symbol)     (symbol)->ginfo.value.block
 #define SYMBOL_VALUE_CHAIN(symbol)     (symbol)->ginfo.value.chain
 #define SYMBOL_LANGUAGE(symbol)                (symbol)->ginfo.lang_specific.language
+#define SYMBOL_SECTION(symbol)         (symbol)->ginfo.section
 
 #define SYMBOL_CPLUS_DEMANGLED_NAME(symbol)    \
   (symbol)->ginfo.lang_specific.lang_u.cplus_specific.demangled_name
@@ -507,7 +515,7 @@ enum address_class
 
   LOC_BLOCK,
 
-  /* Value is a constant byte-sequence pointed to by SYMBOL_VALUE_ADDRESS, in
+  /* Value is a constant byte-sequence pointed to by SYMBOL_VALUE_BYTES, in
      target byte order.  */
 
   LOC_CONST_BYTES,
@@ -518,8 +526,12 @@ enum address_class
      (FRAME_ARGS_ADDRESS).  Added for i960, which passes args in regs then
      copies to frame.  */
 
-  LOC_LOCAL_ARG
+  LOC_LOCAL_ARG,
+
+  /* The variable does not actually exist in the program.
+     The SYMBOL_VALUE is ignored.  */
 
+  LOC_OPTIMIZED_OUT
 };
 
 struct symbol
@@ -679,6 +691,17 @@ struct symtab
 
     struct linetable *linetable;
 
+    /* Section in objfile->section_offsets for the blockvector and
+       the linetable.  */
+
+    int block_line_section;
+
+    /* If several symtabs share a blockvector, exactly one of them
+       should be designed the primary, so that the blockvector
+       is relocated exactly once by objfile_relocate.  */
+
+    int primary;
+
     /* Name of this source file.  */
 
     char *filename;
@@ -854,9 +877,18 @@ struct partial_symtab
 #define OPNAME_PREFIX_P(NAME) \
   ((NAME)[0] == 'o' && (NAME)[1] == 'p' && (NAME)[2] == CPLUS_MARKER)
 
+/* Macro that yields non-zero value iff NAME is the prefix for C++ vtbl
+   names.  */
+
 #define VTBL_PREFIX_P(NAME) \
   ((NAME)[3] == CPLUS_MARKER && !strncmp ((NAME), "_vt", 3))
 
+/* Macro that yields non-zero value iff NAME is the prefix for C++ destructor
+   names.  */
+
+#define DESTRUCTOR_PREFIX_P(NAME) \
+  ((NAME)[0] == '_' && (NAME)[1] == CPLUS_MARKER && (NAME)[2] == '_')
+
 \f
 /* External variables and functions for the objects described above. */
 
@@ -935,7 +967,7 @@ prim_record_minimal_symbol PARAMS ((const char *, CORE_ADDR,
 extern void
 prim_record_minimal_symbol_and_info PARAMS ((const char *, CORE_ADDR,
                                             enum minimal_symbol_type,
-                                            char *info));
+                                            char *info, int section));
 
 extern struct minimal_symbol *
 lookup_minimal_symbol PARAMS ((const char *, struct objfile *));