X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fbuildsym.c;h=d7e99c054e1c3afded4b5ded4d072eec0ddc7b4d;hb=14a5e76714708e70c7a7a962a60b5a2bf68602db;hp=3ca256395b9f5457cfa91ee2df6de1b4534bc7a0;hpb=f7cb3ef862abc8b655aa43f2a829f2d2457587a8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 3ca256395b..d7e99c054e 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -1,5 +1,6 @@ /* Support routines for building symbol tables in GDB's internal format. - Copyright 1986-2000 Free Software Foundation, Inc. + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, + 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GDB. @@ -34,8 +35,10 @@ #include "gdbtypes.h" #include "complaints.h" #include "gdb_string.h" -#include "language.h" /* For "longest_local_hex_string_custom" */ - +#include "expression.h" /* For "enum exp_opcode" used by... */ +#include "language.h" /* For "local_hex_string" */ +#include "bcache.h" +#include "filenames.h" /* For DOSish file names */ /* Ask buildsym.h to define the vars it normally declares `extern'. */ #define EXTERN /**/ @@ -170,7 +173,7 @@ really_free_pendings (PTR dummy) for (next = free_pendings; next; next = next1) { next1 = next->next; - free ((void *) next); + xfree ((void *) next); } free_pendings = NULL; @@ -179,14 +182,14 @@ really_free_pendings (PTR dummy) for (next = file_symbols; next != NULL; next = next1) { next1 = next->next; - free ((void *) next); + xfree ((void *) next); } file_symbols = NULL; for (next = global_symbols; next != NULL; next = next1) { next1 = next->next; - free ((void *) next); + xfree ((void *) next); } global_symbols = NULL; } @@ -204,7 +207,7 @@ free_pending_blocks (void) for (bnext = pending_blocks; bnext; bnext = bnext1) { bnext1 = bnext->next; - free ((void *) bnext); + xfree ((void *) bnext); } #endif pending_blocks = NULL; @@ -272,9 +275,8 @@ finish_block (struct symbol *symbol, struct pending **listhead, parameter symbols. */ int nparams = 0, iparams; struct symbol *sym; - for (i = 0; i < BLOCK_NSYMS (block); i++) + ALL_BLOCK_SYMBOLS (block, i, sym) { - sym = BLOCK_SYM (block, i); switch (SYMBOL_CLASS (sym)) { case LOC_ARG: @@ -320,6 +322,7 @@ finish_block (struct symbol *symbol, struct pending **listhead, case LOC_BASEREG_ARG: case LOC_LOCAL_ARG: TYPE_FIELD_TYPE (ftype, iparams) = SYMBOL_TYPE (sym); + TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0; iparams++; break; case LOC_UNDEF: @@ -485,7 +488,7 @@ make_blockvector (struct objfile *objfile) for (next = pending_blocks; next; next = next1) { next1 = next->next; - free (next); + xfree (next); } #endif pending_blocks = NULL; @@ -506,7 +509,7 @@ make_blockvector (struct objfile *objfile) = BLOCK_START (BLOCKVECTOR_BLOCK (blockvector, i)); complain (&blockvector_complaint, - longest_local_hex_string ((LONGEST) start)); + local_hex_string ((LONGEST) start)); } } } @@ -530,7 +533,7 @@ start_subfile (char *name, char *dirname) for (subfile = subfiles; subfile; subfile = subfile->next) { - if (STREQ (subfile->name, name)) + if (FILENAME_CMP (subfile->name, name) == 0) { current_subfile = subfile; return; @@ -666,7 +669,7 @@ push_subfile (void) subfile_stack = tem; if (current_subfile == NULL || current_subfile->name == NULL) { - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); } tem->name = current_subfile->name; } @@ -679,11 +682,11 @@ pop_subfile (void) if (link == NULL) { - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); } name = link->name; subfile_stack = link->next; - free ((void *) link); + xfree ((void *) link); return (name); } @@ -724,7 +727,7 @@ record_line (register struct subfile *subfile, int line, CORE_ADDR pc) e = subfile->line_vector->item + subfile->line_vector->nitems++; e->line = line; - e->pc = pc; + e->pc = ADDR_BITS_REMOVE(pc); } /* Needed in order to sort line tables from IBM xcoff files. Sigh! */ @@ -992,23 +995,23 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section) } if (subfile->name != NULL) { - free ((void *) subfile->name); + xfree ((void *) subfile->name); } if (subfile->dirname != NULL) { - free ((void *) subfile->dirname); + xfree ((void *) subfile->dirname); } if (subfile->line_vector != NULL) { - free ((void *) subfile->line_vector); + xfree ((void *) subfile->line_vector); } if (subfile->debugformat != NULL) { - free ((void *) subfile->debugformat); + xfree ((void *) subfile->debugformat); } nextsub = subfile->next; - free ((void *) subfile); + xfree ((void *) subfile); } /* Set this for the main source file. */ @@ -1054,33 +1057,13 @@ push_context (int desc, CORE_ADDR valu) return new; } + /* Compute a small integer hash code for the given name. */ int hashname (char *name) { - register char *p = name; - register int total = p[0]; - register int c; - - c = p[1]; - total += c << 2; - if (c) - { - c = p[2]; - total += c << 4; - if (c) - { - total += p[3] << 6; - } - } - - /* Ensure result is positive. */ - if (total < 0) - { - total += (1000 << 6); - } - return (total % HASHSIZE); + return (hash(name,strlen(name)) % HASHSIZE); } @@ -1123,7 +1106,7 @@ merge_symbol_lists (struct pending **srclist, struct pending **targetlist) corresponding to a psymtab. */ void -buildsym_init () +buildsym_init (void) { free_pendings = NULL; file_symbols = NULL; @@ -1136,7 +1119,7 @@ buildsym_init () file, e.g. a shared library). */ void -buildsym_new_init () +buildsym_new_init (void) { buildsym_init (); }