1995-03-16 16:59:07 -05:00
|
|
|
/* Part of CPP library. (Macro hash table support.)
|
1996-04-15 13:51:25 -04:00
|
|
|
Copyright (C) 1986, 87, 89, 92-95, 1996 Free Software Foundation, Inc.
|
1995-03-16 16:59:07 -05:00
|
|
|
Written by Per Bothner, 1994.
|
1998-05-06 17:09:07 -04:00
|
|
|
Based on CCCP program by Paul Rubin, June 1986
|
1995-03-16 16:59:07 -05:00
|
|
|
Adapted to ANSI C, Richard Stallman, Jan 1987
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
Free Software Foundation; either version 2, or (at your option) any
|
|
|
|
later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
1995-06-15 07:33:25 -04:00
|
|
|
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
1995-03-16 16:59:07 -05:00
|
|
|
|
|
|
|
In other words, you are welcome to use, share and improve this program.
|
|
|
|
You are forbidden to forbid anyone else to use, share and improve
|
|
|
|
what you give them. Help stamp out software-hoarding! */
|
|
|
|
|
More cutover to system.h:
* Makefile.in (cppalloc.o, cpperror.o, cppexp.o, cpphash.o,
cpplib.o, cppmain.o, fix-header.o, gcov.o, gen-protos.o,
gengenrtl.o, halfpic.o, hash.o, scan-decls.o, scan.o): Depend on
system.h.
* cpphash.c: Include config.h.
* cppalloc.c: Include system.h. Add parameters to various
function prototypes.
* cpperror.c: Likewise.
* cppexp.c: Likewise.
* cpphash.c: Likewise.
* cpplib.c: Likewise.
* cppmain.c: Likewise.
* fix-header.c: Likewise.
* gcov.c: Likewise.
* gen-protos.c: Likewise.
* gengenrtl.c: Likewise.
* halfpic.c: Likewise.
* hash.c: Likewise.
* scan-decls.c: Likewise.
* scan.c: Likewise.
From-SVN: r18911
1998-03-30 07:05:54 -05:00
|
|
|
#include "config.h"
|
|
|
|
#include "system.h"
|
1995-03-16 16:59:07 -05:00
|
|
|
#include "cpplib.h"
|
|
|
|
#include "cpphash.h"
|
|
|
|
|
1995-04-10 09:22:43 -04:00
|
|
|
extern char *xmalloc PARAMS ((unsigned));
|
|
|
|
|
1998-10-10 20:05:11 -04:00
|
|
|
static HASHNODE *hashtab[HASHSIZE];
|
|
|
|
|
1996-07-03 18:07:53 -04:00
|
|
|
/* Return hash function on name. must be compatible with the one
|
|
|
|
computed a step at a time, elsewhere */
|
|
|
|
|
1995-03-16 16:59:07 -05:00
|
|
|
int
|
|
|
|
hashf (name, len, hashsize)
|
|
|
|
register const U_CHAR *name;
|
|
|
|
register int len;
|
|
|
|
int hashsize;
|
|
|
|
{
|
|
|
|
register int r = 0;
|
|
|
|
|
|
|
|
while (len--)
|
|
|
|
r = HASHSTEP (r, *name++);
|
|
|
|
|
|
|
|
return MAKE_POS (r) % hashsize;
|
|
|
|
}
|
|
|
|
|
1998-05-06 17:09:07 -04:00
|
|
|
/* Find the most recent hash node for name "name" (ending with first
|
1996-07-03 18:07:53 -04:00
|
|
|
non-identifier char) installed by install
|
|
|
|
|
|
|
|
If LEN is >= 0, it is the length of the name.
|
|
|
|
Otherwise, compute the length by scanning the entire name.
|
|
|
|
|
|
|
|
If HASH is >= 0, it is the precomputed hash code.
|
|
|
|
Otherwise, compute the hash code. */
|
|
|
|
|
1995-03-16 16:59:07 -05:00
|
|
|
HASHNODE *
|
|
|
|
cpp_lookup (pfile, name, len, hash)
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 08:40:39 -04:00
|
|
|
cpp_reader *pfile ATTRIBUTE_UNUSED;
|
1995-03-16 16:59:07 -05:00
|
|
|
const U_CHAR *name;
|
|
|
|
int len;
|
|
|
|
int hash;
|
|
|
|
{
|
|
|
|
register const U_CHAR *bp;
|
|
|
|
register HASHNODE *bucket;
|
|
|
|
|
|
|
|
if (len < 0)
|
|
|
|
{
|
|
|
|
for (bp = name; is_idchar[*bp]; bp++) ;
|
|
|
|
len = bp - name;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hash < 0)
|
|
|
|
hash = hashf (name, len, HASHSIZE);
|
|
|
|
|
|
|
|
bucket = hashtab[hash];
|
|
|
|
while (bucket) {
|
|
|
|
if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
|
|
|
|
return bucket;
|
|
|
|
bucket = bucket->next;
|
|
|
|
}
|
1996-07-03 18:07:53 -04:00
|
|
|
return (HASHNODE *) 0;
|
1995-03-16 16:59:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Delete a hash node. Some weirdness to free junk from macros.
|
|
|
|
* More such weirdness will have to be added if you define more hash
|
|
|
|
* types that need it.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Note that the DEFINITION of a macro is removed from the hash table
|
|
|
|
but its storage is not freed. This would be a storage leak
|
|
|
|
except that it is not reasonable to keep undefining and redefining
|
|
|
|
large numbers of macros many times.
|
|
|
|
In any case, this is necessary, because a macro can be #undef'd
|
|
|
|
in the middle of reading the arguments to a call to it.
|
|
|
|
If #undef freed the DEFINITION, that would crash. */
|
|
|
|
|
|
|
|
void
|
|
|
|
delete_macro (hp)
|
|
|
|
HASHNODE *hp;
|
|
|
|
{
|
|
|
|
|
|
|
|
if (hp->prev != NULL)
|
|
|
|
hp->prev->next = hp->next;
|
|
|
|
if (hp->next != NULL)
|
|
|
|
hp->next->prev = hp->prev;
|
|
|
|
|
|
|
|
/* make sure that the bucket chain header that
|
1996-07-03 18:07:53 -04:00
|
|
|
the deleted guy was on points to the right thing afterwards. */
|
1995-03-16 16:59:07 -05:00
|
|
|
if (hp == *hp->bucket_hdr)
|
|
|
|
*hp->bucket_hdr = hp->next;
|
|
|
|
|
1995-04-30 17:43:12 -04:00
|
|
|
if (hp->type == T_MACRO)
|
|
|
|
{
|
|
|
|
DEFINITION *d = hp->value.defn;
|
|
|
|
struct reflist *ap, *nextap;
|
|
|
|
|
|
|
|
for (ap = d->pattern; ap != NULL; ap = nextap)
|
|
|
|
{
|
|
|
|
nextap = ap->next;
|
|
|
|
free (ap);
|
|
|
|
}
|
|
|
|
if (d->nargs >= 0)
|
|
|
|
free (d->args.argnames);
|
|
|
|
free (d);
|
1995-03-16 16:59:07 -05:00
|
|
|
}
|
1995-04-30 17:43:12 -04:00
|
|
|
|
1995-03-16 16:59:07 -05:00
|
|
|
free (hp);
|
|
|
|
}
|
1996-07-03 18:07:53 -04:00
|
|
|
|
|
|
|
/* Install a name in the main hash table, even if it is already there.
|
|
|
|
name stops with first non alphanumeric, except leading '#'.
|
|
|
|
caller must check against redefinition if that is desired.
|
|
|
|
delete_macro () removes things installed by install () in fifo order.
|
|
|
|
this is important because of the `defined' special symbol used
|
|
|
|
in #if, and also if pushdef/popdef directives are ever implemented.
|
|
|
|
|
|
|
|
If LEN is >= 0, it is the length of the name.
|
|
|
|
Otherwise, compute the length by scanning the entire name.
|
|
|
|
|
|
|
|
If HASH is >= 0, it is the precomputed hash code.
|
|
|
|
Otherwise, compute the hash code. */
|
|
|
|
|
1995-03-16 16:59:07 -05:00
|
|
|
HASHNODE *
|
|
|
|
install (name, len, type, ivalue, value, hash)
|
|
|
|
U_CHAR *name;
|
|
|
|
int len;
|
|
|
|
enum node_type type;
|
|
|
|
int ivalue;
|
|
|
|
char *value;
|
|
|
|
int hash;
|
|
|
|
{
|
|
|
|
register HASHNODE *hp;
|
|
|
|
register int i, bucket;
|
|
|
|
register U_CHAR *p, *q;
|
|
|
|
|
|
|
|
if (len < 0) {
|
|
|
|
p = name;
|
|
|
|
while (is_idchar[*p])
|
|
|
|
p++;
|
|
|
|
len = p - name;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hash < 0)
|
|
|
|
hash = hashf (name, len, HASHSIZE);
|
|
|
|
|
|
|
|
i = sizeof (HASHNODE) + len + 1;
|
|
|
|
hp = (HASHNODE *) xmalloc (i);
|
|
|
|
bucket = hash;
|
|
|
|
hp->bucket_hdr = &hashtab[bucket];
|
|
|
|
hp->next = hashtab[bucket];
|
|
|
|
hashtab[bucket] = hp;
|
|
|
|
hp->prev = NULL;
|
|
|
|
if (hp->next != NULL)
|
|
|
|
hp->next->prev = hp;
|
|
|
|
hp->type = type;
|
|
|
|
hp->length = len;
|
|
|
|
if (hp->type == T_CONST)
|
|
|
|
hp->value.ival = ivalue;
|
|
|
|
else
|
|
|
|
hp->value.cpval = value;
|
|
|
|
hp->name = ((U_CHAR *) hp) + sizeof (HASHNODE);
|
|
|
|
p = hp->name;
|
|
|
|
q = name;
|
|
|
|
for (i = 0; i < len; i++)
|
|
|
|
*p++ = *q++;
|
|
|
|
hp->name[len] = 0;
|
|
|
|
return hp;
|
|
|
|
}
|
1995-04-30 17:43:12 -04:00
|
|
|
|
|
|
|
void
|
|
|
|
cpp_hash_cleanup (pfile)
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 08:40:39 -04:00
|
|
|
cpp_reader *pfile ATTRIBUTE_UNUSED;
|
1995-04-30 17:43:12 -04:00
|
|
|
{
|
|
|
|
register int i;
|
|
|
|
for (i = HASHSIZE; --i >= 0; )
|
|
|
|
{
|
|
|
|
while (hashtab[i])
|
|
|
|
delete_macro (hashtab[i]);
|
|
|
|
}
|
|
|
|
}
|