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