X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-incpath.c;h=fe863d52b6e4979915bba443369033e4340dbfea;hb=dd7218bb0fe32b82563c64568e1c057817176089;hp=377653021a5c2bf1481b9e529b6ac621ef885aae;hpb=1cae46be69832433bab9411d0ad860363b14b8c1;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-incpath.c b/gcc/c-incpath.c index 377653021a5..fe863d52b6e 100644 --- a/gcc/c-incpath.c +++ b/gcc/c-incpath.c @@ -1,6 +1,7 @@ /* Set up combined include path chain for the preprocessor. Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. Broken out of cppinit.c and cppfiles.c and rewritten Mar 2003. @@ -16,11 +17,13 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "system.h" #include "coretypes.h" +#include "machmode.h" +#include "target.h" #include "tm.h" #include "cpplib.h" #include "prefix.h" @@ -35,7 +38,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ # define INO_T_EQ(A, B) (!memcmp (&(A), &(B), sizeof (A))) # define INO_T_COPY(DEST, SRC) memcpy(&(DEST), &(SRC), sizeof (SRC)) #else -# if (defined _WIN32 && ! defined (_UWIN)) || defined __MSDOS__ +# if (defined _WIN32 && !defined (_UWIN)) || defined __MSDOS__ # define INO_T_EQ(A, B) 0 # else # define INO_T_EQ(A, B) ((A) == (B)) @@ -43,23 +46,25 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ # define INO_T_COPY(DEST, SRC) (DEST) = (SRC) #endif +static const char dir_separator_str[] = { DIR_SEPARATOR, 0 }; + static void add_env_var_paths (const char *, int); -static void add_standard_paths (const char *, const char *, int); -static void free_path (struct cpp_path *, int); +static void add_standard_paths (const char *, const char *, const char *, int); +static void free_path (struct cpp_dir *, int); static void merge_include_chains (cpp_reader *, int); -static struct cpp_path *remove_duplicates (cpp_reader *, struct cpp_path *, - struct cpp_path *, - struct cpp_path *, int); +static struct cpp_dir *remove_duplicates (cpp_reader *, struct cpp_dir *, + struct cpp_dir *, + struct cpp_dir *, int); /* Include chains heads and tails. */ -static struct cpp_path *heads[4]; -static struct cpp_path *tails[4]; +static struct cpp_dir *heads[4]; +static struct cpp_dir *tails[4]; static bool quote_ignores_source_dir; enum { REASON_QUIET = 0, REASON_NOENT, REASON_DUP, REASON_DUP_SYS }; /* Free an element of the include chain, possibly giving a reason. */ static void -free_path (struct cpp_path *path, int reason) +free_path (struct cpp_dir *path, int reason) { switch (reason) { @@ -107,26 +112,28 @@ add_env_var_paths (const char *env_var, int chain) path = xstrdup ("."); else { - path = xmalloc (q - p + 1); + path = XNEWVEC (char, q - p + 1); memcpy (path, p, q - p); path[q - p] = '\0'; } - add_path (path, chain, chain == SYSTEM); + add_path (path, chain, chain == SYSTEM, false); } } /* Append the standard include chain defined in cppdefault.c. */ static void -add_standard_paths (const char *sysroot, const char *iprefix, int cxx_stdinc) +add_standard_paths (const char *sysroot, const char *iprefix, + const char *imultilib, int cxx_stdinc) { const struct default_include *p; + int relocated = cpp_relocated(); size_t len; if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0) { /* Look for directories that start with the standard prefix. - "Translate" them, ie. replace /usr/local/lib/gcc... with + "Translate" them, i.e. replace /usr/local/lib/gcc... with IPREFIX and search them first. */ for (p = cpp_include_defaults; p->fname; p++) { @@ -140,7 +147,9 @@ add_standard_paths (const char *sysroot, const char *iprefix, int cxx_stdinc) if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len)) { char *str = concat (iprefix, p->fname + len, NULL); - add_path (str, SYSTEM, p->cxx_aware); + if (p->multilib && imultilib) + str = concat (str, dir_separator_str, imultilib, NULL); + add_path (str, SYSTEM, p->cxx_aware, false); } } } @@ -155,10 +164,23 @@ add_standard_paths (const char *sysroot, const char *iprefix, int cxx_stdinc) /* Should this directory start with the sysroot? */ if (sysroot && p->add_sysroot) str = concat (sysroot, p->fname, NULL); + else if (!p->add_sysroot && relocated + && strncmp (p->fname, cpp_PREFIX, cpp_PREFIX_len) == 0) + { + /* If the compiler is relocated, and this is a configured + prefix relative path, then we use gcc_exec_prefix instead + of the configured prefix. */ + str = concat (gcc_exec_prefix, p->fname + + cpp_PREFIX_len, NULL); + str = update_path (str, p->component); + } else str = update_path (p->fname, p->component); - add_path (str, SYSTEM, p->cxx_aware); + if (p->multilib && imultilib) + str = concat (str, dir_separator_str, imultilib, NULL); + + add_path (str, SYSTEM, p->cxx_aware, false); } } } @@ -169,12 +191,13 @@ add_standard_paths (const char *sysroot, const char *iprefix, int cxx_stdinc) JOIN, unless it duplicates JOIN in which case the last path is removed. Return the head of the resulting chain. Any of HEAD, JOIN and SYSTEM can be NULL. */ -static struct cpp_path * -remove_duplicates (cpp_reader *pfile, struct cpp_path *head, - struct cpp_path *system, struct cpp_path *join, + +static struct cpp_dir * +remove_duplicates (cpp_reader *pfile, struct cpp_dir *head, + struct cpp_dir *system, struct cpp_dir *join, int verbose) { - struct cpp_path **pcur, *tmp, *cur; + struct cpp_dir **pcur, *tmp, *cur; struct stat st; for (pcur = &head; *pcur; ) @@ -182,18 +205,23 @@ remove_duplicates (cpp_reader *pfile, struct cpp_path *head, int reason = REASON_QUIET; cur = *pcur; - cpp_simplify_path (cur->name); if (stat (cur->name, &st)) { /* Dirs that don't exist are silently ignored, unless verbose. */ if (errno != ENOENT) - cpp_errno (pfile, DL_ERROR, cur->name); + cpp_errno (pfile, CPP_DL_ERROR, cur->name); else - reason = REASON_NOENT; + { + /* If -Wmissing-include-dirs is given, warn. */ + cpp_options *opts = cpp_get_options (pfile); + if (opts->warn_missing_include_dirs && cur->user_supplied_p) + cpp_errno (pfile, CPP_DL_WARNING, cur->name); + reason = REASON_NOENT; + } } else if (!S_ISDIR (st.st_mode)) - cpp_error_with_line (pfile, DL_ERROR, 0, 0, + cpp_error_with_line (pfile, CPP_DL_ERROR, 0, 0, "%s: not a directory", cur->name); else { @@ -203,22 +231,25 @@ remove_duplicates (cpp_reader *pfile, struct cpp_path *head, /* Remove this one if it is in the system chain. */ reason = REASON_DUP_SYS; for (tmp = system; tmp; tmp = tmp->next) - if (INO_T_EQ (tmp->ino, cur->ino) && tmp->dev == cur->dev) + if (INO_T_EQ (tmp->ino, cur->ino) && tmp->dev == cur->dev + && cur->construct == tmp->construct) break; if (!tmp) { - /* Dupicate of something earlier in the same chain? */ + /* Duplicate of something earlier in the same chain? */ reason = REASON_DUP; for (tmp = head; tmp != cur; tmp = tmp->next) - if (INO_T_EQ (cur->ino, tmp->ino) && cur->dev == tmp->dev) + if (INO_T_EQ (cur->ino, tmp->ino) && cur->dev == tmp->dev + && cur->construct == tmp->construct) break; if (tmp == cur /* Last in the chain and duplicate of JOIN? */ && !(cur->next == NULL && join && INO_T_EQ (cur->ino, join->ino) - && cur->dev == join->dev)) + && cur->dev == join->dev + && cur->construct == join->construct)) { /* Unique, so keep this directory. */ pcur = &cur->next; @@ -242,9 +273,10 @@ remove_duplicates (cpp_reader *pfile, struct cpp_path *head, We can't just merge the lists and then uniquify them because then we may lose directories from the <> search path that should be - there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however safe - to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written -Ibar -I- -Ifoo - -Iquux. */ + there; consider -iquote foo -iquote bar -Ifoo -Iquux. It is + however safe to treat -iquote bar -iquote foo -Ifoo -Iquux as if + written -iquote bar -Ifoo -Iquux. */ + static void merge_include_chains (cpp_reader *pfile, int verbose) { @@ -269,7 +301,7 @@ merge_include_chains (cpp_reader *pfile, int verbose) /* If verbose, print the list of dirs to search. */ if (verbose) { - struct cpp_path *p; + struct cpp_dir *p; fprintf (stderr, _("#include \"...\" search starts here:\n")); for (p = heads[QUOTE];; p = p->next) @@ -299,34 +331,54 @@ split_quote_chain (void) quote_ignores_source_dir = true; } +/* Add P to the chain specified by CHAIN. */ + +void +add_cpp_dir_path (cpp_dir *p, int chain) +{ + if (tails[chain]) + tails[chain]->next = p; + else + heads[chain] = p; + tails[chain] = p; +} + /* Add PATH to the include chain CHAIN. PATH must be malloc-ed and NUL-terminated. */ void -add_path (char *path, int chain, int cxx_aware) +add_path (char *path, int chain, int cxx_aware, bool user_supplied_p) { - struct cpp_path *p; + cpp_dir *p; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Convert all backslashes to slashes. The native CRT stat() + function does not recognize a directory that ends in a backslash + (unless it is a drive root dir, such "c:\"). Forward slashes, + trailing or otherwise, cause no problems for stat(). */ + char* c; + for (c = path; *c; c++) + if (*c == '\\') *c = '/'; +#endif - p = (struct cpp_path *) xmalloc (sizeof (struct cpp_path)); + p = XNEW (cpp_dir); p->next = NULL; p->name = path; if (chain == SYSTEM || chain == AFTER) p->sysp = 1 + !cxx_aware; else p->sysp = 0; + p->construct = 0; + p->user_supplied_p = user_supplied_p; - if (tails[chain]) - tails[chain]->next = p; - else - heads[chain] = p; - tails[chain] = p; + add_cpp_dir_path (p, chain); } /* Exported function to handle include chain merging, duplicate removal, and registration with cpplib. */ void register_include_chains (cpp_reader *pfile, const char *sysroot, - const char *iprefix, int stdinc, int cxx_stdinc, - int verbose) + const char *iprefix, const char *imultilib, + int stdinc, int cxx_stdinc, int verbose) { static const char *const lang_env_vars[] = { "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH", @@ -344,12 +396,33 @@ register_include_chains (cpp_reader *pfile, const char *sysroot, add_env_var_paths ("CPATH", BRACKET); add_env_var_paths (lang_env_vars[idx], SYSTEM); + target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc); + /* Finally chain on the standard directories. */ if (stdinc) - add_standard_paths (sysroot, iprefix, cxx_stdinc); + add_standard_paths (sysroot, iprefix, imultilib, cxx_stdinc); + + target_c_incpath.extra_includes (sysroot, iprefix, stdinc); merge_include_chains (pfile, verbose); cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET], quote_ignores_source_dir); } +#if !(defined TARGET_EXTRA_INCLUDES) || !(defined TARGET_EXTRA_PRE_INCLUDES) +static void hook_void_charptr_charptr_int (const char *sysroot ATTRIBUTE_UNUSED, + const char *iprefix ATTRIBUTE_UNUSED, + int stdinc ATTRIBUTE_UNUSED) +{ +} +#endif + +#ifndef TARGET_EXTRA_INCLUDES +#define TARGET_EXTRA_INCLUDES hook_void_charptr_charptr_int +#endif +#ifndef TARGET_EXTRA_PRE_INCLUDES +#define TARGET_EXTRA_PRE_INCLUDES hook_void_charptr_charptr_int +#endif + +struct target_c_incpath_s target_c_incpath = { TARGET_EXTRA_PRE_INCLUDES, TARGET_EXTRA_INCLUDES }; +