Home | History | Annotate | Line # | Download | only in libcpp
      1      1.1  mrg /* Part of CPP library.  (Precompiled header reading/writing.)
      2  1.1.1.2  mrg    Copyright (C) 2000-2024 Free Software Foundation, Inc.
      3      1.1  mrg 
      4      1.1  mrg This program is free software; you can redistribute it and/or modify it
      5      1.1  mrg under the terms of the GNU General Public License as published by the
      6      1.1  mrg Free Software Foundation; either version 3, or (at your option) any
      7      1.1  mrg later version.
      8      1.1  mrg 
      9      1.1  mrg This program is distributed in the hope that it will be useful,
     10      1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     11      1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12      1.1  mrg GNU General Public License for more details.
     13      1.1  mrg 
     14      1.1  mrg You should have received a copy of the GNU General Public License
     15      1.1  mrg along with this program; see the file COPYING3.  If not see
     16      1.1  mrg <http://www.gnu.org/licenses/>.  */
     17      1.1  mrg 
     18      1.1  mrg #include "config.h"
     19      1.1  mrg #include "system.h"
     20      1.1  mrg #include "cpplib.h"
     21      1.1  mrg #include "internal.h"
     22      1.1  mrg #include "hashtab.h"
     23      1.1  mrg #include "mkdeps.h"
     24      1.1  mrg 
     25      1.1  mrg static int write_macdef (cpp_reader *, cpp_hashnode *, void *);
     26      1.1  mrg static int save_idents (cpp_reader *, cpp_hashnode *, void *);
     27      1.1  mrg static hashval_t hashmem (const void *, size_t);
     28      1.1  mrg static hashval_t cpp_string_hash (const void *);
     29      1.1  mrg static int cpp_string_eq (const void *, const void *);
     30      1.1  mrg static int count_defs (cpp_reader *, cpp_hashnode *, void *);
     31      1.1  mrg static int comp_hashnodes (const void *, const void *);
     32      1.1  mrg static int collect_ht_nodes (cpp_reader *, cpp_hashnode *, void *);
     33      1.1  mrg static int write_defs (cpp_reader *, cpp_hashnode *, void *);
     34      1.1  mrg static int save_macros (cpp_reader *, cpp_hashnode *, void *);
     35      1.1  mrg static int _cpp_save_pushed_macros (cpp_reader *, FILE *);
     36      1.1  mrg static int _cpp_restore_pushed_macros (cpp_reader *, FILE *);
     37      1.1  mrg 
     38      1.1  mrg /* This structure represents a macro definition on disk.  */
     39      1.1  mrg struct macrodef_struct
     40      1.1  mrg {
     41      1.1  mrg   unsigned int definition_length;
     42      1.1  mrg   unsigned short name_length;
     43      1.1  mrg   unsigned short flags;
     44      1.1  mrg };
     45      1.1  mrg 
     46      1.1  mrg /* This is how we write out a macro definition.
     47      1.1  mrg    Suitable for being called by cpp_forall_identifiers.  */
     48      1.1  mrg 
     49      1.1  mrg static int
     50      1.1  mrg write_macdef (cpp_reader *pfile, cpp_hashnode *hn, void *file_p)
     51      1.1  mrg {
     52      1.1  mrg   FILE *f = (FILE *) file_p;
     53      1.1  mrg   bool is_void = false;
     54      1.1  mrg   switch (hn->type)
     55      1.1  mrg     {
     56      1.1  mrg     case NT_VOID:
     57      1.1  mrg       if (! (hn->flags & NODE_POISONED))
     58      1.1  mrg 	return 1;
     59      1.1  mrg       is_void = true;
     60      1.1  mrg       goto poisoned;
     61      1.1  mrg 
     62      1.1  mrg     case NT_BUILTIN_MACRO:
     63      1.1  mrg       return 1;
     64      1.1  mrg 
     65      1.1  mrg     case NT_USER_MACRO:
     66      1.1  mrg       if (hn->value.macro->kind != cmk_assert)
     67      1.1  mrg 	{
     68      1.1  mrg 	poisoned:
     69      1.1  mrg 	  struct macrodef_struct s;
     70      1.1  mrg 	  const unsigned char *defn;
     71      1.1  mrg 
     72      1.1  mrg 	  s.name_length = NODE_LEN (hn);
     73      1.1  mrg 	  s.flags = hn->flags & NODE_POISONED;
     74      1.1  mrg 
     75      1.1  mrg 	  if (is_void)
     76      1.1  mrg 	    {
     77      1.1  mrg 	      defn = NODE_NAME (hn);
     78      1.1  mrg 	      s.definition_length = s.name_length;
     79      1.1  mrg 	    }
     80      1.1  mrg 	  else
     81      1.1  mrg 	    {
     82      1.1  mrg 	      defn = cpp_macro_definition (pfile, hn);
     83      1.1  mrg 	      s.definition_length = ustrlen (defn);
     84      1.1  mrg 	    }
     85      1.1  mrg 
     86      1.1  mrg 	  if (fwrite (&s, sizeof (s), 1, f) != 1
     87      1.1  mrg 	      || fwrite (defn, 1, s.definition_length, f) != s.definition_length)
     88      1.1  mrg 	    {
     89      1.1  mrg 	      cpp_errno (pfile, CPP_DL_ERROR,
     90      1.1  mrg 			 "while writing precompiled header");
     91      1.1  mrg 	      return 0;
     92      1.1  mrg 	    }
     93      1.1  mrg 	}
     94      1.1  mrg       return 1;
     95      1.1  mrg 
     96      1.1  mrg     default:
     97      1.1  mrg       abort ();
     98      1.1  mrg     }
     99      1.1  mrg }
    100      1.1  mrg 
    101      1.1  mrg /* This structure records the names of the defined macros.
    102      1.1  mrg    It's also used as a callback structure for size_initial_idents
    103      1.1  mrg    and save_idents.  */
    104      1.1  mrg 
    105      1.1  mrg struct cpp_savedstate
    106      1.1  mrg {
    107      1.1  mrg   /* A hash table of the defined identifiers.  */
    108      1.1  mrg   htab_t definedhash;
    109      1.1  mrg   /* The size of the definitions of those identifiers (the size of
    110      1.1  mrg      'definedstrs').  */
    111      1.1  mrg   size_t hashsize;
    112      1.1  mrg   /* Number of definitions */
    113      1.1  mrg   size_t n_defs;
    114      1.1  mrg   /* Array of definitions.  In cpp_write_pch_deps it is used for sorting.  */
    115      1.1  mrg   cpp_hashnode **defs;
    116      1.1  mrg   /* Space for the next definition.  Definitions are null-terminated
    117      1.1  mrg      strings.  */
    118      1.1  mrg   unsigned char *definedstrs;
    119      1.1  mrg };
    120      1.1  mrg 
    121      1.1  mrg /* Save this identifier into the state: put it in the hash table,
    122      1.1  mrg    put the definition in 'definedstrs'.  */
    123      1.1  mrg 
    124      1.1  mrg static int
    125      1.1  mrg save_idents (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p)
    126      1.1  mrg {
    127      1.1  mrg   struct cpp_savedstate *const ss = (struct cpp_savedstate *)ss_p;
    128      1.1  mrg 
    129      1.1  mrg   if (hn->type != NT_VOID)
    130      1.1  mrg     {
    131      1.1  mrg       struct cpp_string news;
    132      1.1  mrg       void **slot;
    133      1.1  mrg 
    134      1.1  mrg       news.len = NODE_LEN (hn);
    135      1.1  mrg       news.text= NODE_NAME (hn);
    136      1.1  mrg       slot = htab_find_slot (ss->definedhash, &news, INSERT);
    137      1.1  mrg       if (*slot == NULL)
    138      1.1  mrg 	{
    139      1.1  mrg 	  struct cpp_string *sp;
    140      1.1  mrg 	  unsigned char *text;
    141      1.1  mrg 
    142      1.1  mrg 	  sp = XNEW (struct cpp_string);
    143      1.1  mrg 	  *slot = sp;
    144      1.1  mrg 
    145      1.1  mrg 	  sp->len = NODE_LEN (hn);
    146      1.1  mrg 	  sp->text = text = XNEWVEC (unsigned char, NODE_LEN (hn));
    147      1.1  mrg 	  memcpy (text, NODE_NAME (hn), NODE_LEN (hn));
    148      1.1  mrg 	}
    149      1.1  mrg     }
    150      1.1  mrg 
    151      1.1  mrg   return 1;
    152      1.1  mrg }
    153      1.1  mrg 
    154      1.1  mrg /* Hash some memory in a generic way.  */
    155      1.1  mrg 
    156      1.1  mrg static hashval_t
    157      1.1  mrg hashmem (const void *p_p, size_t sz)
    158      1.1  mrg {
    159      1.1  mrg   const unsigned char *p = (const unsigned char *)p_p;
    160      1.1  mrg   size_t i;
    161      1.1  mrg   hashval_t h;
    162      1.1  mrg 
    163      1.1  mrg   h = 0;
    164      1.1  mrg   for (i = 0; i < sz; i++)
    165      1.1  mrg     h = h * 67 - (*p++ - 113);
    166      1.1  mrg   return h;
    167      1.1  mrg }
    168      1.1  mrg 
    169      1.1  mrg /* Hash a cpp string for the hashtable machinery.  */
    170      1.1  mrg 
    171      1.1  mrg static hashval_t
    172      1.1  mrg cpp_string_hash (const void *a_p)
    173      1.1  mrg {
    174      1.1  mrg   const struct cpp_string *a = (const struct cpp_string *) a_p;
    175      1.1  mrg   return hashmem (a->text, a->len);
    176      1.1  mrg }
    177      1.1  mrg 
    178      1.1  mrg /* Compare two cpp strings for the hashtable machinery.  */
    179      1.1  mrg 
    180      1.1  mrg static int
    181      1.1  mrg cpp_string_eq (const void *a_p, const void *b_p)
    182      1.1  mrg {
    183      1.1  mrg   const struct cpp_string *a = (const struct cpp_string *) a_p;
    184      1.1  mrg   const struct cpp_string *b = (const struct cpp_string *) b_p;
    185      1.1  mrg   return (a->len == b->len
    186      1.1  mrg 	  && memcmp (a->text, b->text, a->len) == 0);
    187      1.1  mrg }
    188      1.1  mrg 
    189      1.1  mrg /* Free memory associated with cpp_string.  */
    190      1.1  mrg 
    191      1.1  mrg static void
    192      1.1  mrg cpp_string_free (void *a_p)
    193      1.1  mrg {
    194      1.1  mrg   struct cpp_string *a = (struct cpp_string *) a_p;
    195      1.1  mrg   free ((void *) a->text);
    196      1.1  mrg   free (a);
    197      1.1  mrg }
    198      1.1  mrg 
    199      1.1  mrg /* Save the current definitions of the cpp_reader for dependency
    200      1.1  mrg    checking purposes.  When writing a precompiled header, this should
    201      1.1  mrg    be called at the same point in the compilation as cpp_valid_state
    202      1.1  mrg    would be called when reading the precompiled header back in.  */
    203      1.1  mrg 
    204      1.1  mrg int
    205      1.1  mrg cpp_save_state (cpp_reader *r, FILE *f)
    206      1.1  mrg {
    207      1.1  mrg   /* Save the list of non-void identifiers for the dependency checking.  */
    208      1.1  mrg   r->savedstate = XNEW (struct cpp_savedstate);
    209      1.1  mrg   r->savedstate->definedhash = htab_create (100, cpp_string_hash,
    210      1.1  mrg 					    cpp_string_eq, cpp_string_free);
    211      1.1  mrg   cpp_forall_identifiers (r, save_idents, r->savedstate);
    212      1.1  mrg 
    213      1.1  mrg   /* Write out the list of defined identifiers.  */
    214      1.1  mrg   cpp_forall_identifiers (r, write_macdef, f);
    215      1.1  mrg 
    216      1.1  mrg   return 0;
    217      1.1  mrg }
    218      1.1  mrg 
    219      1.1  mrg /* Calculate the 'hashsize' field of the saved state.  */
    220      1.1  mrg 
    221      1.1  mrg static int
    222      1.1  mrg count_defs (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p)
    223      1.1  mrg {
    224      1.1  mrg   struct cpp_savedstate *const ss = (struct cpp_savedstate *)ss_p;
    225      1.1  mrg 
    226      1.1  mrg   switch (hn->type)
    227      1.1  mrg     {
    228      1.1  mrg     case NT_BUILTIN_MACRO:
    229      1.1  mrg       return 1;
    230      1.1  mrg 
    231      1.1  mrg     case NT_USER_MACRO:
    232      1.1  mrg       if (hn->value.macro->kind == cmk_assert)
    233      1.1  mrg 	return 1;
    234      1.1  mrg 
    235      1.1  mrg       /* fall through.  */
    236      1.1  mrg 
    237      1.1  mrg     case NT_VOID:
    238      1.1  mrg       {
    239      1.1  mrg 	struct cpp_string news;
    240      1.1  mrg 	void **slot;
    241      1.1  mrg 
    242      1.1  mrg 	news.len = NODE_LEN (hn);
    243      1.1  mrg 	news.text = NODE_NAME (hn);
    244      1.1  mrg 	slot = (void **) htab_find (ss->definedhash, &news);
    245      1.1  mrg 	if (slot == NULL)
    246      1.1  mrg 	  {
    247      1.1  mrg 	    ss->hashsize += NODE_LEN (hn) + 1;
    248      1.1  mrg 	    ss->n_defs += 1;
    249      1.1  mrg 	  }
    250      1.1  mrg       }
    251      1.1  mrg       return 1;
    252      1.1  mrg 
    253      1.1  mrg     default:
    254      1.1  mrg       abort ();
    255      1.1  mrg     }
    256      1.1  mrg }
    257      1.1  mrg 
    258      1.1  mrg /* Collect the identifiers into the state's string table.  */
    259      1.1  mrg static int
    260      1.1  mrg write_defs (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p)
    261      1.1  mrg {
    262      1.1  mrg   struct cpp_savedstate *const ss = (struct cpp_savedstate *)ss_p;
    263      1.1  mrg 
    264      1.1  mrg   switch (hn->type)
    265      1.1  mrg     {
    266      1.1  mrg     case NT_BUILTIN_MACRO:
    267      1.1  mrg       return 1;
    268      1.1  mrg 
    269      1.1  mrg     case NT_USER_MACRO:
    270      1.1  mrg       if (hn->value.macro->kind == cmk_assert)
    271      1.1  mrg 	return 1;
    272      1.1  mrg 
    273      1.1  mrg       /* fall through.  */
    274      1.1  mrg 
    275      1.1  mrg     case NT_VOID:
    276      1.1  mrg       {
    277      1.1  mrg 	struct cpp_string news;
    278      1.1  mrg 	void **slot;
    279      1.1  mrg 
    280      1.1  mrg 	news.len = NODE_LEN (hn);
    281      1.1  mrg 	news.text = NODE_NAME (hn);
    282      1.1  mrg 	slot = (void **) htab_find (ss->definedhash, &news);
    283      1.1  mrg 	if (slot == NULL)
    284      1.1  mrg 	  {
    285      1.1  mrg 	    ss->defs[ss->n_defs] = hn;
    286      1.1  mrg 	    ss->n_defs += 1;
    287      1.1  mrg 	  }
    288      1.1  mrg       }
    289      1.1  mrg       return 1;
    290      1.1  mrg 
    291      1.1  mrg     default:
    292      1.1  mrg       abort ();
    293      1.1  mrg     }
    294      1.1  mrg }
    295      1.1  mrg 
    296      1.1  mrg /* Comparison function for qsort.  The arguments point to pointers of
    297      1.1  mrg    type ht_hashnode *.  */
    298      1.1  mrg static int
    299      1.1  mrg comp_hashnodes (const void *px, const void *py)
    300      1.1  mrg {
    301      1.1  mrg   cpp_hashnode *x = *(cpp_hashnode **) px;
    302      1.1  mrg   cpp_hashnode *y = *(cpp_hashnode **) py;
    303      1.1  mrg   return ustrcmp (NODE_NAME (x), NODE_NAME (y));
    304      1.1  mrg }
    305      1.1  mrg 
    306      1.1  mrg /* Write out the remainder of the dependency information.  This should be
    307      1.1  mrg    called after the PCH is ready to be saved.  */
    308      1.1  mrg 
    309      1.1  mrg int
    310      1.1  mrg cpp_write_pch_deps (cpp_reader *r, FILE *f)
    311      1.1  mrg {
    312      1.1  mrg   struct macrodef_struct z;
    313      1.1  mrg   struct cpp_savedstate *const ss = r->savedstate;
    314      1.1  mrg   unsigned char *definedstrs;
    315      1.1  mrg   size_t i;
    316      1.1  mrg 
    317      1.1  mrg   /* Collect the list of identifiers which have been seen and
    318      1.1  mrg      weren't defined to anything previously.  */
    319      1.1  mrg   ss->hashsize = 0;
    320      1.1  mrg   ss->n_defs = 0;
    321      1.1  mrg   cpp_forall_identifiers (r, count_defs, ss);
    322      1.1  mrg 
    323      1.1  mrg   ss->defs = XNEWVEC (cpp_hashnode *, ss->n_defs);
    324      1.1  mrg   ss->n_defs = 0;
    325      1.1  mrg   cpp_forall_identifiers (r, write_defs, ss);
    326      1.1  mrg 
    327      1.1  mrg   /* Sort the list, copy it into a buffer, and write it out.  */
    328      1.1  mrg   qsort (ss->defs, ss->n_defs, sizeof (cpp_hashnode *), &comp_hashnodes);
    329      1.1  mrg   definedstrs = ss->definedstrs = XNEWVEC (unsigned char, ss->hashsize);
    330      1.1  mrg   for (i = 0; i < ss->n_defs; ++i)
    331      1.1  mrg     {
    332      1.1  mrg       size_t len = NODE_LEN (ss->defs[i]);
    333      1.1  mrg       memcpy (definedstrs, NODE_NAME (ss->defs[i]), len + 1);
    334      1.1  mrg       definedstrs += len + 1;
    335      1.1  mrg     }
    336      1.1  mrg 
    337      1.1  mrg   memset (&z, 0, sizeof (z));
    338      1.1  mrg   z.definition_length = ss->hashsize;
    339      1.1  mrg   if (fwrite (&z, sizeof (z), 1, f) != 1
    340      1.1  mrg       || fwrite (ss->definedstrs, ss->hashsize, 1, f) != 1)
    341      1.1  mrg     {
    342      1.1  mrg       cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header");
    343      1.1  mrg       return -1;
    344      1.1  mrg     }
    345      1.1  mrg   free (ss->definedstrs);
    346      1.1  mrg   free (ss->defs);
    347      1.1  mrg   htab_delete (ss->definedhash);
    348      1.1  mrg 
    349      1.1  mrg   /* Free the saved state.  */
    350      1.1  mrg   free (ss);
    351      1.1  mrg   r->savedstate = NULL;
    352      1.1  mrg 
    353      1.1  mrg   /* Save the next value of __COUNTER__. */
    354      1.1  mrg   if (fwrite (&r->counter, sizeof (r->counter), 1, f) != 1)
    355      1.1  mrg     {
    356      1.1  mrg       cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header");
    357      1.1  mrg       return -1;
    358      1.1  mrg     }
    359      1.1  mrg 
    360      1.1  mrg   return 0;
    361      1.1  mrg }
    362      1.1  mrg 
    363      1.1  mrg /* Write out the definitions of the preprocessor, in a form suitable for
    364      1.1  mrg    cpp_read_state.  */
    365      1.1  mrg 
    366      1.1  mrg int
    367      1.1  mrg cpp_write_pch_state (cpp_reader *r, FILE *f)
    368      1.1  mrg {
    369      1.1  mrg   if (!r->deps)
    370      1.1  mrg     r->deps = deps_init ();
    371      1.1  mrg 
    372      1.1  mrg   if (deps_save (r->deps, f) != 0)
    373      1.1  mrg     {
    374      1.1  mrg       cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header");
    375      1.1  mrg       return -1;
    376      1.1  mrg     }
    377      1.1  mrg 
    378      1.1  mrg   if (! _cpp_save_file_entries (r, f))
    379      1.1  mrg     {
    380      1.1  mrg       cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header");
    381      1.1  mrg       return -1;
    382      1.1  mrg     }
    383      1.1  mrg 
    384      1.1  mrg   /* Save the next __COUNTER__ value.  When we include a precompiled header,
    385      1.1  mrg      we need to start at the offset we would have if the header had been
    386      1.1  mrg      included normally. */
    387      1.1  mrg   if (fwrite (&r->counter, sizeof (r->counter), 1, f) != 1)
    388      1.1  mrg     {
    389      1.1  mrg       cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header");
    390      1.1  mrg       return -1;
    391      1.1  mrg     }
    392      1.1  mrg 
    393      1.1  mrg   /* Write saved macros.  */
    394      1.1  mrg   if (! _cpp_save_pushed_macros (r, f))
    395      1.1  mrg     {
    396      1.1  mrg       cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header");
    397      1.1  mrg       return -1;
    398      1.1  mrg     }
    399      1.1  mrg 
    400      1.1  mrg   return 0;
    401      1.1  mrg }
    402      1.1  mrg 
    403      1.1  mrg static int
    404      1.1  mrg _cpp_restore_pushed_macros (cpp_reader *r, FILE *f)
    405      1.1  mrg {
    406      1.1  mrg   size_t count_saved = 0;
    407      1.1  mrg   size_t i;
    408      1.1  mrg   struct def_pragma_macro *p;
    409      1.1  mrg   size_t nlen;
    410      1.1  mrg   uchar *defn;
    411      1.1  mrg   size_t defnlen;
    412      1.1  mrg 
    413      1.1  mrg   if (fread (&count_saved, sizeof (count_saved), 1, f) != 1)
    414      1.1  mrg     return 0;
    415      1.1  mrg   if (! count_saved)
    416      1.1  mrg     return 1;
    417      1.1  mrg   for (i = 0; i < count_saved; i++)
    418      1.1  mrg     {
    419      1.1  mrg       if (fread (&nlen, sizeof (nlen), 1, f) != 1)
    420      1.1  mrg 	return 0;
    421      1.1  mrg       p = XNEW (struct def_pragma_macro);
    422      1.1  mrg       memset (p, 0, sizeof (struct def_pragma_macro));
    423      1.1  mrg       p->name = XNEWVAR (char, nlen + 1);
    424      1.1  mrg       p->name[nlen] = 0;
    425      1.1  mrg       if (fread (p->name, nlen, 1, f) != 1)
    426      1.1  mrg 	return 0;
    427      1.1  mrg       if (fread (&defnlen, sizeof (defnlen), 1, f) != 1)
    428      1.1  mrg 	return 0;
    429      1.1  mrg       if (defnlen == 0)
    430      1.1  mrg         p->is_undef = 1;
    431      1.1  mrg       else
    432      1.1  mrg         {
    433      1.1  mrg 	  defn = XNEWVEC (uchar, defnlen + 1);
    434      1.1  mrg 	  defn[defnlen] = 0;
    435      1.1  mrg 
    436      1.1  mrg 	  if (fread (defn, defnlen, 1, f) != 1)
    437      1.1  mrg 	    return 0;
    438      1.1  mrg 
    439      1.1  mrg 	  p->definition = defn;
    440      1.1  mrg 	  if (fread (&(p->line), sizeof (location_t), 1, f) != 1)
    441      1.1  mrg 	    return 0;
    442      1.1  mrg 	  defnlen = 0;
    443      1.1  mrg 	  if (fread (&defnlen, sizeof (defnlen), 1, f) != 1)
    444      1.1  mrg 	    return 0;
    445      1.1  mrg 	  p->syshdr = ((defnlen & 1) != 0 ? 1 : 0);
    446      1.1  mrg 	  p->used =  ((defnlen & 2) != 0 ? 1 : 0);
    447      1.1  mrg 	}
    448      1.1  mrg 
    449      1.1  mrg       p->next = r->pushed_macros;
    450      1.1  mrg       r->pushed_macros = p;
    451      1.1  mrg     }
    452      1.1  mrg   return 1;
    453      1.1  mrg }
    454      1.1  mrg 
    455      1.1  mrg static int
    456      1.1  mrg _cpp_save_pushed_macros (cpp_reader *r, FILE *f)
    457      1.1  mrg {
    458      1.1  mrg   size_t count_saved = 0;
    459      1.1  mrg   size_t i;
    460      1.1  mrg   struct def_pragma_macro *p,**pp;
    461      1.1  mrg   size_t defnlen;
    462      1.1  mrg 
    463      1.1  mrg   /* Get count. */
    464      1.1  mrg   p = r->pushed_macros;
    465      1.1  mrg   while (p != NULL)
    466      1.1  mrg     {
    467      1.1  mrg       count_saved++;
    468      1.1  mrg       p = p->next;
    469      1.1  mrg     }
    470      1.1  mrg   if (fwrite (&count_saved, sizeof (count_saved), 1, f) != 1)
    471      1.1  mrg     return 0;
    472      1.1  mrg   if (!count_saved)
    473      1.1  mrg     return 1;
    474      1.1  mrg 
    475      1.1  mrg   pp = (struct def_pragma_macro **) alloca (sizeof (struct def_pragma_macro *)
    476      1.1  mrg 					    * count_saved);
    477      1.1  mrg   /* Store them in reverse order.  */
    478      1.1  mrg   p = r->pushed_macros;
    479      1.1  mrg   i = count_saved;
    480      1.1  mrg   while (p != NULL)
    481      1.1  mrg     {
    482      1.1  mrg       --i;
    483      1.1  mrg       pp[i] = p;
    484      1.1  mrg       p = p->next;
    485      1.1  mrg     }
    486      1.1  mrg   for (i = 0; i < count_saved; i++)
    487      1.1  mrg     {
    488      1.1  mrg       defnlen = strlen (pp[i]->name);
    489      1.1  mrg       if (fwrite (&defnlen, sizeof (size_t), 1, f) != 1
    490      1.1  mrg 	  || fwrite (pp[i]->name, defnlen, 1, f) != 1)
    491      1.1  mrg 	return 0;
    492      1.1  mrg       if (pp[i]->is_undef)
    493      1.1  mrg 	{
    494      1.1  mrg 	  defnlen = 0;
    495      1.1  mrg 	  if (fwrite (&defnlen, sizeof (size_t), 1, f) != 1)
    496      1.1  mrg 	    return 0;
    497      1.1  mrg 	}
    498      1.1  mrg       else
    499      1.1  mrg         {
    500      1.1  mrg 	  defnlen = ustrlen (pp[i]->definition);
    501      1.1  mrg 	  if (fwrite (&defnlen, sizeof (size_t), 1, f) != 1
    502      1.1  mrg 	      || fwrite (pp[i]->definition, defnlen, 1, f) != 1)
    503      1.1  mrg 	    return 0;
    504      1.1  mrg 	  if (fwrite (&(pp[i]->line), sizeof (location_t), 1, f) != 1)
    505      1.1  mrg 	    return 0;
    506      1.1  mrg 	  defnlen = 0;
    507      1.1  mrg 	  defnlen |= (pp[i]->syshdr != 0 ? 1 : 0);
    508      1.1  mrg 	  defnlen |= (pp[i]->used != 0 ? 2 : 0);
    509      1.1  mrg 	  if (fwrite (&defnlen, sizeof (defnlen), 1, f) != 1)
    510      1.1  mrg 	    return 0;
    511      1.1  mrg 	}
    512      1.1  mrg     }
    513      1.1  mrg   return 1;
    514      1.1  mrg }
    515      1.1  mrg 
    516      1.1  mrg 
    517      1.1  mrg /* Data structure to transform hash table nodes into a sorted list */
    518      1.1  mrg 
    519      1.1  mrg struct ht_node_list
    520      1.1  mrg {
    521      1.1  mrg   /* Array of nodes */
    522      1.1  mrg   cpp_hashnode **defs;
    523      1.1  mrg   /* Number of nodes in the array */
    524      1.1  mrg   size_t n_defs;
    525      1.1  mrg   /* Size of the allocated array */
    526      1.1  mrg   size_t asize;
    527      1.1  mrg };
    528      1.1  mrg 
    529      1.1  mrg /* Callback for collecting identifiers from hash table */
    530      1.1  mrg 
    531      1.1  mrg static int
    532      1.1  mrg collect_ht_nodes (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn,
    533      1.1  mrg 		  void *nl_p)
    534      1.1  mrg {
    535      1.1  mrg   struct ht_node_list *const nl = (struct ht_node_list *)nl_p;
    536      1.1  mrg 
    537      1.1  mrg   if (hn->type != NT_VOID || hn->flags & NODE_POISONED)
    538      1.1  mrg     {
    539      1.1  mrg       if (nl->n_defs == nl->asize)
    540      1.1  mrg         {
    541      1.1  mrg           nl->asize *= 2;
    542      1.1  mrg           nl->defs = XRESIZEVEC (cpp_hashnode *, nl->defs, nl->asize);
    543      1.1  mrg         }
    544      1.1  mrg 
    545      1.1  mrg       nl->defs[nl->n_defs] = hn;
    546      1.1  mrg       ++nl->n_defs;
    547      1.1  mrg     }
    548      1.1  mrg   return 1;
    549      1.1  mrg }
    550      1.1  mrg 
    551      1.1  mrg 
    552      1.1  mrg /* Return nonzero if FD is a precompiled header which is consistent
    553      1.1  mrg    with the preprocessor's current definitions.  It will be consistent
    554      1.1  mrg    when:
    555      1.1  mrg 
    556      1.1  mrg    - anything that was defined just before the PCH was generated
    557      1.1  mrg      is defined the same way now; and
    558      1.1  mrg    - anything that was not defined then, but is defined now, was not
    559      1.1  mrg      used by the PCH.
    560      1.1  mrg 
    561      1.1  mrg    NAME is used to print warnings if `warn_invalid_pch' is set in the
    562      1.1  mrg    reader's flags.
    563      1.1  mrg */
    564      1.1  mrg 
    565      1.1  mrg int
    566      1.1  mrg cpp_valid_state (cpp_reader *r, const char *name, int fd)
    567      1.1  mrg {
    568      1.1  mrg   struct macrodef_struct m;
    569      1.1  mrg   size_t namebufsz = 256;
    570      1.1  mrg   unsigned char *namebuf = XNEWVEC (unsigned char, namebufsz);
    571      1.1  mrg   unsigned char *undeftab = NULL;
    572      1.1  mrg   struct ht_node_list nl = { 0, 0, 0 };
    573      1.1  mrg   unsigned char *first, *last;
    574      1.1  mrg   unsigned int i;
    575      1.1  mrg   unsigned int counter;
    576      1.1  mrg 
    577      1.1  mrg   /* Read in the list of identifiers that must be defined
    578      1.1  mrg      Check that they are defined in the same way.  */
    579      1.1  mrg   for (;;)
    580      1.1  mrg     {
    581      1.1  mrg       cpp_hashnode *h;
    582      1.1  mrg       const unsigned char *newdefn;
    583      1.1  mrg 
    584      1.1  mrg       if (read (fd, &m, sizeof (m)) != sizeof (m))
    585      1.1  mrg 	goto error;
    586      1.1  mrg 
    587      1.1  mrg       if (m.name_length == 0)
    588      1.1  mrg 	break;
    589      1.1  mrg 
    590      1.1  mrg       /* If this file is already preprocessed, there won't be any
    591      1.1  mrg 	 macros defined, and that's OK.  */
    592      1.1  mrg       if (CPP_OPTION (r, preprocessed))
    593      1.1  mrg 	{
    594      1.1  mrg 	  if (lseek (fd, m.definition_length, SEEK_CUR) == -1)
    595      1.1  mrg 	    goto error;
    596      1.1  mrg 	  continue;
    597      1.1  mrg 	}
    598      1.1  mrg 
    599      1.1  mrg       if (m.definition_length > namebufsz)
    600      1.1  mrg 	{
    601      1.1  mrg 	  free (namebuf);
    602      1.1  mrg 	  namebufsz = m.definition_length + 256;
    603      1.1  mrg 	  namebuf = XNEWVEC (unsigned char, namebufsz);
    604      1.1  mrg 	}
    605      1.1  mrg 
    606      1.1  mrg       if ((size_t)read (fd, namebuf, m.definition_length)
    607      1.1  mrg 	  != m.definition_length)
    608      1.1  mrg 	goto error;
    609      1.1  mrg 
    610      1.1  mrg       h = cpp_lookup (r, namebuf, m.name_length);
    611      1.1  mrg       if (m.flags & NODE_POISONED
    612      1.1  mrg 	  || h->flags & NODE_POISONED)
    613      1.1  mrg 	{
    614      1.1  mrg 	  if (CPP_OPTION (r, warn_invalid_pch))
    615      1.1  mrg 	    cpp_warning_syshdr (r, CPP_W_INVALID_PCH,
    616      1.1  mrg 		                "%s: not used because `%.*s' is poisoned",
    617      1.1  mrg 		                name, m.name_length, namebuf);
    618      1.1  mrg 	  goto fail;
    619      1.1  mrg 	}
    620      1.1  mrg 
    621      1.1  mrg       if (h->type == NT_VOID)
    622      1.1  mrg 	{
    623      1.1  mrg 	  /* It's ok if __GCC_HAVE_DWARF2_CFI_ASM becomes undefined,
    624      1.1  mrg 	     as in, when the PCH file is created with -g and we're
    625      1.1  mrg 	     attempting to use it without -g.  Restoring the PCH file
    626      1.1  mrg 	     is supposed to bring in this definition *and* enable the
    627      1.1  mrg 	     generation of call frame information, so that precompiled
    628      1.1  mrg 	     definitions that take this macro into account, to decide
    629      1.1  mrg 	     what asm to emit, won't issue .cfi directives when the
    630      1.1  mrg 	     compiler doesn't.  */
    631      1.1  mrg 	  if (!(h->flags & NODE_USED)
    632      1.1  mrg 	      && m.name_length == sizeof ("__GCC_HAVE_DWARF2_CFI_ASM") - 1
    633      1.1  mrg 	      && !memcmp (namebuf, "__GCC_HAVE_DWARF2_CFI_ASM", m.name_length))
    634      1.1  mrg 	    continue;
    635      1.1  mrg 
    636      1.1  mrg 	  if (CPP_OPTION (r, warn_invalid_pch))
    637      1.1  mrg 	    cpp_warning_syshdr (r, CPP_W_INVALID_PCH,
    638      1.1  mrg 		                "%s: not used because `%.*s' not defined",
    639      1.1  mrg 		                name, m.name_length, namebuf);
    640      1.1  mrg 	  goto fail;
    641      1.1  mrg 	}
    642      1.1  mrg 
    643      1.1  mrg       newdefn = cpp_macro_definition (r, h);
    644      1.1  mrg 
    645      1.1  mrg       if (m.definition_length != ustrlen (newdefn)
    646      1.1  mrg 	  || memcmp (namebuf, newdefn, m.definition_length) != 0)
    647      1.1  mrg 	{
    648      1.1  mrg 	  if (CPP_OPTION (r, warn_invalid_pch))
    649      1.1  mrg 	    cpp_warning_syshdr (r, CPP_W_INVALID_PCH,
    650      1.1  mrg 	       "%s: not used because `%.*s' defined as `%s' not `%.*s'",
    651      1.1  mrg 		       name, m.name_length, namebuf, newdefn + m.name_length,
    652      1.1  mrg 		       m.definition_length - m.name_length,
    653      1.1  mrg 		       namebuf +  m.name_length);
    654      1.1  mrg 	  goto fail;
    655      1.1  mrg 	}
    656      1.1  mrg     }
    657      1.1  mrg   free (namebuf);
    658      1.1  mrg   namebuf = NULL;
    659      1.1  mrg 
    660      1.1  mrg   /* Read in the list of identifiers that must not be defined.
    661      1.1  mrg      Check that they really aren't.  */
    662      1.1  mrg   undeftab = XNEWVEC (unsigned char, m.definition_length);
    663      1.1  mrg   if ((size_t) read (fd, undeftab, m.definition_length) != m.definition_length)
    664      1.1  mrg     goto error;
    665      1.1  mrg 
    666      1.1  mrg   /* Collect identifiers from the current hash table.  */
    667      1.1  mrg   nl.n_defs = 0;
    668      1.1  mrg   nl.asize = 10;
    669      1.1  mrg   nl.defs = XNEWVEC (cpp_hashnode *, nl.asize);
    670      1.1  mrg   cpp_forall_identifiers (r, &collect_ht_nodes, &nl);
    671      1.1  mrg   qsort (nl.defs, nl.n_defs, sizeof (cpp_hashnode *), &comp_hashnodes);
    672      1.1  mrg 
    673      1.1  mrg   /* Loop through nl.defs and undeftab, both of which are sorted lists.
    674      1.1  mrg      There should be no matches.  */
    675      1.1  mrg   first = undeftab;
    676      1.1  mrg   last = undeftab + m.definition_length;
    677      1.1  mrg   i = 0;
    678      1.1  mrg 
    679      1.1  mrg   while (first < last && i < nl.n_defs)
    680      1.1  mrg     {
    681      1.1  mrg       int cmp = ustrcmp (first, NODE_NAME (nl.defs[i]));
    682      1.1  mrg 
    683      1.1  mrg       if (cmp < 0)
    684      1.1  mrg  	first += ustrlen (first) + 1;
    685      1.1  mrg       else if (cmp > 0)
    686      1.1  mrg  	++i;
    687      1.1  mrg       else
    688      1.1  mrg 	{
    689      1.1  mrg 	  if (CPP_OPTION (r, warn_invalid_pch))
    690      1.1  mrg 	    cpp_warning_syshdr (r, CPP_W_INVALID_PCH,
    691      1.1  mrg 		                "%s: not used because `%s' is defined",
    692      1.1  mrg 		                name, first);
    693      1.1  mrg 	  goto fail;
    694      1.1  mrg 	}
    695      1.1  mrg     }
    696      1.1  mrg 
    697      1.1  mrg   free(nl.defs);
    698      1.1  mrg   nl.defs = NULL;
    699      1.1  mrg   free (undeftab);
    700      1.1  mrg   undeftab = NULL;
    701      1.1  mrg 
    702      1.1  mrg   /* Read in the next value of __COUNTER__.
    703      1.1  mrg      Check that (a) __COUNTER__ was not used in the pch or (b) __COUNTER__
    704      1.1  mrg      has not been used in this translation unit. */
    705      1.1  mrg   if (read (fd, &counter, sizeof (counter)) != sizeof (counter))
    706      1.1  mrg     goto error;
    707      1.1  mrg   if (counter && r->counter)
    708      1.1  mrg     {
    709      1.1  mrg       if (CPP_OPTION (r, warn_invalid_pch))
    710      1.1  mrg 	cpp_warning_syshdr (r, CPP_W_INVALID_PCH,
    711      1.1  mrg 		            "%s: not used because `__COUNTER__' is invalid",
    712      1.1  mrg 		            name);
    713      1.1  mrg       goto fail;
    714      1.1  mrg     }
    715      1.1  mrg 
    716      1.1  mrg   /* We win!  */
    717      1.1  mrg   return 0;
    718      1.1  mrg 
    719      1.1  mrg  error:
    720      1.1  mrg   cpp_errno (r, CPP_DL_ERROR, "while reading precompiled header");
    721      1.1  mrg 
    722      1.1  mrg  fail:
    723      1.1  mrg   free (namebuf);
    724      1.1  mrg   free (undeftab);
    725      1.1  mrg   free (nl.defs);
    726      1.1  mrg   return 1;
    727      1.1  mrg }
    728      1.1  mrg 
    729      1.1  mrg /* Save all the existing macros.  */
    730      1.1  mrg 
    731      1.1  mrg struct save_macro_data
    732      1.1  mrg {
    733      1.1  mrg   uchar **defns;
    734      1.1  mrg   size_t count;
    735      1.1  mrg   size_t array_size;
    736      1.1  mrg   char **saved_pragmas;
    737      1.1  mrg };
    738      1.1  mrg 
    739      1.1  mrg /* Save the definition of a single macro, so that it will persist
    740      1.1  mrg    across a PCH restore.  Because macro data is in GCed memory, which
    741      1.1  mrg    will be blown away by PCH, it must be temporarily copied to
    742      1.1  mrg    malloced memory.  (The macros will refer to identifier nodes which
    743      1.1  mrg    are also GCed and so on, so the copying is done by turning them
    744      1.1  mrg    into self-contained strings.)  The assumption is that most macro
    745      1.1  mrg    definitions will come from the PCH file, not from the compilation
    746      1.1  mrg    before the PCH file is loaded, so it doesn't matter that this is
    747      1.1  mrg    a little expensive.
    748      1.1  mrg 
    749      1.1  mrg    It would reduce the cost even further if macros defined in the PCH
    750      1.1  mrg    file were not saved in this way, but this is not done (yet), except
    751      1.1  mrg    for builtins, and for #assert by default.  */
    752      1.1  mrg 
    753      1.1  mrg static int
    754      1.1  mrg save_macros (cpp_reader *r, cpp_hashnode *h, void *data_p)
    755      1.1  mrg {
    756      1.1  mrg   struct save_macro_data *data = (struct save_macro_data *)data_p;
    757      1.1  mrg 
    758      1.1  mrg   if (cpp_user_macro_p (h))
    759      1.1  mrg     {
    760      1.1  mrg       if (data->count == data->array_size)
    761      1.1  mrg 	{
    762      1.1  mrg 	  data->array_size *= 2;
    763      1.1  mrg 	  data->defns = XRESIZEVEC (uchar *, data->defns, (data->array_size));
    764      1.1  mrg 	}
    765      1.1  mrg 
    766      1.1  mrg       const uchar * defn = cpp_macro_definition (r, h);
    767      1.1  mrg       size_t defnlen = ustrlen (defn);
    768      1.1  mrg 
    769      1.1  mrg       data->defns[data->count] = (uchar *) xmemdup (defn, defnlen, defnlen + 2);
    770      1.1  mrg       data->defns[data->count][defnlen] = '\n';
    771      1.1  mrg       data->count++;
    772      1.1  mrg     }
    773      1.1  mrg 
    774      1.1  mrg   return 1;
    775      1.1  mrg }
    776      1.1  mrg 
    777      1.1  mrg /* Prepare to restore the state, by saving the currently-defined
    778      1.1  mrg    macros in 'data'.  */
    779      1.1  mrg 
    780      1.1  mrg void
    781      1.1  mrg cpp_prepare_state (cpp_reader *r, struct save_macro_data **data)
    782      1.1  mrg {
    783      1.1  mrg   struct save_macro_data *d = XNEW (struct save_macro_data);
    784      1.1  mrg 
    785      1.1  mrg   d->array_size = 512;
    786      1.1  mrg   d->defns = XNEWVEC (uchar *, d->array_size);
    787      1.1  mrg   d->count = 0;
    788      1.1  mrg   cpp_forall_identifiers (r, save_macros, d);
    789      1.1  mrg   d->saved_pragmas = _cpp_save_pragma_names (r);
    790      1.1  mrg   *data = d;
    791      1.1  mrg }
    792      1.1  mrg 
    793      1.1  mrg /* Given a precompiled header that was previously determined to be valid,
    794      1.1  mrg    apply all its definitions (and undefinitions) to the current state.
    795      1.1  mrg    DEPNAME is passed to deps_restore.  */
    796      1.1  mrg 
    797      1.1  mrg int
    798      1.1  mrg cpp_read_state (cpp_reader *r, const char *name, FILE *f,
    799      1.1  mrg 		struct save_macro_data *data)
    800      1.1  mrg {
    801      1.1  mrg   size_t i;
    802      1.1  mrg   struct lexer_state old_state;
    803      1.1  mrg   unsigned int counter;
    804      1.1  mrg 
    805      1.1  mrg   /* Restore spec_nodes, which will be full of references to the old
    806      1.1  mrg      hashtable entries and so will now be invalid.  */
    807      1.1  mrg   {
    808      1.1  mrg     struct spec_nodes *s = &r->spec_nodes;
    809      1.1  mrg     s->n_defined	= cpp_lookup (r, DSC("defined"));
    810      1.1  mrg     s->n_true		= cpp_lookup (r, DSC("true"));
    811      1.1  mrg     s->n_false		= cpp_lookup (r, DSC("false"));
    812      1.1  mrg     s->n__VA_ARGS__     = cpp_lookup (r, DSC("__VA_ARGS__"));
    813      1.1  mrg     s->n__VA_OPT__      = cpp_lookup (r, DSC("__VA_OPT__"));
    814      1.1  mrg   }
    815      1.1  mrg 
    816      1.1  mrg   old_state = r->state;
    817      1.1  mrg   r->state.in_directive = 1;
    818      1.1  mrg   r->state.prevent_expansion = 1;
    819      1.1  mrg   r->state.angled_headers = 0;
    820      1.1  mrg 
    821      1.1  mrg   /* Run through the carefully-saved macros, insert them.  */
    822      1.1  mrg   for (i = 0; i < data->count; i++)
    823      1.1  mrg     {
    824      1.1  mrg       cpp_hashnode *h;
    825      1.1  mrg       size_t namelen;
    826      1.1  mrg       uchar *defn;
    827      1.1  mrg 
    828      1.1  mrg       namelen = ustrcspn (data->defns[i], "( \n");
    829      1.1  mrg       h = cpp_lookup (r, data->defns[i], namelen);
    830      1.1  mrg       defn = data->defns[i] + namelen;
    831      1.1  mrg 
    832      1.1  mrg       /* The PCH file is valid, so we know that if there is a definition
    833      1.1  mrg 	 from the PCH file it must be the same as the one we had
    834      1.1  mrg 	 originally, and so do not need to restore it.  */
    835      1.1  mrg       if (h->type == NT_VOID)
    836      1.1  mrg 	{
    837      1.1  mrg 	  if (cpp_push_buffer (r, defn, ustrchr (defn, '\n') - defn, true)
    838      1.1  mrg 	      != NULL)
    839      1.1  mrg 	    {
    840      1.1  mrg 	      _cpp_clean_line (r);
    841  1.1.1.2  mrg 
    842  1.1.1.2  mrg 	      /* ??? Using r->line_table->highest_line is not ideal here, but we
    843  1.1.1.2  mrg 		 do need to use some location that is relative to the new line
    844  1.1.1.2  mrg 		 map just loaded, not the old one that was in effect when these
    845  1.1.1.2  mrg 		 macros were lexed.  The proper fix is to remember the file name
    846  1.1.1.2  mrg 		 and line number where each macro was defined, and then add
    847  1.1.1.2  mrg 		 these locations into the new line map.  See PR105608.  */
    848  1.1.1.2  mrg 	      if (!_cpp_create_definition (r, h, r->line_table->highest_line))
    849      1.1  mrg 		abort ();
    850      1.1  mrg 	      _cpp_pop_buffer (r);
    851      1.1  mrg 	    }
    852      1.1  mrg 	  else
    853      1.1  mrg 	    abort ();
    854      1.1  mrg 	}
    855      1.1  mrg 
    856      1.1  mrg       free (data->defns[i]);
    857      1.1  mrg     }
    858      1.1  mrg   r->state = old_state;
    859      1.1  mrg 
    860      1.1  mrg   _cpp_restore_pragma_names (r, data->saved_pragmas);
    861      1.1  mrg 
    862      1.1  mrg   free (data);
    863      1.1  mrg 
    864      1.1  mrg   if (deps_restore (r->deps, f, CPP_OPTION (r, restore_pch_deps) ? name : NULL)
    865      1.1  mrg       != 0)
    866      1.1  mrg     goto error;
    867      1.1  mrg 
    868      1.1  mrg   if (! _cpp_read_file_entries (r, f))
    869      1.1  mrg     goto error;
    870      1.1  mrg 
    871      1.1  mrg   if (fread (&counter, sizeof (counter), 1, f) != 1)
    872      1.1  mrg     goto error;
    873      1.1  mrg 
    874      1.1  mrg   if (!r->counter)
    875      1.1  mrg     r->counter = counter;
    876      1.1  mrg 
    877      1.1  mrg   /* Read pushed macros. */
    878      1.1  mrg   if (! _cpp_restore_pushed_macros (r, f))
    879      1.1  mrg     goto error;
    880      1.1  mrg   return 0;
    881      1.1  mrg 
    882      1.1  mrg  error:
    883      1.1  mrg   cpp_errno (r, CPP_DL_ERROR, "while reading precompiled header");
    884      1.1  mrg   return -1;
    885      1.1  mrg }
    886