]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cppfiles.c
h8300.md (four define_peephole2's): Use h8300_regs_ok_for_stm().
[thirdparty/gcc.git] / gcc / cppfiles.c
CommitLineData
8f9b4009 1/* Part of CPP library. File handling.
5793b276 2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
73e61092 3 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
add7091b
ZW
4 Written by Per Bothner, 1994.
5 Based on CCCP program by Paul Rubin, June 1986
6 Adapted to ANSI C, Richard Stallman, Jan 1987
7 Split out of cpplib.c, Zack Weinberg, Oct 1998
8f9b4009 8 Reimplemented, Neil Booth, Jul 2003
add7091b
ZW
9
10This program is free software; you can redistribute it and/or modify it
11under the terms of the GNU General Public License as published by the
12Free Software Foundation; either version 2, or (at your option) any
13later version.
14
15This program is distributed in the hope that it will be useful,
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
21along with this program; if not, write to the Free Software
e38992e8 22Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
add7091b
ZW
23
24#include "config.h"
25#include "system.h"
add7091b 26#include "cpplib.h"
88ae23e7 27#include "cpphash.h"
c1212d2f 28#include "intl.h"
168d3732 29#include "mkdeps.h"
bf42e45b 30#include "hashtab.h"
73e61092 31#include "md5.h"
8f9b4009 32#include <dirent.h>
f8f769ea 33
8f9b4009
NB
34/* Variable length record files on VMS will have a stat size that includes
35 record control characters that won't be included in the read size. */
36#ifdef VMS
37# define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */
38# define STAT_SIZE_RELIABLE(ST) ((ST).st_fab_rfm != FAB_C_VAR)
39#else
40# define STAT_SIZE_RELIABLE(ST) true
d7a2e0f7
ZW
41#endif
42
8f9b4009
NB
43#ifdef __DJGPP__
44 /* For DJGPP redirected input is opened in text mode. */
45# define set_stdin_to_binary_mode() \
46 if (! isatty (0)) setmode (0, O_BINARY)
47#else
48# define set_stdin_to_binary_mode() /* Nothing */
49#endif
50
51#ifndef O_BINARY
52# define O_BINARY 0
a58d32c2 53#endif
a58d32c2 54
8f9b4009
NB
55/* This structure represents a file searched for by CPP, whether it
56 exists or not. An instance may be pointed to by more than one
57 file_hash_entry; at present no reference count is kept. */
8f9b4009
NB
58struct _cpp_file
59{
60 /* Filename as given to #include or command line switch. */
61 const char *name;
642ce434 62
8f9b4009
NB
63 /* The full path used to find the file. */
64 const char *path;
ae1139f9 65
8f9b4009
NB
66 /* The full path of the pch file. */
67 const char *pchname;
add7091b 68
bf42e45b
NB
69 /* The file's path with the basename stripped. NULL if it hasn't
70 been calculated yet. */
8f9b4009 71 const char *dir_name;
c71f835b 72
49634b3a
NB
73 /* Chain through all files. */
74 struct _cpp_file *next_file;
a36c54fa 75
8f9b4009
NB
76 /* The contents of NAME after calling read_file(). */
77 const uchar *buffer;
a36c54fa 78
8f9b4009
NB
79 /* The macro, if any, preventing re-inclusion. */
80 const cpp_hashnode *cmacro;
642ce434 81
8f9b4009
NB
82 /* The directory in the search path where FILE was found. Used for
83 #include_next and determining whether a header is a system
bf42e45b 84 header. */
8f9b4009 85 cpp_dir *dir;
a36c54fa 86
8f9b4009
NB
87 /* As filled in by stat(2) for the file. */
88 struct stat st;
a36c54fa 89
8f9b4009
NB
90 /* File descriptor. Invalid if -1, otherwise open. */
91 int fd;
d6d52dd6 92
8f9b4009
NB
93 /* Zero if this file was successfully opened and stat()-ed,
94 otherwise errno obtained from failure. */
95 int err_no;
add7091b 96
8f9b4009
NB
97 /* Number of times the file has been stacked for preprocessing. */
98 unsigned short stack_count;
2047e26f 99
49634b3a
NB
100 /* If opened with #import or contains #pragma once. */
101 bool once_only;
add7091b 102
8f9b4009
NB
103 /* If read() failed before. */
104 bool dont_read;
add7091b 105
8f9b4009
NB
106 /* If this file is the main file. */
107 bool main_file;
add7091b 108
8f9b4009
NB
109 /* If BUFFER above contains the true contents of the file. */
110 bool buffer_valid;
b0699dad 111
8f9b4009
NB
112 /* 0: file not known to be a PCH.
113 1: file is a PCH (on return from find_include_file).
114 2: file is not and never will be a valid precompiled header.
115 3: file is always a valid precompiled header. */
116 uchar pch;
117};
d4506961 118
8f9b4009
NB
119/* A singly-linked list for all searches for a given file name, with
120 its head pointed to by a slot in FILE_HASH. The file name is what
121 appeared between the quotes in a #include directive; it can be
a98ebe2e 122 determined implicitly from the hash table location or explicitly
bf42e45b 123 from FILE->name.
8f9b4009
NB
124
125 FILE is a structure containing details about the file that was
126 found with that search, or details of how the search failed.
127
128 START_DIR is the starting location of the search in the include
129 chain. The current directories for "" includes are also hashed in
bf42e45b
NB
130 the hash table and therefore unique. Files that are looked up
131 without using a search path, such as absolute filenames and file
132 names from the command line share a special starting directory so
133 they don't cause cache hits with normal include-chain lookups.
8f9b4009
NB
134
135 If START_DIR is NULL then the entry is for a directory, not a file,
136 and the directory is in DIR. Since the starting point in a file
137 lookup chain is never NULL, this means that simple pointer
138 comparisons against START_DIR can be made to determine cache hits
139 in file lookups.
bf42e45b
NB
140
141 If a cache lookup fails because of e.g. an extra "./" in the path,
142 then nothing will break. It is just less efficient as CPP will
143 have to do more work re-preprocessing the file, and/or comparing
144 its contents against earlier once-only files.
8f9b4009
NB
145*/
146struct file_hash_entry
147{
148 struct file_hash_entry *next;
149 cpp_dir *start_dir;
150 union
151 {
152 _cpp_file *file;
153 cpp_dir *dir;
154 } u;
155};
156
157static bool open_file (_cpp_file *file);
3d67ba1e
GK
158static bool pch_open_file (cpp_reader *pfile, _cpp_file *file,
159 bool *invalid_pch);
160static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file,
161 bool *invalid_pch);
8f9b4009
NB
162static bool read_file_guts (cpp_reader *pfile, _cpp_file *file);
163static bool read_file (cpp_reader *pfile, _cpp_file *file);
cf1ee30c 164static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import);
8f9b4009
NB
165static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
166 int angle_brackets, enum include_type);
167static const char *dir_name_of_file (_cpp_file *file);
168static void open_file_failed (cpp_reader *pfile, _cpp_file *file);
169static struct file_hash_entry *search_cache (struct file_hash_entry *head,
170 const cpp_dir *start_dir);
171static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
172static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp);
173static void allocate_file_hash_entries (cpp_reader *pfile);
174static struct file_hash_entry *new_file_hash_entry (cpp_reader *pfile);
175static int report_missing_guard (void **slot, void *b);
b92be669
PB
176static hashval_t file_hash_hash (const void *p);
177static int file_hash_eq (const void *p, const void *q);
8f9b4009
NB
178static char *read_filename_string (int ch, FILE *f);
179static void read_name_map (cpp_dir *dir);
180static char *remap_filename (cpp_reader *pfile, _cpp_file *file);
181static char *append_file_to_dir (const char *fname, cpp_dir *dir);
182static bool validate_pch (cpp_reader *, _cpp_file *file, const char *pchname);
183static bool include_pch_p (_cpp_file *file);
73e61092
GK
184static int pchf_adder (void **slot, void *data);
185static int pchf_save_compare (const void *e1, const void *e2);
186static int pchf_compare (const void *d_p, const void *e_p);
187static bool check_file_against_entries (cpp_reader *, _cpp_file *, bool);
8f9b4009
NB
188
189/* Given a filename in FILE->PATH, with the empty string interpreted
190 as <stdin>, open it.
191
192 On success FILE contains an open file descriptor and stat
193 information for the file. On failure the file descriptor is -1 and
194 the appropriate errno is also stored in FILE. Returns TRUE iff
195 successful.
196
197 We used to open files in nonblocking mode, but that caused more
198 problems than it solved. Do take care not to acquire a controlling
199 terminal by mistake (this can't happen on sane systems, but
200 paranoia is a virtue).
201
202 Use the three-argument form of open even though we aren't
203 specifying O_CREAT, to defend against broken system headers.
204
205 O_BINARY tells some runtime libraries (notably DJGPP) not to do
206 newline translation; we can handle DOS line breaks just fine
207 ourselves. */
208static bool
209open_file (_cpp_file *file)
210{
211 if (file->path[0] == '\0')
85be8c2d
AP
212 {
213 file->fd = 0;
8f9b4009 214 set_stdin_to_binary_mode ();
85be8c2d 215 }
f2d5f0cc 216 else
8f9b4009 217 file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
a58d32c2 218
8f9b4009 219 if (file->fd != -1)
2047e26f 220 {
8f9b4009
NB
221 if (fstat (file->fd, &file->st) == 0)
222 {
223 if (!S_ISDIR (file->st.st_mode))
224 {
225 file->err_no = 0;
226 return true;
227 }
228
229 /* Ignore a directory and continue the search. The file we're
230 looking for may be elsewhere in the search path. */
231 errno = ENOENT;
232 }
55485cd9 233
55485cd9
ZW
234 close (file->fd);
235 file->fd = -1;
2047e26f 236 }
a54c550f
NB
237 else if (errno == ENOTDIR)
238 errno = ENOENT;
a58d32c2 239
f277b5e0 240 file->err_no = errno;
8f9b4009
NB
241
242 return false;
a58d32c2
ZW
243}
244
3d67ba1e
GK
245/* Temporary PCH intercept of opening a file. Try to find a PCH file
246 based on FILE->name and FILE->dir, and test those found for
247 validity using PFILE->cb.valid_pch. Return true iff a valid file is
248 found. Set *INVALID_PCH if a PCH file is found but wasn't valid. */
249
8f9b4009 250static bool
3d67ba1e 251pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
17211ab5 252{
8f9b4009
NB
253 static const char extension[] = ".gch";
254 const char *path = file->path;
255 size_t len, flen;
256 char *pchname;
257 struct stat st;
258 bool valid = false;
259
260 /* No PCH on <stdin> or if not requested. */
261 if (file->name[0] == '\0' || !pfile->cb.valid_pch)
262 return false;
17211ab5 263
8f9b4009
NB
264 flen = strlen (path);
265 len = flen + sizeof (extension);
266 pchname = xmalloc (len);
267 memcpy (pchname, path, flen);
268 memcpy (pchname + flen, extension, sizeof (extension));
17211ab5 269
8f9b4009 270 if (stat (pchname, &st) == 0)
17211ab5 271 {
8f9b4009
NB
272 DIR *pchdir;
273 struct dirent *d;
274 size_t dlen, plen = len;
275
276 if (!S_ISDIR (st.st_mode))
277 valid = validate_pch (pfile, file, pchname);
278 else if ((pchdir = opendir (pchname)) != NULL)
17211ab5 279 {
8f9b4009
NB
280 pchname[plen - 1] = '/';
281 while ((d = readdir (pchdir)) != NULL)
8d973a83 282 {
8f9b4009 283 dlen = strlen (d->d_name) + 1;
230fcd32
PE
284 if ((strcmp (d->d_name, ".") == 0)
285 || (strcmp (d->d_name, "..") == 0))
286 continue;
8f9b4009 287 if (dlen + plen > len)
17211ab5 288 {
8f9b4009
NB
289 len += dlen + 64;
290 pchname = xrealloc (pchname, len);
17211ab5 291 }
8f9b4009
NB
292 memcpy (pchname + plen, d->d_name, dlen);
293 valid = validate_pch (pfile, file, pchname);
294 if (valid)
8d973a83 295 break;
17211ab5 296 }
8f9b4009 297 closedir (pchdir);
17211ab5 298 }
bcad4ca2
RS
299 if (valid)
300 file->pch = true;
301 else
302 *invalid_pch = true;
17211ab5 303 }
8d973a83 304
8f9b4009
NB
305 if (valid)
306 file->pchname = pchname;
307 else
308 free (pchname);
309
310 return valid;
17211ab5
GK
311}
312
8f9b4009 313/* Try to open the path FILE->name appended to FILE->dir. This is
cf1ee30c 314 where remap and PCH intercept the file lookup process. Return true
16dd5cfe 315 if the file was found, whether or not the open was successful.
3d67ba1e
GK
316 Set *INVALID_PCH to true if a PCH file is found but wasn't valid. */
317
e5eba70a 318static bool
3d67ba1e 319find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
a58d32c2 320{
8f9b4009 321 char *path;
51d0f328 322
8f9b4009
NB
323 if (CPP_OPTION (pfile, remap) && (path = remap_filename (pfile, file)))
324 ;
325 else
326 path = append_file_to_dir (file->name, file->dir);
e5eba70a 327
8f9b4009 328 file->path = path;
3d67ba1e 329 if (pch_open_file (pfile, file, invalid_pch))
8f9b4009 330 return true;
51d0f328 331
8f9b4009
NB
332 if (open_file (file))
333 return true;
51d0f328 334
cf1ee30c
NB
335 if (file->err_no != ENOENT)
336 {
337 open_file_failed (pfile, file);
338 return true;
339 }
340
8f9b4009 341 free (path);
cf1ee30c 342 file->path = file->name;
8f9b4009
NB
343 return false;
344}
345
4dc299fb
PB
346bool
347_cpp_find_failed (_cpp_file *file)
348{
349 return file->err_no != 0;
350}
351
8f9b4009
NB
352/* Given a filename FNAME search for such a file in the include path
353 starting from START_DIR. If FNAME is the empty string it is
354 interpreted as STDIN if START_DIR is PFILE->no_seach_path.
355
356 If the file is not found in the file cache fall back to the O/S and
357 add the result to our cache.
358
359 If the file was not found in the filesystem, or there was an error
02fa63cd 360 opening it, then ERR_NO is nonzero and FD is -1. If the file was
8f9b4009
NB
361 found, then ERR_NO is zero and FD could be -1 or an open file
362 descriptor. FD can be -1 if the file was found in the cache and
363 had previously been closed. To open it again pass the return value
364 to open_file().
365*/
4dc299fb
PB
366_cpp_file *
367_cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool fake)
8f9b4009
NB
368{
369 struct file_hash_entry *entry, **hash_slot;
370 _cpp_file *file;
3d67ba1e 371 bool invalid_pch = false;
8f9b4009
NB
372
373 /* Ensure we get no confusion between cached files and directories. */
374 if (start_dir == NULL)
0527bc4e 375 cpp_error (pfile, CPP_DL_ICE, "NULL directory in find_file");
8f9b4009
NB
376
377 hash_slot = (struct file_hash_entry **)
b92be669
PB
378 htab_find_slot_with_hash (pfile->file_hash, fname,
379 htab_hash_string (fname),
380 INSERT);
17211ab5 381
8f9b4009
NB
382 /* First check the cache before we resort to memory allocation. */
383 entry = search_cache (*hash_slot, start_dir);
384 if (entry)
385 return entry->u.file;
386
387 file = make_cpp_file (pfile, start_dir, fname);
388
389 /* Try each path in the include chain. */
390 for (; !fake ;)
7c092714 391 {
3d67ba1e 392 if (find_file_in_dir (pfile, file, &invalid_pch))
8f9b4009
NB
393 break;
394
cf1ee30c
NB
395 file->dir = file->dir->next;
396 if (file->dir == NULL)
e5eba70a 397 {
8f9b4009 398 open_file_failed (pfile, file);
3d67ba1e
GK
399 if (invalid_pch)
400 {
16dd5cfe 401 cpp_error (pfile, CPP_DL_ERROR,
e235d8bf
GK
402 "one or more PCH files were found, but they were invalid");
403 if (!cpp_get_options (pfile)->warn_invalid_pch)
16dd5cfe 404 cpp_error (pfile, CPP_DL_ERROR,
e235d8bf 405 "use -Winvalid-pch for more information");
3d67ba1e 406 }
8f9b4009 407 break;
e5eba70a 408 }
eb1f4d9d 409
8f9b4009
NB
410 /* Only check the cache for the starting location (done above)
411 and the quote and bracket chain heads because there are no
412 other possible starting points for searches. */
413 if (file->dir != pfile->bracket_include
414 && file->dir != pfile->quote_include)
415 continue;
a58d32c2 416
8f9b4009
NB
417 entry = search_cache (*hash_slot, file->dir);
418 if (entry)
49634b3a
NB
419 break;
420 }
421
422 if (entry)
423 {
424 /* Cache for START_DIR too, sharing the _cpp_file structure. */
425 free ((char *) file->name);
426 free (file);
427 file = entry->u.file;
428 }
429 else
430 {
431 /* This is a new file; put it in the list. */
432 file->next_file = pfile->all_files;
433 pfile->all_files = file;
8f9b4009 434 }
eb1f4d9d 435
8f9b4009
NB
436 /* Store this new result in the hash table. */
437 entry = new_file_hash_entry (pfile);
438 entry->next = *hash_slot;
439 entry->start_dir = start_dir;
440 entry->u.file = file;
441 *hash_slot = entry;
e5eba70a 442
8f9b4009 443 return file;
a58d32c2
ZW
444}
445
8f9b4009 446/* Read a file into FILE->buffer, returning true on success.
a58d32c2 447
8f9b4009
NB
448 If FILE->fd is something weird, like a block device, we don't want
449 to read it at all. Don't even try to figure out what something is,
450 except for plain files and block devices, since there is no
451 reliable portable way of doing this.
a58d32c2
ZW
452
453 FIXME: Flush file cache and try again if we run out of memory. */
8f9b4009
NB
454static bool
455read_file_guts (cpp_reader *pfile, _cpp_file *file)
a58d32c2 456{
8f9b4009 457 ssize_t size, total, count;
562a5c27 458 uchar *buf;
8f9b4009 459 bool regular;
16dd5cfe 460
8f9b4009
NB
461 if (S_ISBLK (file->st.st_mode))
462 {
0527bc4e 463 cpp_error (pfile, CPP_DL_ERROR, "%s is a block device", file->path);
8f9b4009
NB
464 return false;
465 }
a58d32c2 466
8f9b4009
NB
467 regular = S_ISREG (file->st.st_mode);
468 if (regular)
f2d5f0cc 469 {
a58d32c2
ZW
470 /* off_t might have a wider range than ssize_t - in other words,
471 the max size of a file might be bigger than the address
472 space. We can't handle a file that large. (Anyone with
473 a single source file bigger than 2GB needs to rethink
474 their coding style.) Some systems (e.g. AIX 4.1) define
475 SSIZE_MAX to be much smaller than the actual range of the
476 type. Use INTTYPE_MAXIMUM unconditionally to ensure this
477 does not bite us. */
8f9b4009 478 if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
f2d5f0cc 479 {
0527bc4e 480 cpp_error (pfile, CPP_DL_ERROR, "%s is too large", file->path);
8f9b4009 481 return false;
f2d5f0cc 482 }
a58d32c2 483
8f9b4009
NB
484 size = file->st.st_size;
485 }
486 else
487 /* 8 kilobytes is a sensible starting size. It ought to be bigger
488 than the kernel pipe buffer, and it's definitely bigger than
489 the majority of C source files. */
490 size = 8 * 1024;
491
492 buf = xmalloc (size + 1);
493 total = 0;
494 while ((count = read (file->fd, buf + total, size - total)) > 0)
495 {
496 total += count;
497
498 if (total == size)
d4506961 499 {
8f9b4009
NB
500 if (regular)
501 break;
502 size *= 2;
503 buf = xrealloc (buf, size + 1);
d4506961 504 }
a58d32c2 505 }
8f9b4009
NB
506
507 if (count < 0)
a58d32c2 508 {
0527bc4e 509 cpp_errno (pfile, CPP_DL_ERROR, file->path);
8f9b4009 510 return false;
a58d32c2 511 }
8f9b4009
NB
512
513 if (regular && total != size && STAT_SIZE_RELIABLE (file->st))
0527bc4e
JDA
514 cpp_error (pfile, CPP_DL_WARNING,
515 "%s is shorter than expected", file->path);
8f9b4009 516
16dd5cfe
EC
517 file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset),
518 buf, size, total, &file->st.st_size);
8f9b4009
NB
519 file->buffer_valid = true;
520
521 return true;
522}
523
524/* Convenience wrapper around read_file_guts that opens the file if
a98ebe2e 525 necessary and closes the file descriptor after reading. FILE must
8f9b4009
NB
526 have been passed through find_file() at some stage. */
527static bool
528read_file (cpp_reader *pfile, _cpp_file *file)
529{
8f9b4009
NB
530 /* If we already have its contents in memory, succeed immediately. */
531 if (file->buffer_valid)
532 return true;
a58d32c2 533
8f9b4009
NB
534 /* If an earlier read failed for some reason don't try again. */
535 if (file->dont_read || file->err_no)
536 return false;
4d6baafa 537
8f9b4009
NB
538 if (file->fd == -1 && !open_file (file))
539 {
540 open_file_failed (pfile, file);
541 return false;
f2d5f0cc 542 }
d7a2e0f7 543
8f9b4009
NB
544 file->dont_read = !read_file_guts (pfile, file);
545 close (file->fd);
546 file->fd = -1;
a58d32c2 547
8f9b4009 548 return !file->dont_read;
a58d32c2
ZW
549}
550
cf1ee30c
NB
551/* Returns TRUE if FILE's contents have been successfully placed in
552 FILE->buffer and the file should be stacked, otherwise false. */
8f9b4009 553static bool
cf1ee30c 554should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
a58d32c2 555{
cf1ee30c 556 _cpp_file *f;
8f9b4009 557
49634b3a
NB
558 /* Skip once-only files. */
559 if (file->once_only)
560 return false;
561
16dd5cfe 562 /* We must mark the file once-only if #import now, before header
49634b3a
NB
563 guard checks. Otherwise, undefining the header guard might
564 cause the file to be re-stacked. */
565 if (import)
566 {
567 _cpp_mark_file_once_only (pfile, file);
568
569 /* Don't stack files that have been stacked before. */
570 if (file->stack_count)
571 return false;
572 }
573
cf1ee30c
NB
574 /* Skip if the file had a header guard and the macro is defined.
575 PCH relies on this appearing before the PCH handler below. */
576 if (file->cmacro && file->cmacro->type == NT_MACRO)
bf42e45b
NB
577 return false;
578
cf1ee30c
NB
579 /* Handle PCH files immediately; don't stack them. */
580 if (include_pch_p (file))
c31a6508 581 {
cf1ee30c
NB
582 pfile->cb.read_pch (pfile, file->path, file->fd, file->pchname);
583 close (file->fd);
584 file->fd = -1;
585 return false;
c31a6508 586 }
8f9b4009 587
8f9b4009
NB
588 if (!read_file (pfile, file))
589 return false;
c31a6508 590
73e61092
GK
591 /* Check the file against the PCH file. This is done before
592 checking against files we've already seen, since it may save on
593 I/O. */
594 if (check_file_against_entries (pfile, file, import))
595 {
596 /* If this isn't a #import, but yet we can't include the file,
597 that means that it was #import-ed in the PCH file,
598 so we can never include it again. */
599 if (! import)
600 _cpp_mark_file_once_only (pfile, file);
601 return false;
602 }
603
49634b3a
NB
604 /* Now we've read the file's contents, we can stack it if there
605 are no once-only files. */
606 if (!pfile->seen_once_only)
cf1ee30c
NB
607 return true;
608
49634b3a 609 /* We may have read the file under a different name. Look
8f9b4009 610 for likely candidates and compare file contents to be sure. */
49634b3a 611 for (f = pfile->all_files; f; f = f->next_file)
8f9b4009
NB
612 {
613 if (f == file)
614 continue;
615
49634b3a
NB
616 if ((import || f->once_only)
617 && f->err_no == 0
8f9b4009
NB
618 && f->st.st_mtime == file->st.st_mtime
619 && f->st.st_size == file->st.st_size
620 && read_file (pfile, f)
621 /* Size might have changed in read_file(). */
622 && f->st.st_size == file->st.st_size
623 && !memcmp (f->buffer, file->buffer, f->st.st_size))
bf42e45b 624 break;
0b3d776a 625 }
8f9b4009 626
cf1ee30c
NB
627 return f == NULL;
628}
629
630/* Place the file referenced by FILE into a new buffer on the buffer
631 stack if possible. IMPORT is true if this stacking attempt is
632 because of a #import directive. Returns true if a buffer is
633 stacked. */
4dc299fb
PB
634bool
635_cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
cf1ee30c
NB
636{
637 cpp_buffer *buffer;
638 int sysp;
639
640 if (!should_stack_file (pfile, file, import))
641 return false;
642
12f9df4e
PB
643 if (pfile->buffer == NULL || file->dir == NULL)
644 sysp = 0;
645 else
646 sysp = MAX (pfile->buffer->sysp, file->dir->sysp);
cf1ee30c
NB
647
648 /* Add the file to the dependencies on its first inclusion. */
649 if (CPP_OPTION (pfile, deps.style) > !!sysp && !file->stack_count)
650 {
651 if (!file->main_file || !CPP_OPTION (pfile, deps.ignore_main_file))
652 deps_add_dep (pfile->deps, file->path);
653 }
654
655 /* Clear buffer_valid since _cpp_clean_line messes it up. */
656 file->buffer_valid = false;
657 file->stack_count++;
658
659 /* Stack the buffer. */
660 buffer = cpp_push_buffer (pfile, file->buffer, file->st.st_size,
4dc299fb 661 CPP_OPTION (pfile, preprocessed));
cf1ee30c 662 buffer->file = file;
12f9df4e 663 buffer->sysp = sysp;
cf1ee30c
NB
664
665 /* Initialize controlling macro state. */
666 pfile->mi_valid = true;
667 pfile->mi_cmacro = 0;
668
669 /* Generate the call back. */
76bf2c97 670 _cpp_do_file_change (pfile, LC_ENTER, file->path, 1, sysp);
cf1ee30c
NB
671
672 return true;
add7091b
ZW
673}
674
49634b3a 675/* Mark FILE to be included once only. */
8f9b4009 676void
49634b3a 677_cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file)
f2d5f0cc 678{
49634b3a
NB
679 pfile->seen_once_only = true;
680 file->once_only = true;
8f9b4009
NB
681}
682
683/* Return the directory from which searching for FNAME should start,
2067c116 684 considering the directive TYPE and ANGLE_BRACKETS. If there is
8f9b4009
NB
685 nothing left in the path, returns NULL. */
686static struct cpp_dir *
687search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
688 enum include_type type)
689{
690 cpp_dir *dir;
691 _cpp_file *file;
74eb4b3e 692
3dce1408 693 if (IS_ABSOLUTE_PATH (fname))
8f9b4009
NB
694 return &pfile->no_search_path;
695
4dc299fb
PB
696 /* pfile->buffer is NULL when processing an -include command-line flag. */
697 file = pfile->buffer == NULL ? pfile->main_file : pfile->buffer->file;
41947a54
NB
698
699 /* For #include_next, skip in the search path past the dir in which
e7182666
NB
700 the current file was found, but if it was found via an absolute
701 path use the normal search logic. */
8f9b4009
NB
702 if (type == IT_INCLUDE_NEXT && file->dir)
703 dir = file->dir->next;
74eb4b3e 704 else if (angle_brackets)
8f9b4009
NB
705 dir = pfile->bracket_include;
706 else if (type == IT_CMDLINE)
707 /* -include and -imacros use the #include "" chain with the
708 preprocessor's cwd prepended. */
709 return make_cpp_dir (pfile, "./", false);
710 else if (pfile->quote_ignores_source_dir)
711 dir = pfile->quote_include;
41947a54 712 else
12f9df4e
PB
713 return make_cpp_dir (pfile, dir_name_of_file (file),
714 pfile->buffer ? pfile->buffer->sysp : 0);
8f9b4009
NB
715
716 if (dir == NULL)
0527bc4e 717 cpp_error (pfile, CPP_DL_ERROR,
8f9b4009
NB
718 "no include path in which to search for %s", fname);
719
720 return dir;
721}
41947a54 722
8f9b4009 723/* Strip the basename from the file's path. It ends with a slash if
02fa63cd 724 of nonzero length. Note that this procedure also works for
8f9b4009
NB
725 <stdin>, which is represented by the empty string. */
726static const char *
727dir_name_of_file (_cpp_file *file)
728{
729 if (!file->dir_name)
41947a54 730 {
8f9b4009
NB
731 size_t len = lbasename (file->path) - file->path;
732 char *dir_name = xmalloc (len + 1);
733
734 memcpy (dir_name, file->path, len);
735 dir_name[len] = '\0';
736 file->dir_name = dir_name;
41947a54
NB
737 }
738
8f9b4009
NB
739 return file->dir_name;
740}
741
8f9b4009
NB
742/* Handles #include-family directives (distinguished by TYPE),
743 including HEADER, and the command line -imacros and -include.
744 Returns true if a buffer was stacked. */
745bool
746_cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
747 enum include_type type)
748{
749 struct cpp_dir *dir;
750
751 dir = search_path_head (pfile, fname, angle_brackets, type);
752 if (!dir)
753 return false;
754
4dc299fb 755 return _cpp_stack_file (pfile, _cpp_find_file (pfile, fname, dir, false),
8f9b4009
NB
756 type == IT_IMPORT);
757}
758
759/* Could not open FILE. The complication is dependency output. */
760static void
761open_file_failed (cpp_reader *pfile, _cpp_file *file)
762{
12f9df4e 763 int sysp = pfile->line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
8f9b4009
NB
764 bool print_dep = CPP_OPTION (pfile, deps.style) > !!sysp;
765
766 errno = file->err_no;
767 if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
bf42e45b 768 deps_add_dep (pfile->deps, file->name);
8f9b4009 769 else
add7091b 770 {
8f9b4009
NB
771 /* If we are outputting dependencies but not for this file then
772 don't error because we can still produce correct output. */
773 if (CPP_OPTION (pfile, deps.style) && ! print_dep)
0527bc4e 774 cpp_errno (pfile, CPP_DL_WARNING, file->path);
e7182666 775 else
0527bc4e 776 cpp_errno (pfile, CPP_DL_ERROR, file->path);
add7091b 777 }
8f9b4009 778}
591e15a1 779
8f9b4009
NB
780/* Search in the chain beginning at HEAD for a file whose search path
781 started at START_DIR != NULL. */
782static struct file_hash_entry *
783search_cache (struct file_hash_entry *head, const cpp_dir *start_dir)
784{
785 while (head && head->start_dir != start_dir)
786 head = head->next;
787
788 return head;
789}
790
791/* Allocate a new _cpp_file structure. */
792static _cpp_file *
793make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
794{
795 _cpp_file *file;
796
797 file = xcalloc (1, sizeof (_cpp_file));
798 file->main_file = !pfile->buffer;
799 file->fd = -1;
800 file->dir = dir;
801 file->name = xstrdup (fname);
802
803 return file;
804}
805
806/* A hash of directory names. The directory names are the path names
807 of files which contain a #include "", the included file name is
808 appended to this directories.
809
810 To avoid duplicate entries we follow the convention that all
811 non-empty directory names should end in a '/'. DIR_NAME must be
812 stored in permanently allocated memory. */
813static cpp_dir *
814make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
815{
816 struct file_hash_entry *entry, **hash_slot;
817 cpp_dir *dir;
818
819 hash_slot = (struct file_hash_entry **)
b92be669
PB
820 htab_find_slot_with_hash (pfile->file_hash, dir_name,
821 htab_hash_string (dir_name),
822 INSERT);
8f9b4009
NB
823
824 /* Have we already hashed this directory? */
825 for (entry = *hash_slot; entry; entry = entry->next)
826 if (entry->start_dir == NULL)
827 return entry->u.dir;
828
829 dir = xcalloc (1, sizeof (cpp_dir));
830 dir->next = pfile->quote_include;
831 dir->name = (char *) dir_name;
832 dir->len = strlen (dir_name);
833 dir->sysp = sysp;
834
835 /* Store this new result in the hash table. */
836 entry = new_file_hash_entry (pfile);
837 entry->next = *hash_slot;
838 entry->start_dir = NULL;
839 entry->u.dir = dir;
840 *hash_slot = entry;
841
842 return dir;
843}
844
845/* Create a new block of memory for file hash entries. */
846static void
847allocate_file_hash_entries (cpp_reader *pfile)
848{
849 pfile->file_hash_entries_used = 0;
850 pfile->file_hash_entries_allocated = 127;
851 pfile->file_hash_entries = xmalloc
852 (pfile->file_hash_entries_allocated * sizeof (struct file_hash_entry));
853}
854
855/* Return a new file hash entry. */
856static struct file_hash_entry *
857new_file_hash_entry (cpp_reader *pfile)
858{
859 if (pfile->file_hash_entries_used == pfile->file_hash_entries_allocated)
860 allocate_file_hash_entries (pfile);
861
862 return &pfile->file_hash_entries[pfile->file_hash_entries_used++];
863}
864
865/* Returns TRUE if a file FNAME has ever been successfully opened.
866 This routine is not intended to correctly handle filenames aliased
867 by links or redundant . or .. traversals etc. */
868bool
869cpp_included (cpp_reader *pfile, const char *fname)
870{
871 struct file_hash_entry *entry;
872
b92be669
PB
873 entry = htab_find_with_hash (pfile->file_hash, fname,
874 htab_hash_string (fname));
8f9b4009
NB
875
876 while (entry && (entry->start_dir == NULL || entry->u.file->err_no))
877 entry = entry->next;
878
879 return entry != NULL;
880}
881
6614fd40 882/* Calculate the hash value of a file hash entry P. */
b92be669
PB
883
884static hashval_t
885file_hash_hash (const void *p)
886{
887 struct file_hash_entry *entry = (struct file_hash_entry *) p;
888 const char *hname;
889 if (entry->start_dir)
890 hname = entry->u.file->name;
891 else
892 hname = entry->u.dir->name;
893
894 return htab_hash_string (hname);
895}
896
8f9b4009
NB
897/* Compare a string Q against a file hash entry P. */
898static int
b92be669 899file_hash_eq (const void *p, const void *q)
8f9b4009
NB
900{
901 struct file_hash_entry *entry = (struct file_hash_entry *) p;
902 const char *fname = (const char *) q;
903 const char *hname;
904
905 if (entry->start_dir)
906 hname = entry->u.file->name;
907 else
908 hname = entry->u.dir->name;
909
910 return strcmp (hname, fname) == 0;
911}
912
913/* Initialize everything in this source file. */
914void
915_cpp_init_files (cpp_reader *pfile)
916{
b92be669 917 pfile->file_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
8f9b4009
NB
918 NULL, xcalloc, free);
919 allocate_file_hash_entries (pfile);
920}
921
922/* Finalize everything in this source file. */
923void
924_cpp_cleanup_files (cpp_reader *pfile)
925{
926 htab_delete (pfile->file_hash);
927}
928
929/* Enter a file name in the hash for the sake of cpp_included. */
930void
931_cpp_fake_include (cpp_reader *pfile, const char *fname)
932{
4dc299fb 933 _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true);
add7091b
ZW
934}
935
e605b040 936/* Not everyone who wants to set system-header-ness on a buffer can
642ce434
NB
937 see the details of a buffer. This is an exported interface because
938 fix-header needs it. */
e605b040 939void
6cf87ca4 940cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc)
e605b040 941{
614c7d37 942 int flags = 0;
12f9df4e 943 const struct line_map *map = linemap_lookup (pfile->line_table, pfile->line);
614c7d37
NB
944
945 /* 1 = system header, 2 = system header to be treated as C. */
946 if (syshdr)
947 flags = 1 + (externc != 0);
12f9df4e
PB
948 pfile->buffer->sysp = flags;
949 _cpp_do_file_change (pfile, LC_RENAME, map->to_file,
950 SOURCE_LINE (map, pfile->line), flags);
e605b040
ZW
951}
952
b4e46cea
PB
953/* Allow the client to change the current file. Used by the front end
954 to achieve pseudo-file names like <built-in>.
955 If REASON is LC_LEAVE, then NEW_NAME must be NULL. */
c19b12cb 956void
6cf87ca4
ZW
957cpp_change_file (cpp_reader *pfile, enum lc_reason reason,
958 const char *new_name)
c19b12cb 959{
b4e46cea 960 _cpp_do_file_change (pfile, reason, new_name, 1, 0);
c19b12cb
NB
961}
962
8f9b4009 963/* Callback function for htab_traverse. */
c71f835b 964static int
8f9b4009 965report_missing_guard (void **slot, void *b)
c71f835b 966{
8f9b4009 967 struct file_hash_entry *entry = (struct file_hash_entry *) *slot;
dc65cd60 968 int *bannerp = (int *) b;
c71f835b 969
8f9b4009
NB
970 /* Skip directories. */
971 if (entry->start_dir != NULL)
c71f835b 972 {
8f9b4009
NB
973 _cpp_file *file = entry->u.file;
974
975 /* We don't want MI guard advice for the main file. */
976 if (file->cmacro == NULL && file->stack_count == 1 && !file->main_file)
c71f835b 977 {
8f9b4009
NB
978 if (*bannerp == 0)
979 {
980 fputs (_("Multiple include guards may be useful for:\n"),
981 stderr);
982 *bannerp = 1;
983 }
984
985 fputs (entry->u.file->path, stderr);
986 putc ('\n', stderr);
c71f835b 987 }
c71f835b 988 }
c71f835b 989
8f9b4009 990 return 0;
a36c54fa
NB
991}
992
8f9b4009
NB
993/* Report on all files that might benefit from a multiple include guard.
994 Triggered by -H. */
995void
996_cpp_report_missing_guards (cpp_reader *pfile)
168d3732 997{
8f9b4009 998 int banner = 0;
ba133c96 999
8f9b4009 1000 htab_traverse (pfile->file_hash, report_missing_guard, &banner);
168d3732
ZW
1001}
1002
41947a54 1003/* Locate HEADER, and determine whether it is newer than the current
48c4721e 1004 file. If it cannot be located or dated, return -1, if it is
41947a54 1005 newer, return 1, otherwise 0. */
f3f751ad 1006int
6cf87ca4
ZW
1007_cpp_compare_file_date (cpp_reader *pfile, const char *fname,
1008 int angle_brackets)
f3f751ad 1009{
8f9b4009
NB
1010 _cpp_file *file;
1011 struct cpp_dir *dir;
df383483 1012
8f9b4009
NB
1013 dir = search_path_head (pfile, fname, angle_brackets, IT_INCLUDE);
1014 if (!dir)
f3f751ad 1015 return -1;
41947a54 1016
4dc299fb 1017 file = _cpp_find_file (pfile, fname, dir, false);
8f9b4009
NB
1018 if (file->err_no)
1019 return -1;
c45da1ca 1020
8f9b4009 1021 if (file->fd != -1)
c0bfe993 1022 {
8f9b4009
NB
1023 close (file->fd);
1024 file->fd = -1;
c0bfe993 1025 }
041c3194 1026
8f9b4009 1027 return file->st.st_mtime > pfile->buffer->file->st.st_mtime;
f8f769ea
ZW
1028}
1029
c19b12cb
NB
1030/* Pushes the given file onto the buffer stack. Returns nonzero if
1031 successful. */
1032bool
8f9b4009 1033cpp_push_include (cpp_reader *pfile, const char *fname)
c19b12cb 1034{
c19b12cb
NB
1035 /* Make the command line directive take up a line. */
1036 pfile->line++;
8f9b4009 1037 return _cpp_stack_include (pfile, fname, false, IT_CMDLINE);
c19b12cb
NB
1038}
1039
5d8ebbd8 1040/* Do appropriate cleanup when a file INC's buffer is popped off the
af0d16cd
NB
1041 input stack. */
1042void
8f9b4009 1043_cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
f9a0e96c 1044{
ba133c96 1045 /* Record the inclusion-preventing macro, which could be NULL
6d18adbc 1046 meaning no controlling macro. */
8f9b4009
NB
1047 if (pfile->mi_valid && file->cmacro == NULL)
1048 file->cmacro = pfile->mi_cmacro;
93c80368
NB
1049
1050 /* Invalidate control macros in the #including file. */
6d18adbc 1051 pfile->mi_valid = false;
f9a0e96c 1052
8f9b4009
NB
1053 if (file->buffer)
1054 {
1055 free ((void *) file->buffer);
1056 file->buffer = NULL;
1057 }
f9a0e96c
ZW
1058}
1059
8f9b4009
NB
1060/* Set the include chain for "" to QUOTE, for <> to BRACKET. If
1061 QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
1062 directory of the including file.
ba133c96 1063
8f9b4009
NB
1064 If BRACKET does not lie in the QUOTE chain, it is set to QUOTE. */
1065void
1066cpp_set_include_chains (cpp_reader *pfile, cpp_dir *quote, cpp_dir *bracket,
1067 int quote_ignores_source_dir)
591e15a1 1068{
8f9b4009
NB
1069 pfile->quote_include = quote;
1070 pfile->bracket_include = quote;
1071 pfile->quote_ignores_source_dir = quote_ignores_source_dir;
591e15a1 1072
8f9b4009 1073 for (; quote; quote = quote->next)
591e15a1 1074 {
8f9b4009
NB
1075 quote->name_map = NULL;
1076 quote->len = strlen (quote->name);
1077 if (quote == bracket)
1078 pfile->bracket_include = bracket;
ba133c96 1079 }
591e15a1
NB
1080}
1081
8f9b4009
NB
1082/* Append the file name to the directory to create the path, but don't
1083 turn / into // or // into ///; // may be a namespace escape. */
1084static char *
1085append_file_to_dir (const char *fname, cpp_dir *dir)
1086{
1087 size_t dlen, flen;
1088 char *path;
1089
1090 dlen = dir->len;
1091 flen = strlen (fname);
1092 path = xmalloc (dlen + 1 + flen + 1);
1093 memcpy (path, dir->name, dlen);
1094 if (dlen && path[dlen - 1] != '/')
1095 path[dlen++] = '/';
1096 memcpy (&path[dlen], fname, flen + 1);
1097
1098 return path;
1099}
c31a6508
ZW
1100
1101/* Read a space delimited string of unlimited length from a stdio
5d8ebbd8 1102 file F. */
c31a6508 1103static char *
6cf87ca4 1104read_filename_string (int ch, FILE *f)
c31a6508
ZW
1105{
1106 char *alloc, *set;
1107 int len;
1108
1109 len = 20;
1110 set = alloc = xmalloc (len + 1);
dc65cd60 1111 if (! is_space (ch))
c31a6508
ZW
1112 {
1113 *set++ = ch;
dc65cd60 1114 while ((ch = getc (f)) != EOF && ! is_space (ch))
c31a6508
ZW
1115 {
1116 if (set - alloc == len)
1117 {
1118 len *= 2;
1119 alloc = xrealloc (alloc, len + 1);
1120 set = alloc + len / 2;
1121 }
1122 *set++ = ch;
1123 }
1124 }
1125 *set = '\0';
1126 ungetc (ch, f);
1127 return alloc;
1128}
1129
8f9b4009
NB
1130/* Read the file name map file for DIR. */
1131static void
1132read_name_map (cpp_dir *dir)
c31a6508 1133{
8f9b4009 1134 static const char FILE_NAME_MAP_FILE[] = "header.gcc";
c31a6508
ZW
1135 char *name;
1136 FILE *f;
8f9b4009
NB
1137 size_t len, count = 0, room = 9;
1138
1139 len = dir->len;
1140 name = alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
1141 memcpy (name, dir->name, len);
1142 if (len && name[len - 1] != '/')
1143 name[len++] = '/';
1144 strcpy (name + len, FILE_NAME_MAP_FILE);
c31a6508 1145 f = fopen (name, "r");
8767c894 1146
8f9b4009
NB
1147 dir->name_map = xmalloc (room * sizeof (char *));
1148
8767c894
NB
1149 /* Silently return NULL if we cannot open. */
1150 if (f)
c31a6508
ZW
1151 {
1152 int ch;
c31a6508
ZW
1153
1154 while ((ch = getc (f)) != EOF)
1155 {
8f9b4009 1156 char *to;
c31a6508 1157
dc65cd60 1158 if (is_space (ch))
c31a6508 1159 continue;
8f9b4009
NB
1160
1161 if (count + 2 > room)
1162 {
1163 room += 8;
1164 dir->name_map = xrealloc (dir->name_map, room * sizeof (char *));
1165 }
1166
1167 dir->name_map[count] = read_filename_string (ch, f);
dc65cd60 1168 while ((ch = getc (f)) != EOF && is_hspace (ch))
c31a6508 1169 ;
c31a6508 1170
8f9b4009 1171 to = read_filename_string (ch, f);
3dce1408 1172 if (IS_ABSOLUTE_PATH (to))
8f9b4009 1173 dir->name_map[count + 1] = to;
c31a6508
ZW
1174 else
1175 {
8f9b4009 1176 dir->name_map[count + 1] = append_file_to_dir (to, dir);
c31a6508 1177 free (to);
df383483 1178 }
c31a6508 1179
8f9b4009 1180 count += 2;
c31a6508
ZW
1181 while ((ch = getc (f)) != '\n')
1182 if (ch == EOF)
1183 break;
1184 }
8f9b4009 1185
c31a6508
ZW
1186 fclose (f);
1187 }
df383483 1188
8f9b4009
NB
1189 /* Terminate the list of maps. */
1190 dir->name_map[count] = NULL;
df383483 1191}
c31a6508 1192
8f9b4009
NB
1193/* Remap a FILE's name based on the file_name_map, if any, for
1194 FILE->dir. If the file name has any directory separators,
1195 recursively check those directories too. */
c31a6508 1196static char *
8f9b4009 1197remap_filename (cpp_reader *pfile, _cpp_file *file)
c31a6508 1198{
8f9b4009
NB
1199 const char *fname, *p;
1200 char *new_dir;
1201 cpp_dir *dir;
1202 size_t index, len;
8767c894 1203
8f9b4009
NB
1204 dir = file->dir;
1205 fname = file->name;
df383483 1206
8f9b4009
NB
1207 for (;;)
1208 {
1209 if (!dir->name_map)
1210 read_name_map (dir);
c31a6508 1211
8f9b4009
NB
1212 for (index = 0; dir->name_map[index]; index += 2)
1213 if (!strcmp (dir->name_map[index], fname))
1214 return xstrdup (dir->name_map[index + 1]);
c31a6508 1215
8f9b4009
NB
1216 p = strchr (fname, '/');
1217 if (!p || p == fname)
1218 return NULL;
f9200da2 1219
8f9b4009
NB
1220 len = dir->len + (p - fname + 1);
1221 new_dir = xmalloc (len + 1);
1222 memcpy (new_dir, dir->name, dir->len);
1223 memcpy (new_dir + dir->len, fname, p - fname + 1);
1224 new_dir[len] = '\0';
df383483 1225
8f9b4009
NB
1226 dir = make_cpp_dir (pfile, new_dir, dir->sysp);
1227 fname = p + 1;
0b3d776a 1228 }
0b3d776a 1229}
986b1f13 1230
8f9b4009
NB
1231/* Return true if FILE is usable by PCH. */
1232static bool
1233include_pch_p (_cpp_file *file)
986b1f13 1234{
8f9b4009 1235 return file->pch & 1;
986b1f13
NB
1236}
1237
8f9b4009
NB
1238/* Returns true if PCHNAME is a valid PCH file for FILE. */
1239static bool
1240validate_pch (cpp_reader *pfile, _cpp_file *file, const char *pchname)
986b1f13 1241{
8f9b4009 1242 const char *saved_path = file->path;
230fcd32 1243 bool valid = false;
986b1f13 1244
8f9b4009
NB
1245 file->path = pchname;
1246 if (open_file (file))
986b1f13 1247 {
230fcd32 1248 valid = 1 & pfile->cb.valid_pch (pfile, pchname, file->fd);
8f9b4009 1249
230fcd32 1250 if (!valid)
986b1f13 1251 {
8f9b4009
NB
1252 close (file->fd);
1253 file->fd = -1;
986b1f13 1254 }
986b1f13 1255
8f9b4009 1256 if (CPP_OPTION (pfile, print_include_names))
986b1f13 1257 {
8f9b4009 1258 unsigned int i;
54020b29 1259 for (i = 1; i < pfile->line_table->depth; i++)
8f9b4009
NB
1260 putc ('.', stderr);
1261 fprintf (stderr, "%c %s\n",
230fcd32 1262 valid ? '!' : 'x', pchname);
986b1f13 1263 }
986b1f13
NB
1264 }
1265
8f9b4009 1266 file->path = saved_path;
230fcd32 1267 return valid;
986b1f13 1268}
73e61092
GK
1269\f
1270/* This datastructure holds the list of header files that were seen
1271 while the PCH was being built. The 'entries' field is kept sorted
1272 in memcmp() order; yes, this means that on little-endian systems,
1273 it's sorted initially by the least-significant byte of 'size', but
1274 that's OK. The code does rely on having entries with the same size
1275 next to each other. */
1276
1277struct pchf_data {
1278 /* Number of pchf_entry structures. */
1279 size_t count;
1280
1281 /* Are there any values with once_only set?
1282 This is used as an optimisation, it means we don't have to search
1283 the structure if we're processing a regular #include. */
1284 bool have_once_only;
16dd5cfe 1285
73e61092
GK
1286 struct pchf_entry {
1287 /* The size of this file. This is used to save running a MD5 checksum
1288 if the sizes don't match. */
1289 off_t size;
1290 /* The MD5 checksum of this file. */
1291 unsigned char sum[16];
1292 /* Is this file to be included only once? */
1293 bool once_only;
1294 } entries[1];
1295};
1296
1297static struct pchf_data *pchf;
1298
1299/* Data for pchf_addr. */
16dd5cfe 1300struct pchf_adder_info
73e61092
GK
1301{
1302 cpp_reader *pfile;
1303 struct pchf_data *d;
1304};
1305
1306/* A hash traversal function to add entries into DATA->D. */
1307
1308static int
1309pchf_adder (void **slot, void *data)
1310{
1311 struct file_hash_entry *h = (struct file_hash_entry *) *slot;
1312 struct pchf_adder_info *i = (struct pchf_adder_info *) data;
1313
1314 if (h->start_dir != NULL && h->u.file->stack_count != 0)
1315 {
1316 struct pchf_data *d = i->d;
1317 _cpp_file *f = h->u.file;
1318 size_t count = d->count++;
1319
1320 /* This should probably never happen, since if a read error occurred
1321 the PCH file shouldn't be written... */
1322 if (f->dont_read || f->err_no)
1323 return 1;
16dd5cfe 1324
73e61092
GK
1325 d->entries[count].once_only = f->once_only;
1326 d->have_once_only |= f->once_only;
1327 if (f->buffer_valid)
16dd5cfe 1328 md5_buffer ((const char *)f->buffer,
73e61092
GK
1329 f->st.st_size, d->entries[count].sum);
1330 else
1331 {
1332 FILE *ff;
1333 int oldfd = f->fd;
1334
1335 if (!open_file (f))
1336 {
1337 open_file_failed (i->pfile, f);
1338 return 0;
1339 }
1340 ff = fdopen (f->fd, "rb");
1341 md5_stream (ff, d->entries[count].sum);
1342 fclose (ff);
1343 f->fd = oldfd;
1344 }
1345 d->entries[count].size = f->st.st_size;
1346 }
1347 return 1;
1348}
1349
1350/* A qsort ordering function for pchf_entry structures. */
1351
1352static int
1353pchf_save_compare (const void *e1, const void *e2)
1354{
1355 return memcmp (e1, e2, sizeof (struct pchf_entry));
1356}
1357
1358/* Create and write to F a pchf_data structure. */
1359
1360bool
1361_cpp_save_file_entries (cpp_reader *pfile, FILE *f)
1362{
1363 size_t count = 0;
1364 struct pchf_data *result;
1365 size_t result_size;
1366 struct pchf_adder_info pai;
16dd5cfe 1367
73e61092 1368 count = htab_elements (pfile->file_hash);
16dd5cfe 1369 result_size = (sizeof (struct pchf_data)
73e61092
GK
1370 + sizeof (struct pchf_entry) * (count - 1));
1371 result = xcalloc (result_size, 1);
16dd5cfe 1372
73e61092
GK
1373 result->count = 0;
1374 result->have_once_only = false;
16dd5cfe 1375
73e61092
GK
1376 pai.pfile = pfile;
1377 pai.d = result;
1378 htab_traverse (pfile->file_hash, pchf_adder, &pai);
1379
1380 result_size = (sizeof (struct pchf_data)
1381 + sizeof (struct pchf_entry) * (result->count - 1));
16dd5cfe 1382
73e61092
GK
1383 qsort (result->entries, result->count, sizeof (struct pchf_entry),
1384 pchf_save_compare);
1385
1386 return fwrite (result, result_size, 1, f) == 1;
1387}
1388
1389/* Read the pchf_data structure from F. */
1390
1391bool
1392_cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
1393{
1394 struct pchf_data d;
16dd5cfe 1395
73e61092
GK
1396 if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f)
1397 != 1)
1398 return false;
16dd5cfe 1399
73e61092
GK
1400 pchf = xmalloc (sizeof (struct pchf_data)
1401 + sizeof (struct pchf_entry) * (d.count - 1));
1402 memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
1403 if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f)
1404 != d.count)
1405 return false;
1406 return true;
1407}
1408
1409/* The parameters for pchf_compare. */
1410
1411struct pchf_compare_data
1412{
1413 /* The size of the file we're looking for. */
1414 off_t size;
1415
1416 /* The MD5 checksum of the file, if it's been computed. */
1417 unsigned char sum[16];
1418
1419 /* Is SUM valid? */
1420 bool sum_computed;
1421
1422 /* Do we need to worry about entries that don't have ONCE_ONLY set? */
1423 bool check_included;
16dd5cfe 1424
73e61092
GK
1425 /* The file that we're searching for. */
1426 _cpp_file *f;
1427};
1428
1429/* bsearch comparison function; look for D_P in E_P. */
1430
1431static int
1432pchf_compare (const void *d_p, const void *e_p)
1433{
1434 const struct pchf_entry *e = (const struct pchf_entry *)e_p;
1435 struct pchf_compare_data *d = (struct pchf_compare_data *)d_p;
1436 int result;
16dd5cfe 1437
73e61092
GK
1438 result = memcmp (&d->size, &e->size, sizeof (off_t));
1439 if (result != 0)
1440 return result;
16dd5cfe 1441
73e61092
GK
1442 if (! d->sum_computed)
1443 {
1444 _cpp_file *const f = d->f;
16dd5cfe 1445
73e61092
GK
1446 md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum);
1447 d->sum_computed = true;
1448 }
1449
1450 result = memcmp (d->sum, e->sum, 16);
1451 if (result != 0)
1452 return result;
1453
1454 if (d->check_included || e->once_only)
1455 return 0;
1456 else
1457 return 1;
1458}
1459
16dd5cfe 1460/* Check that F is not in a list read from a PCH file (if any).
73e61092
GK
1461 Assumes that f->buffer_valid is true. Return TRUE if the file
1462 should not be read. */
1463
1464static bool
1465check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED,
1466 _cpp_file *f,
1467 bool check_included)
1468{
1469 struct pchf_compare_data d;
16dd5cfe 1470
73e61092
GK
1471 if (pchf == NULL
1472 || (! check_included && ! pchf->have_once_only))
1473 return false;
1474
1475 d.size = f->st.st_size;
1476 d.sum_computed = false;
1477 d.f = f;
1478 d.check_included = check_included;
1479 return bsearch (&d, pchf->entries, pchf->count, sizeof (struct pchf_entry),
1480 pchf_compare) != NULL;
1481}