* stabsread.c: Make all complaints static.

* Fix formatting of live range splitting code.
	* (resolve_symbol_reference define_symbol resolve_live_range):  Change
	errors to complaints so that bad live range symbols won't abort the
	entire symbol table.  Handle errors by aborting just the current
	symbol.
	* (ref_init):  Goes away.  Folded into ref_add().
	* (REF_MAP_SIZE):  Put parens around parameter so that args like
	`1 + 2' get handled correctly (yes, this was a real bug).
	* (ref_add):  Remove check for allocation failures.  Not necessary
	when using xrealloc().  Fix pointer arithmetic problem when clearing
	memory.  This and the previous patch prevent random SEGV's when there
	are lots of live range symbols.
This commit is contained in:
Stu Grossman 1998-09-15 22:38:40 +00:00
parent 27001c664d
commit 3c47adae01
1 changed files with 89 additions and 69 deletions

View File

@ -172,22 +172,19 @@ read_cfront_member_functions PARAMS ((struct field_info *, char **,
/* end new functions added for cfront support */
static void
static void
add_live_range PARAMS ((struct objfile *, struct symbol *,
CORE_ADDR, CORE_ADDR));
static void
static int
resolve_live_range PARAMS ((struct objfile *, struct symbol *, char *));
static int
static int
process_reference PARAMS ((char **string));
static CORE_ADDR
static CORE_ADDR
ref_search_value PARAMS ((int refnum));
static void
ref_init PARAMS ((void));
static int
resolve_symbol_reference PARAMS ((struct objfile *, struct symbol *, char *));
@ -203,43 +200,46 @@ static const char vb_name[] = { '_','v','b',CPLUS_MARKER,'\0' };
#define BELIEVE_PCC_PROMOTION 0
#endif
struct complaint invalid_cpp_abbrev_complaint =
static struct complaint invalid_cpp_abbrev_complaint =
{"invalid C++ abbreviation `%s'", 0, 0};
struct complaint invalid_cpp_type_complaint =
static struct complaint invalid_cpp_type_complaint =
{"C++ abbreviated type name unknown at symtab pos %d", 0, 0};
struct complaint member_fn_complaint =
static struct complaint member_fn_complaint =
{"member function type missing, got '%c'", 0, 0};
struct complaint const_vol_complaint =
static struct complaint const_vol_complaint =
{"const/volatile indicator missing, got '%c'", 0, 0};
struct complaint error_type_complaint =
static struct complaint error_type_complaint =
{"debug info mismatch between compiler and debugger", 0, 0};
struct complaint invalid_member_complaint =
static struct complaint invalid_member_complaint =
{"invalid (minimal) member type data format at symtab pos %d.", 0, 0};
struct complaint range_type_base_complaint =
static struct complaint range_type_base_complaint =
{"base type %d of range type is not defined", 0, 0};
struct complaint reg_value_complaint =
static struct complaint reg_value_complaint =
{"register number %d too large (max %d) in symbol %s", 0, 0};
struct complaint vtbl_notfound_complaint =
static struct complaint vtbl_notfound_complaint =
{"virtual function table pointer not found when defining class `%s'", 0, 0};
struct complaint unrecognized_cplus_name_complaint =
static struct complaint unrecognized_cplus_name_complaint =
{"Unknown C++ symbol name `%s'", 0, 0};
struct complaint rs6000_builtin_complaint =
static struct complaint rs6000_builtin_complaint =
{"Unknown builtin type %d", 0, 0};
struct complaint unresolved_sym_chain_complaint =
static struct complaint unresolved_sym_chain_complaint =
{"%s: common block `%s' from global_sym_chain unresolved", 0, 0};
struct complaint stabs_general_complaint =
static struct complaint stabs_general_complaint =
{"%s", 0, 0};
static struct complaint lrs_general_complaint =
{"%s", 0, 0};
/* Make a list of forward references which haven't been defined. */
@ -1079,8 +1079,10 @@ resolve_symbol_reference (objfile, sym, p)
refnum = process_reference (&p);
ref_sym = ref_search (refnum);
if (!ref_sym)
error ("error: symbol for reference not found.\n");
{
complain (&lrs_general_complaint, "symbol for reference not found");
return 0;
}
/* Parse the stab of the referencing symbol
now that we have the referenced symbol.
@ -1113,7 +1115,10 @@ resolve_symbol_reference (objfile, sym, p)
alias = (struct alias_list *) obstack_alloc (&objfile->type_obstack,
sizeof (struct alias_list));
if (!alias)
error ("Unable to allocate alias list memory");
{
complain (&lrs_general_complaint, "Unable to allocate alias list memory");
return 0;
}
alias->next = 0;
alias->sym = sym;
@ -1144,20 +1149,21 @@ resolve_symbol_reference (objfile, sym, p)
return 0;
}
#define MAX_CHUNK_REFS 100
#define REF_CHUNK_SIZE \
MAX_CHUNK_REFS * sizeof (struct ref_map_s)
#define REF_MAP_SIZE(ref_chunk) \
ref_chunk * REF_CHUNK_SIZE
/* Structure for storing pointers to reference definitions for fast lookup
during "process_later". */
static struct ref_map_s
struct ref_map
{
char *stabs;
CORE_ADDR value;
struct symbol *sym;
} *ref_map;
};
#define MAX_CHUNK_REFS 100
#define REF_CHUNK_SIZE (MAX_CHUNK_REFS * sizeof (struct ref_map))
#define REF_MAP_SIZE(ref_chunk) ((ref_chunk) * REF_CHUNK_SIZE)
static struct ref_map *ref_map;
/* Ptr to free cell in chunk's linked list. */
static int ref_count = 0;
@ -1165,16 +1171,6 @@ static int ref_count = 0;
/* Number of chunks malloced. */
static int ref_chunk = 0;
/* Initialize our list of references.
This should be called before any symbol table is read. */
static void
ref_init ()
{
ref_count = 0;
ref_chunk = 0;
}
/* Create array of pointers mapping refids to symbols and stab strings.
Add pointers to reference definition symbols and/or their values as we
find them, using their reference numbers as our index.
@ -1187,18 +1183,16 @@ ref_add (refnum, sym, stabs, value)
CORE_ADDR value;
{
if (ref_count == 0)
ref_init ();
ref_chunk = 0;
if (refnum >= ref_count)
ref_count = refnum + 1;
if (ref_count > ref_chunk * MAX_CHUNK_REFS)
{
int new_slots = ref_count - ref_chunk * MAX_CHUNK_REFS;
int new_chunks = new_slots / MAX_CHUNK_REFS + 1;
ref_map = (struct ref_map_s *)
xrealloc (ref_map, REF_MAP_SIZE(ref_chunk + new_chunks));
if (!ref_map)
error ("no more free slots in chain\n");
memset (ref_map + REF_MAP_SIZE(ref_chunk), 0, new_chunks * REF_CHUNK_SIZE);
ref_map = (struct ref_map *)
xrealloc (ref_map, REF_MAP_SIZE (ref_chunk + new_chunks));
memset (ref_map + ref_chunk * MAX_CHUNK_REFS, 0, new_chunks * REF_CHUNK_SIZE);
ref_chunk += new_chunks;
}
ref_map[refnum].stabs = stabs;
@ -2158,36 +2152,47 @@ define_symbol (valu, string, desc, type, objfile)
the end of the stab string. eg. "l(#1,#2);l(#3,#5)" */
/* Resolve the live range and add it to SYM's live range list. */
resolve_live_range (objfile, sym, p);
if (!resolve_live_range (objfile, sym, p))
return NULL;
/* Find end of live range info. */
p = strchr (p, ')');
if (!*p || *p != ')')
error ("Internal error: live range format not recognized.\n");
{
complain (&lrs_general_complaint, "live range format not recognized");
return NULL;
}
p++;
}
}
return sym;
}
/* Add the live range found in P to the symbol SYM in objfile OBJFILE. */
/* Add the live range found in P to the symbol SYM in objfile OBJFILE. Returns
non-zero on success, zero otherwise. */
static void
static int
resolve_live_range (objfile, sym, p)
struct objfile * objfile;
struct symbol *sym;
char *p;
struct objfile *objfile;
struct symbol *sym;
char *p;
{
int refnum;
CORE_ADDR start, end;
/* Sanity check the beginning of the stabs string. */
if (!*p || *p != 'l')
error ("Internal error: live range string.\n");
{
complain (&lrs_general_complaint, "live range string 1");
return 0;
}
p++;
if (!*p || *p != '(')
error ("Internal error: live range string.\n");
{
complain (&lrs_general_complaint, "live range string 2");
return 0;
}
p++;
/* Get starting value of range and advance P past the reference id.
@ -2197,10 +2202,16 @@ resolve_live_range (objfile, sym, p)
refnum = process_reference (&p);
start = ref_search_value (refnum);
if (!start)
error ("Internal error: live range symbol not found.\n");
{
complain (&lrs_general_complaint, "Live range symbol not found 1");
return 0;
}
if (!*p || *p != ',')
error ("Internal error: live range string.\n");
{
complain (&lrs_general_complaint, "live range string 3");
return 0;
}
p++;
/* Get ending value of range and advance P past the reference id.
@ -2210,14 +2221,22 @@ resolve_live_range (objfile, sym, p)
refnum = process_reference (&p);
end = ref_search_value (refnum);
if (!end)
error ("Internal error: live range symbol not found.\n");
{
complain (&lrs_general_complaint, "Live range symbol not found 2");
return 0;
}
if (!*p || *p != ')')
error ("Internal error: live range string.\n");
{
complain (&lrs_general_complaint, "live range string 4");
return 0;
}
/* Now that we know the bounds of the range, add it to the
symbol. */
add_live_range (objfile, sym, start, end);
return 1;
}
/* Add a new live range defined by START and END to the symbol SYM
@ -2225,28 +2244,29 @@ resolve_live_range (objfile, sym, p)
static void
add_live_range (objfile, sym, start, end)
struct objfile *objfile;
struct symbol *sym;
CORE_ADDR start, end;
struct objfile *objfile;
struct symbol *sym;
CORE_ADDR start, end;
{
struct range_list *r, *rs;
if (start >= end)
error ("Internal error: end of live range follows start.\n");
{
complain (&lrs_general_complaint, "end of live range follows start");
return;
}
/* Alloc new live range structure. */
r = (struct range_list *)
obstack_alloc (&objfile->type_obstack,
sizeof (struct range_list));
obstack_alloc (&objfile->type_obstack,
sizeof (struct range_list));
r->start = start;
r->end = end;
r->next = 0;
/* Append this range to the symbol's range list. */
if (!SYMBOL_RANGES (sym))
{
SYMBOL_RANGES (sym) = r;
}
SYMBOL_RANGES (sym) = r;
else
{
/* Get the last range for the symbol. */