OSDN Git Service

* gcc.c-torture/execute/strct-stdarg-1.x: New file. Expect
[pf3gnuchains/gcc-fork.git] / gcc / cpphash.h
index 17438c7..be8d902 100644 (file)
@@ -1,5 +1,6 @@
 /* Part of CPP library.
-   Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+   Free Software Foundation, Inc.
 
 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
@@ -35,7 +36,6 @@ struct directive;             /* Deliberately incomplete.  */
 
 #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,35 +43,26 @@ struct directive;           /* Deliberately incomplete.  */
    efficiency, and partly to limit runaway recursion.  */
 #define CPP_STACK_MAX 200
 
-/* Memory pools.  */
-#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 += POOL_ALIGN (len, (p)->align));\
-  if ((p)->cur->front > (p)->cur->limit) abort ();} while (0)
-
-typedef struct cpp_chunk cpp_chunk;
-struct cpp_chunk
+/* A generic memory buffer, and operations on it.  */
+typedef struct _cpp_buff _cpp_buff;
+struct _cpp_buff
 {
-  cpp_chunk *next;
-  unsigned char *front;
-  unsigned char *limit;
-  unsigned char *base;
+  struct _cpp_buff *next;
+  unsigned char *base, *cur, *limit;
 };
 
-typedef struct cpp_pool cpp_pool;
-struct cpp_pool
-{
-  struct cpp_chunk *cur, *locked;
-  unsigned char *pos;          /* Current position.  */
-  unsigned int align;
-  unsigned int locks;
-};
+extern _cpp_buff *_cpp_get_buff PARAMS ((cpp_reader *, size_t));
+extern void _cpp_release_buff PARAMS ((cpp_reader *, _cpp_buff *));
+extern void _cpp_extend_buff PARAMS ((cpp_reader *, _cpp_buff **, size_t));
+extern _cpp_buff *_cpp_append_extend_buff PARAMS ((cpp_reader *, _cpp_buff *,
+                                                  size_t));
+extern void _cpp_free_buff PARAMS ((_cpp_buff *));
+extern unsigned char *_cpp_aligned_alloc PARAMS ((cpp_reader *, size_t));
+extern unsigned char *_cpp_unaligned_alloc PARAMS ((cpp_reader *, size_t));
+
+#define BUFF_ROOM(BUFF) (size_t) ((BUFF)->limit - (BUFF)->cur)
+#define BUFF_FRONT(BUFF) ((BUFF)->cur)
+#define BUFF_LIMIT(BUFF) ((BUFF)->limit)
 
 /* List of directories to look for include files in.  */
 struct search_path
@@ -93,18 +84,21 @@ struct search_path
   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
+union utoken
 {
-  cpp_token *first;
-  cpp_token *limit;
+  const cpp_token *token;
+  const cpp_token **ptoken;
+};
+
+/* A "run" of tokens; part of a chain of runs.  */
+typedef struct tokenrun tokenrun;
+struct tokenrun
+{
+  tokenrun *next, *prev;
+  cpp_token *base, *limit;
 };
 
 typedef struct cpp_context cpp_context;
@@ -115,10 +109,18 @@ struct cpp_context
 
   /* Contexts other than the base context are contiguous tokens.
      e.g. macro expansions, expanded argument tokens.  */
-  struct toklist list;
+  union utoken first;
+  union utoken last;
+
+  /* If non-NULL, a buffer used for storage related to this context.
+     When the context is popped, the buffer is released.  */
+  _cpp_buff *buff;
 
-  /* For a macro context, these are the macro and its arguments.  */
-  cpp_macro *macro;
+  /* For a macro context, the macro node, otherwise NULL.  */
+  cpp_hashnode *macro;
+
+  /* True if utoken element is token, else ptoken.  */
+  bool direct_p;
 };
 
 struct lexer_state
@@ -126,6 +128,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;
 
@@ -133,9 +138,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;
 
@@ -158,34 +160,28 @@ struct lexer_state
 /* Special nodes - identifiers with predefined significance.  */
 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 */
   cpp_hashnode *n__VA_ARGS__;          /* C99 vararg macros */
 };
 
+/* Represents the contents of a file cpplib has read in.  */
 struct cpp_buffer
 {
   const unsigned char *cur;     /* current position */
+  const unsigned char *backup_to; /* if peeked character is not wanted */
   const unsigned char *rlimit; /* end of valid data */
   const unsigned char *line_base; /* start of current line */
-  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 */
-
-  /* Filename specified with #line command.  */
-  const char *nominal_fname;
+  const unsigned char *buf;     /* Entire character buffer.  */
 
-  /* 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.
@@ -195,9 +191,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;
 
@@ -216,22 +209,14 @@ 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;
-
-  /* Nonzero means we have printed (while error reporting) a list of
-     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;
 
-  /* Buffer type.  */
-  ENUM_BITFIELD (cpp_buffer_type) type : 8;
+  /* 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;
 
   /* The directory of the this buffer's file.  Its NAME member is not
      allocated, so we don't need to worry about freeing it.  */
@@ -241,7 +226,6 @@ struct cpp_buffer
 /* A cpp_reader encapsulates the "state" of a pre-processor run.
    Applying cpp_get_token repeatedly yields a stream of pre-processor
    tokens.  Usually, there is only one cpp_reader object active.  */
-
 struct cpp_reader
 {
   /* Top of buffer stack.  */
@@ -250,15 +234,18 @@ struct cpp_reader
   /* Lexer state.  */
   struct lexer_state state;
 
-  /* The position of the last lexed token and last lexed directive.  */
-  cpp_lexer_pos lexer_pos;
-  cpp_lexer_pos directive_pos;
+  /* Source line tracking.  */
+  struct line_maps line_maps;
+  const struct line_map *map;
+  unsigned int line;
 
-  /* Memory pools.  */
-  cpp_pool ident_pool;         /* For all identifiers, and permanent
-                                  numbers and strings.  */
-  cpp_pool macro_pool;         /* For macro definitions.  Permanent.  */
-  cpp_pool argument_pool;      /* For macro arguments.  Temporary.   */
+  /* The line of the '#' of the current directive.  */
+  unsigned int directive_line;
+
+  /* Memory buffers.  */
+  _cpp_buff *a_buff;           /* Aligned permanent storage.  */
+  _cpp_buff *u_buff;           /* Unaligned permanent storage.  */
+  _cpp_buff *free_buffs;       /* Free buffer chain.  */
 
   /* Context stack.  */
   struct cpp_context base_context;
@@ -268,38 +255,30 @@ 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;
+
+  /* Lexing.  */
+  cpp_token *cur_token;
+  tokenrun base_run, *cur_run;
+  unsigned int lookaheads;
 
-  /* Token lookahead.  */
-  struct cpp_lookahead *la_read;       /* Read from this lookahead.  */
-  struct cpp_lookahead *la_write;      /* Write to this lookahead.  */
-  struct cpp_lookahead *la_unused;     /* Free store.  */
-  struct cpp_lookahead *la_saved;      /* Backup when entering directive.  */
+  /* Non-zero prevents the lexer from re-using the token runs.  */
+  unsigned int keep_tokens;
 
   /* Error counter for exit code.  */
   unsigned int errors;
 
   /* Line and column where a newline was first seen in a string
      constant (multi-line strings).  */
-  cpp_lexer_pos mlstring_pos;
+  unsigned int mls_line;
+  unsigned int mls_col;
 
   /* Buffer to hold macro definition string.  */
   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;
-
   /* Tree of other included files.  See cppfiles.c.  */
   struct splay_tree_s *all_include_files;
 
@@ -311,6 +290,10 @@ struct cpp_reader
   cpp_token date;
   cpp_token time;
 
+  /* EOF token, and a token forcing paste avoidance.  */
+  cpp_token avoid_paste;
+  cpp_token eof;
+
   /* Opaque handle to the dependencies of mkdeps.c.  Used by -M etc.  */
   struct deps *deps;
 
@@ -339,12 +322,6 @@ struct cpp_reader
      preprocessor.  */
   struct spec_nodes spec_nodes;
 
-  /* We're printed a warning recommending against using #import.  */
-  unsigned char import_warning;
-
-  /* True if we are skipping a failed conditional group.  */
-  unsigned char skipping;
-
   /* Whether to print our version number.  Done this way so
      we don't get it twice for -v -version.  */
   unsigned char print_version;
@@ -383,24 +360,19 @@ extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1];
 /* Macros.  */
 
 #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)
 
 /* In cpperror.c  */
 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 *));
+                                      unsigned int, unsigned int));
 
 /* 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_free_lookaheads       PARAMS ((cpp_reader *));
-extern void _cpp_release_lookahead     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_hashtable                PARAMS ((cpp_reader *, hash_table *));
@@ -410,8 +382,8 @@ extern void _cpp_destroy_hashtable  PARAMS ((cpp_reader *));
 extern void _cpp_fake_include          PARAMS ((cpp_reader *, const char *));
 extern void _cpp_never_reread          PARAMS ((struct include_file *));
 extern char *_cpp_simplify_pathname    PARAMS ((char *));
-extern int _cpp_read_file              PARAMS ((cpp_reader *, const char *));
-extern int _cpp_execute_include                PARAMS ((cpp_reader *,
+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 *,
@@ -419,24 +391,22 @@ extern int _cpp_compare_file_date       PARAMS ((cpp_reader *,
 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 bool _cpp_pop_file_buffer       PARAMS ((cpp_reader *,
+                                                struct include_file *));
 
 /* In cppexp.c */
 extern int _cpp_parse_expr             PARAMS ((cpp_reader *));
 
 /* In cpplex.c */
-extern void _cpp_lex_token             PARAMS ((cpp_reader *, cpp_token *));
+extern cpp_token *_cpp_temp_token      PARAMS ((cpp_reader *));
+extern const cpp_token *_cpp_lex_token PARAMS ((cpp_reader *));
+extern cpp_token *_cpp_lex_direct      PARAMS ((cpp_reader *));
 extern int _cpp_equiv_tokens           PARAMS ((const cpp_token *,
                                                 const cpp_token *));
-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 *));
+extern void _cpp_init_tokenrun         PARAMS ((tokenrun *, unsigned int));
+
+/* In cppinit.c.  */
+extern bool _cpp_push_next_buffer      PARAMS ((cpp_reader *));
 
 /* In cpplib.c */
 extern int _cpp_test_assertion PARAMS ((cpp_reader *, int *));
@@ -445,8 +415,10 @@ extern void _cpp_define_builtin    PARAMS ((cpp_reader *, const char *));
 extern void _cpp_do__Pragma    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
@@ -514,4 +486,4 @@ ufputs (s, f)
   return fputs ((const char *)s, f);
 }
 
-#endif /* GCC_CPPHASH_H */
+#endif /* GCC_CPPHASH_H */