]> git.ipfire.org Git - thirdparty/gcc.git/blame - libcpp/files.c
Update copyright years.
[thirdparty/gcc.git] / libcpp / files.c
CommitLineData
8f9b4009 1/* Part of CPP library. File handling.
8d9254fc 2 Copyright (C) 1986-2020 Free Software Foundation, Inc.
add7091b
ZW
3 Written by Per Bothner, 1994.
4 Based on CCCP program by Paul Rubin, June 1986
5 Adapted to ANSI C, Richard Stallman, Jan 1987
6 Split out of cpplib.c, Zack Weinberg, Oct 1998
8f9b4009 7 Reimplemented, Neil Booth, Jul 2003
add7091b
ZW
8
9This program is free software; you can redistribute it and/or modify it
10under the terms of the GNU General Public License as published by the
748086b7 11Free Software Foundation; either version 3, or (at your option) any
add7091b
ZW
12later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
748086b7
JJ
20along with this program; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
add7091b
ZW
22
23#include "config.h"
24#include "system.h"
add7091b 25#include "cpplib.h"
4f4e53dd 26#include "internal.h"
168d3732 27#include "mkdeps.h"
0b4cafec 28#include "obstack.h"
bf42e45b 29#include "hashtab.h"
73e61092 30#include "md5.h"
8f9b4009 31#include <dirent.h>
f8f769ea 32
8f9b4009
NB
33/* Variable length record files on VMS will have a stat size that includes
34 record control characters that won't be included in the read size. */
35#ifdef VMS
36# define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */
37# define STAT_SIZE_RELIABLE(ST) ((ST).st_fab_rfm != FAB_C_VAR)
38#else
39# define STAT_SIZE_RELIABLE(ST) true
d7a2e0f7
ZW
40#endif
41
8f9b4009 42#ifdef __DJGPP__
473c5bc9 43#include <io.h>
8f9b4009
NB
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
8f9b4009
NB
51/* This structure represents a file searched for by CPP, whether it
52 exists or not. An instance may be pointed to by more than one
d87fc699 53 cpp_file_hash_entry; at present no reference count is kept. */
8f9b4009
NB
54struct _cpp_file
55{
56 /* Filename as given to #include or command line switch. */
57 const char *name;
642ce434 58
8f9b4009
NB
59 /* The full path used to find the file. */
60 const char *path;
ae1139f9 61
8f9b4009
NB
62 /* The full path of the pch file. */
63 const char *pchname;
add7091b 64
bf42e45b
NB
65 /* The file's path with the basename stripped. NULL if it hasn't
66 been calculated yet. */
8f9b4009 67 const char *dir_name;
c71f835b 68
49634b3a
NB
69 /* Chain through all files. */
70 struct _cpp_file *next_file;
a36c54fa 71
8f9b4009
NB
72 /* The contents of NAME after calling read_file(). */
73 const uchar *buffer;
a36c54fa 74
688e7a53
TT
75 /* Pointer to the real start of BUFFER. read_file() might increment
76 BUFFER; when freeing, this this pointer must be used instead. */
77 const uchar *buffer_start;
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 100 /* If opened with #import or contains #pragma once. */
a0be978a 101 bool once_only : 1;
add7091b 102
8f9b4009 103 /* If read() failed before. */
a0be978a 104 bool dont_read : 1;
add7091b 105
8f9b4009 106 /* If this file is the main file. */
a0be978a 107 bool main_file : 1;
add7091b 108
8f9b4009 109 /* If BUFFER above contains the true contents of the file. */
a0be978a 110 bool buffer_valid : 1;
1efcb8c6
JM
111
112 /* If this file is implicitly preincluded. */
a0be978a 113 bool implicit_preinclude : 1;
8f9b4009 114};
d4506961 115
8f9b4009
NB
116/* A singly-linked list for all searches for a given file name, with
117 its head pointed to by a slot in FILE_HASH. The file name is what
118 appeared between the quotes in a #include directive; it can be
a98ebe2e 119 determined implicitly from the hash table location or explicitly
bf42e45b 120 from FILE->name.
8f9b4009
NB
121
122 FILE is a structure containing details about the file that was
123 found with that search, or details of how the search failed.
124
125 START_DIR is the starting location of the search in the include
126 chain. The current directories for "" includes are also hashed in
bf42e45b
NB
127 the hash table and therefore unique. Files that are looked up
128 without using a search path, such as absolute filenames and file
129 names from the command line share a special starting directory so
130 they don't cause cache hits with normal include-chain lookups.
8f9b4009
NB
131
132 If START_DIR is NULL then the entry is for a directory, not a file,
133 and the directory is in DIR. Since the starting point in a file
134 lookup chain is never NULL, this means that simple pointer
135 comparisons against START_DIR can be made to determine cache hits
136 in file lookups.
bf42e45b
NB
137
138 If a cache lookup fails because of e.g. an extra "./" in the path,
139 then nothing will break. It is just less efficient as CPP will
140 have to do more work re-preprocessing the file, and/or comparing
141 its contents against earlier once-only files.
8f9b4009 142*/
d87fc699 143struct cpp_file_hash_entry
8f9b4009 144{
d87fc699 145 struct cpp_file_hash_entry *next;
8f9b4009 146 cpp_dir *start_dir;
620e594b 147 location_t location;
8f9b4009
NB
148 union
149 {
150 _cpp_file *file;
151 cpp_dir *dir;
152 } u;
153};
154
d87fc699 155/* Number of entries to put in a cpp_file_hash_entry pool. */
97f6bd40
TT
156#define FILE_HASH_POOL_SIZE 127
157
d87fc699 158/* A file hash entry pool. We allocate cpp_file_hash_entry object from
97f6bd40
TT
159 one of these. */
160struct file_hash_entry_pool
161{
162 /* Number of entries used from this pool. */
163 unsigned int file_hash_entries_used;
164 /* Next pool in the chain; used when freeing. */
165 struct file_hash_entry_pool *next;
166 /* The memory pool. */
d87fc699 167 struct cpp_file_hash_entry pool[FILE_HASH_POOL_SIZE];
97f6bd40
TT
168};
169
8f9b4009 170static bool open_file (_cpp_file *file);
3d67ba1e
GK
171static bool pch_open_file (cpp_reader *pfile, _cpp_file *file,
172 bool *invalid_pch);
173static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file,
620e594b 174 bool *invalid_pch, location_t loc);
ac81cf0b 175static bool read_file_guts (cpp_reader *pfile, _cpp_file *file,
620e594b 176 location_t loc);
ac81cf0b 177static bool read_file (cpp_reader *pfile, _cpp_file *file,
620e594b 178 location_t loc);
8f9b4009
NB
179static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
180 int angle_brackets, enum include_type);
181static const char *dir_name_of_file (_cpp_file *file);
ac81cf0b 182static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int,
620e594b 183 location_t);
d87fc699 184static struct cpp_file_hash_entry *search_cache (struct cpp_file_hash_entry *head,
8f9b4009
NB
185 const cpp_dir *start_dir);
186static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
1b449375 187static void destroy_cpp_file (_cpp_file *);
8f9b4009
NB
188static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp);
189static void allocate_file_hash_entries (cpp_reader *pfile);
d87fc699 190static struct cpp_file_hash_entry *new_file_hash_entry (cpp_reader *pfile);
8f9b4009 191static int report_missing_guard (void **slot, void *b);
b92be669
PB
192static hashval_t file_hash_hash (const void *p);
193static int file_hash_eq (const void *p, const void *q);
8f9b4009
NB
194static char *read_filename_string (int ch, FILE *f);
195static void read_name_map (cpp_dir *dir);
196static char *remap_filename (cpp_reader *pfile, _cpp_file *file);
197static char *append_file_to_dir (const char *fname, cpp_dir *dir);
198static bool validate_pch (cpp_reader *, _cpp_file *file, const char *pchname);
73e61092
GK
199static int pchf_save_compare (const void *e1, const void *e2);
200static int pchf_compare (const void *d_p, const void *e_p);
201static bool check_file_against_entries (cpp_reader *, _cpp_file *, bool);
8f9b4009
NB
202
203/* Given a filename in FILE->PATH, with the empty string interpreted
204 as <stdin>, open it.
205
206 On success FILE contains an open file descriptor and stat
207 information for the file. On failure the file descriptor is -1 and
208 the appropriate errno is also stored in FILE. Returns TRUE iff
209 successful.
210
211 We used to open files in nonblocking mode, but that caused more
212 problems than it solved. Do take care not to acquire a controlling
213 terminal by mistake (this can't happen on sane systems, but
214 paranoia is a virtue).
215
216 Use the three-argument form of open even though we aren't
217 specifying O_CREAT, to defend against broken system headers.
218
219 O_BINARY tells some runtime libraries (notably DJGPP) not to do
220 newline translation; we can handle DOS line breaks just fine
221 ourselves. */
222static bool
223open_file (_cpp_file *file)
224{
225 if (file->path[0] == '\0')
85be8c2d
AP
226 {
227 file->fd = 0;
8f9b4009 228 set_stdin_to_binary_mode ();
85be8c2d 229 }
f2d5f0cc 230 else
8f9b4009 231 file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
a58d32c2 232
8f9b4009 233 if (file->fd != -1)
2047e26f 234 {
8f9b4009
NB
235 if (fstat (file->fd, &file->st) == 0)
236 {
237 if (!S_ISDIR (file->st.st_mode))
238 {
239 file->err_no = 0;
240 return true;
241 }
242
243 /* Ignore a directory and continue the search. The file we're
244 looking for may be elsewhere in the search path. */
245 errno = ENOENT;
246 }
55485cd9 247
55485cd9
ZW
248 close (file->fd);
249 file->fd = -1;
2047e26f 250 }
84152c25
VP
251#if defined(_WIN32) && !defined(__CYGWIN__)
252 else if (errno == EACCES)
253 {
254 /* On most UNIX systems, open succeeds on a directory. Above,
255 we check if we have opened a directory and if so, set errno
256 to ENOENT. However, on Windows, opening a directory
66938a1d 257 fails with EACCES. We want to return ENOENT in that
84152c25
VP
258 case too. */
259 if (stat (file->path, &file->st) == 0
260 && S_ISDIR (file->st.st_mode))
261 errno = ENOENT;
71995ede
VP
262 else
263 /* The call to stat may have reset errno. */
66938a1d 264 errno = EACCES;
84152c25
VP
265 }
266#endif
a54c550f
NB
267 else if (errno == ENOTDIR)
268 errno = ENOENT;
a58d32c2 269
f277b5e0 270 file->err_no = errno;
8f9b4009
NB
271
272 return false;
a58d32c2
ZW
273}
274
3d67ba1e
GK
275/* Temporary PCH intercept of opening a file. Try to find a PCH file
276 based on FILE->name and FILE->dir, and test those found for
277 validity using PFILE->cb.valid_pch. Return true iff a valid file is
278 found. Set *INVALID_PCH if a PCH file is found but wasn't valid. */
279
8f9b4009 280static bool
3d67ba1e 281pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
17211ab5 282{
8f9b4009
NB
283 static const char extension[] = ".gch";
284 const char *path = file->path;
285 size_t len, flen;
286 char *pchname;
287 struct stat st;
288 bool valid = false;
289
290 /* No PCH on <stdin> or if not requested. */
291 if (file->name[0] == '\0' || !pfile->cb.valid_pch)
292 return false;
17211ab5 293
9a8a2b7a
RG
294 /* If the file is not included as first include from either the toplevel
295 file or the command-line it is not a valid use of PCH. */
ca708025
RB
296 for (_cpp_file *f = pfile->all_files; f; f = f->next_file)
297 if (f->implicit_preinclude)
298 continue;
299 else if (f->main_file)
300 break;
301 else
302 return false;
9a8a2b7a 303
8f9b4009
NB
304 flen = strlen (path);
305 len = flen + sizeof (extension);
c3f829c1 306 pchname = XNEWVEC (char, len);
8f9b4009
NB
307 memcpy (pchname, path, flen);
308 memcpy (pchname + flen, extension, sizeof (extension));
17211ab5 309
8f9b4009 310 if (stat (pchname, &st) == 0)
17211ab5 311 {
8f9b4009
NB
312 DIR *pchdir;
313 struct dirent *d;
314 size_t dlen, plen = len;
315
316 if (!S_ISDIR (st.st_mode))
317 valid = validate_pch (pfile, file, pchname);
318 else if ((pchdir = opendir (pchname)) != NULL)
17211ab5 319 {
8f9b4009
NB
320 pchname[plen - 1] = '/';
321 while ((d = readdir (pchdir)) != NULL)
8d973a83 322 {
8f9b4009 323 dlen = strlen (d->d_name) + 1;
230fcd32
PE
324 if ((strcmp (d->d_name, ".") == 0)
325 || (strcmp (d->d_name, "..") == 0))
326 continue;
8f9b4009 327 if (dlen + plen > len)
17211ab5 328 {
8f9b4009 329 len += dlen + 64;
c3f829c1 330 pchname = XRESIZEVEC (char, pchname, len);
17211ab5 331 }
8f9b4009
NB
332 memcpy (pchname + plen, d->d_name, dlen);
333 valid = validate_pch (pfile, file, pchname);
334 if (valid)
8d973a83 335 break;
17211ab5 336 }
8f9b4009 337 closedir (pchdir);
17211ab5 338 }
d4c32e1d 339 if (!valid)
bcad4ca2 340 *invalid_pch = true;
17211ab5 341 }
8d973a83 342
8f9b4009
NB
343 if (valid)
344 file->pchname = pchname;
345 else
346 free (pchname);
347
348 return valid;
17211ab5
GK
349}
350
b193dfa8
MLI
351/* Canonicalize the path to FILE. Return the canonical form if it is
352 shorter, otherwise return NULL. This function does NOT free the
353 memory pointed by FILE. */
354
355static char *
356maybe_shorter_path (const char * file)
357{
358 char * file2 = lrealpath (file);
359 if (file2 && strlen (file2) < strlen (file))
360 {
361 return file2;
362 }
363 else
364 {
365 free (file2);
366 return NULL;
367 }
368}
369
8f9b4009 370/* Try to open the path FILE->name appended to FILE->dir. This is
cf1ee30c 371 where remap and PCH intercept the file lookup process. Return true
16dd5cfe 372 if the file was found, whether or not the open was successful.
ac81cf0b
DM
373 Set *INVALID_PCH to true if a PCH file is found but wasn't valid.
374 Use LOC when emitting any diagnostics. */
3d67ba1e 375
e5eba70a 376static bool
ac81cf0b 377find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch,
620e594b 378 location_t loc)
a58d32c2 379{
8f9b4009 380 char *path;
51d0f328 381
8f9b4009
NB
382 if (CPP_OPTION (pfile, remap) && (path = remap_filename (pfile, file)))
383 ;
384 else
94d1613b
MS
385 if (file->dir->construct)
386 path = file->dir->construct (file->name, file->dir);
387 else
388 path = append_file_to_dir (file->name, file->dir);
e5eba70a 389
94d1613b
MS
390 if (path)
391 {
b193dfa8 392 hashval_t hv;
0b4cafec
ILT
393 char *copy;
394 void **pp;
395
eac3e079
JY
396 /* We try to canonicalize system headers. For DOS based file
397 * system, we always try to shorten non-system headers, as DOS
398 * has a tighter constraint on max path length. */
28939589 399 if ((CPP_OPTION (pfile, canonical_system_headers) && file->dir->sysp)
eac3e079
JY
400#ifdef HAVE_DOS_BASED_FILE_SYSTEM
401 || !file->dir->sysp
402#endif
403 )
b193dfa8
MLI
404 {
405 char * canonical_path = maybe_shorter_path (path);
406 if (canonical_path)
407 {
408 /* The canonical path was newly allocated. Let's free the
409 non-canonical one. */
410 free (path);
411 path = canonical_path;
412 }
413 }
414
415 hv = htab_hash_string (path);
0b4cafec
ILT
416 if (htab_find_with_hash (pfile->nonexistent_file_hash, path, hv) != NULL)
417 {
418 file->err_no = ENOENT;
419 return false;
420 }
421
94d1613b
MS
422 file->path = path;
423 if (pch_open_file (pfile, file, invalid_pch))
424 return true;
51d0f328 425
94d1613b
MS
426 if (open_file (file))
427 return true;
428
429 if (file->err_no != ENOENT)
430 {
ac81cf0b 431 open_file_failed (pfile, file, 0, loc);
94d1613b
MS
432 return true;
433 }
434
0b4cafec
ILT
435 /* We copy the path name onto an obstack partly so that we don't
436 leak the memory, but mostly so that we don't fragment the
437 heap. */
f1bf410c
JQ
438 copy = (char *) obstack_copy0 (&pfile->nonexistent_file_ob, path,
439 strlen (path));
94d1613b 440 free (path);
0b4cafec
ILT
441 pp = htab_find_slot_with_hash (pfile->nonexistent_file_hash,
442 copy, hv, INSERT);
443 *pp = copy;
444
94d1613b
MS
445 file->path = file->name;
446 }
447 else
448 {
449 file->err_no = ENOENT;
450 file->path = NULL;
451 }
452
453 return false;
454}
51d0f328 455
0bf12a52 456/* Return true iff the missing_header callback found the given HEADER. */
94d1613b
MS
457static bool
458search_path_exhausted (cpp_reader *pfile, const char *header, _cpp_file *file)
459{
460 missing_header_cb func = pfile->cb.missing_header;
461
462 /* When the regular search path doesn't work, try context dependent
463 headers search paths. */
464 if (func
465 && file->dir == NULL)
cf1ee30c 466 {
e3c287c9 467 if ((file->path = func (pfile, header, &file->dir)) != NULL)
94d1613b
MS
468 {
469 if (open_file (file))
470 return true;
471 free ((void *)file->path);
472 }
473 file->path = file->name;
cf1ee30c
NB
474 }
475
8f9b4009
NB
476 return false;
477}
478
4dc299fb
PB
479bool
480_cpp_find_failed (_cpp_file *file)
481{
482 return file->err_no != 0;
483}
484
8f9b4009
NB
485/* Given a filename FNAME search for such a file in the include path
486 starting from START_DIR. If FNAME is the empty string it is
1ae58c30 487 interpreted as STDIN if START_DIR is PFILE->no_search_path.
8f9b4009
NB
488
489 If the file is not found in the file cache fall back to the O/S and
490 add the result to our cache.
491
492 If the file was not found in the filesystem, or there was an error
02fa63cd 493 opening it, then ERR_NO is nonzero and FD is -1. If the file was
8f9b4009
NB
494 found, then ERR_NO is zero and FD could be -1 or an open file
495 descriptor. FD can be -1 if the file was found in the cache and
496 had previously been closed. To open it again pass the return value
497 to open_file().
1efcb8c6
JM
498
499 If IMPLICIT_PREINCLUDE then it is OK for the file to be missing.
500 If present, it is OK for a precompiled header to be included after
501 it.
ac81cf0b
DM
502
503 Use LOC as the location for any errors. */
504
4dc299fb 505_cpp_file *
1efcb8c6 506_cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
ac81cf0b 507 bool fake, int angle_brackets, bool implicit_preinclude,
620e594b 508 location_t loc)
8f9b4009 509{
d87fc699 510 struct cpp_file_hash_entry *entry;
15fd8332 511 void **hash_slot;
8f9b4009 512 _cpp_file *file;
3d67ba1e 513 bool invalid_pch = false;
0b4cafec
ILT
514 bool saw_bracket_include = false;
515 bool saw_quote_include = false;
516 struct cpp_dir *found_in_cache = NULL;
8f9b4009
NB
517
518 /* Ensure we get no confusion between cached files and directories. */
519 if (start_dir == NULL)
ac81cf0b 520 cpp_error_at (pfile, CPP_DL_ICE, loc, "NULL directory in find_file");
8f9b4009 521
15fd8332
JJ
522 hash_slot
523 = htab_find_slot_with_hash (pfile->file_hash, fname,
524 htab_hash_string (fname), INSERT);
17211ab5 525
8f9b4009 526 /* First check the cache before we resort to memory allocation. */
d87fc699 527 entry = search_cache ((struct cpp_file_hash_entry *) *hash_slot, start_dir);
8f9b4009
NB
528 if (entry)
529 return entry->u.file;
530
531 file = make_cpp_file (pfile, start_dir, fname);
4bda5946
JJ
532 file->implicit_preinclude
533 = (implicit_preinclude
534 || (pfile->buffer
535 && pfile->buffer->file->implicit_preinclude));
8f9b4009 536
b0d11f1e
NS
537 if (!fake)
538 /* Try each path in the include chain. */
539 for (;;)
540 {
541 if (find_file_in_dir (pfile, file, &invalid_pch, loc))
8f9b4009 542 break;
49634b3a 543
b0d11f1e
NS
544 file->dir = file->dir->next;
545 if (file->dir == NULL)
546 {
547 if (search_path_exhausted (pfile, fname, file))
548 {
549 /* Although this file must not go in the cache,
550 because the file found might depend on things (like
551 the current file) that aren't represented in the
552 cache, it still has to go in the list of all files
553 so that #import works. */
554 file->next_file = pfile->all_files;
555 pfile->all_files = file;
556 if (*hash_slot == NULL)
557 {
558 /* If *hash_slot is NULL, the above
559 htab_find_slot_with_hash call just created the
560 slot, but we aren't going to store there
561 anything, so need to remove the newly created
562 entry. htab_clear_slot requires that it is
563 non-NULL, so store there some non-NULL pointer,
564 htab_clear_slot will overwrite it
565 immediately. */
566 *hash_slot = file;
567 htab_clear_slot (pfile->file_hash, hash_slot);
568 }
569 return file;
570 }
571
572 if (invalid_pch)
573 {
574 cpp_error (pfile, CPP_DL_ERROR,
575 "one or more PCH files were found,"
576 " but they were invalid");
577 if (!cpp_get_options (pfile)->warn_invalid_pch)
578 cpp_error (pfile, CPP_DL_ERROR,
579 "use -Winvalid-pch for more information");
580 }
581
582 if (implicit_preinclude)
583 {
584 free ((char *) file->name);
585 free (file);
586 if (*hash_slot == NULL)
587 {
588 /* See comment on the above htab_clear_slot call. */
589 *hash_slot = file;
590 htab_clear_slot (pfile->file_hash, hash_slot);
591 }
592 return NULL;
593 }
eb1f4d9d 594
b0d11f1e
NS
595 open_file_failed (pfile, file, angle_brackets, loc);
596 break;
597 }
598
599 /* Only check the cache for the starting location (done above)
600 and the quote and bracket chain heads because there are no
601 other possible starting points for searches. */
602 if (file->dir == pfile->bracket_include)
603 saw_bracket_include = true;
604 else if (file->dir == pfile->quote_include)
605 saw_quote_include = true;
606 else
607 continue;
608
609 entry
610 = search_cache ((struct cpp_file_hash_entry *) *hash_slot, file->dir);
611 if (entry)
612 {
613 found_in_cache = file->dir;
614 break;
615 }
616 }
c6e83800 617
f5eab47e
JJ
618 if (entry)
619 {
620 /* Cache for START_DIR too, sharing the _cpp_file structure. */
621 free ((char *) file->name);
622 free (file);
623 file = entry->u.file;
624 }
625 else
626 {
627 /* This is a new file; put it in the list. */
628 file->next_file = pfile->all_files;
629 pfile->all_files = file;
c6e83800
ZW
630 }
631
8f9b4009
NB
632 /* Store this new result in the hash table. */
633 entry = new_file_hash_entry (pfile);
d87fc699 634 entry->next = (struct cpp_file_hash_entry *) *hash_slot;
8f9b4009 635 entry->start_dir = start_dir;
f1e20710 636 entry->location = pfile->line_table->highest_location;
8f9b4009 637 entry->u.file = file;
15fd8332 638 *hash_slot = (void *) entry;
e5eba70a 639
0b4cafec
ILT
640 /* If we passed the quote or bracket chain heads, cache them also.
641 This speeds up processing if there are lots of -I options. */
642 if (saw_bracket_include
643 && pfile->bracket_include != start_dir
644 && found_in_cache != pfile->bracket_include)
645 {
646 entry = new_file_hash_entry (pfile);
d87fc699 647 entry->next = (struct cpp_file_hash_entry *) *hash_slot;
0b4cafec 648 entry->start_dir = pfile->bracket_include;
f1e20710 649 entry->location = pfile->line_table->highest_location;
0b4cafec 650 entry->u.file = file;
15fd8332 651 *hash_slot = (void *) entry;
0b4cafec
ILT
652 }
653 if (saw_quote_include
654 && pfile->quote_include != start_dir
655 && found_in_cache != pfile->quote_include)
656 {
657 entry = new_file_hash_entry (pfile);
d87fc699 658 entry->next = (struct cpp_file_hash_entry *) *hash_slot;
0b4cafec 659 entry->start_dir = pfile->quote_include;
f1e20710 660 entry->location = pfile->line_table->highest_location;
0b4cafec 661 entry->u.file = file;
15fd8332 662 *hash_slot = (void *) entry;
0b4cafec
ILT
663 }
664
8f9b4009 665 return file;
a58d32c2
ZW
666}
667
8f9b4009 668/* Read a file into FILE->buffer, returning true on success.
a58d32c2 669
8f9b4009
NB
670 If FILE->fd is something weird, like a block device, we don't want
671 to read it at all. Don't even try to figure out what something is,
672 except for plain files and block devices, since there is no
673 reliable portable way of doing this.
a58d32c2 674
ac81cf0b
DM
675 Use LOC for any diagnostics.
676
a58d32c2 677 FIXME: Flush file cache and try again if we run out of memory. */
8f9b4009 678static bool
620e594b 679read_file_guts (cpp_reader *pfile, _cpp_file *file, location_t loc)
a58d32c2 680{
8f9b4009 681 ssize_t size, total, count;
562a5c27 682 uchar *buf;
8f9b4009 683 bool regular;
16dd5cfe 684
8f9b4009
NB
685 if (S_ISBLK (file->st.st_mode))
686 {
ac81cf0b
DM
687 cpp_error_at (pfile, CPP_DL_ERROR, loc,
688 "%s is a block device", file->path);
8f9b4009
NB
689 return false;
690 }
a58d32c2 691
fc0993ac 692 regular = S_ISREG (file->st.st_mode) != 0;
8f9b4009 693 if (regular)
f2d5f0cc 694 {
a58d32c2
ZW
695 /* off_t might have a wider range than ssize_t - in other words,
696 the max size of a file might be bigger than the address
697 space. We can't handle a file that large. (Anyone with
698 a single source file bigger than 2GB needs to rethink
699 their coding style.) Some systems (e.g. AIX 4.1) define
700 SSIZE_MAX to be much smaller than the actual range of the
701 type. Use INTTYPE_MAXIMUM unconditionally to ensure this
702 does not bite us. */
8f9b4009 703 if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
f2d5f0cc 704 {
ac81cf0b
DM
705 cpp_error_at (pfile, CPP_DL_ERROR, loc,
706 "%s is too large", file->path);
8f9b4009 707 return false;
f2d5f0cc 708 }
a58d32c2 709
8f9b4009
NB
710 size = file->st.st_size;
711 }
712 else
713 /* 8 kilobytes is a sensible starting size. It ought to be bigger
714 than the kernel pipe buffer, and it's definitely bigger than
715 the majority of C source files. */
716 size = 8 * 1024;
717
f41e5bd1
JJ
718 /* The + 16 here is space for the final '\n' and 15 bytes of padding,
719 used to quiet warnings from valgrind or Address Sanitizer, when the
720 optimized lexer accesses aligned 16-byte memory chunks, including
721 the bytes after the malloced, area, and stops lexing on '\n'. */
722 buf = XNEWVEC (uchar, size + 16);
8f9b4009
NB
723 total = 0;
724 while ((count = read (file->fd, buf + total, size - total)) > 0)
725 {
726 total += count;
727
728 if (total == size)
d4506961 729 {
8f9b4009
NB
730 if (regular)
731 break;
732 size *= 2;
f41e5bd1 733 buf = XRESIZEVEC (uchar, buf, size + 16);
d4506961 734 }
a58d32c2 735 }
8f9b4009
NB
736
737 if (count < 0)
a58d32c2 738 {
ac81cf0b 739 cpp_errno_filename (pfile, CPP_DL_ERROR, file->path, loc);
55e7f907 740 free (buf);
8f9b4009 741 return false;
a58d32c2 742 }
8f9b4009
NB
743
744 if (regular && total != size && STAT_SIZE_RELIABLE (file->st))
ac81cf0b 745 cpp_error_at (pfile, CPP_DL_WARNING, loc,
0527bc4e 746 "%s is shorter than expected", file->path);
8f9b4009 747
688e7a53
TT
748 file->buffer = _cpp_convert_input (pfile,
749 CPP_OPTION (pfile, input_charset),
f41e5bd1 750 buf, size + 16, total,
688e7a53
TT
751 &file->buffer_start,
752 &file->st.st_size);
8f9b4009
NB
753 file->buffer_valid = true;
754
755 return true;
756}
757
758/* Convenience wrapper around read_file_guts that opens the file if
a98ebe2e 759 necessary and closes the file descriptor after reading. FILE must
ac81cf0b
DM
760 have been passed through find_file() at some stage. Use LOC for
761 any diagnostics. */
8f9b4009 762static bool
620e594b 763read_file (cpp_reader *pfile, _cpp_file *file, location_t loc)
8f9b4009 764{
8f9b4009
NB
765 /* If we already have its contents in memory, succeed immediately. */
766 if (file->buffer_valid)
767 return true;
a58d32c2 768
8f9b4009
NB
769 /* If an earlier read failed for some reason don't try again. */
770 if (file->dont_read || file->err_no)
771 return false;
4d6baafa 772
8f9b4009
NB
773 if (file->fd == -1 && !open_file (file))
774 {
ac81cf0b 775 open_file_failed (pfile, file, 0, loc);
8f9b4009 776 return false;
f2d5f0cc 777 }
d7a2e0f7 778
ac81cf0b 779 file->dont_read = !read_file_guts (pfile, file, loc);
8f9b4009
NB
780 close (file->fd);
781 file->fd = -1;
a58d32c2 782
8f9b4009 783 return !file->dont_read;
a58d32c2
ZW
784}
785
b0d11f1e
NS
786/* Returns TRUE if FILE is already known to be idempotent, and should
787 therefore not be read again. */
8f9b4009 788static bool
b0d11f1e 789is_known_idempotent_file (cpp_reader *pfile, _cpp_file *file, bool import)
a58d32c2 790{
49634b3a
NB
791 /* Skip once-only files. */
792 if (file->once_only)
b0d11f1e 793 return true;
49634b3a 794
16dd5cfe 795 /* We must mark the file once-only if #import now, before header
49634b3a
NB
796 guard checks. Otherwise, undefining the header guard might
797 cause the file to be re-stacked. */
798 if (import)
799 {
800 _cpp_mark_file_once_only (pfile, file);
801
802 /* Don't stack files that have been stacked before. */
803 if (file->stack_count)
b0d11f1e 804 return true;
49634b3a
NB
805 }
806
cf1ee30c
NB
807 /* Skip if the file had a header guard and the macro is defined.
808 PCH relies on this appearing before the PCH handler below. */
3f6677f4 809 if (file->cmacro && cpp_macro_p (file->cmacro))
b0d11f1e 810 return true;
bf42e45b 811
cf1ee30c 812 /* Handle PCH files immediately; don't stack them. */
d4c32e1d 813 if (file->pchname)
c31a6508 814 {
c0d578e6 815 pfile->cb.read_pch (pfile, file->pchname, file->fd, file->path);
cf1ee30c 816 file->fd = -1;
d4c32e1d
JJ
817 free ((void *) file->pchname);
818 file->pchname = NULL;
b0d11f1e 819 return true;
c31a6508 820 }
8f9b4009 821
b0d11f1e
NS
822 return false;
823}
c31a6508 824
b0d11f1e
NS
825/* Return TRUE if file has unique contents, so we should read process
826 it. The file's contents must already have been read. */
827
828static bool
829has_unique_contents (cpp_reader *pfile, _cpp_file *file, bool import,
830 location_t loc)
831{
73e61092
GK
832 /* Check the file against the PCH file. This is done before
833 checking against files we've already seen, since it may save on
834 I/O. */
835 if (check_file_against_entries (pfile, file, import))
836 {
837 /* If this isn't a #import, but yet we can't include the file,
838 that means that it was #import-ed in the PCH file,
839 so we can never include it again. */
840 if (! import)
841 _cpp_mark_file_once_only (pfile, file);
842 return false;
843 }
844
49634b3a
NB
845 /* Now we've read the file's contents, we can stack it if there
846 are no once-only files. */
847 if (!pfile->seen_once_only)
cf1ee30c
NB
848 return true;
849
49634b3a 850 /* We may have read the file under a different name. Look
8f9b4009 851 for likely candidates and compare file contents to be sure. */
b0d11f1e 852 for (_cpp_file *f = pfile->all_files; f; f = f->next_file)
8f9b4009
NB
853 {
854 if (f == file)
b0d11f1e 855 continue; /* It'sa me! */
8f9b4009 856
49634b3a
NB
857 if ((import || f->once_only)
858 && f->err_no == 0
8f9b4009 859 && f->st.st_mtime == file->st.st_mtime
1b449375
EB
860 && f->st.st_size == file->st.st_size)
861 {
862 _cpp_file *ref_file;
1b449375
EB
863
864 if (f->buffer && !f->buffer_valid)
865 {
866 /* We already have a buffer but it is not valid, because
867 the file is still stacked. Make a new one. */
868 ref_file = make_cpp_file (pfile, f->dir, f->name);
869 ref_file->path = f->path;
870 }
871 else
872 /* The file is not stacked anymore. We can reuse it. */
873 ref_file = f;
874
b0d11f1e
NS
875 bool same_file_p = (read_file (pfile, ref_file, loc)
876 /* Size might have changed in read_file(). */
877 && ref_file->st.st_size == file->st.st_size
878 && !memcmp (ref_file->buffer, file->buffer,
879 file->st.st_size));
1b449375
EB
880
881 if (f->buffer && !f->buffer_valid)
882 {
883 ref_file->path = 0;
884 destroy_cpp_file (ref_file);
885 }
886
887 if (same_file_p)
b0d11f1e
NS
888 /* Already seen under a different name. */
889 return false;
1b449375 890 }
0b3d776a 891 }
8f9b4009 892
b0d11f1e 893 return true;
cf1ee30c
NB
894}
895
896/* Place the file referenced by FILE into a new buffer on the buffer
897 stack if possible. IMPORT is true if this stacking attempt is
898 because of a #import directive. Returns true if a buffer is
ac81cf0b 899 stacked. Use LOC for any diagnostics. */
4dc299fb 900bool
b0d11f1e 901_cpp_stack_file (cpp_reader *pfile, _cpp_file *file, include_type type,
620e594b 902 location_t loc)
cf1ee30c 903{
b0d11f1e
NS
904 if (is_known_idempotent_file (pfile, file, type == IT_IMPORT))
905 return false;
cf1ee30c 906
b0d11f1e 907 if (!read_file (pfile, file, loc))
ff65e980 908 return false;
cf1ee30c 909
b0d11f1e
NS
910 if (!has_unique_contents (pfile, file, type == IT_IMPORT, loc))
911 return false;
912
913 int sysp = 0;
914 if (pfile->buffer && file->dir)
915 sysp = MAX (pfile->buffer->sysp, file->dir->sysp);
cf1ee30c
NB
916
917 /* Add the file to the dependencies on its first inclusion. */
b0d11f1e
NS
918 if (CPP_OPTION (pfile, deps.style) > (sysp != 0)
919 && !file->stack_count
61145d93 920 && file->path[0]
b0d11f1e 921 && !(file->main_file && CPP_OPTION (pfile, deps.ignore_main_file)))
61145d93 922 deps_add_dep (pfile->deps, file->path);
cf1ee30c
NB
923
924 /* Clear buffer_valid since _cpp_clean_line messes it up. */
925 file->buffer_valid = false;
926 file->stack_count++;
927
928 /* Stack the buffer. */
b0d11f1e
NS
929 cpp_buffer *buffer
930 = cpp_push_buffer (pfile, file->buffer, file->st.st_size,
931 CPP_OPTION (pfile, preprocessed)
932 && !CPP_OPTION (pfile, directives_only));
cf1ee30c 933 buffer->file = file;
12f9df4e 934 buffer->sysp = sysp;
28937f11 935 buffer->to_free = file->buffer_start;
cf1ee30c
NB
936
937 /* Initialize controlling macro state. */
938 pfile->mi_valid = true;
939 pfile->mi_cmacro = 0;
940
056f95ec
NS
941 /* In the case of a normal #include, we're now at the start of the
942 line *following* the #include. A separate location_t for this
943 location makes no sense, until we do the LC_LEAVE.
944
945 This does not apply if we found a PCH file, we're not a regular
946 include, or we ran out of locations. */
947 if (file->pchname == NULL
948 && type < IT_DIRECTIVE_HWM
949 && pfile->line_table->highest_location != LINE_MAP_MAX_LOCATION - 1)
950 pfile->line_table->highest_location--;
b0d11f1e
NS
951
952 /* Add line map and do callbacks. */
76bf2c97 953 _cpp_do_file_change (pfile, LC_ENTER, file->path, 1, sysp);
cf1ee30c
NB
954
955 return true;
add7091b
ZW
956}
957
49634b3a 958/* Mark FILE to be included once only. */
8f9b4009 959void
49634b3a 960_cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file)
f2d5f0cc 961{
49634b3a
NB
962 pfile->seen_once_only = true;
963 file->once_only = true;
8f9b4009
NB
964}
965
966/* Return the directory from which searching for FNAME should start,
2067c116 967 considering the directive TYPE and ANGLE_BRACKETS. If there is
8f9b4009
NB
968 nothing left in the path, returns NULL. */
969static struct cpp_dir *
970search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
971 enum include_type type)
972{
973 cpp_dir *dir;
974 _cpp_file *file;
74eb4b3e 975
3dce1408 976 if (IS_ABSOLUTE_PATH (fname))
8f9b4009
NB
977 return &pfile->no_search_path;
978
4dc299fb
PB
979 /* pfile->buffer is NULL when processing an -include command-line flag. */
980 file = pfile->buffer == NULL ? pfile->main_file : pfile->buffer->file;
41947a54
NB
981
982 /* For #include_next, skip in the search path past the dir in which
e7182666
NB
983 the current file was found, but if it was found via an absolute
984 path use the normal search logic. */
b0f4807f
MM
985 if (type == IT_INCLUDE_NEXT && file->dir
986 && file->dir != &pfile->no_search_path)
8f9b4009 987 dir = file->dir->next;
74eb4b3e 988 else if (angle_brackets)
8f9b4009
NB
989 dir = pfile->bracket_include;
990 else if (type == IT_CMDLINE)
991 /* -include and -imacros use the #include "" chain with the
992 preprocessor's cwd prepended. */
993 return make_cpp_dir (pfile, "./", false);
994 else if (pfile->quote_ignores_source_dir)
995 dir = pfile->quote_include;
41947a54 996 else
12f9df4e
PB
997 return make_cpp_dir (pfile, dir_name_of_file (file),
998 pfile->buffer ? pfile->buffer->sysp : 0);
8f9b4009
NB
999
1000 if (dir == NULL)
0527bc4e 1001 cpp_error (pfile, CPP_DL_ERROR,
8f9b4009
NB
1002 "no include path in which to search for %s", fname);
1003
1004 return dir;
1005}
41947a54 1006
8f9b4009 1007/* Strip the basename from the file's path. It ends with a slash if
02fa63cd 1008 of nonzero length. Note that this procedure also works for
8f9b4009
NB
1009 <stdin>, which is represented by the empty string. */
1010static const char *
1011dir_name_of_file (_cpp_file *file)
1012{
1013 if (!file->dir_name)
41947a54 1014 {
8f9b4009 1015 size_t len = lbasename (file->path) - file->path;
c3f829c1 1016 char *dir_name = XNEWVEC (char, len + 1);
8f9b4009
NB
1017
1018 memcpy (dir_name, file->path, len);
1019 dir_name[len] = '\0';
1020 file->dir_name = dir_name;
41947a54
NB
1021 }
1022
8f9b4009
NB
1023 return file->dir_name;
1024}
1025
8f9b4009
NB
1026/* Handles #include-family directives (distinguished by TYPE),
1027 including HEADER, and the command line -imacros and -include.
1028 Returns true if a buffer was stacked. */
1029bool
1030_cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
620e594b 1031 enum include_type type, location_t loc)
8f9b4009 1032{
cc811a8a
BE
1033 /* For -include command-line flags we have type == IT_CMDLINE.
1034 When the first -include file is processed we have the case, where
1035 pfile->cur_token == pfile->cur_run->base, we are directly called up
1036 by the front end. However in the case of the second -include file,
1037 we are called from _cpp_lex_token -> _cpp_get_fresh_line ->
1038 cpp_push_include, with pfile->cur_token != pfile->cur_run->base,
1039 and pfile->cur_token[-1].src_loc not (yet) initialized.
1040 However, when the include file cannot be found, we need src_loc to
1041 be initialized to some safe value: 0 means UNKNOWN_LOCATION. */
1042 if (type == IT_CMDLINE && pfile->cur_token != pfile->cur_run->base)
1043 pfile->cur_token[-1].src_loc = 0;
1044
b0d11f1e 1045 cpp_dir *dir = search_path_head (pfile, fname, angle_brackets, type);
8f9b4009
NB
1046 if (!dir)
1047 return false;
1048
b0d11f1e
NS
1049 _cpp_file *file = _cpp_find_file (pfile, fname, dir, false, angle_brackets,
1050 type == IT_DEFAULT, loc);
1efcb8c6
JM
1051 if (type == IT_DEFAULT && file == NULL)
1052 return false;
22234f56 1053
b0d11f1e 1054 return _cpp_stack_file (pfile, file, type, loc);
8f9b4009
NB
1055}
1056
1057/* Could not open FILE. The complication is dependency output. */
1058static void
ac81cf0b 1059open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets,
620e594b 1060 location_t loc)
8f9b4009 1061{
500bee0a 1062 int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
6568f34b 1063 bool print_dep = CPP_OPTION (pfile, deps.style) > (angle_brackets || !!sysp);
8f9b4009 1064
a15f7cb8
ESR
1065 if (pfile->state.in__has_include__)
1066 return;
1067
8f9b4009
NB
1068 errno = file->err_no;
1069 if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
74dc6a11
CD
1070 {
1071 deps_add_dep (pfile->deps, file->name);
1072 /* If the preprocessor output (other than dependency information) is
1073 being used, we must also flag an error. */
1074 if (CPP_OPTION (pfile, deps.need_preprocessor_output))
46ce03de 1075 cpp_errno_filename (pfile, CPP_DL_FATAL,
ac81cf0b
DM
1076 file->path ? file->path : file->name,
1077 loc);
74dc6a11 1078 }
8f9b4009 1079 else
add7091b 1080 {
74dc6a11
CD
1081 /* If we are not outputting dependencies, or if we are and dependencies
1082 were requested for this file, or if preprocessor output is needed
1083 in addition to dependency information, this is an error.
1084
1085 Otherwise (outputting dependencies but not for this file, and not
1086 using the preprocessor output), we can still produce correct output
1087 so it's only a warning. */
1088 if (CPP_OPTION (pfile, deps.style) == DEPS_NONE
1089 || print_dep
1090 || CPP_OPTION (pfile, deps.need_preprocessor_output))
46ce03de 1091 cpp_errno_filename (pfile, CPP_DL_FATAL,
ac81cf0b
DM
1092 file->path ? file->path : file->name,
1093 loc);
74dc6a11 1094 else
46ce03de 1095 cpp_errno_filename (pfile, CPP_DL_WARNING,
ac81cf0b
DM
1096 file->path ? file->path : file->name,
1097 loc);
add7091b 1098 }
8f9b4009 1099}
591e15a1 1100
8f9b4009
NB
1101/* Search in the chain beginning at HEAD for a file whose search path
1102 started at START_DIR != NULL. */
d87fc699
JH
1103static struct cpp_file_hash_entry *
1104search_cache (struct cpp_file_hash_entry *head, const cpp_dir *start_dir)
8f9b4009 1105{
f5eab47e
JJ
1106 while (head && head->start_dir != start_dir)
1107 head = head->next;
1108
1109 return head;
8f9b4009
NB
1110}
1111
1112/* Allocate a new _cpp_file structure. */
1113static _cpp_file *
1114make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
1115{
1116 _cpp_file *file;
1117
c3f829c1 1118 file = XCNEW (_cpp_file);
8f9b4009
NB
1119 file->main_file = !pfile->buffer;
1120 file->fd = -1;
1121 file->dir = dir;
1122 file->name = xstrdup (fname);
1123
1124 return file;
1125}
1126
1b449375
EB
1127/* Release a _cpp_file structure. */
1128static void
1129destroy_cpp_file (_cpp_file *file)
1130{
04695783 1131 free ((void *) file->buffer_start);
1b449375 1132 free ((void *) file->name);
f5ea989d 1133 free ((void *) file->path);
1b449375
EB
1134 free (file);
1135}
1136
97f6bd40
TT
1137/* Release all the files allocated by this reader. */
1138static void
1139destroy_all_cpp_files (cpp_reader *pfile)
1140{
1141 _cpp_file *iter = pfile->all_files;
1142 while (iter)
1143 {
1144 _cpp_file *next = iter->next_file;
1145 destroy_cpp_file (iter);
1146 iter = next;
1147 }
1148}
1149
8f9b4009
NB
1150/* A hash of directory names. The directory names are the path names
1151 of files which contain a #include "", the included file name is
1152 appended to this directories.
1153
1154 To avoid duplicate entries we follow the convention that all
1155 non-empty directory names should end in a '/'. DIR_NAME must be
1156 stored in permanently allocated memory. */
1157static cpp_dir *
1158make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
1159{
d87fc699 1160 struct cpp_file_hash_entry *entry, **hash_slot;
8f9b4009
NB
1161 cpp_dir *dir;
1162
d87fc699 1163 hash_slot = (struct cpp_file_hash_entry **)
a23ee064 1164 htab_find_slot_with_hash (pfile->dir_hash, dir_name,
b92be669
PB
1165 htab_hash_string (dir_name),
1166 INSERT);
8f9b4009
NB
1167
1168 /* Have we already hashed this directory? */
1169 for (entry = *hash_slot; entry; entry = entry->next)
1170 if (entry->start_dir == NULL)
1171 return entry->u.dir;
1172
c3f829c1 1173 dir = XCNEW (cpp_dir);
8f9b4009
NB
1174 dir->next = pfile->quote_include;
1175 dir->name = (char *) dir_name;
1176 dir->len = strlen (dir_name);
1177 dir->sysp = sysp;
94d1613b 1178 dir->construct = 0;
8f9b4009
NB
1179
1180 /* Store this new result in the hash table. */
1181 entry = new_file_hash_entry (pfile);
1182 entry->next = *hash_slot;
1183 entry->start_dir = NULL;
f1e20710 1184 entry->location = pfile->line_table->highest_location;
8f9b4009
NB
1185 entry->u.dir = dir;
1186 *hash_slot = entry;
1187
1188 return dir;
1189}
1190
1191/* Create a new block of memory for file hash entries. */
1192static void
1193allocate_file_hash_entries (cpp_reader *pfile)
1194{
97f6bd40
TT
1195 struct file_hash_entry_pool *pool = XNEW (struct file_hash_entry_pool);
1196 pool->file_hash_entries_used = 0;
1197 pool->next = pfile->file_hash_entries;
1198 pfile->file_hash_entries = pool;
8f9b4009
NB
1199}
1200
1201/* Return a new file hash entry. */
d87fc699 1202static struct cpp_file_hash_entry *
8f9b4009
NB
1203new_file_hash_entry (cpp_reader *pfile)
1204{
97f6bd40
TT
1205 unsigned int idx;
1206 if (pfile->file_hash_entries->file_hash_entries_used == FILE_HASH_POOL_SIZE)
8f9b4009
NB
1207 allocate_file_hash_entries (pfile);
1208
97f6bd40
TT
1209 idx = pfile->file_hash_entries->file_hash_entries_used++;
1210 return &pfile->file_hash_entries->pool[idx];
1211}
1212
1213/* Free the file hash entry pools. */
1214static void
1215free_file_hash_entries (cpp_reader *pfile)
1216{
1217 struct file_hash_entry_pool *iter = pfile->file_hash_entries;
1218 while (iter)
1219 {
1220 struct file_hash_entry_pool *next = iter->next;
1221 free (iter);
1222 iter = next;
1223 }
8f9b4009
NB
1224}
1225
1226/* Returns TRUE if a file FNAME has ever been successfully opened.
1227 This routine is not intended to correctly handle filenames aliased
1228 by links or redundant . or .. traversals etc. */
1229bool
1230cpp_included (cpp_reader *pfile, const char *fname)
1231{
d87fc699 1232 struct cpp_file_hash_entry *entry;
8f9b4009 1233
d87fc699 1234 entry = (struct cpp_file_hash_entry *)
c3f829c1 1235 htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
8f9b4009
NB
1236
1237 while (entry && (entry->start_dir == NULL || entry->u.file->err_no))
1238 entry = entry->next;
1239
1240 return entry != NULL;
1241}
1242
f1e20710
TT
1243/* Returns TRUE if a file FNAME has ever been successfully opened
1244 before LOCATION. This routine is not intended to correctly handle
1245 filenames aliased by links or redundant . or .. traversals etc. */
1246bool
1247cpp_included_before (cpp_reader *pfile, const char *fname,
620e594b 1248 location_t location)
f1e20710 1249{
53290e07
JJ
1250 struct cpp_file_hash_entry *entry
1251 = (struct cpp_file_hash_entry *)
1252 htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
f1e20710 1253
53290e07
JJ
1254 if (IS_ADHOC_LOC (location))
1255 location = get_location_from_adhoc_loc (pfile->line_table, location);
f1e20710
TT
1256
1257 while (entry && (entry->start_dir == NULL || entry->u.file->err_no
1258 || entry->location > location))
1259 entry = entry->next;
1260
1261 return entry != NULL;
1262}
1263
6614fd40 1264/* Calculate the hash value of a file hash entry P. */
b92be669
PB
1265
1266static hashval_t
1267file_hash_hash (const void *p)
1268{
d87fc699 1269 struct cpp_file_hash_entry *entry = (struct cpp_file_hash_entry *) p;
b92be669
PB
1270 const char *hname;
1271 if (entry->start_dir)
1272 hname = entry->u.file->name;
1273 else
1274 hname = entry->u.dir->name;
1275
1276 return htab_hash_string (hname);
1277}
1278
8f9b4009
NB
1279/* Compare a string Q against a file hash entry P. */
1280static int
b92be669 1281file_hash_eq (const void *p, const void *q)
8f9b4009 1282{
d87fc699 1283 struct cpp_file_hash_entry *entry = (struct cpp_file_hash_entry *) p;
8f9b4009
NB
1284 const char *fname = (const char *) q;
1285 const char *hname;
1286
1287 if (entry->start_dir)
1288 hname = entry->u.file->name;
1289 else
1290 hname = entry->u.dir->name;
1291
4489800d 1292 return filename_cmp (hname, fname) == 0;
8f9b4009
NB
1293}
1294
0b4cafec
ILT
1295/* Compare entries in the nonexistent file hash table. These are just
1296 strings. */
1297static int
1298nonexistent_file_hash_eq (const void *p, const void *q)
1299{
4489800d 1300 return filename_cmp ((const char *) p, (const char *) q) == 0;
0b4cafec
ILT
1301}
1302
8f9b4009
NB
1303/* Initialize everything in this source file. */
1304void
1305_cpp_init_files (cpp_reader *pfile)
1306{
b92be669 1307 pfile->file_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
8f9b4009 1308 NULL, xcalloc, free);
a23ee064
AP
1309 pfile->dir_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
1310 NULL, xcalloc, free);
8f9b4009 1311 allocate_file_hash_entries (pfile);
0b4cafec
ILT
1312 pfile->nonexistent_file_hash = htab_create_alloc (127, htab_hash_string,
1313 nonexistent_file_hash_eq,
1314 NULL, xcalloc, free);
19a9ba64
AM
1315 obstack_specify_allocation (&pfile->nonexistent_file_ob, 0, 0,
1316 xmalloc, free);
8f9b4009
NB
1317}
1318
1319/* Finalize everything in this source file. */
1320void
1321_cpp_cleanup_files (cpp_reader *pfile)
1322{
1323 htab_delete (pfile->file_hash);
a23ee064 1324 htab_delete (pfile->dir_hash);
0b4cafec
ILT
1325 htab_delete (pfile->nonexistent_file_hash);
1326 obstack_free (&pfile->nonexistent_file_ob, 0);
97f6bd40
TT
1327 free_file_hash_entries (pfile);
1328 destroy_all_cpp_files (pfile);
1329}
1330
1331/* Make the parser forget about files it has seen. This can be useful
1332 for resetting the parser to start another run. */
1333void
1334cpp_clear_file_cache (cpp_reader *pfile)
1335{
1336 _cpp_cleanup_files (pfile);
1337 pfile->file_hash_entries = NULL;
1338 pfile->all_files = NULL;
1339 _cpp_init_files (pfile);
8f9b4009
NB
1340}
1341
1342/* Enter a file name in the hash for the sake of cpp_included. */
1343void
1344_cpp_fake_include (cpp_reader *pfile, const char *fname)
1345{
ac81cf0b 1346 _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true, 0, false, 0);
add7091b
ZW
1347}
1348
e605b040 1349/* Not everyone who wants to set system-header-ness on a buffer can
642ce434
NB
1350 see the details of a buffer. This is an exported interface because
1351 fix-header needs it. */
e605b040 1352void
6cf87ca4 1353cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc)
e605b040 1354{
614c7d37 1355 int flags = 0;
99b1c316 1356 const class line_maps *line_table = pfile->line_table;
0e50b624 1357 const line_map_ordinary *map = LINEMAPS_LAST_ORDINARY_MAP (line_table);
614c7d37
NB
1358 /* 1 = system header, 2 = system header to be treated as C. */
1359 if (syshdr)
1360 flags = 1 + (externc != 0);
12f9df4e 1361 pfile->buffer->sysp = flags;
46427374 1362 _cpp_do_file_change (pfile, LC_RENAME, ORDINARY_MAP_FILE_NAME (map),
500bee0a 1363 SOURCE_LINE (map, pfile->line_table->highest_line), flags);
e605b040
ZW
1364}
1365
b4e46cea
PB
1366/* Allow the client to change the current file. Used by the front end
1367 to achieve pseudo-file names like <built-in>.
1368 If REASON is LC_LEAVE, then NEW_NAME must be NULL. */
c19b12cb 1369void
6cf87ca4
ZW
1370cpp_change_file (cpp_reader *pfile, enum lc_reason reason,
1371 const char *new_name)
c19b12cb 1372{
b4e46cea 1373 _cpp_do_file_change (pfile, reason, new_name, 1, 0);
c19b12cb
NB
1374}
1375
affa55c6
JJ
1376struct report_missing_guard_data
1377{
1378 const char **paths;
1379 size_t count;
1380};
1381
8f9b4009 1382/* Callback function for htab_traverse. */
c71f835b 1383static int
affa55c6 1384report_missing_guard (void **slot, void *d)
c71f835b 1385{
d87fc699 1386 struct cpp_file_hash_entry *entry = (struct cpp_file_hash_entry *) *slot;
affa55c6
JJ
1387 struct report_missing_guard_data *data
1388 = (struct report_missing_guard_data *) d;
c71f835b 1389
8f9b4009
NB
1390 /* Skip directories. */
1391 if (entry->start_dir != NULL)
c71f835b 1392 {
8f9b4009
NB
1393 _cpp_file *file = entry->u.file;
1394
1395 /* We don't want MI guard advice for the main file. */
d8a12e84
MLI
1396 if (!file->once_only && file->cmacro == NULL
1397 && file->stack_count == 1 && !file->main_file)
c71f835b 1398 {
affa55c6 1399 if (data->paths == NULL)
8f9b4009 1400 {
affa55c6
JJ
1401 data->paths = XCNEWVEC (const char *, data->count);
1402 data->count = 0;
8f9b4009
NB
1403 }
1404
affa55c6 1405 data->paths[data->count++] = file->path;
c71f835b 1406 }
c71f835b 1407 }
c71f835b 1408
affa55c6
JJ
1409 /* Keep traversing the hash table. */
1410 return 1;
1411}
1412
1413/* Comparison function for qsort. */
1414static int
1415report_missing_guard_cmp (const void *p1, const void *p2)
1416{
1417 return strcmp (*(const char *const *) p1, *(const char *const *) p2);
a36c54fa
NB
1418}
1419
8f9b4009
NB
1420/* Report on all files that might benefit from a multiple include guard.
1421 Triggered by -H. */
1422void
1423_cpp_report_missing_guards (cpp_reader *pfile)
168d3732 1424{
affa55c6
JJ
1425 struct report_missing_guard_data data;
1426
1427 data.paths = NULL;
1428 data.count = htab_elements (pfile->file_hash);
1429 htab_traverse (pfile->file_hash, report_missing_guard, &data);
ba133c96 1430
affa55c6
JJ
1431 if (data.paths != NULL)
1432 {
1433 size_t i;
1434
1435 /* Sort the paths to avoid outputting them in hash table
1436 order. */
1437 qsort (data.paths, data.count, sizeof (const char *),
1438 report_missing_guard_cmp);
1439 fputs (_("Multiple include guards may be useful for:\n"),
1440 stderr);
1441 for (i = 0; i < data.count; i++)
1442 {
1443 fputs (data.paths[i], stderr);
1444 putc ('\n', stderr);
1445 }
1446 free (data.paths);
1447 }
168d3732
ZW
1448}
1449
41947a54 1450/* Locate HEADER, and determine whether it is newer than the current
48c4721e 1451 file. If it cannot be located or dated, return -1, if it is
41947a54 1452 newer, return 1, otherwise 0. */
f3f751ad 1453int
6cf87ca4
ZW
1454_cpp_compare_file_date (cpp_reader *pfile, const char *fname,
1455 int angle_brackets)
f3f751ad 1456{
8f9b4009
NB
1457 _cpp_file *file;
1458 struct cpp_dir *dir;
df383483 1459
8f9b4009
NB
1460 dir = search_path_head (pfile, fname, angle_brackets, IT_INCLUDE);
1461 if (!dir)
f3f751ad 1462 return -1;
41947a54 1463
ac81cf0b 1464 file = _cpp_find_file (pfile, fname, dir, false, angle_brackets, false, 0);
8f9b4009
NB
1465 if (file->err_no)
1466 return -1;
c45da1ca 1467
8f9b4009 1468 if (file->fd != -1)
c0bfe993 1469 {
8f9b4009
NB
1470 close (file->fd);
1471 file->fd = -1;
c0bfe993 1472 }
041c3194 1473
8f9b4009 1474 return file->st.st_mtime > pfile->buffer->file->st.st_mtime;
f8f769ea
ZW
1475}
1476
c19b12cb
NB
1477/* Pushes the given file onto the buffer stack. Returns nonzero if
1478 successful. */
1479bool
8f9b4009 1480cpp_push_include (cpp_reader *pfile, const char *fname)
c19b12cb 1481{
ac81cf0b 1482 return _cpp_stack_include (pfile, fname, false, IT_CMDLINE, 0);
c19b12cb
NB
1483}
1484
1efcb8c6
JM
1485/* Pushes the given file, implicitly included at the start of a
1486 compilation, onto the buffer stack but without any errors if the
1487 file is not found. Returns nonzero if successful. */
1488bool
1489cpp_push_default_include (cpp_reader *pfile, const char *fname)
1490{
ac81cf0b 1491 return _cpp_stack_include (pfile, fname, true, IT_DEFAULT, 0);
1efcb8c6
JM
1492}
1493
5d8ebbd8 1494/* Do appropriate cleanup when a file INC's buffer is popped off the
af0d16cd
NB
1495 input stack. */
1496void
28937f11
JJ
1497_cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file,
1498 const unsigned char *to_free)
f9a0e96c 1499{
ba133c96 1500 /* Record the inclusion-preventing macro, which could be NULL
6d18adbc 1501 meaning no controlling macro. */
8f9b4009
NB
1502 if (pfile->mi_valid && file->cmacro == NULL)
1503 file->cmacro = pfile->mi_cmacro;
93c80368
NB
1504
1505 /* Invalidate control macros in the #including file. */
6d18adbc 1506 pfile->mi_valid = false;
f9a0e96c 1507
28937f11 1508 if (to_free)
8f9b4009 1509 {
28937f11
JJ
1510 if (to_free == file->buffer_start)
1511 {
1512 file->buffer_start = NULL;
1513 file->buffer = NULL;
1514 file->buffer_valid = false;
1515 }
1516 free ((void *) to_free);
8f9b4009 1517 }
f9a0e96c
ZW
1518}
1519
b492b686
GF
1520/* Return the file name associated with FILE. */
1521const char *
1522_cpp_get_file_name (_cpp_file *file)
1523{
1524 return file->name;
1525}
1526
be8ac3e2
GZ
1527/* Inteface to file statistics record in _cpp_file structure. */
1528struct stat *
1529_cpp_get_file_stat (_cpp_file *file)
1530{
1531 return &file->st;
1532}
1533
8f9b4009
NB
1534/* Set the include chain for "" to QUOTE, for <> to BRACKET. If
1535 QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
1536 directory of the including file.
ba133c96 1537
8f9b4009
NB
1538 If BRACKET does not lie in the QUOTE chain, it is set to QUOTE. */
1539void
1540cpp_set_include_chains (cpp_reader *pfile, cpp_dir *quote, cpp_dir *bracket,
1541 int quote_ignores_source_dir)
591e15a1 1542{
8f9b4009
NB
1543 pfile->quote_include = quote;
1544 pfile->bracket_include = quote;
1545 pfile->quote_ignores_source_dir = quote_ignores_source_dir;
591e15a1 1546
8f9b4009 1547 for (; quote; quote = quote->next)
591e15a1 1548 {
8f9b4009
NB
1549 quote->name_map = NULL;
1550 quote->len = strlen (quote->name);
1551 if (quote == bracket)
1552 pfile->bracket_include = bracket;
ba133c96 1553 }
591e15a1
NB
1554}
1555
8f9b4009
NB
1556/* Append the file name to the directory to create the path, but don't
1557 turn / into // or // into ///; // may be a namespace escape. */
1558static char *
1559append_file_to_dir (const char *fname, cpp_dir *dir)
1560{
1561 size_t dlen, flen;
1562 char *path;
1563
1564 dlen = dir->len;
1565 flen = strlen (fname);
c3f829c1 1566 path = XNEWVEC (char, dlen + 1 + flen + 1);
8f9b4009 1567 memcpy (path, dir->name, dlen);
4489800d 1568 if (dlen && !IS_DIR_SEPARATOR (path[dlen - 1]))
8f9b4009
NB
1569 path[dlen++] = '/';
1570 memcpy (&path[dlen], fname, flen + 1);
1571
1572 return path;
1573}
c31a6508
ZW
1574
1575/* Read a space delimited string of unlimited length from a stdio
5d8ebbd8 1576 file F. */
c31a6508 1577static char *
6cf87ca4 1578read_filename_string (int ch, FILE *f)
c31a6508
ZW
1579{
1580 char *alloc, *set;
1581 int len;
1582
1583 len = 20;
c3f829c1 1584 set = alloc = XNEWVEC (char, len + 1);
dc65cd60 1585 if (! is_space (ch))
c31a6508
ZW
1586 {
1587 *set++ = ch;
dc65cd60 1588 while ((ch = getc (f)) != EOF && ! is_space (ch))
c31a6508
ZW
1589 {
1590 if (set - alloc == len)
1591 {
1592 len *= 2;
c3f829c1 1593 alloc = XRESIZEVEC (char, alloc, len + 1);
c31a6508
ZW
1594 set = alloc + len / 2;
1595 }
1596 *set++ = ch;
1597 }
1598 }
1599 *set = '\0';
1600 ungetc (ch, f);
1601 return alloc;
1602}
1603
8f9b4009
NB
1604/* Read the file name map file for DIR. */
1605static void
1606read_name_map (cpp_dir *dir)
c31a6508 1607{
8f9b4009 1608 static const char FILE_NAME_MAP_FILE[] = "header.gcc";
c31a6508
ZW
1609 char *name;
1610 FILE *f;
8f9b4009
NB
1611 size_t len, count = 0, room = 9;
1612
1613 len = dir->len;
c3f829c1 1614 name = (char *) alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
8f9b4009 1615 memcpy (name, dir->name, len);
4489800d 1616 if (len && !IS_DIR_SEPARATOR (name[len - 1]))
8f9b4009
NB
1617 name[len++] = '/';
1618 strcpy (name + len, FILE_NAME_MAP_FILE);
c31a6508 1619 f = fopen (name, "r");
8767c894 1620
c3f829c1 1621 dir->name_map = XNEWVEC (const char *, room);
8f9b4009 1622
8767c894
NB
1623 /* Silently return NULL if we cannot open. */
1624 if (f)
c31a6508
ZW
1625 {
1626 int ch;
c31a6508
ZW
1627
1628 while ((ch = getc (f)) != EOF)
1629 {
8f9b4009 1630 char *to;
c31a6508 1631
dc65cd60 1632 if (is_space (ch))
c31a6508 1633 continue;
8f9b4009
NB
1634
1635 if (count + 2 > room)
1636 {
1637 room += 8;
c3f829c1 1638 dir->name_map = XRESIZEVEC (const char *, dir->name_map, room);
8f9b4009
NB
1639 }
1640
1641 dir->name_map[count] = read_filename_string (ch, f);
dc65cd60 1642 while ((ch = getc (f)) != EOF && is_hspace (ch))
c31a6508 1643 ;
c31a6508 1644
8f9b4009 1645 to = read_filename_string (ch, f);
3dce1408 1646 if (IS_ABSOLUTE_PATH (to))
8f9b4009 1647 dir->name_map[count + 1] = to;
c31a6508
ZW
1648 else
1649 {
8f9b4009 1650 dir->name_map[count + 1] = append_file_to_dir (to, dir);
c31a6508 1651 free (to);
df383483 1652 }
c31a6508 1653
8f9b4009 1654 count += 2;
c31a6508
ZW
1655 while ((ch = getc (f)) != '\n')
1656 if (ch == EOF)
1657 break;
1658 }
8f9b4009 1659
c31a6508
ZW
1660 fclose (f);
1661 }
df383483 1662
8f9b4009
NB
1663 /* Terminate the list of maps. */
1664 dir->name_map[count] = NULL;
df383483 1665}
c31a6508 1666
8f9b4009
NB
1667/* Remap a FILE's name based on the file_name_map, if any, for
1668 FILE->dir. If the file name has any directory separators,
1669 recursively check those directories too. */
c31a6508 1670static char *
8f9b4009 1671remap_filename (cpp_reader *pfile, _cpp_file *file)
c31a6508 1672{
8f9b4009 1673 const char *fname, *p;
58f30963 1674 char *new_dir, *p3;
8f9b4009
NB
1675 cpp_dir *dir;
1676 size_t index, len;
8767c894 1677
8f9b4009
NB
1678 dir = file->dir;
1679 fname = file->name;
df383483 1680
8f9b4009
NB
1681 for (;;)
1682 {
1683 if (!dir->name_map)
1684 read_name_map (dir);
c31a6508 1685
8f9b4009 1686 for (index = 0; dir->name_map[index]; index += 2)
4489800d 1687 if (!filename_cmp (dir->name_map[index], fname))
8f9b4009 1688 return xstrdup (dir->name_map[index + 1]);
4489800d
KT
1689 if (IS_ABSOLUTE_PATH (fname))
1690 return NULL;
8f9b4009 1691 p = strchr (fname, '/');
4489800d
KT
1692#ifdef HAVE_DOS_BASED_FILE_SYSTEM
1693 {
1694 char *p2 = strchr (fname, '\\');
1695 if (!p || (p > p2))
1696 p = p2;
1697 }
1698#endif
8f9b4009
NB
1699 if (!p || p == fname)
1700 return NULL;
f9200da2 1701
8f9b4009 1702 len = dir->len + (p - fname + 1);
58f30963
AP
1703 new_dir = XNEWVEC (char, len + 2);
1704 p3 = new_dir + dir->len;
8f9b4009 1705 memcpy (new_dir, dir->name, dir->len);
58f30963
AP
1706 if (dir->len && !IS_DIR_SEPARATOR (dir->name[dir->len - 1]))
1707 {
1708 *p3++ = '/';
1709 len++;
1710 }
1711 memcpy (p3, fname, p - fname + 1);
8f9b4009 1712 new_dir[len] = '\0';
df383483 1713
8f9b4009
NB
1714 dir = make_cpp_dir (pfile, new_dir, dir->sysp);
1715 fname = p + 1;
0b3d776a 1716 }
0b3d776a 1717}
986b1f13 1718
8f9b4009
NB
1719/* Returns true if PCHNAME is a valid PCH file for FILE. */
1720static bool
1721validate_pch (cpp_reader *pfile, _cpp_file *file, const char *pchname)
986b1f13 1722{
8f9b4009 1723 const char *saved_path = file->path;
230fcd32 1724 bool valid = false;
986b1f13 1725
8f9b4009
NB
1726 file->path = pchname;
1727 if (open_file (file))
986b1f13 1728 {
230fcd32 1729 valid = 1 & pfile->cb.valid_pch (pfile, pchname, file->fd);
8f9b4009 1730
230fcd32 1731 if (!valid)
986b1f13 1732 {
8f9b4009
NB
1733 close (file->fd);
1734 file->fd = -1;
986b1f13 1735 }
986b1f13 1736
8f9b4009 1737 if (CPP_OPTION (pfile, print_include_names))
986b1f13 1738 {
8f9b4009 1739 unsigned int i;
54020b29 1740 for (i = 1; i < pfile->line_table->depth; i++)
8f9b4009
NB
1741 putc ('.', stderr);
1742 fprintf (stderr, "%c %s\n",
230fcd32 1743 valid ? '!' : 'x', pchname);
986b1f13 1744 }
986b1f13
NB
1745 }
1746
8f9b4009 1747 file->path = saved_path;
230fcd32 1748 return valid;
986b1f13 1749}
94d1613b
MS
1750
1751/* Get the path associated with the _cpp_file F. The path includes
1752 the base name from the include directive and the directory it was
1753 found in via the search path. */
1754
1755const char *
1756cpp_get_path (struct _cpp_file *f)
1757{
1758 return f->path;
1759}
1760
e3c287c9
MS
1761/* Get the directory associated with the _cpp_file F. */
1762
1763cpp_dir *
1764cpp_get_dir (struct _cpp_file *f)
1765{
1766 return f->dir;
1767}
1768
94d1613b
MS
1769/* Get the cpp_buffer currently associated with the cpp_reader
1770 PFILE. */
1771
1772cpp_buffer *
1773cpp_get_buffer (cpp_reader *pfile)
1774{
1775 return pfile->buffer;
1776}
1777
1778/* Get the _cpp_file associated with the cpp_buffer B. */
1779
1780_cpp_file *
1781cpp_get_file (cpp_buffer *b)
1782{
1783 return b->file;
1784}
1785
1786/* Get the previous cpp_buffer given a cpp_buffer B. The previous
1787 buffer is the buffer that included the given buffer. */
1788
1789cpp_buffer *
1790cpp_get_prev (cpp_buffer *b)
1791{
1792 return b->prev;
1793}
73e61092 1794\f
1ae58c30 1795/* This data structure holds the list of header files that were seen
73e61092
GK
1796 while the PCH was being built. The 'entries' field is kept sorted
1797 in memcmp() order; yes, this means that on little-endian systems,
1798 it's sorted initially by the least-significant byte of 'size', but
1799 that's OK. The code does rely on having entries with the same size
1800 next to each other. */
1801
c3f829c1
GDR
1802struct pchf_entry {
1803 /* The size of this file. This is used to save running a MD5 checksum
1804 if the sizes don't match. */
1805 off_t size;
1806 /* The MD5 checksum of this file. */
1807 unsigned char sum[16];
1808 /* Is this file to be included only once? */
1809 bool once_only;
1810};
1811
73e61092
GK
1812struct pchf_data {
1813 /* Number of pchf_entry structures. */
1814 size_t count;
1815
1816 /* Are there any values with once_only set?
1817 This is used as an optimisation, it means we don't have to search
1818 the structure if we're processing a regular #include. */
1819 bool have_once_only;
16dd5cfe 1820
c3f829c1 1821 struct pchf_entry entries[1];
73e61092
GK
1822};
1823
1824static struct pchf_data *pchf;
1825
ecddfb39
MS
1826/* A qsort ordering function for pchf_entry structures. */
1827
1828static int
1829pchf_save_compare (const void *e1, const void *e2)
73e61092 1830{
ecddfb39
MS
1831 return memcmp (e1, e2, sizeof (struct pchf_entry));
1832}
73e61092 1833
ecddfb39 1834/* Create and write to F a pchf_data structure. */
73e61092 1835
ecddfb39
MS
1836bool
1837_cpp_save_file_entries (cpp_reader *pfile, FILE *fp)
73e61092 1838{
ecddfb39
MS
1839 size_t count = 0;
1840 struct pchf_data *result;
1841 size_t result_size;
1842 _cpp_file *f;
3b8af25b 1843 bool ret;
73e61092 1844
ecddfb39
MS
1845 for (f = pfile->all_files; f; f = f->next_file)
1846 ++count;
1847
1848 result_size = (sizeof (struct pchf_data)
1849 + sizeof (struct pchf_entry) * (count - 1));
c3f829c1 1850 result = XCNEWVAR (struct pchf_data, result_size);
ecddfb39
MS
1851
1852 result->count = 0;
1853 result->have_once_only = false;
1854
1855 for (f = pfile->all_files; f; f = f->next_file)
73e61092 1856 {
ecddfb39 1857 size_t count;
73e61092
GK
1858
1859 /* This should probably never happen, since if a read error occurred
1860 the PCH file shouldn't be written... */
1861 if (f->dont_read || f->err_no)
ecddfb39
MS
1862 continue;
1863
1864 if (f->stack_count == 0)
1865 continue;
16dd5cfe 1866
ecddfb39
MS
1867 count = result->count++;
1868
1869 result->entries[count].once_only = f->once_only;
97d62313 1870 /* |= is avoided in the next line because of an HP C compiler bug */
ecddfb39 1871 result->have_once_only = result->have_once_only | f->once_only;
73e61092 1872 if (f->buffer_valid)
ecddfb39
MS
1873 md5_buffer ((const char *)f->buffer,
1874 f->st.st_size, result->entries[count].sum);
73e61092
GK
1875 else
1876 {
1877 FILE *ff;
1878 int oldfd = f->fd;
1879
1880 if (!open_file (f))
1881 {
ac81cf0b 1882 open_file_failed (pfile, f, 0, 0);
55e7f907 1883 free (result);
ecddfb39 1884 return false;
73e61092
GK
1885 }
1886 ff = fdopen (f->fd, "rb");
ecddfb39 1887 md5_stream (ff, result->entries[count].sum);
73e61092
GK
1888 fclose (ff);
1889 f->fd = oldfd;
1890 }
ecddfb39 1891 result->entries[count].size = f->st.st_size;
73e61092 1892 }
73e61092
GK
1893
1894 result_size = (sizeof (struct pchf_data)
1895 + sizeof (struct pchf_entry) * (result->count - 1));
16dd5cfe 1896
73e61092
GK
1897 qsort (result->entries, result->count, sizeof (struct pchf_entry),
1898 pchf_save_compare);
1899
3b8af25b
JJ
1900 ret = fwrite (result, result_size, 1, fp) == 1;
1901 free (result);
1902 return ret;
73e61092
GK
1903}
1904
1905/* Read the pchf_data structure from F. */
1906
1907bool
1908_cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
1909{
1910 struct pchf_data d;
16dd5cfe 1911
73e61092
GK
1912 if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f)
1913 != 1)
1914 return false;
16dd5cfe 1915
c3f829c1 1916 pchf = XNEWVAR (struct pchf_data, sizeof (struct pchf_data)
73e61092
GK
1917 + sizeof (struct pchf_entry) * (d.count - 1));
1918 memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
1919 if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f)
1920 != d.count)
1921 return false;
1922 return true;
1923}
1924
1925/* The parameters for pchf_compare. */
1926
1927struct pchf_compare_data
1928{
1929 /* The size of the file we're looking for. */
1930 off_t size;
1931
1932 /* The MD5 checksum of the file, if it's been computed. */
1933 unsigned char sum[16];
1934
1935 /* Is SUM valid? */
1936 bool sum_computed;
1937
1938 /* Do we need to worry about entries that don't have ONCE_ONLY set? */
1939 bool check_included;
16dd5cfe 1940
73e61092
GK
1941 /* The file that we're searching for. */
1942 _cpp_file *f;
1943};
1944
1945/* bsearch comparison function; look for D_P in E_P. */
1946
1947static int
1948pchf_compare (const void *d_p, const void *e_p)
1949{
1950 const struct pchf_entry *e = (const struct pchf_entry *)e_p;
1951 struct pchf_compare_data *d = (struct pchf_compare_data *)d_p;
1952 int result;
16dd5cfe 1953
73e61092
GK
1954 result = memcmp (&d->size, &e->size, sizeof (off_t));
1955 if (result != 0)
1956 return result;
16dd5cfe 1957
73e61092
GK
1958 if (! d->sum_computed)
1959 {
1960 _cpp_file *const f = d->f;
16dd5cfe 1961
73e61092
GK
1962 md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum);
1963 d->sum_computed = true;
1964 }
1965
1966 result = memcmp (d->sum, e->sum, 16);
1967 if (result != 0)
1968 return result;
1969
1970 if (d->check_included || e->once_only)
1971 return 0;
1972 else
1973 return 1;
1974}
1975
16dd5cfe 1976/* Check that F is not in a list read from a PCH file (if any).
73e61092
GK
1977 Assumes that f->buffer_valid is true. Return TRUE if the file
1978 should not be read. */
1979
1980static bool
1981check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED,
1982 _cpp_file *f,
1983 bool check_included)
1984{
1985 struct pchf_compare_data d;
16dd5cfe 1986
73e61092
GK
1987 if (pchf == NULL
1988 || (! check_included && ! pchf->have_once_only))
1989 return false;
1990
1991 d.size = f->st.st_size;
1992 d.sum_computed = false;
1993 d.f = f;
1994 d.check_included = check_included;
1995 return bsearch (&d, pchf->entries, pchf->count, sizeof (struct pchf_entry),
1996 pchf_compare) != NULL;
1997}
a15f7cb8
ESR
1998
1999/* Return true if the file FNAME is found in the appropriate include file path
2000 as indicated by ANGLE_BRACKETS. */
2001
2002bool
2003_cpp_has_header (cpp_reader *pfile, const char *fname, int angle_brackets,
2004 enum include_type type)
2005{
2006 cpp_dir *start_dir = search_path_head (pfile, fname, angle_brackets, type);
2007 _cpp_file *file = _cpp_find_file (pfile, fname, start_dir,
2008 /*fake=*/false, angle_brackets,
ac81cf0b 2009 /*implicit_preinclude=*/false, 0);
a15f7cb8
ESR
2010 return file->err_no != ENOENT;
2011}
2012