aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-03-23 03:45:33 +0000
committerRichard Stallman <rms@gnu.org>1992-03-23 03:45:33 +0000
commit3ed8294e3200bbc003211f9b7eeb64a9c407a626 (patch)
treed971a969518fd5cd9a630a59db3007657ad1d268
parent36d747f619192d604ccb56d9dbf34bc31719cc50 (diff)
downloadgcc-3ed8294e3200bbc003211f9b7eeb64a9c407a626.zip
gcc-3ed8294e3200bbc003211f9b7eeb64a9c407a626.tar.gz
gcc-3ed8294e3200bbc003211f9b7eeb64a9c407a626.tar.bz2
*** empty log message ***
From-SVN: r574
-rw-r--r--gcc/cccp.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/gcc/cccp.c b/gcc/cccp.c
index 9147e47..54a95d2 100644
--- a/gcc/cccp.c
+++ b/gcc/cccp.c
@@ -201,6 +201,7 @@ static void pfatal_with_name ();
static void perror_with_name ();
static void print_containing_files ();
static int lookup_import ();
+static int lookup_include ();
static int check_preconditions ();
static void pcfinclude ();
static void pcstring_used ();
@@ -3730,25 +3731,13 @@ get_filename:
fname = (char *) xmalloc (max_include_len + flen + 2);
/* + 2 above for slash and terminating null. */
- /* See if we already included this file and we can tell in advance
- (from a #ifndef around its contents last time)
- that there is no need to include it again. */
- {
- struct file_name_list *l = all_include_files;
- strncpy (fname, fbeg, flen);
- fname[flen] = 0;
- for (; l; l = l->next)
- if (! strcmp (fname, l->fname)
- && l->control_macro
- && lookup (l->control_macro, -1, -1))
- return 0;
- }
-
/* If specified file name is absolute, just open it. */
if (*fbeg == '/') {
strncpy (fname, fbeg, flen);
fname[flen] = 0;
+ if (lookup_include (fname))
+ return 0;
if (importing)
f = lookup_import (fname);
else
@@ -3791,6 +3780,10 @@ get_filename:
f = open (fname, O_RDONLY, 0666);
if (f == -2)
return 0; /* Already included this file */
+ if (lookup_include (fname)) {
+ close (f);
+ return 0;
+ }
if (f >= 0)
break;
}
@@ -3921,6 +3914,23 @@ get_filename:
return 0;
}
+/* Return nonzero if there is no need to include file NAME
+ because it has already been included and it contains a conditional
+ to make a repeated include do nothing. */
+
+static int
+lookup_include (name)
+ char *name;
+{
+ struct file_name_list *l = all_include_files;
+ for (; l; l = l->next)
+ if (! strcmp (name, l->fname)
+ && l->control_macro
+ && lookup (l->control_macro, -1, -1))
+ return 1;
+ return 0;
+}
+
/* Process the contents of include file FNAME, already open on descriptor F,
with output to OP.
SYSTEM_HEADER_P is 1 if this file was specified using <...>.