]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libcpp/internal.h
* doc/invoke.texi (Spec Files): Update location of the
[thirdparty/gcc.git] / libcpp / internal.h
index 37aac821d62abd5f8d53d75d78f3b22079b19439..5b9c389bb493d55d07a765388a2739dcc80ab693 100644 (file)
@@ -1,6 +1,5 @@
 /* Part of CPP library.
-   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007,
-   2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+   Copyright (C) 1997-2019 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
@@ -24,7 +23,7 @@ along with this program; see the file COPYING3.  If not see
 #define LIBCPP_INTERNAL_H
 
 #include "symtab.h"
-#include "cpp-id-data.h"
+#include "cpplib.h"
 
 #if HAVE_ICONV
 #include <iconv.h>
@@ -60,6 +59,8 @@ struct cset_converter
     || (((prevc) == 'p' || (prevc) == 'P') \
         && CPP_OPTION (pfile, extended_numbers))))
 
+#define DIGIT_SEP(c) ((c) == '\'' && CPP_OPTION (pfile, digit_separators))
+
 #define CPP_OPTION(PFILE, OPTION) ((PFILE)->opts.OPTION)
 #define CPP_BUFFER(PFILE) ((PFILE)->buffer)
 #define CPP_BUF_COLUMN(BUF, CUR) ((CUR) - (BUF)->line_base)
@@ -67,7 +68,7 @@ struct cset_converter
 
 #define CPP_INCREMENT_LINE(PFILE, COLS_HINT) do { \
     const struct line_maps *line_table = PFILE->line_table; \
-    const struct line_map *map = \
+    const struct line_map_ordinary *map = \
       LINEMAPS_LAST_ORDINARY_MAP (line_table); \
     linenum_type line = SOURCE_LINE (map, line_table->highest_line); \
     linemap_line_start (PFILE->line_table, line + 1, COLS_HINT); \
@@ -92,9 +93,8 @@ struct dummy
 #define CPP_ALIGN2(size, align) (((size) + ((align) - 1)) & ~((align) - 1))
 #define CPP_ALIGN(size) CPP_ALIGN2 (size, DEFAULT_ALIGNMENT)
 
-#define _cpp_mark_macro_used(NODE) do {                                        \
-  if ((NODE)->type == NT_MACRO && !((NODE)->flags & NODE_BUILTIN))     \
-    (NODE)->value.macro->used = 1; } while (0)
+#define _cpp_mark_macro_used(NODE)                                     \
+  (cpp_user_macro_p (NODE) ? (NODE)->value.macro->used = 1 : 0)
 
 /* A generic memory buffer, and operations on it.  */
 typedef struct _cpp_buff _cpp_buff;
@@ -117,7 +117,7 @@ extern unsigned char *_cpp_unaligned_alloc (cpp_reader *, size_t);
 #define BUFF_LIMIT(BUFF) ((BUFF)->limit)
 
 /* #include types.  */
-enum include_type {IT_INCLUDE, IT_INCLUDE_NEXT, IT_IMPORT, IT_CMDLINE};
+enum include_type {IT_INCLUDE, IT_INCLUDE_NEXT, IT_IMPORT, IT_CMDLINE, IT_DEFAULT};
 
 union utoken
 {
@@ -150,11 +150,11 @@ typedef struct
      location at index 0 is the virtual location of the token at index
      0 in the current instance of cpp_context; similarly for all the
      other virtual locations.  */
-  source_location *virt_locs;
+  location_t *virt_locs;
   /* This is a pointer to the current virtual location.  This is used
      to iterate over the virtual locations while we iterate over the
      tokens they belong to.  */
-  source_location *cur_virt_loc;
+  location_t *cur_virt_loc;
 } macro_context;
 
 /* The kind of tokens carried by a cpp_context.  */
@@ -245,7 +245,7 @@ struct lexer_state
      all directives apart from #define.  */
   unsigned char save_comments;
 
-  /* Nonzero if lexing __VA_ARGS__ is valid.  */
+  /* Nonzero if lexing __VA_ARGS__ and __VA_OPT__ are valid.  */
   unsigned char va_args_ok;
 
   /* Nonzero if lexing poisoned identifiers is valid.  */
@@ -257,6 +257,9 @@ struct lexer_state
   /* Nonzero when parsing arguments to a function-like macro.  */
   unsigned char parsing_args;
 
+  /* Nonzero if in a __has_include__ or __has_include_next__ statement.  */
+  unsigned char in__has_include__;
+
   /* Nonzero if prevent_expansion is true only because output is
      being discarded.  */
   unsigned char discarding_output;
@@ -278,6 +281,9 @@ struct spec_nodes
   cpp_hashnode *n_true;                        /* C++ keyword true */
   cpp_hashnode *n_false;               /* C++ keyword false */
   cpp_hashnode *n__VA_ARGS__;          /* C99 vararg macros */
+  cpp_hashnode *n__VA_OPT__;           /* C++ vararg macros */
+  cpp_hashnode *n__has_include__;      /* __has_include__ operator */
+  cpp_hashnode *n__has_include_next__; /* __has_include_next__ operator */
 };
 
 typedef struct _cpp_line_note _cpp_line_note;
@@ -302,6 +308,8 @@ struct cpp_buffer
 
   const unsigned char *buf;        /* Entire character buffer.  */
   const unsigned char *rlimit;     /* Writable byte at end of file.  */
+  const unsigned char *to_free;           /* Pointer that should be freed when
+                                     popping the buffer.  */
 
   _cpp_line_note *notes;           /* Array of notes.  */
   unsigned int cur_note;           /* Next note to process.  */
@@ -364,7 +372,7 @@ struct def_pragma_macro {
   unsigned char *definition;
 
   /* Definition line number.  */
-  source_location line;
+  location_t line;
   /* If macro defined in system header.  */
   unsigned int syshdr   : 1;
   /* Nonzero if it has been expanded or had its existence tested.  */
@@ -392,7 +400,7 @@ struct cpp_reader
   struct line_maps *line_table;
 
   /* The line of the '#' of the current directive.  */
-  source_location directive_line;
+  location_t directive_line;
 
   /* Memory buffers.  */
   _cpp_buff *a_buff;           /* Aligned permanent storage.  */
@@ -411,7 +419,12 @@ struct cpp_reader
 
   /* When expanding a macro at top-level, this is the location of the
      macro invocation.  */
-  source_location invocation_location;
+  location_t invocation_location;
+
+  /* This is the node representing the macro being expanded at
+     top-level.  The value of this data member is valid iff
+     in_macro_expansion_p() returns TRUE.  */
+  cpp_hashnode *top_most_macro_node;
 
   /* Nonzero if we are about to expand a macro.  Note that if we are
      really expanding a macro, the function macro_of_context returns
@@ -489,12 +502,17 @@ struct cpp_reader
   const unsigned char *date;
   const unsigned char *time;
 
+  /* Externally set timestamp to replace current date and time useful for
+     reproducibility.  It should be initialized to -2 (not yet set) and
+     set to -1 to disable it or to a non-negative value to enable it.  */
+  time_t source_date_epoch;
+
   /* EOF token, and a token forcing paste avoidance.  */
   cpp_token avoid_paste;
   cpp_token eof;
 
   /* Opaque handle to the dependencies of mkdeps.c.  */
-  struct deps *deps;
+  struct mkdeps *deps;
 
   /* Obstack holding all macro hash nodes.  This never shrinks.
      See identifiers.c */
@@ -533,7 +551,7 @@ struct cpp_reader
     unsigned char *base;
     unsigned char *limit;
     unsigned char *cur;
-    source_location first_line;
+    location_t first_line;
   } out;
 
   /* Used for buffer overlays by traditional.c.  */
@@ -552,9 +570,9 @@ struct cpp_reader
   /* List of saved macros by push_macro.  */
   struct def_pragma_macro *pushed_macros;
 
-  /* If non-null, the lexer will use this location for the next token
+  /* If non-zero, the lexer will use this location for the next token
      instead of getting a location from the linemap.  */
-  source_location *forced_token_location_p;
+  location_t forced_token_location;
 };
 
 /* Character classes.  Based on the more primitive macros in safe-ctype.h.
@@ -575,6 +593,8 @@ struct cpp_reader
 #define is_nvspace(x)  IS_NVSPACE(x)
 #define is_space(x)    IS_SPACE_OR_NUL(x)
 
+#define SEEN_EOL() (pfile->cur_token[-1].type == CPP_EOF)
+
 /* This table is constant if it can be initialized at compile time,
    which is the case if cpp was compiled with GCC >=2.7, or another
    compiler that supports C99.  */
@@ -584,6 +604,12 @@ extern const unsigned char _cpp_trigraph_map[UCHAR_MAX + 1];
 extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1];
 #endif
 
+#if !defined (HAVE_UCHAR) && !defined (IN_GCC)
+typedef unsigned char uchar;
+#endif
+
+#define UC (const uchar *)  /* Intended use: UC"string" */
+
 /* Macros.  */
 
 static inline int cpp_in_system_header (cpp_reader *);
@@ -603,44 +629,58 @@ cpp_in_primary_file (cpp_reader *pfile)
 }
 
 /* In macro.c */
+extern void _cpp_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node);
+inline void _cpp_maybe_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node)
+{
+  if (!(node->flags & NODE_USED))
+    _cpp_notify_macro_use (pfile, node);
+}
+extern cpp_macro *_cpp_new_macro (cpp_reader *, cpp_macro_kind, void *);
 extern void _cpp_free_definition (cpp_hashnode *);
 extern bool _cpp_create_definition (cpp_reader *, cpp_hashnode *);
 extern void _cpp_pop_context (cpp_reader *);
 extern void _cpp_push_text_context (cpp_reader *, cpp_hashnode *,
                                    const unsigned char *, size_t);
-extern bool _cpp_save_parameter (cpp_reader *, cpp_macro *, cpp_hashnode *);
+extern bool _cpp_save_parameter (cpp_reader *, unsigned, cpp_hashnode *,
+                                cpp_hashnode *);
+extern void _cpp_unsave_parameters (cpp_reader *, unsigned);
 extern bool _cpp_arguments_ok (cpp_reader *, cpp_macro *, const cpp_hashnode *,
                               unsigned int);
 extern const unsigned char *_cpp_builtin_macro_text (cpp_reader *,
-                                                    cpp_hashnode *);
+                                                    cpp_hashnode *,
+                                                    location_t = 0);
 extern int _cpp_warn_if_unused_macro (cpp_reader *, cpp_hashnode *, void *);
 extern void _cpp_push_token_context (cpp_reader *, cpp_hashnode *,
                                     const cpp_token *, unsigned int);
 extern void _cpp_backup_tokens_direct (cpp_reader *, unsigned int);
 
 /* In identifiers.c */
-extern void _cpp_init_hashtable (cpp_reader *, hash_table *);
+extern void _cpp_init_hashtable (cpp_reader *, cpp_hash_table *);
 extern void _cpp_destroy_hashtable (cpp_reader *);
 
 /* In files.c */
 typedef struct _cpp_file _cpp_file;
 extern _cpp_file *_cpp_find_file (cpp_reader *, const char *, cpp_dir *,
-                                 bool, int);
+                                 bool, int, bool, location_t);
 extern bool _cpp_find_failed (_cpp_file *);
 extern void _cpp_mark_file_once_only (cpp_reader *, struct _cpp_file *);
 extern void _cpp_fake_include (cpp_reader *, const char *);
-extern bool _cpp_stack_file (cpp_reader *, _cpp_file*, bool);
+extern bool _cpp_stack_file (cpp_reader *, _cpp_file*, bool,
+                            location_t);
 extern bool _cpp_stack_include (cpp_reader *, const char *, int,
-                               enum include_type);
+                               enum include_type, location_t);
 extern int _cpp_compare_file_date (cpp_reader *, const char *, int);
 extern void _cpp_report_missing_guards (cpp_reader *);
 extern void _cpp_init_files (cpp_reader *);
 extern void _cpp_cleanup_files (cpp_reader *);
-extern void _cpp_pop_file_buffer (cpp_reader *, struct _cpp_file *);
+extern void _cpp_pop_file_buffer (cpp_reader *, struct _cpp_file *,
+                                 const unsigned char *);
 extern bool _cpp_save_file_entries (cpp_reader *pfile, FILE *f);
 extern bool _cpp_read_file_entries (cpp_reader *, FILE *);
 extern const char *_cpp_get_file_name (_cpp_file *);
 extern struct stat *_cpp_get_file_stat (_cpp_file *);
+extern bool _cpp_has_header (cpp_reader *, const char *, int,
+                            enum include_type);
 
 /* In expr.c */
 extern bool _cpp_parse_expr (cpp_reader *, bool);
@@ -654,11 +694,20 @@ extern bool _cpp_skip_block_comment (cpp_reader *);
 extern cpp_token *_cpp_temp_token (cpp_reader *);
 extern const cpp_token *_cpp_lex_token (cpp_reader *);
 extern cpp_token *_cpp_lex_direct (cpp_reader *);
+extern unsigned char *_cpp_spell_ident_ucns (unsigned char *, cpp_hashnode *);
 extern int _cpp_equiv_tokens (const cpp_token *, const cpp_token *);
 extern void _cpp_init_tokenrun (tokenrun *, unsigned int);
 extern cpp_hashnode *_cpp_lex_identifier (cpp_reader *, const char *);
 extern int _cpp_remaining_tokens_num_in_context (cpp_context *);
 extern void _cpp_init_lexer (void);
+static inline void *_cpp_reserve_room (cpp_reader *pfile, size_t have,
+                                      size_t extra)
+{
+  if (BUFF_ROOM (pfile->a_buff) < (have + extra))
+    _cpp_extend_buff (pfile, &pfile->a_buff, extra);
+  return BUFF_FRONT (pfile->a_buff);
+}
+extern void *_cpp_commit_buff (cpp_reader *pfile, size_t size);
 
 /* In init.c.  */
 extern void _cpp_maybe_push_include_file (cpp_reader *);
@@ -670,31 +719,32 @@ extern int _cpp_handle_directive (cpp_reader *, int);
 extern void _cpp_define_builtin (cpp_reader *, const char *);
 extern char ** _cpp_save_pragma_names (cpp_reader *);
 extern void _cpp_restore_pragma_names (cpp_reader *, char **);
-extern int _cpp_do__Pragma (cpp_reader *);
+extern int _cpp_do__Pragma (cpp_reader *, location_t);
 extern void _cpp_init_directives (cpp_reader *);
 extern void _cpp_init_internal_pragmas (cpp_reader *);
 extern void _cpp_do_file_change (cpp_reader *, enum lc_reason, const char *,
                                 linenum_type, unsigned int);
 extern void _cpp_pop_buffer (cpp_reader *);
+extern char *_cpp_bracket_include (cpp_reader *);
 
 /* In directives.c */
 struct _cpp_dir_only_callbacks
 {
   /* Called to print a block of lines. */
   void (*print_lines) (int, const void *, size_t);
-  void (*maybe_print_line) (source_location);
+  bool (*maybe_print_line) (location_t);
 };
 
 extern void _cpp_preprocess_dir_only (cpp_reader *,
                                      const struct _cpp_dir_only_callbacks *);
 
 /* In traditional.c.  */
-extern bool _cpp_scan_out_logical_line (cpp_reader *, cpp_macro *);
+extern bool _cpp_scan_out_logical_line (cpp_reader *, cpp_macro *, bool);
 extern bool _cpp_read_logical_line_trad (cpp_reader *);
 extern void _cpp_overlay_buffer (cpp_reader *pfile, const unsigned char *,
                                 size_t);
 extern void _cpp_remove_overlay (cpp_reader *);
-extern bool _cpp_create_trad_definition (cpp_reader *, cpp_macro *);
+extern cpp_macro *_cpp_create_trad_definition (cpp_reader *);
 extern bool _cpp_expansions_different_trad (const cpp_macro *,
                                            const cpp_macro *);
 extern unsigned char *_cpp_copy_replacement_text (const cpp_macro *,
@@ -709,9 +759,10 @@ extern size_t _cpp_replacement_text_len (const cpp_macro *);
 
 struct normalize_state 
 {
-  /* The previous character.  */
+  /* The previous starter character.  */
   cppchar_t previous;
-  /* The combining class of the previous character.  */
+  /* The combining class of the previous character (whether or not a
+     starter).  */
   unsigned char prev_class;
   /* The lowest normalization level so far.  */
   enum cpp_normalize_level level;
@@ -719,14 +770,17 @@ struct normalize_state
 #define INITIAL_NORMALIZE_STATE { 0, 0, normalized_KC }
 #define NORMALIZE_STATE_RESULT(st) ((st)->level)
 
-/* We saw a character that matches ISIDNUM(), update a
+/* We saw a character that matches ISIDNUM(), update a
    normalize_state appropriately.  */
-#define NORMALIZE_STATE_UPDATE_IDNUM(st) \
-  ((st)->previous = 0, (st)->prev_class = 0)
-
-extern cppchar_t _cpp_valid_ucn (cpp_reader *, const unsigned char **,
-                                const unsigned char *, int,
-                                struct normalize_state *state);
+#define NORMALIZE_STATE_UPDATE_IDNUM(st, c)    \
+  ((st)->previous = (c), (st)->prev_class = 0)
+
+extern bool _cpp_valid_ucn (cpp_reader *, const unsigned char **,
+                           const unsigned char *, int,
+                           struct normalize_state *state,
+                           cppchar_t *,
+                           source_range *char_range,
+                           cpp_string_location_reader *loc_reader);
 extern void _cpp_destroy_iconv (cpp_reader *);
 extern unsigned char *_cpp_convert_input (cpp_reader *, const char *,
                                          unsigned char *, size_t, size_t,
@@ -813,10 +867,10 @@ ufputs (const unsigned char *s, FILE *f)
    of the macro, rather than the the location of the first character
    of the macro.  NUM_TOKENS is the number of tokens that are part of
    the replacement-list of MACRO.  */
-const struct line_map *linemap_enter_macro (struct line_maps *,
-                                           struct cpp_hashnode*,
-                                           source_location,
-                                           unsigned int);
+const line_map_macro *linemap_enter_macro (struct line_maps *,
+                                          struct cpp_hashnode*,
+                                          location_t,
+                                          unsigned int);
 
 /* Create and return a virtual location for a token that is part of a
    macro expansion-list at a macro expansion point.  See the comment
@@ -840,10 +894,10 @@ const struct line_map *linemap_enter_macro (struct line_maps *,
    MACRO_DEFINITION_LOC is the location in the macro definition,
    either of the token itself or of a macro parameter that it
    replaces.  */
-source_location linemap_add_macro_token (const struct line_map *,
-                                        unsigned int,
-                                        source_location,
-                                        source_location);
+location_t linemap_add_macro_token (const line_map_macro *,
+                                   unsigned int,
+                                   location_t,
+                                   location_t);
 
 /* Return the source line number corresponding to source location
    LOCATION.  SET is the line map set LOCATION comes from.  If
@@ -851,7 +905,7 @@ source_location linemap_add_macro_token (const struct line_map *,
    expansion-list of a macro expansion return the line number of the
    macro expansion point.  */
 int linemap_get_expansion_line (struct line_maps *,
-                               source_location);
+                               location_t);
 
 /* Return the path of the file corresponding to source code location
    LOCATION.
@@ -862,7 +916,7 @@ int linemap_get_expansion_line (struct line_maps *,
 
    SET is the line map set LOCATION comes from.  */
 const char* linemap_get_expansion_filename (struct line_maps *,
-                                           source_location);
+                                           location_t);
 
 #ifdef __cplusplus
 }