]> 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 c2d08168945f639c24eca577d6de9b6bde120908..5b9c389bb493d55d07a765388a2739dcc80ab693 100644 (file)
@@ -1,5 +1,5 @@
 /* Part of CPP library.
-   Copyright (C) 1997-2015 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
@@ -23,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>
@@ -68,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); \
@@ -93,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;
@@ -151,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.  */
@@ -246,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.  */
@@ -282,6 +281,7 @@ 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 */
 };
@@ -372,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.  */
@@ -400,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.  */
@@ -419,7 +419,7 @@ 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
@@ -502,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 */
@@ -546,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.  */
@@ -565,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.
@@ -588,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.  */
@@ -597,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 *);
@@ -616,17 +629,26 @@ 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);
@@ -639,13 +661,14 @@ 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);
+                                 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 *);
@@ -677,6 +700,14 @@ 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 *);
@@ -688,7 +719,7 @@ 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 *,
@@ -701,7 +732,7 @@ 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 *,
@@ -713,7 +744,7 @@ 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 *,
@@ -744,9 +775,12 @@ struct normalize_state
 #define NORMALIZE_STATE_UPDATE_IDNUM(st, c)    \
   ((st)->previous = (c), (st)->prev_class = 0)
 
-extern cppchar_t _cpp_valid_ucn (cpp_reader *, const unsigned char **,
-                                const unsigned char *, int,
-                                struct normalize_state *state);
+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,
@@ -833,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
@@ -860,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
@@ -871,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.
@@ -882,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
 }