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