[cfe-commits] r140341 - in /cfe/trunk: include/clang/Driver/CC1Options.td include/clang/Frontend/HeaderSearchOptions.h lib/Driver/Tools.cpp lib/Frontend/CompilerInvocation.cpp lib/Frontend/InitHeaderSearch.cpp test/Driver/cpath.c

Eli Friedman eli.friedman at gmail.com
Thu Sep 22 18:53:14 PDT 2011


On Thu, Sep 22, 2011 at 2:41 PM, Benjamin Kramer
<benny.kra at googlemail.com> wrote:
> Author: d0k
> Date: Thu Sep 22 16:41:16 2011
> New Revision: 140341
>
> URL: http://llvm.org/viewvc/llvm-project?rev=140341&view=rev
> Log:
> Add support for CPATH and friends.
>
> This moves the existing code for CPATH into the driver and adds the environment lookup and path splitting there.
> The paths are then passed down to cc1 with -I options (CPATH), added after the normal user-specified include dirs.
> Language specific paths are passed via -LANG-isystem and the actual filtering is performed in the frontend.
>
> I tried to match GCC's behavior as close as possible
>
> Fixes PR8971.

This commit completely breaks the include paths for ObjC++, causing a
failure on smooshlab.

-Eli

> Added:
>    cfe/trunk/test/Driver/cpath.c
> Modified:
>    cfe/trunk/include/clang/Driver/CC1Options.td
>    cfe/trunk/include/clang/Frontend/HeaderSearchOptions.h
>    cfe/trunk/lib/Driver/Tools.cpp
>    cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>    cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
>
> Modified: cfe/trunk/include/clang/Driver/CC1Options.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=140341&r1=140340&r2=140341&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/CC1Options.td (original)
> +++ cfe/trunk/include/clang/Driver/CC1Options.td Thu Sep 22 16:41:16 2011
> @@ -623,8 +623,16 @@
>   HelpText<"Make the next included directory (-I or -F) an indexer header map">;
>  def iquote : JoinedOrSeparate<"-iquote">, MetaVarName<"<directory>">,
>   HelpText<"Add directory to QUOTE include search path">;
> +def c_isystem : JoinedOrSeparate<"-c-isystem">, MetaVarName<"<directory>">,
> +  HelpText<"Add directory to the C SYSTEM include search path">;
>  def cxx_isystem : JoinedOrSeparate<"-cxx-isystem">, MetaVarName<"<directory>">,
>   HelpText<"Add directory to the C++ SYSTEM include search path">;
> +def objc_isystem : JoinedOrSeparate<"-objc-isystem">,
> +  MetaVarName<"<directory>">,
> +  HelpText<"Add directory to the ObjC SYSTEM include search path">;
> +def objcxx_isystem : JoinedOrSeparate<"-objcxx-isystem">,
> +  MetaVarName<"<directory>">,
> +  HelpText<"Add directory to the ObjC++ SYSTEM include search path">;
>  def isystem : JoinedOrSeparate<"-isystem">, MetaVarName<"<directory>">,
>   HelpText<"Add directory to SYSTEM include search path">;
>  def iwithsysroot : JoinedOrSeparate<"-iwithsysroot">,MetaVarName<"<directory>">,
>
> Modified: cfe/trunk/include/clang/Frontend/HeaderSearchOptions.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/HeaderSearchOptions.h?rev=140341&r1=140340&r2=140341&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/HeaderSearchOptions.h (original)
> +++ cfe/trunk/include/clang/Frontend/HeaderSearchOptions.h Thu Sep 22 16:41:16 2011
> @@ -26,7 +26,10 @@
>     IndexHeaderMap, ///< Like Angled, but marks header maps used when
>                        ///  building frameworks.
>     System,         ///< Like Angled, but marks system directories.
> +    CSystem,        ///< Like System, but only used for C.
>     CXXSystem,      ///< Like System, but only used for C++.
> +    ObjCSystem,     ///< Like System, but only used for ObjC.
> +    ObjCXXSystem,   ///< Like System, but only used for ObjC++.
>     After           ///< Like System, but searched after the system directories.
>   };
>  }
> @@ -59,18 +62,6 @@
>   /// User specified include entries.
>   std::vector<Entry> UserEntries;
>
> -  /// A (system-path) delimited list of include paths to be added from the
> -  /// environment following the user specified includes (but prior to builtin
> -  /// and standard includes). This is parsed in the same manner as the CPATH
> -  /// environment variable for gcc.
> -  std::string EnvIncPath;
> -
> -  /// Per-language environmental include paths, see \see EnvIncPath.
> -  std::string CEnvIncPath;
> -  std::string ObjCEnvIncPath;
> -  std::string CXXEnvIncPath;
> -  std::string ObjCXXEnvIncPath;
> -
>   /// The directory which holds the compiler resource files (builtin includes,
>   /// etc.).
>   std::string ResourceDir;
>
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=140341&r1=140340&r2=140341&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Thu Sep 22 16:41:16 2011
> @@ -183,6 +183,38 @@
>   CmdArgs.push_back(Args.MakeArgString(ProfileRT));
>  }
>
> +static void AddIncludeDirectoryList(const ArgList &Args,
> +                                    ArgStringList &CmdArgs,
> +                                    const char *ArgName,
> +                                    const char *DirList) {
> +  if (!DirList)
> +    return; // Nothing to do.
> +
> +  StringRef Dirs(DirList);
> +  if (Dirs.empty()) // Empty string should not add '.'.
> +    return;
> +
> +  StringRef::size_type Delim;
> +  while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
> +    if (Delim == 0) { // Leading colon.
> +      CmdArgs.push_back(ArgName);
> +      CmdArgs.push_back(".");
> +    } else {
> +      CmdArgs.push_back(ArgName);
> +      CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
> +    }
> +    Dirs = Dirs.substr(Delim + 1);
> +  }
> +
> +  if (Dirs.empty()) { // Trailing colon.
> +    CmdArgs.push_back(ArgName);
> +    CmdArgs.push_back(".");
> +  } else { // Add the last path.
> +    CmdArgs.push_back(ArgName);
> +    CmdArgs.push_back(Args.MakeArgString(Dirs));
> +  }
> +}
> +
>  void Clang::AddPreprocessingOptions(const Driver &D,
>                                     const ArgList &Args,
>                                     ArgStringList &CmdArgs,
> @@ -391,6 +423,23 @@
>   }
>
>   Args.AddAllArgs(CmdArgs, options::OPT_fauto_module_import);
> +
> +  // Parse additional include paths from environment variables.
> +  // CPATH - included following the user specified includes (but prior to
> +  // builtin and standard includes).
> +  AddIncludeDirectoryList(Args, CmdArgs, "-I", ::getenv("CPATH"));
> +  // C_INCLUDE_PATH - system includes enabled when compiling C.
> +  AddIncludeDirectoryList(Args, CmdArgs, "-c-isystem",
> +                          ::getenv("C_INCLUDE_PATH"));
> +  // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
> +  AddIncludeDirectoryList(Args, CmdArgs, "-cxx-isystem",
> +                          ::getenv("CPLUS_INCLUDE_PATH"));
> +  // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
> +  AddIncludeDirectoryList(Args, CmdArgs, "-objc-isystem",
> +                          ::getenv("OBJC_INCLUDE_PATH"));
> +  // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
> +  AddIncludeDirectoryList(Args, CmdArgs, "-objcxx-isystem",
> +                          ::getenv("OBJCPLUS_INCLUDE_PATH"));
>  }
>
>  /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=140341&r1=140340&r2=140341&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Sep 22 16:41:16 2011
> @@ -534,9 +534,21 @@
>         Res.push_back(E.IsFramework? "-F" : "-I");
>         break;
>
> +      case frontend::CSystem:
> +        Res.push_back("-c-isystem");
> +        break;
> +
>       case frontend::CXXSystem:
>         Res.push_back("-cxx-isystem");
>         break;
> +
> +      case frontend::ObjCSystem:
> +        Res.push_back("-objc-isystem");
> +        break;
> +
> +      case frontend::ObjCXXSystem:
> +        Res.push_back("-objcxx-isystem");
> +        break;
>
>       case frontend::Angled:
>         Res.push_back(E.IsFramework ? "-F" : "-I");
> @@ -551,26 +563,6 @@
>     Res.push_back(E.Path);
>   }
>
> -  if (!Opts.EnvIncPath.empty()) {
> -    // FIXME: Provide an option for this, and move env detection to driver.
> -    llvm::report_fatal_error("Not yet implemented!");
> -  }
> -  if (!Opts.CEnvIncPath.empty()) {
> -    // FIXME: Provide an option for this, and move env detection to driver.
> -    llvm::report_fatal_error("Not yet implemented!");
> -  }
> -  if (!Opts.ObjCEnvIncPath.empty()) {
> -    // FIXME: Provide an option for this, and move env detection to driver.
> -    llvm::report_fatal_error("Not yet implemented!");
> -  }
> -  if (!Opts.CXXEnvIncPath.empty()) {
> -    // FIXME: Provide an option for this, and move env detection to driver.
> -    llvm::report_fatal_error("Not yet implemented!");
> -  }
> -  if (!Opts.ObjCXXEnvIncPath.empty()) {
> -    // FIXME: Provide an option for this, and move env detection to driver.
> -    llvm::report_fatal_error("Not yet implemented!");
> -  }
>   if (!Opts.ResourceDir.empty()) {
>     Res.push_back("-resource-dir");
>     Res.push_back(Opts.ResourceDir);
> @@ -1424,14 +1416,25 @@
>   for (arg_iterator it = Args.filtered_begin(OPT_iquote),
>          ie = Args.filtered_end(); it != ie; ++it)
>     Opts.AddPath((*it)->getValue(Args), frontend::Quoted, true, false, false);
> -  for (arg_iterator it = Args.filtered_begin(OPT_cxx_isystem, OPT_isystem,
> +  for (arg_iterator it = Args.filtered_begin(OPT_isystem,
>          OPT_iwithsysroot), ie = Args.filtered_end(); it != ie; ++it)
> -    Opts.AddPath((*it)->getValue(Args),
> -                 ((*it)->getOption().matches(OPT_cxx_isystem) ?
> -                   frontend::CXXSystem : frontend::System),
> -                 true, false, !(*it)->getOption().matches(OPT_iwithsysroot));
> -
> -  // FIXME: Need options for the various environment variables!
> +    Opts.AddPath((*it)->getValue(Args), frontend::System, true, false,
> +                 !(*it)->getOption().matches(OPT_iwithsysroot));
> +
> +  // Add the paths for the various language specific isystem flags.
> +  for (arg_iterator it = Args.filtered_begin(OPT_c_isystem),
> +       ie = Args.filtered_end(); it != ie; ++it)
> +    Opts.AddPath((*it)->getValue(Args), frontend::CSystem, true, false, true);
> +  for (arg_iterator it = Args.filtered_begin(OPT_cxx_isystem),
> +       ie = Args.filtered_end(); it != ie; ++it)
> +    Opts.AddPath((*it)->getValue(Args), frontend::CXXSystem, true, false, true);
> +  for (arg_iterator it = Args.filtered_begin(OPT_objc_isystem),
> +       ie = Args.filtered_end(); it != ie; ++it)
> +    Opts.AddPath((*it)->getValue(Args), frontend::ObjCSystem, true, false,true);
> +  for (arg_iterator it = Args.filtered_begin(OPT_objcxx_isystem),
> +       ie = Args.filtered_end(); it != ie; ++it)
> +    Opts.AddPath((*it)->getValue(Args), frontend::ObjCXXSystem, true, false,
> +                 true);
>  }
>
>  void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
>
> Modified: cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=140341&r1=140340&r2=140341&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/InitHeaderSearch.cpp (original)
> +++ cfe/trunk/lib/Frontend/InitHeaderSearch.cpp Thu Sep 22 16:41:16 2011
> @@ -81,10 +81,6 @@
>   void AddMinGW64CXXPaths(StringRef Base,
>                           StringRef Version);
>
> -  /// AddDelimitedPaths - Add a list of paths delimited by the system PATH
> -  /// separator. The processing follows that of the CPATH variable for gcc.
> -  void AddDelimitedPaths(StringRef String);
> -
>   // AddDefaultCIncludePaths - Add paths that should always be searched.
>   void AddDefaultCIncludePaths(const llvm::Triple &triple,
>                                const HeaderSearchOptions &HSOpts);
> @@ -167,26 +163,6 @@
>                  << MappedPathStr << "\"\n";
>  }
>
> -
> -void InitHeaderSearch::AddDelimitedPaths(StringRef at) {
> -  if (at.empty()) // Empty string should not add '.' path.
> -    return;
> -
> -  StringRef::size_type delim;
> -  while ((delim = at.find(llvm::sys::PathSeparator)) != StringRef::npos) {
> -    if (delim == 0)
> -      AddPath(".", Angled, false, true, false);
> -    else
> -      AddPath(at.substr(0, delim), Angled, false, true, false);
> -    at = at.substr(delim + 1);
> -  }
> -
> -  if (at.empty())
> -    AddPath(".", Angled, false, true, false);
> -  else
> -    AddPath(at, Angled, false, true, false);
> -}
> -
>  void InitHeaderSearch::AddGnuCPlusPlusIncludePaths(StringRef Base,
>                                                    StringRef ArchDir,
>                                                    StringRef Dir32,
> @@ -1094,7 +1070,11 @@
>
>   for (path_iterator it = IncludePath.begin(), ie = IncludePath.end();
>        it != ie; ++it) {
> -    if (it->first == System || (Lang.CPlusPlus && it->first == CXXSystem))
> +    if (it->first == System ||
> +        (!Lang.ObjC1 && !Lang.CPlusPlus && it->first == CSystem)    ||
> +        (!Lang.ObjC1 && Lang.CPlusPlus  && it->first == CXXSystem)  ||
> +        (Lang.ObjC1  && !Lang.CPlusPlus && it->first == ObjCSystem) ||
> +        (Lang.ObjC1  && Lang.CPlusPlus  && it->first == ObjCXXSystem))
>       SearchList.push_back(it->second);
>   }
>
> @@ -1147,17 +1127,6 @@
>                  E.IgnoreSysRoot);
>   }
>
> -  // Add entries from CPATH and friends.
> -  Init.AddDelimitedPaths(HSOpts.EnvIncPath);
> -  if (Lang.CPlusPlus && Lang.ObjC1)
> -    Init.AddDelimitedPaths(HSOpts.ObjCXXEnvIncPath);
> -  else if (Lang.CPlusPlus)
> -    Init.AddDelimitedPaths(HSOpts.CXXEnvIncPath);
> -  else if (Lang.ObjC1)
> -    Init.AddDelimitedPaths(HSOpts.ObjCEnvIncPath);
> -  else
> -    Init.AddDelimitedPaths(HSOpts.CEnvIncPath);
> -
>   if (HSOpts.UseStandardIncludes)
>     Init.AddDefaultSystemIncludePaths(Lang, Triple, HSOpts);
>
>
> Added: cfe/trunk/test/Driver/cpath.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cpath.c?rev=140341&view=auto
> ==============================================================================
> --- cfe/trunk/test/Driver/cpath.c (added)
> +++ cfe/trunk/test/Driver/cpath.c Thu Sep 22 16:41:16 2011
> @@ -0,0 +1,20 @@
> +// RUN: mkdir -p %T/test1 %T/test2
> +
> +// RUN: CPATH=%T/test1: %clang -x c -E -v %s 2>&1 | FileCheck %s -check-prefix=CPATH
> +// CPATH: -I {{.*}}/test1 -I .
> +// CPATH: search starts here
> +// CPATH: test1
> +
> +// RUN: OBJC_INCLUDE_PATH=%T/test1  OBJCPLUS_INCLUDE_PATH=%T/test1  CPLUS_INCLUDE_PATH=%T/test1 C_INCLUDE_PATH=%T/test2 %clang -x c -E -v %s 2>&1 | FileCheck %s -check-prefix=C_INCLUDE_PATH
> +// C_INCLUDE_PATH: -c-isystem {{.*}}/test2 -cxx-isystem {{.*}}/test1 -objc-isystem {{.*}}/test1 -objcxx-isystem {{.*}}/test1
> +// C_INCLUDE_PATH: search starts here
> +// C_INCLUDE_PATH-NOT: test1
> +// C_INCLUDE_PATH: test2
> +// C_INCLUDE_PATH-NOT: test1
> +
> +// RUN: OBJC_INCLUDE_PATH=%T/test1  OBJCPLUS_INCLUDE_PATH=%T/test2  CPLUS_INCLUDE_PATH=%T/test1 C_INCLUDE_PATH=%T/test1 %clang -x objective-c++ -E -v %s 2>&1 | FileCheck %s -check-prefix=OBJCPLUS_INCLUDE_PATH
> +// OBJCPLUS_INCLUDE_PATH: -c-isystem {{.*}}/test1 -cxx-isystem {{.*}}/test1 -objc-isystem {{.*}}/test1 -objcxx-isystem {{.*}}/test2
> +// OBJCPLUS_INCLUDE_PATH: search starts here
> +// OBJCPLUS_INCLUDE_PATH-NOT: test1
> +// OBJCPLUS_INCLUDE_PATH: test2
> +// OBJCPLUS_INCLUDE_PATH-NOT: test1
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list