]> git.ipfire.org Git - thirdparty/gcc.git/blame - libcpp/identifiers.c
[ARM,testsuite] Fix typo in arm_arch_v8a_ok effective target.
[thirdparty/gcc.git] / libcpp / identifiers.c
CommitLineData
0d086e18 1/* Hash tables for the CPP library.
fbd26352 2 Copyright (C) 1986-2019 Free Software Foundation, Inc.
1d6fa33f 3 Written by Per Bothner, 1994.
3398e91d 4 Based on CCCP program by Paul Rubin, June 1986
1d6fa33f 5 Adapted to ANSI C, Richard Stallman, Jan 1987
6
7This program is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
6bc9506f 9Free Software Foundation; either version 3, or (at your option) any
1d6fa33f 10later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
6bc9506f 18along with this program; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>.
1d6fa33f 20
21 In other words, you are welcome to use, share and improve this program.
22 You are forbidden to forbid anyone else to use, share and improve
23 what you give them. Help stamp out software-hoarding! */
24
1486870d 25#include "config.h"
26#include "system.h"
1d6fa33f 27#include "cpplib.h"
d856c8a6 28#include "internal.h"
2b3dbc20 29
2b15d2ba 30static hashnode alloc_node (cpp_hash_table *);
1d6fa33f 31
0d086e18 32/* Return an identifier node for hashtable.c. Used by cpplib except
33 when integrated with the C front ends. */
e297899b 34static hashnode
2b15d2ba 35alloc_node (cpp_hash_table *table)
b0a314a7 36{
0d086e18 37 cpp_hashnode *node;
b1a9ff83 38
720aca92 39 node = XOBNEW (&table->pfile->hash_ob, cpp_hashnode);
b9a7cc69 40 memset (node, 0, sizeof (cpp_hashnode));
e297899b 41 return HT_NODE (node);
da2bd80d 42}
43
0d086e18 44/* Set up the identifier hash table. Use TABLE if non-null, otherwise
45 create our own. */
69461e0d 46void
2b15d2ba 47_cpp_init_hashtable (cpp_reader *pfile, cpp_hash_table *table)
6d71dc85 48{
9ceb1c29 49 struct spec_nodes *s;
50
0d086e18 51 if (table == NULL)
6d71dc85 52 {
0d086e18 53 pfile->our_hashtable = 1;
54 table = ht_create (13); /* 8K (=2^13) entries. */
e297899b 55 table->alloc_node = alloc_node;
69edc0b3 56
cc0a8c77 57 obstack_specify_allocation (&pfile->hash_ob, 0, 0, xmalloc, free);
be164b73 58 }
69461e0d 59
0d086e18 60 table->pfile = pfile;
61 pfile->hash_table = table;
9ceb1c29 62
63 /* Now we can initialize things that use the hash table. */
64 _cpp_init_directives (pfile);
65 _cpp_init_internal_pragmas (pfile);
66
67 s = &pfile->spec_nodes;
9ceb1c29 68 s->n_defined = cpp_lookup (pfile, DSC("defined"));
69 s->n_true = cpp_lookup (pfile, DSC("true"));
70 s->n_false = cpp_lookup (pfile, DSC("false"));
9ceb1c29 71 s->n__VA_ARGS__ = cpp_lookup (pfile, DSC("__VA_ARGS__"));
72 s->n__VA_ARGS__->flags |= NODE_DIAGNOSTIC;
86136db8 73 s->n__VA_OPT__ = cpp_lookup (pfile, DSC("__VA_OPT__"));
74 s->n__VA_OPT__->flags |= NODE_DIAGNOSTIC;
f6751ff2 75 s->n__has_include__ = cpp_lookup (pfile, DSC("__has_include__"));
76 s->n__has_include_next__ = cpp_lookup (pfile, DSC("__has_include_next__"));
05dba164 77}
78
0d086e18 79/* Tear down the identifier hash table. */
0d086e18 80void
f7fdd7a1 81_cpp_destroy_hashtable (cpp_reader *pfile)
05dba164 82{
0d086e18 83 if (pfile->our_hashtable)
be164b73 84 {
162cee98 85 ht_destroy (pfile->hash_table);
0d086e18 86 obstack_free (&pfile->hash_ob, 0);
be164b73 87 }
0578f103 88}
89
0d086e18 90/* Returns the hash entry for the STR of length LEN, creating one
91 if necessary. */
69461e0d 92cpp_hashnode *
f7fdd7a1 93cpp_lookup (cpp_reader *pfile, const unsigned char *str, unsigned int len)
6d71dc85 94{
0d086e18 95 /* ht_lookup cannot return NULL. */
96 return CPP_HASHNODE (ht_lookup (pfile->hash_table, str, len, HT_ALLOC));
da2bd80d 97}
d453a374 98
0d086e18 99/* Determine whether the str STR, of length LEN, is a defined macro. */
0d086e18 100int
f7fdd7a1 101cpp_defined (cpp_reader *pfile, const unsigned char *str, int len)
da2bd80d 102{
0d086e18 103 cpp_hashnode *node;
d453a374 104
0d086e18 105 node = CPP_HASHNODE (ht_lookup (pfile->hash_table, str, len, HT_NO_INSERT));
5ecec5da 106
793b38da 107 /* If it's a macro, it cannot have been poisoned. */
108 return node && cpp_macro_p (node);
5ecec5da 109}
110
e297899b 111/* We don't need a proxy since the hash table's identifier comes first
112 in cpp_hashnode. However, in case this is ever changed, we have a
113 static assertion for it. */
114extern char proxy_assertion_broken[offsetof (struct cpp_hashnode, ident) == 0 ? 1 : -1];
115
0d086e18 116/* For all nodes in the hashtable, callback CB with parameters PFILE,
117 the node, and V. */
5ecec5da 118void
f7fdd7a1 119cpp_forall_identifiers (cpp_reader *pfile, cpp_cb cb, void *v)
5ecec5da 120{
0d086e18 121 ht_forall (pfile->hash_table, (ht_cb) cb, v);
e14c5993 122}