diff options
author | Neil Booth <neilb@earthling.net> | 2000-10-28 17:59:06 +0000 |
---|---|---|
committer | Neil Booth <neil@gcc.gnu.org> | 2000-10-28 17:59:06 +0000 |
commit | 93c80368d9a16c073f2b930bef4232661971765f (patch) | |
tree | b1f50a88de9fbdd6a784d0c03fa8cd31e4ac5916 /gcc/cpphash.h | |
parent | de48b52da8468f94c0bdffc11fa7e8fe49b4ba66 (diff) | |
download | gcc-93c80368d9a16c073f2b930bef4232661971765f.zip gcc-93c80368d9a16c073f2b930bef4232661971765f.tar.gz gcc-93c80368d9a16c073f2b930bef4232661971765f.tar.bz2 |
New macro expander.
2000-10-28 Neil Booth <neilb@earthling.net>
New macro expander.
* cpplib.c (struct answer): New.
(struct if_stack): Use cpp_lexer_pos rather than line and col.
Rename cmacro mi_cmacro.
(struct directive, KANDR, STDC89, EXTENSION, COND, IF_COND, INCL,
IN_I): New directive and flags.
(skip_rest_of_line, check_eol, run_directive, glue_header_name,
parse_answer, parse_assertion, find_answer): New functions.
(parse_ifdef, detect_if_not_defined, validate_else): Remove.
(lex_macro_node): New function to replace parse_ifdef and
get_define_node.
(_cpp_handle_directive): New function, combines _cpp_check_directive
and _cpp_check_linemarker.
(do_define, do_undef, parse_include, do_include, do_import,
do_include_next, read_line_number, do_line, do_ident, do_pragma,
do_pragma_once, do_pragma_poison, do_pragma_dependency):
Update for new token getting interface.
(do_ifdef, do_ifndef, do_if, do_else, do_endif, push_conditional)
: Update for new multiple-include optimisation technique.
(do_elif): Don't forget to invalidate controlling macros.
(unwind_if_stack, cpp_defined, cpp_push_buffer, cpp_pop_buffer): Update.
(parse_assertion, parse_answer, find_answer, _cpp_test_assertion):
Functions to handle assertions with the new token interface.
(do_assert, do_unassert): Use them.
(cpp_define, _cpp_define_builtin, cpp_undef, cpp_assert, cpp_unassert):
Use run_directive.
(_cpp_init_stacks): Register directive names. Don't register special
nodes.
* cpperror.c (print_containing_files, _cpp_begin_message): Update to
new position recording regime.
(cpp_ice, cpp_fatal, cpp_error, cpp_error_with_line, cpp_warning,
cpp_warning_with_line, cpp_pedwarn, cpp_pedwarn_with_line,
cpp_pedwarn_with_file_and_line): Update for _cpp_begin_message changes.
(cpp_type2name): Move to cpplex.c.
* cppexp.c (parse_charconst): spec_nodes is no longer a pointer.
(parse_defined): Update to handle new multiple include optimisation
method. Remove poisoned identifier warning.
(parse_assertion, TYPE_NAME): Delete.
(lex): Update for multiple include optimisation, removal of
CPP_DEFINED, to use _cpp_test_assertion for assertions and
cpp_token_as_text.
(_cpp_parse_expr): Update for MI optimisation, and to use op_as_text.
(op_as_text): New function, to wrap cpp_token_as_text.
* cppfiles.c (stack_include_file, _cpp_pop_file_buffer):
Update for MI optimisation.
(_cpp_execute_include): Take a token rather than 3 arguments. Fix
segfault on diagnostic.
(_cpp_compare_file_date): Take a token rather than 3 args.
(cpp_read_file): Work correctly for zero-length files.
* cpphash.c (_cpp_init_macros, _cpp_cleanup_macros): Rename
_cpp_init_hashtable and _cpp_cleanup_hashtable.
(cpp_lookup): Place identifiers at front of identifier pool
for _cpp_lookup_with_hash.
(_cpp_lookup_with_hash): Require identifiers to be at the front of
the identifier pool. Commit the memory if not already in the
hash table.
* cppinit.c (cpp_reader_init): Move cpp_init_completed test to top.
Initialise various members of cpp_reader, memory pools, and the
special nodes.
(cpp_printer_init): Delete.
(cpp_cleanup): Update.
(struct builtin, builtin_array, initialize_builtins): Update for new
hashnode definition and builtin handling.
(cpp_start_read, cpp_finish): Don't take or initialise a
printer. Update.
* cpplib.h (cpp_printer, cpp_toklist, CPP_DEFINED, BOL,
PASTED, VAR_ARGS, BEG_OF_FILE, IN_DIRECTIVE, KNOWN_DIRECTIVE,
T_VOID, T_SPECLINE, T_DATE, T_FILE, T_BASE_FILE, T_INCLUDE_LEVEL,
T_TIME, T_STDC, T_OPERATOR, T_POISON, T_MACRO, T_ASSERTION): Delete.
(struct cpp_pool, struct cpp_macro, struct cpp_lexer_pos,
struct cpp_lookahead, CPP_DHASH, enum mi_state, enum mi_ind,
NO_EXPAND, VARARGS_FIRST, struct cpp_token_with_pos,
struct toklist, struct cpp_context, struct specnodes,
TOKEN_LOOKAHEAD, TOKEN_BUFFSIZE, NODE_OPERATOR, NODE_POISONED,
NODE_BUILTIN, NODE_DIAGNOSTIC, NT_VOID, NT_MACRO, NT_ASSERTION,
enum builtin_type, cpp_can_paste): New.
(struct cpp_token): Delete line and col members.
(struct cpp_buffer): New member output_lineno.
(struct lexer_state): Delete indented, in_lex_line, seen_dot.
Add va_args_ok, poisoned_ok, prevent_expansion, parsing_args.
(struct cpp_reader): New members lexer_pos, macro_pos, directive_pos,
ident_pool, temp_string_pool, macro_pool, argument_pool, string_pool,
base_context, context, directive, mi_state, mi_if_not_defined,
mi_lexed, mi_cmacro, mi_ind_cmacro, la_read, la_write, la_unused,
mlstring_pos, macro_buffer, macro_buffer_len.
Delete members mls_line, mls_column, token_list, potential_control_macro,
temp_tokens, temp_cap, temp_alloced, temp_used, first_directive_token,
context_cap, cur_context, no_expand_level, paste_level, contexts, args,
save_parameter_spellings, need_newline, .
Change type of date, time and spec_nodes members.
Change prototypes for include and ident callbacks.
(struct cpp_hashnode): Change type of name. Remove union members
expansion and code. Add members macro, operator and builtin.
(cpp_token_len, cpp_token_as_text, cpp_spell_token, cpp_start_read,
cpp_finish, cpp_avoid_paste, cpp_get_token, cpp_get_line,
cpp_get_output_line, cpp_macro_definition, cpp_start_lookahead,
cpp_stop_lookahead): New prototypes.
(cpp_printer_init, cpp_dump_definition): Delete prototypes.
(U_CHAR, U, ustrcmp, ustrncmp, ustrlen, uxstrdup, ustrchr, ufputs):
Move from cpphash.h.
* cpphash.h (U_CHAR, U, ustrcmp, ustrncmp, ustrlen, uxstrdup, ustrchr,
ufputs): Move to cpplib.h.
(enum spell_type, struct token_spelling, _cpp_token_spellings, TOKEN_SPELL,
TOKEN_NAME, struct answer, FREE_ANSWER, KANDR, STDC89, EXTENSION,
COND, EXPAND, INCL, COMMENTS, IN_I, struct directive, directive_handler,
struct spec_nodes, _cpp_digraph_spellings, _cpp_free_temp_tokens,
_cpp_init_input_buffer, _cpp_grow_token_buffer, _cpp_init_toklist,
_cpp_clear_toklist, _cpp_expand_token_space, _cpp_expand_name_space,
_cpp_equiv_tokens, _cpp_equiv_toklists, _cpp_process_directive,
_cpp_run_directive, _cpp_get_line, _cpp_get_raw_token, _cpp_glue_header_name,
_cpp_can_paste, _cpp_check_directive, _cpp_check_linemarker,
_cpp_parse_assertion, _cpp_find_answer): Delete.
(VALID_SIGN, ALIGN, POOL_FRONT, POOL_LIMIT, POOL_BASE, POOL_SIZE,
POOL_USED, POOL_COMMIT, struct cpp_chunk, _cpp_lex_token, _cpp_init_pool,
_cpp_free_pool, _cpp_pool_reserve, _cpp_pool_alloc, _cpp_next_chunk,
_cpp_lock_pool, _cpp_unlock_pool, _cpp_test_assertion,
_cpp_handle_directive, DSC): New.
(struct include_file): New member defined.
(DO_NOT_REREAD, _cpp_begin_message, _cpp_execute_include,
_cpp_compare_file_date): Update.
(_cpp_pop_context, _cpp_get_token, _cpp_free_lookaheads, _cpp_push_token): New.
(_cpp_init_macros, _cpp_cleanup_macros): Rename to _cpp_init_hashtable,
_cpp_cleanup_hashtable.
* Makefile.in: Remove cppoutput.c.
* cppoutput.c: Delete
* fixheader.c (read_scan_file): Update for new cpp_get_token
prototype.
(recognized_function): New argument LINE.
* scan-decls.c (skip_to_closing_brace, scan_decls): Update for
new cpp_get_token prototype.
* scan.h (recognized_function): Update prototype.
* po/POTFILES.in: Remove cppoutput.c.
From-SVN: r37098
Diffstat (limited to 'gcc/cpphash.h')
-rw-r--r-- | gcc/cpphash.h | 239 |
1 files changed, 57 insertions, 182 deletions
diff --git a/gcc/cpphash.h b/gcc/cpphash.h index 8787a6c..bba1ba9 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -22,68 +22,30 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __GCC_CPPHASH__ #define __GCC_CPPHASH__ -typedef unsigned char U_CHAR; -#define U (const U_CHAR *) /* Intended use: U"string" */ - -/* Tokens with SPELL_STRING store their spelling in the token list, - and it's length in the token->val.name.len. */ -enum spell_type +/* Test if a sign is valid within a preprocessing number. */ +#define VALID_SIGN(c, prevc) \ + (((c) == '+' || (c) == '-') && \ + ((prevc) == 'e' || (prevc) == 'E' \ + || (((prevc) == 'p' || (prevc) == 'P') && !CPP_OPTION (pfile, c89)))) + +/* Memory pools. */ +#define ALIGN(size, align) (((size) + ((align) - 1)) & ~((align) - 1)) +#define POOL_FRONT(p) ((p)->cur->front) +#define POOL_LIMIT(p) ((p)->cur->limit) +#define POOL_BASE(p) ((p)->cur->base) +#define POOL_SIZE(p) ((p)->cur->limit - (p)->cur->base) +#define POOL_ROOM(p) ((p)->cur->limit - (p)->cur->front) +#define POOL_USED(p) ((p)->cur->front - (p)->cur->base) +#define POOL_COMMIT(p, len) do {((p)->cur->front += ALIGN (len, (p)->align));\ + if ((p)->cur->front > (p)->cur->limit) abort ();} while (0) + +typedef struct cpp_chunk cpp_chunk; +struct cpp_chunk { - SPELL_OPERATOR = 0, - SPELL_CHAR, - SPELL_IDENT, - SPELL_STRING, - SPELL_NONE -}; - -struct token_spelling -{ - enum spell_type category; - const U_CHAR *name; -}; - -extern const struct token_spelling _cpp_token_spellings[]; -#define TOKEN_SPELL(token) (_cpp_token_spellings[(token)->type].category) -#define TOKEN_NAME(token) (_cpp_token_spellings[(token)->type].name) - -/* Chained list of answers to an assertion. */ -struct answer -{ - struct answer *next; - cpp_toklist list; -}; -#define FREE_ANSWER(answer) do {_cpp_free_toklist (&answer->list); \ - free (answer); } while (0) - -/* Values for the origin field of struct directive. KANDR directives - come from traditional (K&R) C. STDC89 directives come from the - 1989 C standard. EXTENSION directives are extensions. */ -#define KANDR 0 -#define STDC89 1 -#define EXTENSION 2 - -/* Values for the flags field of struct directive. COND indicates a - conditional. EXPAND means that macros are to be expanded on the - directive line. INCL means to treat "..." and <...> as - q-char-sequence and h-char-sequence respectively. COMMENTS means - preserve comments in the directive if -C. IN_I means this directive - should be handled even if -fpreprocessed is in effect (these are the - directives with callback hooks). */ -#define COND (1 << 0) -#define EXPAND (1 << 1) -#define INCL (1 << 2) -#define COMMENTS (1 << 3) -#define IN_I (1 << 4) - -/* Defines one #-directive, including how to handle it. */ -typedef void (*directive_handler) PARAMS ((cpp_reader *)); -struct directive -{ - directive_handler handler; /* Function to handle directive. */ - const U_CHAR *name; /* Name of directive. */ - unsigned short length; /* Length of name. */ - unsigned char origin; /* Origin of directive. */ - unsigned char flags; /* Flags describing this directive. */ + cpp_chunk *next; + unsigned char *front; + unsigned char *limit; + unsigned char *base; }; /* List of directories to look for include files in. */ @@ -122,28 +84,18 @@ struct include_file unsigned short refcnt; /* number of stacked buffers using this file */ unsigned char sysp; /* file is a system header */ unsigned char mapped; /* file buffer is mmapped */ + unsigned char defined; /* cmacro prevents inclusion in this state */ }; /* The cmacro works like this: If it's NULL, the file is to be included again. If it's NEVER_REREAD, the file is never to be included again. Otherwise it is a macro hashnode, and the file is - to be included again if the macro is not defined. */ + to be included again if the macro is defined or not as specified by + DEFINED. */ #define NEVER_REREAD ((const cpp_hashnode *)-1) #define DO_NOT_REREAD(inc) \ -((inc)->cmacro && \ - ((inc)->cmacro == NEVER_REREAD || (inc)->cmacro->type != T_VOID)) - -/* Special nodes - identifiers with predefined significance. - Note that the array length of dirs[] must be kept in sync with - cpplib.c's dtable[]. */ -struct spec_nodes -{ - cpp_hashnode *n_L; /* L"str" */ - cpp_hashnode *n__STRICT_ANSI__; /* STDC_0_IN_SYSTEM_HEADERS */ - cpp_hashnode *n__CHAR_UNSIGNED__; /* plain char is unsigned */ - cpp_hashnode *n__VA_ARGS__; /* C99 vararg macros */ - cpp_hashnode *dirs[19]; /* 19 directives counting #sccs */ -}; +((inc)->cmacro && ((inc)->cmacro == NEVER_REREAD \ + || ((inc)->cmacro->type == NT_MACRO) == (inc)->defined)) /* Character classes. If the definition of `numchar' looks odd to you, please look up the @@ -200,27 +152,30 @@ extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; /* In cpperror.c */ enum error_type { WARNING = 0, PEDWARN, ERROR, FATAL, ICE }; extern int _cpp_begin_message PARAMS ((cpp_reader *, enum error_type, - const char *, unsigned int, - unsigned int)); + const char *, const cpp_lexer_pos *)); /* In cppmacro.c */ extern void _cpp_free_definition PARAMS ((cpp_hashnode *)); extern int _cpp_create_definition PARAMS ((cpp_reader *, cpp_hashnode *)); +extern void _cpp_pop_context PARAMS ((cpp_reader *)); +extern void _cpp_get_token PARAMS ((cpp_reader *, cpp_token *)); +extern void _cpp_free_lookaheads PARAMS ((cpp_reader *)); +extern void _cpp_push_token PARAMS ((cpp_reader *, const cpp_token *, + const cpp_lexer_pos *)); /* In cpphash.c */ -extern void _cpp_init_macros PARAMS ((cpp_reader *)); -extern void _cpp_cleanup_macros PARAMS ((cpp_reader *)); -extern cpp_hashnode *_cpp_lookup_with_hash PARAMS ((cpp_reader*, const U_CHAR *, - size_t, unsigned int)); +extern void _cpp_init_hashtable PARAMS ((cpp_reader *)); +extern void _cpp_cleanup_hashtable PARAMS ((cpp_reader *)); +extern cpp_hashnode *_cpp_lookup_with_hash PARAMS ((cpp_reader*, size_t, + unsigned int)); /* In cppfiles.c */ extern void _cpp_simplify_pathname PARAMS ((char *)); -extern void _cpp_execute_include PARAMS ((cpp_reader *, const U_CHAR *, - unsigned int, int, - struct file_name_list *, - int)); -extern int _cpp_compare_file_date PARAMS ((cpp_reader *, const U_CHAR *, - unsigned int, int)); +extern void _cpp_execute_include PARAMS ((cpp_reader *, + const cpp_token *, int, + struct file_name_list *)); +extern int _cpp_compare_file_date PARAMS ((cpp_reader *, + const cpp_token *)); extern void _cpp_report_missing_guards PARAMS ((cpp_reader *)); extern void _cpp_init_includes PARAMS ((cpp_reader *)); extern void _cpp_cleanup_includes PARAMS ((cpp_reader *)); @@ -231,113 +186,33 @@ extern void _cpp_pop_file_buffer PARAMS ((cpp_reader *, cpp_buffer *)); extern int _cpp_parse_expr PARAMS ((cpp_reader *)); /* In cpplex.c */ -extern const unsigned char *_cpp_digraph_spellings[]; -extern void _cpp_skip_rest_of_line PARAMS ((cpp_reader *)); -extern void _cpp_free_temp_tokens PARAMS ((cpp_reader *)); -extern void _cpp_init_input_buffer PARAMS ((cpp_reader *)); -extern void _cpp_grow_token_buffer PARAMS ((cpp_reader *, long)); -extern void _cpp_init_toklist PARAMS ((cpp_toklist *, int)); -extern void _cpp_clear_toklist PARAMS ((cpp_toklist *)); -extern void _cpp_free_toklist PARAMS ((const cpp_toklist *)); +extern void _cpp_lex_token PARAMS ((cpp_reader *, cpp_token *)); extern int _cpp_equiv_tokens PARAMS ((const cpp_token *, const cpp_token *)); -extern int _cpp_equiv_toklists PARAMS ((const cpp_toklist *, - const cpp_toklist *)); -extern void _cpp_expand_token_space PARAMS ((cpp_toklist *, unsigned int)); -extern void _cpp_reserve_name_space PARAMS ((cpp_toklist *, unsigned int)); -extern void _cpp_expand_name_space PARAMS ((cpp_toklist *, unsigned int)); -extern int _cpp_equiv_tokens PARAMS ((const cpp_token *, - const cpp_token *)); -extern void _cpp_process_directive PARAMS ((cpp_reader *, const cpp_token *)); -extern void _cpp_run_directive PARAMS ((cpp_reader *, - const struct directive *, - const char *, size_t, - const char *)); -extern unsigned int _cpp_get_line PARAMS ((cpp_reader *, - unsigned int *)); -extern const cpp_token *_cpp_get_token PARAMS ((cpp_reader *)); -extern const cpp_token *_cpp_get_raw_token PARAMS ((cpp_reader *)); -extern void _cpp_push_token PARAMS ((cpp_reader *, const cpp_token*)); -extern const cpp_token *_cpp_glue_header_name PARAMS ((cpp_reader *)); -extern enum cpp_ttype _cpp_can_paste PARAMS ((cpp_reader *, const cpp_token *, - const cpp_token *, int *)); +extern void _cpp_init_pool PARAMS ((cpp_pool *, unsigned int, + unsigned int, unsigned int)); +extern void _cpp_free_pool PARAMS ((cpp_pool *)); +extern unsigned char *_cpp_pool_reserve PARAMS ((cpp_pool *, unsigned int)); +extern unsigned char *_cpp_pool_alloc PARAMS ((cpp_pool *, unsigned int)); +extern unsigned char *_cpp_next_chunk PARAMS ((cpp_pool *, unsigned int, + unsigned char **)); +extern void _cpp_lock_pool PARAMS ((cpp_pool *)); +extern void _cpp_unlock_pool PARAMS ((cpp_pool *)); /* In cpplib.c */ -extern const struct directive *_cpp_check_directive - PARAMS ((cpp_reader *, const cpp_token *)); -extern const struct directive *_cpp_check_linemarker - PARAMS ((cpp_reader *, const cpp_token *)); -extern cpp_hashnode *_cpp_parse_assertion PARAMS ((cpp_reader *, - struct answer **)); -extern struct answer **_cpp_find_answer PARAMS ((cpp_hashnode *, - const cpp_toklist *)); -extern void _cpp_define_builtin PARAMS ((cpp_reader *, const char *)); - +extern int _cpp_test_assertion PARAMS ((cpp_reader *, int *)); +extern int _cpp_handle_directive PARAMS ((cpp_reader *, int)); +extern void _cpp_define_builtin PARAMS ((cpp_reader *, const char *)); extern void _cpp_init_stacks PARAMS ((cpp_reader *)); extern void _cpp_cleanup_stacks PARAMS ((cpp_reader *)); extern void _cpp_init_internal_pragmas PARAMS ((cpp_reader *)); /* Utility routines and macros. */ +#define DSC(str) (const U_CHAR *)str, sizeof str - 1 #define xnew(T) (T *) xmalloc (sizeof(T)) #define xcnew(T) (T *) xcalloc (1, sizeof(T)) #define xnewvec(T, N) (T *) xmalloc (sizeof(T) * (N)) #define xcnewvec(T, N) (T *) xcalloc (N, sizeof(T)) #define xobnew(O, T) (T *) obstack_alloc (O, sizeof(T)) -/* These are inline functions instead of macros so we can get type - checking. */ - -static inline int ustrcmp PARAMS ((const U_CHAR *, const U_CHAR *)); -static inline int ustrncmp PARAMS ((const U_CHAR *, const U_CHAR *, - size_t)); -static inline size_t ustrlen PARAMS ((const U_CHAR *)); -static inline U_CHAR *uxstrdup PARAMS ((const U_CHAR *)); -static inline U_CHAR *ustrchr PARAMS ((const U_CHAR *, int)); -static inline int ufputs PARAMS ((const U_CHAR *, FILE *)); - -static inline int -ustrcmp (s1, s2) - const U_CHAR *s1, *s2; -{ - return strcmp ((const char *)s1, (const char *)s2); -} - -static inline int -ustrncmp (s1, s2, n) - const U_CHAR *s1, *s2; - size_t n; -{ - return strncmp ((const char *)s1, (const char *)s2, n); -} - -static inline size_t -ustrlen (s1) - const U_CHAR *s1; -{ - return strlen ((const char *)s1); -} - -static inline U_CHAR * -uxstrdup (s1) - const U_CHAR *s1; -{ - return (U_CHAR *) xstrdup ((const char *)s1); -} - -static inline U_CHAR * -ustrchr (s1, c) - const U_CHAR *s1; - int c; -{ - return (U_CHAR *) strchr ((const char *)s1, c); -} - -static inline int -ufputs (s, f) - const U_CHAR *s; - FILE *f; -{ - return fputs ((const char *)s, f); -} - #endif |