ENFILE, close all cached file descriptors and try again.
(_cpp_execute_include): Keep a count of the number of times
each header is included.
(close_cached_fd): New function.
* cpphash.h (struct include_file): Rename before to
include_count; all users updated. Make include_count and sysp
unsigned short.
* cppinit.c (cpp_finish): If -H, report headers that could use
reinclude guards.
(report_missing_guard): New function.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@34760
138bc75d-0d04-0410-961f-
82ee72b054a4
+2000-06-28 Zack Weinberg <zack@wolery.cumb.org>
+
+ * cppfiles.c (open_include_file): If open(2) returns EMFILE or
+ ENFILE, close all cached file descriptors and try again.
+ (_cpp_execute_include): Keep a count of the number of times
+ each header is included.
+ (close_cached_fd): New function.
+ * cpphash.h (struct include_file): Rename before to
+ include_count; all users updated. Make include_count and sysp
+ unsigned short.
+ * cppinit.c (cpp_finish): If -H, report headers that could use
+ reinclude guards.
+ (report_missing_guard): New function.
+
Wed Jun 28 14:46:58 MET DST 2000 Jan Hubicka <jh@suse.cz>
* i386.md (prologue_set_got): Set length_immediate field.
static ssize_t read_file PARAMS ((cpp_buffer *, int, ssize_t));
static void destroy_include_file_node PARAMS ((splay_tree_value));
+static int close_cached_fd PARAMS ((splay_tree_node, void *));
#if 0
static void hack_vms_include_specification PARAMS ((char *));
}
}
+static int
+close_cached_fd (n, dummy)
+ splay_tree_node n;
+ void *dummy ATTRIBUTE_UNUSED;
+{
+ struct include_file *f = (struct include_file *)n->value;
+ if (f && f->fd != -1)
+ {
+ close (f->fd);
+ f->fd = -1;
+ }
+ return 0;
+}
+
void
_cpp_init_include_table (pfile)
cpp_reader *pfile;
ourselves.
Special case: the empty string is translated to stdin. */
+ retry:
+
if (filename[0] == '\0')
fd = 0;
else
filename);
}
#endif
+ if (0
+#ifdef EMFILE
+ || errno == EMFILE
+#endif
+#ifdef ENFILE
+ || errno == ENFILE
+#endif
+ )
+ {
+ /* Too many files open. Close all cached file descriptors and
+ try again. */
+ splay_tree_foreach (pfile->all_include_files, close_cached_fd, 0);
+ goto retry;
+ }
+
/* Nonexistent or inaccessible file. Create a negative node for it. */
if (nd)
{
{
file = xnew (struct include_file);
file->cmacro = 0;
- file->before = 0;
+ file->include_count = 0;
file->sysp = 0;
file->foundhere = 0;
file->name = xstrdup (filename);
return;
/* For -M, add the file to the dependencies on its first inclusion. */
- if (!inc->before && PRINT_THIS_DEP (pfile, angle_brackets))
+ if (!inc->include_count && PRINT_THIS_DEP (pfile, angle_brackets))
deps_add_dep (pfile->deps, inc->name);
- inc->before = 1;
+ inc->include_count++;
/* Handle -H option. */
if (CPP_OPTION (pfile, print_include_names))
/* location in search path where file was
found, for #include_next */
int fd; /* file descriptor possibly open on file */
- unsigned char before; /* file has been included before */
- unsigned char sysp; /* file is a system header */
+ unsigned short include_count; /* number of times file has been read */
+ unsigned short sysp; /* file is a system header */
};
/* The cmacro works like this: If it's NULL, the file is to be
#endif
static int parse_option PARAMS ((const char *));
static int handle_option PARAMS ((cpp_reader *, int, char **));
+static int report_missing_guard PARAMS ((splay_tree_node, void *));
/* Fourth argument to append_include_chain: chain to use */
enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
return 1;
}
+static int
+report_missing_guard (n, b)
+ splay_tree_node n;
+ void *b;
+{
+ struct include_file *f = (struct include_file *) n->value;
+ int *bannerp = (int *)b;
+
+ if (f && f->cmacro == 0 && f->include_count == 1)
+ {
+ if (*bannerp == 0)
+ {
+ fputs (_("Multiple include guards may be useful for:\n"), stderr);
+ *bannerp = 1;
+ }
+ fputs (f->name, stderr);
+ putc ('\n', stderr);
+ }
+ return 0;
+}
+
/* This is called at the end of preprocessing. It pops the
last buffer and writes dependency output. It should also
clear macro definitions, such that you could call cpp_start_read
if (ferror (print->outf) || fclose (print->outf))
cpp_notice_from_errno (pfile, CPP_OPTION (pfile, out_fname));
}
+
+ /* Report on headers that could use multiple include guards. */
+ if (CPP_OPTION (pfile, print_include_names))
+ {
+ int banner = 0;
+ splay_tree_foreach (pfile->all_include_files, report_missing_guard,
+ (void *) &banner);
+ }
}
static void