Index: gdb/stabsread.c |
diff --git a/gdb/stabsread.c b/gdb/stabsread.c |
index 865bac8530cce831fadfe83d0d602e08569f048d..eb09c9d5997dfb9a43bc9a96ca5090e4c33a7749 100644 |
--- a/gdb/stabsread.c |
+++ b/gdb/stabsread.c |
@@ -98,7 +98,7 @@ static void |
patch_block_stabs (struct pending *, struct pending_stabs *, |
struct objfile *); |
-static void fix_common_block (struct symbol *, int); |
+static void fix_common_block (struct symbol *, CORE_ADDR); |
static int read_type_number (char **, int *); |
@@ -1173,7 +1173,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type, |
NULL, objfile); |
if (msym != NULL) |
{ |
- char *new_name = gdbarch_static_transform_name |
+ const char *new_name = gdbarch_static_transform_name |
(gdbarch, SYMBOL_LINKAGE_NAME (sym)); |
SYMBOL_SET_LINKAGE_NAME (sym, new_name); |
@@ -1367,7 +1367,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type, |
NULL, objfile); |
if (msym != NULL) |
{ |
- char *new_name = gdbarch_static_transform_name |
+ const char *new_name = gdbarch_static_transform_name |
(gdbarch, SYMBOL_LINKAGE_NAME (sym)); |
SYMBOL_SET_LINKAGE_NAME (sym, new_name); |
@@ -2232,10 +2232,11 @@ rs6000_builtin_type (int typenum, struct objfile *objfile) |
/* This page contains subroutines of read_type. */ |
-/* Replace *OLD_NAME with the method name portion of PHYSNAME. */ |
+/* Wrapper around method_name_from_physname to flag a complaint |
+ if there is an error. */ |
-static void |
-update_method_name_from_physname (char **old_name, const char *physname) |
+static char * |
+stabs_method_name_from_physname (const char *physname) |
{ |
char *method_name; |
@@ -2245,16 +2246,10 @@ update_method_name_from_physname (char **old_name, const char *physname) |
{ |
complaint (&symfile_complaints, |
_("Method has bad physname %s\n"), physname); |
- return; |
+ return NULL; |
} |
- if (strcmp (*old_name, method_name) != 0) |
- { |
- xfree (*old_name); |
- *old_name = method_name; |
- } |
- else |
- xfree (method_name); |
+ return method_name; |
} |
/* Read member function stabs info for C++ classes. The form of each member |
@@ -2278,10 +2273,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type, |
{ |
int nfn_fields = 0; |
int length = 0; |
- /* Total number of member functions defined in this class. If the class |
- defines two `f' functions, and one `g' function, then this will have |
- the value 3. */ |
- int total_length = 0; |
int i; |
struct next_fnfield |
{ |
@@ -2681,7 +2672,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type, |
destr_fnlist->next = fip->fnlist; |
fip->fnlist = destr_fnlist; |
nfn_fields++; |
- total_length += has_destructor; |
length -= has_destructor; |
} |
else if (is_v3) |
@@ -2692,14 +2682,24 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type, |
- in -gstabs instead of -gstabs+ |
- or for static methods, which are output as a function type |
instead of a method type. */ |
+ char *new_method_name = |
+ stabs_method_name_from_physname (sublist->fn_field.physname); |
- update_method_name_from_physname (&new_fnlist->fn_fieldlist.name, |
- sublist->fn_field.physname); |
+ if (new_method_name != NULL |
+ && strcmp (new_method_name, |
+ new_fnlist->fn_fieldlist.name) != 0) |
+ { |
+ new_fnlist->fn_fieldlist.name = new_method_name; |
+ xfree (main_fn_name); |
+ } |
+ else |
+ xfree (new_method_name); |
} |
else if (has_destructor && new_fnlist->fn_fieldlist.name[0] != '~') |
{ |
new_fnlist->fn_fieldlist.name = |
- concat ("~", main_fn_name, (char *)NULL); |
+ obconcat (&objfile->objfile_obstack, |
+ "~", main_fn_name, (char *)NULL); |
xfree (main_fn_name); |
} |
else if (!has_stub) |
@@ -2716,6 +2716,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type, |
new_fnlist->fn_fieldlist.name |
= obsavestring (dem_opname, strlen (dem_opname), |
&objfile->objfile_obstack); |
+ xfree (main_fn_name); |
} |
new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *) |
@@ -2732,7 +2733,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type, |
new_fnlist->next = fip->fnlist; |
fip->fnlist = new_fnlist; |
nfn_fields++; |
- total_length += length; |
} |
} |
@@ -2744,7 +2744,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type, |
memset (TYPE_FN_FIELDLISTS (type), 0, |
sizeof (struct fn_fieldlist) * nfn_fields); |
TYPE_NFN_FIELDS (type) = nfn_fields; |
- TYPE_NFN_FIELDS_TOTAL (type) = total_length; |
} |
return 1; |
@@ -2760,7 +2759,7 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type, |
struct objfile *objfile) |
{ |
char *p; |
- char *name; |
+ const char *name; |
char cpp_abbrev; |
struct type *context; |
@@ -2831,8 +2830,8 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type, |
{ |
int nbits; |
- FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ';', &nbits, |
- 0); |
+ SET_FIELD_BITPOS (fip->list->field, |
+ read_huge_number (pp, ';', &nbits, 0)); |
if (nbits != 0) |
return 0; |
} |
@@ -2908,7 +2907,8 @@ read_one_struct_field (struct field_info *fip, char **pp, char *p, |
{ |
int nbits; |
- FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ',', &nbits, 0); |
+ SET_FIELD_BITPOS (fip->list->field, |
+ read_huge_number (pp, ',', &nbits, 0)); |
if (nbits != 0) |
{ |
stabs_general_complaint ("bad structure-type format"); |
@@ -3188,7 +3188,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type, |
corresponding to this baseclass. Always zero in the absence of |
multiple inheritance. */ |
- FIELD_BITPOS (new->field) = read_huge_number (pp, ',', &nbits, 0); |
+ SET_FIELD_BITPOS (new->field, read_huge_number (pp, ',', &nbits, 0)); |
if (nbits != 0) |
return 0; |
} |
@@ -3273,7 +3273,7 @@ read_tilde_fields (struct field_info *fip, char **pp, struct type *type, |
i >= TYPE_N_BASECLASSES (t); |
--i) |
{ |
- char *name = TYPE_FIELD_NAME (t, i); |
+ const char *name = TYPE_FIELD_NAME (t, i); |
if (!strncmp (name, vptr_name, sizeof (vptr_name) - 2) |
&& is_cplus_marker (name[sizeof (vptr_name) - 2])) |
@@ -3413,8 +3413,8 @@ attach_fields_to_type (struct field_info *fip, struct type *type, |
static void |
complain_about_struct_wipeout (struct type *type) |
{ |
- char *name = ""; |
- char *kind = ""; |
+ const char *name = ""; |
+ const char *kind = ""; |
if (TYPE_TAG_NAME (type)) |
{ |
@@ -3731,7 +3731,7 @@ read_enum_type (char **pp, struct type *type, |
SYMBOL_TYPE (xsym) = type; |
TYPE_FIELD_NAME (type, n) = SYMBOL_LINKAGE_NAME (xsym); |
- TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym); |
+ SET_FIELD_ENUMVAL (TYPE_FIELD (type, n), SYMBOL_VALUE (xsym)); |
TYPE_FIELD_BITSIZE (type, n) = 0; |
} |
if (syms == osyms) |
@@ -4398,7 +4398,7 @@ common_block_end (struct objfile *objfile) |
the common block name). */ |
static void |
-fix_common_block (struct symbol *sym, int valu) |
+fix_common_block (struct symbol *sym, CORE_ADDR valu) |
{ |
struct pending *next = (struct pending *) SYMBOL_TYPE (sym); |
@@ -4552,7 +4552,7 @@ cleanup_undefined_types_1 (void) |
struct pending *ppt; |
int i; |
/* Name of the type, without "struct" or "union". */ |
- char *typename = TYPE_TAG_NAME (*type); |
+ const char *typename = TYPE_TAG_NAME (*type); |
if (typename == NULL) |
{ |
@@ -4598,7 +4598,7 @@ cleanup_undefined_types_1 (void) |
this unit. */ |
void |
-cleanup_undefined_types (struct objfile *objfile) |
+cleanup_undefined_stabs_types (struct objfile *objfile) |
{ |
cleanup_undefined_types_1 (); |
cleanup_undefined_types_noname (objfile); |