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