Backport from GCC mainline.
[platform/upstream/linaro-gcc.git] / gcc / incpath.c
1 /* Set up combined include path chain for the preprocessor.
2    Copyright (C) 1986-2016 Free Software Foundation, Inc.
3
4    Broken out of cppinit.c and cppfiles.c and rewritten Mar 2003.
5
6    This program is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by the
8    Free Software Foundation; either version 3, or (at your option) any
9    later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; see the file COPYING3.  If not see
18    <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "target.h"
24 #include "cpplib.h"
25 #include "prefix.h"
26 #include "intl.h"
27 #include "incpath.h"
28 #include "cppdefault.h"
29
30 /* Microsoft Windows does not natively support inodes.
31    VMS has non-numeric inodes.  */
32 #ifdef VMS
33 # define INO_T_EQ(A, B) (!memcmp (&(A), &(B), sizeof (A)))
34 # define INO_T_COPY(DEST, SRC) memcpy (&(DEST), &(SRC), sizeof (SRC))
35 #elif !defined (HOST_LACKS_INODE_NUMBERS)
36 # define INO_T_EQ(A, B) ((A) == (B))
37 # define INO_T_COPY(DEST, SRC) (DEST) = (SRC)
38 #endif
39
40 #if defined INO_T_EQ
41 #define DIRS_EQ(A, B) ((A)->dev == (B)->dev \
42         && INO_T_EQ ((A)->ino, (B)->ino))
43 #else
44 #define DIRS_EQ(A, B) (!filename_cmp ((A)->canonical_name, (B)->canonical_name))
45 #endif
46
47 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
48
49 static void add_env_var_paths (const char *, int);
50 static void add_standard_paths (const char *, const char *, const char *, int);
51 static void free_path (struct cpp_dir *, int);
52 static void merge_include_chains (const char *, cpp_reader *, int);
53 static void add_sysroot_to_chain (const char *, int);
54 static struct cpp_dir *remove_duplicates (cpp_reader *, struct cpp_dir *,
55                                            struct cpp_dir *,
56                                            struct cpp_dir *, int);
57
58 /* Include chains heads and tails.  */
59 static struct cpp_dir *heads[4];
60 static struct cpp_dir *tails[4];
61 static bool quote_ignores_source_dir;
62 enum { REASON_QUIET = 0, REASON_NOENT, REASON_DUP, REASON_DUP_SYS };
63
64 /* Free an element of the include chain, possibly giving a reason.  */
65 static void
66 free_path (struct cpp_dir *path, int reason)
67 {
68   switch (reason)
69     {
70     case REASON_DUP:
71     case REASON_DUP_SYS:
72       fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"), path->name);
73       if (reason == REASON_DUP_SYS)
74         fprintf (stderr,
75  _("  as it is a non-system directory that duplicates a system directory\n"));
76       break;
77
78     case REASON_NOENT:
79       fprintf (stderr, _("ignoring nonexistent directory \"%s\"\n"),
80                path->name);
81       break;
82
83     case REASON_QUIET:
84     default:
85       break;
86     }
87
88   free (path->name);
89   free (path);
90 }
91
92 /* Read ENV_VAR for a PATH_SEPARATOR-separated list of file names; and
93    append all the names to the search path CHAIN.  */
94 static void
95 add_env_var_paths (const char *env_var, int chain)
96 {
97   char *p, *q, *path;
98
99   q = getenv (env_var);
100
101   if (!q)
102     return;
103
104   for (p = q; *q; p = q + 1)
105     {
106       q = p;
107       while (*q != 0 && *q != PATH_SEPARATOR)
108         q++;
109
110       if (p == q)
111         path = xstrdup (".");
112       else
113         {
114           path = XNEWVEC (char, q - p + 1);
115           memcpy (path, p, q - p);
116           path[q - p] = '\0';
117         }
118
119       add_path (path, chain, chain == SYSTEM, false);
120     }
121 }
122
123 /* Append the standard include chain defined in cppdefault.c.  */
124 static void
125 add_standard_paths (const char *sysroot, const char *iprefix,
126                     const char *imultilib, int cxx_stdinc)
127 {
128   const struct default_include *p;
129   int relocated = cpp_relocated ();
130   size_t len;
131
132   if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0)
133     {
134       /* Look for directories that start with the standard prefix.
135          "Translate" them, i.e. replace /usr/local/lib/gcc... with
136          IPREFIX and search them first.  */
137       for (p = cpp_include_defaults; p->fname; p++)
138         {
139           if (!p->cplusplus || cxx_stdinc)
140             {
141               /* Should we be translating sysrooted dirs too?  Assume
142                  that iprefix and sysroot are mutually exclusive, for
143                  now.  */
144               if (sysroot && p->add_sysroot)
145                 continue;
146               if (!filename_ncmp (p->fname, cpp_GCC_INCLUDE_DIR, len))
147                 {
148                   char *str = concat (iprefix, p->fname + len, NULL);
149                   if (p->multilib == 1 && imultilib)
150                     str = reconcat (str, str, dir_separator_str,
151                                     imultilib, NULL);
152                   else if (p->multilib == 2)
153                     {
154                       if (!imultiarch)
155                         {
156                           free (str);
157                           continue;
158                         }
159                       str = reconcat (str, str, dir_separator_str,
160                                       imultiarch, NULL);
161                     }
162                   add_path (str, SYSTEM, p->cxx_aware, false);
163                 }
164             }
165         }
166     }
167
168   for (p = cpp_include_defaults; p->fname; p++)
169     {
170       if (!p->cplusplus || cxx_stdinc)
171         {
172           char *str;
173
174           /* Should this directory start with the sysroot?  */
175           if (sysroot && p->add_sysroot)
176             {
177               char *sysroot_no_trailing_dir_separator = xstrdup (sysroot);
178               size_t sysroot_len = strlen (sysroot);
179
180               if (sysroot_len > 0 && sysroot[sysroot_len - 1] == DIR_SEPARATOR)
181                 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
182               str = concat (sysroot_no_trailing_dir_separator, p->fname, NULL);
183               free (sysroot_no_trailing_dir_separator);
184             }
185           else if (!p->add_sysroot && relocated
186                    && !filename_ncmp (p->fname, cpp_PREFIX, cpp_PREFIX_len))
187             {
188               static const char *relocated_prefix;
189               char *ostr;
190               /* If this path starts with the configure-time prefix,
191                  but the compiler has been relocated, replace it
192                  with the run-time prefix.  The run-time exec prefix
193                  is GCC_EXEC_PREFIX.  Compute the path from there back
194                  to the toplevel prefix.  */
195               if (!relocated_prefix)
196                 {
197                   char *dummy;
198                   /* Make relative prefix expects the first argument
199                      to be a program, not a directory.  */
200                   dummy = concat (gcc_exec_prefix, "dummy", NULL);
201                   relocated_prefix
202                     = make_relative_prefix (dummy,
203                                             cpp_EXEC_PREFIX,
204                                             cpp_PREFIX);
205                   free (dummy);
206                 }
207               ostr = concat (relocated_prefix,
208                              p->fname + cpp_PREFIX_len,
209                              NULL);
210               str = update_path (ostr, p->component);
211               free (ostr);
212             }
213           else
214             str = update_path (p->fname, p->component);
215
216           if (p->multilib == 1 && imultilib)
217             str = reconcat (str, str, dir_separator_str, imultilib, NULL);
218           else if (p->multilib == 2)
219             {
220               if (!imultiarch)
221                 {
222                   free (str);
223                   continue;
224                 }
225               str = reconcat (str, str, dir_separator_str, imultiarch, NULL);
226             }
227
228           add_path (str, SYSTEM, p->cxx_aware, false);
229         }
230     }
231 }
232
233 /* For each duplicate path in chain HEAD, keep just the first one.
234    Remove each path in chain HEAD that also exists in chain SYSTEM.
235    Set the NEXT pointer of the last path in the resulting chain to
236    JOIN, unless it duplicates JOIN in which case the last path is
237    removed.  Return the head of the resulting chain.  Any of HEAD,
238    JOIN and SYSTEM can be NULL.  */
239
240 static struct cpp_dir *
241 remove_duplicates (cpp_reader *pfile, struct cpp_dir *head,
242                    struct cpp_dir *system, struct cpp_dir *join,
243                    int verbose)
244 {
245   struct cpp_dir **pcur, *tmp, *cur;
246   struct stat st;
247
248   for (pcur = &head; *pcur; )
249     {
250       int reason = REASON_QUIET;
251
252       cur = *pcur;
253
254       if (stat (cur->name, &st))
255         {
256           /* Dirs that don't exist or have denied permissions are 
257              silently ignored, unless verbose.  */
258           if ((errno != ENOENT) && (errno != EPERM))
259             cpp_errno (pfile, CPP_DL_ERROR, cur->name);
260           else
261             {
262               /* If -Wmissing-include-dirs is given, warn.  */
263               cpp_options *opts = cpp_get_options (pfile);
264               if (opts->warn_missing_include_dirs && cur->user_supplied_p)
265                 cpp_warning (pfile, CPP_W_MISSING_INCLUDE_DIRS, "%s: %s",
266                              cur->name, xstrerror (errno));
267               reason = REASON_NOENT;
268             }
269         }
270       else if (!S_ISDIR (st.st_mode))
271         cpp_error_with_line (pfile, CPP_DL_WARNING, 0, 0,
272                              "%s: not a directory", cur->name);
273       else
274         {
275 #if defined (INO_T_COPY)
276           INO_T_COPY (cur->ino, st.st_ino);
277           cur->dev  = st.st_dev;
278 #endif
279
280           /* Remove this one if it is in the system chain.  */
281           reason = REASON_DUP_SYS;
282           for (tmp = system; tmp; tmp = tmp->next)
283            if (DIRS_EQ (tmp, cur) && cur->construct == tmp->construct)
284               break;
285
286           if (!tmp)
287             {
288               /* Duplicate of something earlier in the same chain?  */
289               reason = REASON_DUP;
290               for (tmp = head; tmp != cur; tmp = tmp->next)
291                if (DIRS_EQ (cur, tmp) && cur->construct == tmp->construct)
292                   break;
293
294               if (tmp == cur
295                   /* Last in the chain and duplicate of JOIN?  */
296                   && !(cur->next == NULL && join
297                        && DIRS_EQ (cur, join)
298                        && cur->construct == join->construct))
299                 {
300                   /* Unique, so keep this directory.  */
301                   pcur = &cur->next;
302                   continue;
303                 }
304             }
305         }
306
307       /* Remove this entry from the chain.  */
308       *pcur = cur->next;
309       free_path (cur, verbose ? reason: REASON_QUIET);
310     }
311
312   *pcur = join;
313   return head;
314 }
315
316 /* Add SYSROOT to any user-supplied paths in CHAIN starting with
317    "=".  */
318
319 static void
320 add_sysroot_to_chain (const char *sysroot, int chain)
321 {
322   struct cpp_dir *p;
323
324   for (p = heads[chain]; p != NULL; p = p->next)
325     if (p->name[0] == '=' && p->user_supplied_p)
326       p->name = concat (sysroot, p->name + 1, NULL);
327 }
328
329 /* Merge the four include chains together in the order quote, bracket,
330    system, after.  Remove duplicate dirs (determined in
331    system-specific manner).
332
333    We can't just merge the lists and then uniquify them because then
334    we may lose directories from the <> search path that should be
335    there; consider -iquote foo -iquote bar -Ifoo -Iquux.  It is
336    however safe to treat -iquote bar -iquote foo -Ifoo -Iquux as if
337    written -iquote bar -Ifoo -Iquux.  */
338
339 static void
340 merge_include_chains (const char *sysroot, cpp_reader *pfile, int verbose)
341 {
342   /* Add the sysroot to user-supplied paths starting with "=".  */
343   if (sysroot)
344     {
345       add_sysroot_to_chain (sysroot, QUOTE);
346       add_sysroot_to_chain (sysroot, BRACKET);
347       add_sysroot_to_chain (sysroot, SYSTEM);
348       add_sysroot_to_chain (sysroot, AFTER);
349     }
350
351   /* Join the SYSTEM and AFTER chains.  Remove duplicates in the
352      resulting SYSTEM chain.  */
353   if (heads[SYSTEM])
354     tails[SYSTEM]->next = heads[AFTER];
355   else
356     heads[SYSTEM] = heads[AFTER];
357   heads[SYSTEM] = remove_duplicates (pfile, heads[SYSTEM], 0, 0, verbose);
358
359   /* Remove duplicates from BRACKET that are in itself or SYSTEM, and
360      join it to SYSTEM.  */
361   heads[BRACKET] = remove_duplicates (pfile, heads[BRACKET], heads[SYSTEM],
362                                       heads[SYSTEM], verbose);
363
364   /* Remove duplicates from QUOTE that are in itself or SYSTEM, and
365      join it to BRACKET.  */
366   heads[QUOTE] = remove_duplicates (pfile, heads[QUOTE], heads[SYSTEM],
367                                     heads[BRACKET], verbose);
368
369   /* If verbose, print the list of dirs to search.  */
370   if (verbose)
371     {
372       struct cpp_dir *p;
373
374       fprintf (stderr, _("#include \"...\" search starts here:\n"));
375       for (p = heads[QUOTE];; p = p->next)
376         {
377           if (p == heads[BRACKET])
378             fprintf (stderr, _("#include <...> search starts here:\n"));
379           if (!p)
380             break;
381           fprintf (stderr, " %s\n", p->name);
382         }
383       fprintf (stderr, _("End of search list.\n"));
384     }
385 }
386
387 /* Use given -I paths for #include "..." but not #include <...>, and
388    don't search the directory of the present file for #include "...".
389    (Note that -I. -I- is not the same as the default setup; -I. uses
390    the compiler's working dir.)  */
391 void
392 split_quote_chain (void)
393 {
394   if (heads[QUOTE])
395     free_path (heads[QUOTE], REASON_QUIET);
396   if (tails[QUOTE])
397     free_path (tails[QUOTE], REASON_QUIET);
398   heads[QUOTE] = heads[BRACKET];
399   tails[QUOTE] = tails[BRACKET];
400   heads[BRACKET] = NULL;
401   tails[BRACKET] = NULL;
402   /* This is NOT redundant.  */
403   quote_ignores_source_dir = true;
404 }
405
406 /* Add P to the chain specified by CHAIN.  */
407
408 void
409 add_cpp_dir_path (cpp_dir *p, int chain)
410 {
411   if (tails[chain])
412     tails[chain]->next = p;
413   else
414     heads[chain] = p;
415   tails[chain] = p;
416 }
417
418 /* Add PATH to the include chain CHAIN. PATH must be malloc-ed and
419    NUL-terminated.  */
420 void
421 add_path (char *path, int chain, int cxx_aware, bool user_supplied_p)
422 {
423   cpp_dir *p;
424
425 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
426   /* Remove unnecessary trailing slashes.  On some versions of MS
427      Windows, trailing  _forward_ slashes cause no problems for stat().
428      On newer versions, stat() does not recognize a directory that ends
429      in a '\\' or '/', unless it is a drive root dir, such as "c:/",
430      where it is obligatory.  */
431   int pathlen = strlen (path);
432   char* end = path + pathlen - 1;
433   /* Preserve the lead '/' or lead "c:/".  */
434   char* start = path + (pathlen > 2 && path[1] == ':' ? 3 : 1);
435
436   for (; end > start && IS_DIR_SEPARATOR (*end); end--)
437     *end = 0;
438 #endif
439
440   p = XNEW (cpp_dir);
441   p->next = NULL;
442   p->name = path;
443 #ifndef INO_T_EQ
444   p->canonical_name = lrealpath (path);
445 #endif
446   if (chain == SYSTEM || chain == AFTER)
447     p->sysp = 1 + !cxx_aware;
448   else
449     p->sysp = 0;
450   p->construct = 0;
451   p->user_supplied_p = user_supplied_p;
452
453   add_cpp_dir_path (p, chain);
454 }
455
456 /* Exported function to handle include chain merging, duplicate
457    removal, and registration with cpplib.  */
458 void
459 register_include_chains (cpp_reader *pfile, const char *sysroot,
460                          const char *iprefix, const char *imultilib,
461                          int stdinc, int cxx_stdinc, int verbose)
462 {
463   static const char *const lang_env_vars[] =
464     { "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH",
465       "OBJC_INCLUDE_PATH", "OBJCPLUS_INCLUDE_PATH" };
466   cpp_options *cpp_opts = cpp_get_options (pfile);
467   size_t idx = (cpp_opts->objc ? 2: 0);
468
469   if (cpp_opts->cplusplus)
470     idx++;
471   else
472     cxx_stdinc = false;
473
474   /* CPATH and language-dependent environment variables may add to the
475      include chain.  */
476   add_env_var_paths ("CPATH", BRACKET);
477   add_env_var_paths (lang_env_vars[idx], SYSTEM);
478
479   target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc);
480
481   /* Finally chain on the standard directories.  */
482   if (stdinc)
483     add_standard_paths (sysroot, iprefix, imultilib, cxx_stdinc);
484
485   target_c_incpath.extra_includes (sysroot, iprefix, stdinc);
486
487   merge_include_chains (sysroot, pfile, verbose);
488
489   cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET],
490                           quote_ignores_source_dir);
491 }
492
493 /* Return the current chain of cpp dirs.  */
494
495 struct cpp_dir *
496 get_added_cpp_dirs (int chain)
497 {
498   return heads[chain];
499 }
500
501 #if !(defined TARGET_EXTRA_INCLUDES) || !(defined TARGET_EXTRA_PRE_INCLUDES)
502 static void hook_void_charptr_charptr_int (const char *sysroot ATTRIBUTE_UNUSED,
503                                            const char *iprefix ATTRIBUTE_UNUSED,
504                                            int stdinc ATTRIBUTE_UNUSED)
505 {
506 }
507 #endif
508
509 #ifndef TARGET_EXTRA_INCLUDES
510 #define TARGET_EXTRA_INCLUDES hook_void_charptr_charptr_int
511 #endif
512 #ifndef TARGET_EXTRA_PRE_INCLUDES
513 #define TARGET_EXTRA_PRE_INCLUDES hook_void_charptr_charptr_int
514 #endif
515
516 struct target_c_incpath_s target_c_incpath = { TARGET_EXTRA_PRE_INCLUDES, TARGET_EXTRA_INCLUDES };
517