OSDN Git Service

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