OSDN Git Service

* update_web_docs (PREPROCESS): Rename to WWWPREPROCESS.
[pf3gnuchains/gcc-fork.git] / gcc / cpphash.h
index 380f125..1ba4282 100644 (file)
@@ -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;
@@ -71,29 +72,28 @@ struct cpp_pool
   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;
 
@@ -155,6 +158,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 */
@@ -177,9 +182,6 @@ struct cpp_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. */
   struct include_file *inc;
@@ -191,8 +193,13 @@ 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;
+  /* The line of the buffer that we return to after a #include.
+     Strictly this is redundant, since it can be calculated from the
+     line maps, but it is clearest to save it here.  */
+  unsigned int return_to_line;
+
+  /* Contains PREV_WHITE and/or AVOID_LPASTE.  */
+  unsigned char saved_flags;
 
   /* Because of the way the lexer works, -Wtrigraphs can sometimes
      warn twice for the same trigraph.  This helps prevent that.  */
@@ -209,9 +216,6 @@ struct cpp_buffer
      buffers.  */
   unsigned char from_stage3;
 
-  /* Temporary storage for pfile->skipping whilst in a directive.  */
-  unsigned char was_skipping;
-
   /* 1 = system header file, 2 = C system header file used for C++.  */
   unsigned char sysp;
 
@@ -219,8 +223,21 @@ struct cpp_buffer
      containing files that matches the current status.  */
   unsigned char include_stack_listed;
 
+  /* Nonzero means that the directory to start searching for ""
+     include files has been calculated and stored in "dir" below.  */
+  unsigned char search_cached;
+
+  /* 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;
+
   /* 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.
@@ -235,9 +252,15 @@ struct cpp_reader
   /* Lexer state.  */
   struct lexer_state state;
 
+  /* Source line tracking.  */
+  struct line_maps line_maps;
+  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
@@ -253,11 +276,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.  */
@@ -285,16 +306,9 @@ struct cpp_reader
   /* 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;
@@ -308,11 +322,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.  */
@@ -321,6 +335,9 @@ struct cpp_reader
   /* Call backs.  */
   struct cpp_callbacks cb;
 
+  /* Identifier hash table.  */ 
+  struct ht *hash_table;
+
   /* User visible options.  */
   struct cpp_options opts;
 
@@ -328,15 +345,12 @@ struct cpp_reader
      preprocessor.  */
   struct spec_nodes spec_nodes;
 
-  /* We're printed a warning recommending against using #import.  */
-  unsigned char import_warning;
+  /* Whether to print our version number.  Done this way so
+     we don't get it twice for -v -version.  */
+  unsigned char print_version;
 
-  /* True after cpp_start_read completes.  Used to inhibit some
-     warnings while parsing the command line.  */
-  unsigned char done_initializing;
-
-  /* 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.
@@ -368,19 +382,14 @@ 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_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 *));
 
@@ -394,18 +403,17 @@ 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 char *_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 int _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 *));
@@ -435,11 +443,11 @@ 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,
+                                        unsigned int));
+extern void _cpp_pop_buffer PARAMS ((cpp_reader *));
 
 /* Utility routines and macros.  */
 #define DSC(str) (const U_CHAR *)str, sizeof str - 1
@@ -507,4 +515,4 @@ ufputs (s, f)
   return fputs ((const char *)s, f);
 }
 
-#endif
+#endif /* ! GCC_CPPHASH_H */