From bf42e45b205e05a710de0e9fe0fc33e668fdb891 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Fri, 1 Aug 2003 14:04:02 +0000 Subject: [PATCH] Makefile.in: Refine dependencies. * Makefile.in: Refine dependencies. * c-opts.c (c_common_handle_option): Do nothing for -Wimport. * c.opt: Update help for -Wimport. * cppfiles.c: Include hashtab.h. Update comments. (stack_file): Read the file before updating dependencies. (once_only_file_p): Be smarter about marking once-only files. (_cpp_mark_file_once_only): Correct the check for existence on the list. (open_file_failed): Use name not path, which is NULL. * cpphash.h: Don't include hashtab.h. (struct _cpp_file): Remove. (struct cpp_reader): Update. * cppinit.c (cpp_create_reader): Don't initialize warn_import. * cpplib.h (struct cpp_options): Remove warn_import. (cpp_simplify_path): Remove. From-SVN: r70045 --- gcc/ChangeLog | 18 +++++++++++++ gcc/Makefile.in | 4 +-- gcc/c-opts.c | 2 +- gcc/c.opt | 2 +- gcc/cppfiles.c | 67 ++++++++++++++++++++++++++----------------------- gcc/cpphash.h | 4 +-- gcc/cppinit.c | 1 - gcc/cpplib.h | 4 --- 8 files changed, 59 insertions(+), 43 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 56fe21a8a30..625eb041342 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,21 @@ +2003-08-01 Neil Booth + + * Makefile.in: Refine dependencies. + * c-opts.c (c_common_handle_option): Do nothing for -Wimport. + * c.opt: Update help for -Wimport. + * cppfiles.c: Include hashtab.h. Update comments. + (stack_file): Read the file before updating dependencies. + (once_only_file_p): Be smarter about marking once-only files. + (_cpp_mark_file_once_only): Correct the check for existence on + the list. + (open_file_failed): Use name not path, which is NULL. + * cpphash.h: Don't include hashtab.h. + (struct _cpp_file): Remove. + (struct cpp_reader): Update. + * cppinit.c (cpp_create_reader): Don't initialize warn_import. + * cpplib.h (struct cpp_options): Remove warn_import. + (cpp_simplify_path): Remove. + 2003-08-01 Nathan Sidwell PR c++/11295 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 78cd1710c50..1bb944fe31f 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2354,7 +2354,7 @@ LIBCPP_OBJS = cpplib.o cpplex.o cppmacro.o cppexp.o cppfiles.o cpptrad.o \ hashtable.o line-map.o mkdeps.o cpppch.o LIBCPP_DEPS = $(CPPLIB_H) cpphash.h line-map.h hashtable.h intl.h \ - $(HASHTAB_H) $(OBSTACK_H) $(CONFIG_H) $(SYSTEM_H) + $(OBSTACK_H) $(CONFIG_H) $(SYSTEM_H) # Most of the other archives built/used by this makefile are for # targets. This one is strictly for the host. @@ -2371,7 +2371,7 @@ cppmacro.o: cppmacro.c $(LIBCPP_DEPS) cpplib.o: cpplib.c $(LIBCPP_DEPS) cpphash.o: cpphash.c $(LIBCPP_DEPS) cpptrad.o: cpptrad.c $(LIBCPP_DEPS) -cppfiles.o: cppfiles.c $(LIBCPP_DEPS) $(SPLAY_TREE_H) mkdeps.h +cppfiles.o: cppfiles.c $(LIBCPP_DEPS) $(HASHTAB_H) mkdeps.h cppinit.o: cppinit.c $(LIBCPP_DEPS) mkdeps.h cpppch.o: cpppch.c $(LIBCPP_DEPS) mkdeps.h diff --git a/gcc/c-opts.c b/gcc/c-opts.c index 3e4a10aafd3..e1922cb9bcb 100644 --- a/gcc/c-opts.c +++ b/gcc/c-opts.c @@ -484,7 +484,7 @@ c_common_handle_option (size_t scode, const char *arg, int value) break; case OPT_Wimport: - cpp_opts->warn_import = value; + /* Silently ignore for now. */ break; case OPT_Winvalid_offsetof: diff --git a/gcc/c.opt b/gcc/c.opt index 15b96ad5e82..221fb678b3d 100644 --- a/gcc/c.opt +++ b/gcc/c.opt @@ -251,7 +251,7 @@ Warn when a declaration does not specify a type Wimport C ObjC C++ ObjC++ -Warn about uses of the \"#import\" directive +Deprecated. This switch has no effect. Winvalid-offsetof C++ ObjC++ diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c index cd3498e42da..374036a29cd 100644 --- a/gcc/cppfiles.c +++ b/gcc/cppfiles.c @@ -27,6 +27,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "cpphash.h" #include "intl.h" #include "mkdeps.h" +#include "hashtab.h" #include /* Variable length record files on VMS will have a stat size that includes @@ -68,8 +69,8 @@ struct _cpp_file /* The full path of the pch file. */ const char *pchname; - /* The file's path with the basename stripped, malloced. NULL if it - hasn't been calculated yet. */ + /* The file's path with the basename stripped. NULL if it hasn't + been calculated yet. */ const char *dir_name; /* Chain through #import-ed files or those containing #pragma once. */ @@ -83,8 +84,7 @@ struct _cpp_file /* The directory in the search path where FILE was found. Used for #include_next and determining whether a header is a system - header. Is NULL if the file was given as an absolute path, or - opened with read_file. */ + header. */ cpp_dir *dir; /* As filled in by stat(2) for the file. */ @@ -126,23 +126,28 @@ struct _cpp_file its head pointed to by a slot in FILE_HASH. The file name is what appeared between the quotes in a #include directive; it can be determined implicity from the hash table location or explicitly - from FILE->fname. + from FILE->name. FILE is a structure containing details about the file that was found with that search, or details of how the search failed. START_DIR is the starting location of the search in the include chain. The current directories for "" includes are also hashed in - the hash table. Files that are looked up without using a search - path, such as absolute filenames and file names from the command - line share a special starting directory so they don't get confused - with normal include-chain lookups in the cache. + the hash table and therefore unique. Files that are looked up + without using a search path, such as absolute filenames and file + names from the command line share a special starting directory so + they don't cause cache hits with normal include-chain lookups. If START_DIR is NULL then the entry is for a directory, not a file, and the directory is in DIR. Since the starting point in a file lookup chain is never NULL, this means that simple pointer comparisons against START_DIR can be made to determine cache hits in file lookups. + + If a cache lookup fails because of e.g. an extra "./" in the path, + then nothing will break. It is just less efficient as CPP will + have to do more work re-preprocessing the file, and/or comparing + its contents against earlier once-only files. */ struct file_hash_entry { @@ -530,6 +535,9 @@ stack_file (cpp_reader *pfile, _cpp_file *file, bool import) if (once_only_file_p (pfile, file, import)) return false; + if (!read_file (pfile, file)) + return false; + sysp = MAX ((pfile->map ? pfile->map->sysp : 0), (file->dir ? file->dir->sysp : 0)); @@ -540,9 +548,6 @@ stack_file (cpp_reader *pfile, _cpp_file *file, bool import) deps_add_dep (pfile->deps, file->path); } - if (!read_file (pfile, file)) - return false; - /* Clear buffer_valid since _cpp_clean_line messes it up. */ file->buffer_valid = false; file->stack_count++; @@ -580,15 +585,12 @@ once_only_file_p (cpp_reader *pfile, _cpp_file *file, bool import) return true; /* Are we #import-ing a previously #import-ed file? */ - if (import) - { - if (file->import) - return true; - _cpp_mark_file_once_only (pfile, file, true); - } + if (import && file->import) + return true; /* Read the file contents now. stack_file would do it later, and - we're smart enough to not do it twice, so this is no loss. */ + we're smart enough to not do it twice, so this is no loss. Note + we don't mark the file once-only if we can't read it. */ if (!read_file (pfile, file)) return false; @@ -609,10 +611,13 @@ once_only_file_p (cpp_reader *pfile, _cpp_file *file, bool import) /* Size might have changed in read_file(). */ && f->st.st_size == file->st.st_size && !memcmp (f->buffer, file->buffer, f->st.st_size)) - return true; + break; } - return false; + if (import || f != NULL) + _cpp_mark_file_once_only (pfile, file, import); + + return f != NULL; } /* Mark FILE to be included once only. IMPORT is true if because of @@ -620,22 +625,22 @@ once_only_file_p (cpp_reader *pfile, _cpp_file *file, bool import) void _cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file, bool import) { - if (import) - file->import = true; - else - { - pfile->saw_pragma_once = true; - file->pragma_once = true; - } - /* Put it on the once-only list if it's not on there already (an earlier #include with a #pragma once might have put it on there already). */ - if (file->once_only_next == NULL) + if (!file->import && !file->pragma_once) { file->once_only_next = pfile->once_only_files; pfile->once_only_files = file; } + + if (import) + file->import = true; + else + { + pfile->saw_pragma_once = true; + file->pragma_once = true; + } } /* Return the directory from which searching for FNAME should start, @@ -731,7 +736,7 @@ open_file_failed (cpp_reader *pfile, _cpp_file *file) errno = file->err_no; if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT) - deps_add_dep (pfile->deps, file->path); + deps_add_dep (pfile->deps, file->name); else { /* If we are outputting dependencies but not for this file then diff --git a/gcc/cpphash.h b/gcc/cpphash.h index e4378cb89d0..951dd2f4101 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -24,7 +24,6 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define GCC_CPPHASH_H #include "hashtable.h" -#include "hashtab.h" #ifdef HAVE_ICONV #include @@ -37,7 +36,6 @@ struct directive; /* Deliberately incomplete. */ struct pending_option; struct op; struct strbuf; -struct _cpp_file; typedef bool (*convert_f) (iconv_t, const unsigned char *, size_t, struct strbuf *); @@ -365,7 +363,7 @@ struct cpp_reader struct _cpp_file *once_only_files; /* File and directory hash table. */ - htab_t file_hash; + struct htab *file_hash; struct file_hash_entry *file_hash_entries; unsigned int file_hash_entries_allocated, file_hash_entries_used; diff --git a/gcc/cppinit.c b/gcc/cppinit.c index 5f10e273071..b719a85bb8c 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -133,7 +133,6 @@ cpp_create_reader (enum c_lang lang, hash_table *table) pfile = xcalloc (1, sizeof (cpp_reader)); cpp_set_lang (pfile, lang); - CPP_OPTION (pfile, warn_import) = 1; CPP_OPTION (pfile, warn_multichar) = 1; CPP_OPTION (pfile, discard_comments) = 1; CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1; diff --git a/gcc/cpplib.h b/gcc/cpplib.h index 7f5cfd4edd9..ca3f81422ad 100644 --- a/gcc/cpplib.h +++ b/gcc/cpplib.h @@ -267,9 +267,6 @@ struct cpp_options /* Nonzero means warn if there are any trigraphs. */ unsigned char warn_trigraphs; - /* Nonzero means warn if #import is used. */ - unsigned char warn_import; - /* Nonzero means warn about multicharacter charconsts. */ unsigned char warn_multichar; @@ -712,7 +709,6 @@ extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *, /* In cppfiles.c */ extern bool cpp_included (cpp_reader *, const char *); extern void cpp_make_system_header (cpp_reader *, int, int); -extern void cpp_simplify_path (char *); extern bool cpp_push_include (cpp_reader *, const char *); extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *); -- 2.30.2