X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcpphash.h;h=a31368396ef72061461dc258702f52c39666e9e1;hb=840aa09324b8b64b2922be5bd7e29908bca738cd;hp=73744889392244a37bd1f400a8732da06920300c;hpb=498f6d3f67808b0100f57c084d9c30d3e7287537;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cpphash.h b/gcc/cpphash.h index 73744889392..a31368396ef 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -19,11 +19,12 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ that need to be visible across files. It's called cpphash.h for historical reasons. */ -#ifndef __GCC_CPPHASH__ -#define __GCC_CPPHASH__ +#ifndef GCC_CPPHASH_H +#define GCC_CPPHASH_H -struct directive; /* These are deliberately incomplete. */ -struct htab; +#include "hashtable.h" + +struct directive; /* Deliberately incomplete. */ /* Test if a sign is valid within a preprocessing number. */ #define VALID_SIGN(c, prevc) \ @@ -34,7 +35,6 @@ struct htab; #define CPP_OPTION(PFILE, OPTION) ((PFILE)->opts.OPTION) #define CPP_BUFFER(PFILE) ((PFILE)->buffer) -#define CPP_BUF_LINE(BUF) ((BUF)->lineno) #define CPP_BUF_COLUMN(BUF, CUR) ((CUR) - (BUF)->line_base + (BUF)->col_adjust) #define CPP_BUF_COL(BUF) CPP_BUF_COLUMN(BUF, (BUF)->cur) @@ -43,14 +43,15 @@ struct htab; #define CPP_STACK_MAX 200 /* Memory pools. */ -#define _ALIGN(size, align) (((size) + ((align) - 1)) & ~((align) - 1)) +#define POOL_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));\ +#define POOL_COMMIT(p, len) do {\ + ((p)->cur->front += POOL_ALIGN (len, (p)->align));\ if ((p)->cur->front > (p)->cur->limit) abort ();} while (0) typedef struct cpp_chunk cpp_chunk; @@ -65,35 +66,34 @@ struct cpp_chunk typedef struct cpp_pool cpp_pool; struct cpp_pool { - struct cpp_chunk *cur, *locked; + struct cpp_chunk *cur, *locked, *first; unsigned char *pos; /* Current position. */ unsigned int align; unsigned int locks; }; -/* List of directories to look for include files in. */ -struct file_name_list +/* List of directories to look for include files in. */ +struct search_path { - struct file_name_list *next; - struct file_name_list *alloc; /* for the cache of - current directory entries */ - char *name; - unsigned int nlen; + struct search_path *next; + + /* NOTE: NAME may not be null terminated for the case of the current + file's directory! */ + const char *name; + unsigned int len; /* We use these to tell if the directory mentioned here is a duplicate - of an earlier directory on the search path. */ + of an earlier directory on the search path. */ ino_t ino; dev_t dev; - /* If the following is nonzero, it is a C-language system include - directory. */ + /* Non-zero if it is a system include directory. */ int sysp; - /* Mapping of file names for this directory. - Only used on MS-DOS and related platforms. */ + /* Mapping of file names for this directory. Only used on MS-DOS + and related platforms. */ struct file_name_map *name_map; }; -/* Multiple-include optimisation. */ -enum mi_state {MI_FAILED = 0, MI_OUTSIDE}; -enum mi_ind {MI_IND_NONE = 0, MI_IND_NOT}; +/* #include types. */ +enum include_type {IT_INCLUDE, IT_INCLUDE_NEXT, IT_IMPORT, IT_CMDLINE}; typedef struct toklist toklist; struct toklist @@ -121,6 +121,9 @@ struct lexer_state /* Nonzero if first token on line is CPP_HASH. */ unsigned char in_directive; + /* True if we are skipping a failed conditional group. */ + unsigned char skipping; + /* Nonzero if in a directive that takes angle-bracketed headers. */ unsigned char angled_headers; @@ -128,9 +131,6 @@ struct lexer_state all directives apart from #define. */ unsigned char save_comments; - /* If nonzero the next token is at the beginning of the line. */ - unsigned char next_bol; - /* Nonzero if we're mid-comment. */ unsigned char lexing_comment; @@ -155,6 +155,8 @@ struct spec_nodes { cpp_hashnode *n_L; /* L"str" */ cpp_hashnode *n_defined; /* defined operator */ + cpp_hashnode *n_true; /* C++ keyword true */ + cpp_hashnode *n_false; /* C++ keyword false */ cpp_hashnode *n__Pragma; /* _Pragma operator */ cpp_hashnode *n__STRICT_ANSI__; /* STDC_0_IN_SYSTEM_HEADERS */ cpp_hashnode *n__CHAR_UNSIGNED__; /* plain char is unsigned */ @@ -169,19 +171,12 @@ struct cpp_buffer cppchar_t read_ahead; /* read ahead character */ cppchar_t extra_char; /* extra read-ahead for long tokens. */ - struct cpp_reader *pfile; /* Owns this buffer. */ struct cpp_buffer *prev; - const unsigned char *buf; /* entire buffer */ + const unsigned char *buf; /* Entire buffer. */ - /* Filename specified with #line command. */ - const char *nominal_fname; - - /* Actual directory of this file, used only for "" includes */ - struct file_name_list *actual_dir; - - /* Pointer into the include table. Used for include_next and - to record control macros. */ + /* Pointer into the include table; non-NULL if this is a file + buffer. Used for include_next and to record control macros. */ struct include_file *inc; /* Value of if_stack at start of this file. @@ -191,9 +186,6 @@ struct cpp_buffer /* Token column position adjustment owing to tabs in whitespace. */ unsigned int col_adjust; - /* Line number at line_base (above). */ - unsigned int lineno; - /* Contains PREV_WHITE and/or AVOID_LPASTE. */ unsigned char saved_flags; @@ -212,18 +204,18 @@ struct cpp_buffer buffers. */ unsigned char from_stage3; - /* Temporary storage for pfile->skipping whilst in a directive. */ - unsigned char was_skipping; + /* Nonzero means that the directory to start searching for "" + include files has been calculated and stored in "dir" below. */ + unsigned char search_cached; - /* 1 = system header file, 2 = C system header file used for C++. */ - unsigned char sysp; + /* At EOF, a buffer is automatically popped. If RETURN_AT_EOF is + true, a CPP_EOF token is then returned. Otherwise, the next + token from the enclosing buffer is returned. */ + bool return_at_eof; - /* Nonzero means we have printed (while error reporting) a list of - containing files that matches the current status. */ - unsigned char include_stack_listed; - - /* Buffer type. */ - ENUM_BITFIELD (cpp_buffer_type) type : 8; + /* The directory of the this buffer's file. Its NAME member is not + allocated, so we don't need to worry about freeing it. */ + struct search_path dir; }; /* A cpp_reader encapsulates the "state" of a pre-processor run. @@ -238,9 +230,15 @@ struct cpp_reader /* Lexer state. */ struct lexer_state state; + /* Source line tracking. */ + struct line_maps line_maps; + const struct line_map *map; + unsigned int line; + /* The position of the last lexed token and last lexed directive. */ cpp_lexer_pos lexer_pos; cpp_lexer_pos directive_pos; + unsigned int directive_line; /* Memory pools. */ cpp_pool ident_pool; /* For all identifiers, and permanent @@ -256,11 +254,9 @@ struct cpp_reader const struct directive *directive; /* Multiple inlcude optimisation. */ - enum mi_state mi_state; - enum mi_ind mi_if_not_defined; - unsigned int mi_lexed; const cpp_hashnode *mi_cmacro; const cpp_hashnode *mi_ind_cmacro; + bool mi_valid; /* Token lookahead. */ struct cpp_lookahead *la_read; /* Read from this lookahead. */ @@ -279,25 +275,9 @@ struct cpp_reader unsigned char *macro_buffer; unsigned int macro_buffer_len; - /* Current depth in #include directives that use <...>. */ - unsigned int system_include_depth; - - /* Current depth of buffer stack. */ - unsigned int buffer_stack_depth; - - /* Current depth in #include directives. */ - unsigned int include_depth; - - /* Hash table of macros and assertions. See cpphash.c. */ - struct htab *hashtab; - /* Tree of other included files. See cppfiles.c. */ struct splay_tree_s *all_include_files; - /* Chain of `actual directory' file_name_list entries, for "" - inclusion. */ - struct file_name_list *actual_dirs; - /* Current maximum length of directory names in the search path for include files. (Altered as we get more of them.) */ unsigned int max_include_len; @@ -311,11 +291,11 @@ struct cpp_reader /* Obstack holding all macro hash nodes. This never shrinks. See cpphash.c */ - struct obstack *hash_ob; + struct obstack hash_ob; /* Obstack holding buffer and conditional structures. This is a - real stack. See cpplib.c */ - struct obstack *buffer_ob; + real stack. See cpplib.c. */ + struct obstack buffer_ob; /* Pragma table - dynamic, because a library user can add to the list of recognized pragmas. */ @@ -324,6 +304,9 @@ struct cpp_reader /* Call backs. */ struct cpp_callbacks cb; + /* Identifier hash table. */ + struct ht *hash_table; + /* User visible options. */ struct cpp_options opts; @@ -331,15 +314,12 @@ struct cpp_reader preprocessor. */ struct spec_nodes spec_nodes; - /* We're printed a warning recommending against using #import. */ - unsigned char import_warning; - - /* True after cpp_start_read completes. Used to inhibit some - warnings while parsing the command line. */ - unsigned char done_initializing; + /* Whether to print our version number. Done this way so + we don't get it twice for -v -version. */ + unsigned char print_version; - /* True if we are skipping a failed conditional group. */ - unsigned char skipping; + /* Whether cpplib owns the hashtable. */ + unsigned char our_hashtable; }; /* Character classes. Based on the more primitive macros in safe-ctype.h. @@ -371,21 +351,15 @@ extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; /* Macros. */ -#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->prev) #define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps) -#define CPP_IN_SYSTEM_HEADER(PFILE) \ - (CPP_BUFFER (PFILE) && CPP_BUFFER (PFILE)->sysp) +#define CPP_IN_SYSTEM_HEADER(PFILE) ((PFILE)->map && (PFILE)->map->sysp) #define CPP_PEDANTIC(PF) CPP_OPTION (PF, pedantic) #define CPP_WTRADITIONAL(PF) CPP_OPTION (PF, warn_traditional) -/* Hash step. The hash calculation is duplicated in cpp_lookup and - parse_name. */ -#define HASHSTEP(r, c) ((r) * 67 + (c - 113)); - /* In cpperror.c */ -enum error_type { WARNING = 0, PEDWARN, ERROR, FATAL, ICE }; +enum error_type { WARNING = 0, WARNING_SYSHDR, PEDWARN, ERROR, FATAL, ICE }; extern int _cpp_begin_message PARAMS ((cpp_reader *, enum error_type, - const char *, const cpp_lexer_pos *)); + const cpp_lexer_pos *)); /* In cppmacro.c */ extern void _cpp_free_definition PARAMS ((cpp_hashnode *)); @@ -397,24 +371,24 @@ extern void _cpp_push_token PARAMS ((cpp_reader *, const cpp_token *, const cpp_lexer_pos *)); /* In cpphash.c */ -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)); +extern void _cpp_init_hashtable PARAMS ((cpp_reader *, hash_table *)); +extern void _cpp_destroy_hashtable PARAMS ((cpp_reader *)); /* In cppfiles.c */ extern void _cpp_fake_include PARAMS ((cpp_reader *, const char *)); extern void _cpp_never_reread PARAMS ((struct include_file *)); -extern void _cpp_simplify_pathname PARAMS ((char *)); -extern int _cpp_read_file PARAMS ((cpp_reader *, const char *)); -extern void _cpp_execute_include PARAMS ((cpp_reader *, - const cpp_token *, int, int)); +extern char *_cpp_simplify_pathname PARAMS ((char *)); +extern bool _cpp_read_file PARAMS ((cpp_reader *, const char *)); +extern bool _cpp_execute_include PARAMS ((cpp_reader *, + const cpp_token *, + enum include_type)); 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 *)); -extern void _cpp_pop_file_buffer PARAMS ((cpp_reader *, cpp_buffer *)); +extern void _cpp_pop_file_buffer PARAMS ((cpp_reader *, + struct include_file *)); /* In cppexp.c */ extern int _cpp_parse_expr PARAMS ((cpp_reader *)); @@ -433,16 +407,20 @@ extern unsigned char *_cpp_next_chunk PARAMS ((cpp_pool *, unsigned int, extern void _cpp_lock_pool PARAMS ((cpp_pool *)); extern void _cpp_unlock_pool PARAMS ((cpp_pool *)); +/* In cppinit.c. */ +extern bool _cpp_push_next_buffer PARAMS ((cpp_reader *)); + /* In cpplib.c */ 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_do__Pragma PARAMS ((cpp_reader *)); -extern void _cpp_init_stacks PARAMS ((cpp_reader *)); -extern void _cpp_cleanup_stacks PARAMS ((cpp_reader *)); +extern void _cpp_init_directives PARAMS ((cpp_reader *)); extern void _cpp_init_internal_pragmas PARAMS ((cpp_reader *)); -extern void _cpp_do_file_change PARAMS ((cpp_reader *, enum cpp_fc_reason, - const char *, unsigned int)); +extern void _cpp_do_file_change PARAMS ((cpp_reader *, enum lc_reason, + const char *, + unsigned int, unsigned int)); +extern void _cpp_pop_buffer PARAMS ((cpp_reader *)); /* Utility routines and macros. */ #define DSC(str) (const U_CHAR *)str, sizeof str - 1 @@ -510,4 +488,4 @@ ufputs (s, f) return fputs ((const char *)s, f); } -#endif +#endif /* ! GCC_CPPHASH_H */