]> granicus.if.org Git - clang/commitdiff
[Driver] Allow drivers to add multiple libc++ include paths
authorPetr Hosek <phosek@chromium.org>
Tue, 10 Apr 2018 19:55:55 +0000 (19:55 +0000)
committerPetr Hosek <phosek@chromium.org>
Tue, 10 Apr 2018 19:55:55 +0000 (19:55 +0000)
This allows toolchain drivers to add multiple libc++ include paths akin
to libstdc++. This is useful in multiarch setup when some headers might
be in target specific include directory. There should be no functional
change.

Differential Revision: https://reviews.llvm.org/D45422

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@329748 91177308-0d34-0410-b5e6-96231b3b80d8

21 files changed:
lib/Driver/ToolChains/BareMetal.cpp
lib/Driver/ToolChains/BareMetal.h
lib/Driver/ToolChains/CloudABI.cpp
lib/Driver/ToolChains/CloudABI.h
lib/Driver/ToolChains/Contiki.h
lib/Driver/ToolChains/Gnu.cpp
lib/Driver/ToolChains/Gnu.h
lib/Driver/ToolChains/Haiku.cpp
lib/Driver/ToolChains/Haiku.h
lib/Driver/ToolChains/Lanai.h
lib/Driver/ToolChains/Linux.cpp
lib/Driver/ToolChains/Linux.h
lib/Driver/ToolChains/MipsLinux.cpp
lib/Driver/ToolChains/MipsLinux.h
lib/Driver/ToolChains/Myriad.cpp
lib/Driver/ToolChains/Myriad.h
lib/Driver/ToolChains/NaCl.cpp
lib/Driver/ToolChains/NaCl.h
lib/Driver/ToolChains/NetBSD.cpp
lib/Driver/ToolChains/NetBSD.h
lib/Driver/ToolChains/PS4CPU.h

index 57a668650e6bce22541f6654196d66804e6e7a62..c302d647b973fa1f0eda22c8ec72f03a7bdd0ebe 100644 (file)
@@ -95,16 +95,23 @@ void BareMetal::addClangTargetOptions(const ArgList &DriverArgs,
   CC1Args.push_back("-nostdsysteminc");
 }
 
-std::string BareMetal::findLibCxxIncludePath(CXXStdlibType LibType) const {
+void BareMetal::AddClangCXXStdlibIncludeArgs(
+    const ArgList &DriverArgs, ArgStringList &CC1Args) const {
+  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
+      DriverArgs.hasArg(options::OPT_nostdlibinc) ||
+      DriverArgs.hasArg(options::OPT_nostdincxx))
+    return;
+
   StringRef SysRoot = getDriver().SysRoot;
   if (SysRoot.empty())
-    return "";
+    return;
 
-  switch (LibType) {
+  switch (GetCXXStdlibType(DriverArgs)) {
   case ToolChain::CST_Libcxx: {
     SmallString<128> Dir(SysRoot);
     llvm::sys::path::append(Dir, "include", "c++", "v1");
-    return Dir.str();
+    addSystemInclude(DriverArgs, CC1Args, Dir.str());
+    break;
   }
   case ToolChain::CST_Libstdcxx: {
     SmallString<128> Dir(SysRoot);
@@ -124,24 +131,12 @@ std::string BareMetal::findLibCxxIncludePath(CXXStdlibType LibType) const {
       Version = CandidateVersion;
     }
     if (Version.Major == -1)
-      return "";
+      return;
     llvm::sys::path::append(Dir, Version.Text);
-    return Dir.str();
+    addSystemInclude(DriverArgs, CC1Args, Dir.str());
+    break;
   }
   }
-  llvm_unreachable("unhandled LibType");
-}
-
-void BareMetal::AddClangCXXStdlibIncludeArgs(
-    const ArgList &DriverArgs, ArgStringList &CC1Args) const {
-  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
-      DriverArgs.hasArg(options::OPT_nostdlibinc) ||
-      DriverArgs.hasArg(options::OPT_nostdincxx))
-    return;
-
-  std::string Path = findLibCxxIncludePath(GetCXXStdlibType(DriverArgs));
-  if (!Path.empty())
-    addSystemInclude(DriverArgs, CC1Args, Path);
 }
 
 void BareMetal::AddCXXStdlibLibArgs(const ArgList &Args,
index 0bed63332cad0f888835fa02e38c433e6f10fa8d..43a6a8b4bec34f368173bb7fda7ca4ae175ec1d0 100644 (file)
@@ -53,7 +53,6 @@ public:
   void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
                              llvm::opt::ArgStringList &CC1Args,
                              Action::OffloadKind DeviceOffloadKind) const override;
-  std::string findLibCxxIncludePath(ToolChain::CXXStdlibType LibType) const;
   void AddClangCXXStdlibIncludeArgs(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override;
index cdf807f7f91ff7fecbf3f3463be66b7435055daf..3aa55de7ea1b7a442994fee716b79f5d26be05e8 100644 (file)
@@ -104,10 +104,11 @@ CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
   getFilePaths().push_back(P.str());
 }
 
-std::string CloudABI::findLibCxxIncludePath() const {
+void CloudABI::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
+                                     llvm::opt::ArgStringList &CC1Args) const {
   SmallString<128> P(getDriver().Dir);
   llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
-  return P.str();
+  addSystemInclude(DriverArgs, CC1Args, P.str());
 }
 
 void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
index a284eb3dc0a425d6031fd23c6875e6119c9c37d2..7464c59545556bc6975138e024bade3a9d38f418 100644 (file)
@@ -50,7 +50,9 @@ public:
   GetCXXStdlibType(const llvm::opt::ArgList &Args) const override {
     return ToolChain::CST_Libcxx;
   }
-  std::string findLibCxxIncludePath() const override;
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override;
   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
                            llvm::opt::ArgStringList &CmdArgs) const override;
 
index f6e15073887b445d2e6ec5fc4e2142a335187cda..86d59ac92b164edbc557ff961d9a74c54762d60d 100644 (file)
@@ -23,7 +23,9 @@ public:
           const llvm::opt::ArgList &Args);
 
   // No support for finding a C++ standard library yet.
-  std::string findLibCxxIncludePath() const override { return ""; }
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override {}
   void addLibStdCxxIncludePaths(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override {}
index e10e14fb23b6a102feaaecfe23a2b04e472e1c20..a50e5bd6632a0d7f4ad506511cec876f53b02654 100644 (file)
@@ -2391,12 +2391,9 @@ void Generic_GCC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
     return;
 
   switch (GetCXXStdlibType(DriverArgs)) {
-  case ToolChain::CST_Libcxx: {
-    std::string Path = findLibCxxIncludePath();
-    if (!Path.empty())
-      addSystemInclude(DriverArgs, CC1Args, Path);
+  case ToolChain::CST_Libcxx:
+    addLibCxxIncludePaths(DriverArgs, CC1Args);
     break;
-  }
 
   case ToolChain::CST_Libstdcxx:
     addLibStdCxxIncludePaths(DriverArgs, CC1Args);
@@ -2404,9 +2401,12 @@ void Generic_GCC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
   }
 }
 
-std::string Generic_GCC::findLibCxxIncludePath() const {
+void
+Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
+                                   llvm::opt::ArgStringList &CC1Args) const {
   // FIXME: The Linux behavior would probaby be a better approach here.
-  return getDriver().SysRoot + "/usr/include/c++/v1";
+  addSystemInclude(DriverArgs, CC1Args,
+                   getDriver().SysRoot + "/usr/include/c++/v1");
 }
 
 void
index cc9b4a334557808a0197eb55e8e927f9ca8425a3..a053e6f213c6e17613436a88309eabb0af68538e 100644 (file)
@@ -316,7 +316,9 @@ protected:
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override;
 
-  virtual std::string findLibCxxIncludePath() const;
+  virtual void
+  addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
+                        llvm::opt::ArgStringList &CC1Args) const;
   virtual void
   addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
                            llvm::opt::ArgStringList &CC1Args) const;
index 284d269a0c1b7d13c34175c3421b0473abcca25c..12461ec9c4bdc3f1c687f1f6b5fc1eda816c9e68 100644 (file)
@@ -22,8 +22,10 @@ Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
 
 }
 
-std::string Haiku::findLibCxxIncludePath() const {
-  return getDriver().SysRoot + "/system/develop/headers/c++/v1";
+void Haiku::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
+                                  llvm::opt::ArgStringList &CC1Args) const {
+  addSystemInclude(DriverArgs, CC1Args,
+                   getDriver().SysRoot + "/system/develop/headers/c++/v1");
 }
 
 void Haiku::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
index 8b5b48e5902367635e3b63c8e4bd335deae93d64..a12a48e009767610599da1110020afc7ca906285 100644 (file)
@@ -27,7 +27,9 @@ public:
     return getTriple().getArch() == llvm::Triple::x86_64;
   }
 
-  std::string findLibCxxIncludePath() const override;
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override;
   void addLibStdCxxIncludePaths(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override;
index 4ce658dc7775bf7230307b39158d01e92f126789..bb92bfaea7e26e9b945a57a6d4a8db31f649d7d4 100644 (file)
@@ -24,7 +24,9 @@ public:
       : Generic_ELF(D, Triple, Args) {}
 
   // No support for finding a C++ standard library yet.
-  std::string findLibCxxIncludePath() const override { return ""; }
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override {}
   void addLibStdCxxIncludePaths(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override {}
index f135c19e540f2a524e003dba583cd7363e2b70a3..c9544a39c203c780991ce007253308098e4ab9dd 100644 (file)
@@ -775,7 +775,8 @@ static std::string DetectLibcxxIncludePath(StringRef base) {
   return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
 }
 
-std::string Linux::findLibCxxIncludePath() const {
+void Linux::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
+                                  llvm::opt::ArgStringList &CC1Args) const {
   const std::string LibCXXIncludePathCandidates[] = {
       DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
       // If this is a development, non-installed, clang, libcxx will
@@ -787,9 +788,9 @@ std::string Linux::findLibCxxIncludePath() const {
     if (IncludePath.empty() || !getVFS().exists(IncludePath))
       continue;
     // Use the first candidate that exists.
-    return IncludePath;
+    addSystemInclude(DriverArgs, CC1Args, IncludePath);
+    return;
   }
-  return "";
 }
 
 void Linux::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
index 9778c1832ccc91ad55caf1c1f6d03347fca56ee7..22dbbecf6b96d96b1d7ef6eb322f9cb8d957471d 100644 (file)
@@ -27,7 +27,9 @@ public:
   void
   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                             llvm::opt::ArgStringList &CC1Args) const override;
-  std::string findLibCxxIncludePath() const override;
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override;
   void addLibStdCxxIncludePaths(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override;
index b394208336edb256fa3cf6c32d5c8259dbe676c4..2f1c8b2f0c7073ffcfead99982ab9c7fafa79f3a 100644 (file)
@@ -94,16 +94,18 @@ MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
   return ToolChain::CST_Libcxx;
 }
 
-std::string MipsLLVMToolChain::findLibCxxIncludePath() const {
+void MipsLLVMToolChain::addLibCxxIncludePaths(
+    const llvm::opt::ArgList &DriverArgs,
+    llvm::opt::ArgStringList &CC1Args) const {
   if (const auto &Callback = Multilibs.includeDirsCallback()) {
     for (std::string Path : Callback(SelectedMultilib)) {
       Path = getDriver().getInstalledDir() + Path + "/c++/v1";
       if (llvm::sys::fs::exists(Path)) {
-        return Path;
+        addSystemInclude(DriverArgs, CC1Args, Path);
+        return;
       }
     }
   }
-  return "";
 }
 
 void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
index fa82efbbfc8f9f4803981f7778d1eb1da1cc47c0..d4b476d883e67c96f10b427ceab33ae173a08b1e 100644 (file)
@@ -31,7 +31,9 @@ public:
 
   CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;
 
-  std::string findLibCxxIncludePath() const override;
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override;
 
   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
                            llvm::opt::ArgStringList &CmdArgs) const override;
index 2c0b3162588d2573539a95077ead70cf09a9aa3c..2b4c1d165576fbe3e449cc0d7d24caf41d0f1b31 100644 (file)
@@ -242,9 +242,11 @@ void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
     addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
 }
 
-std::string MyriadToolChain::findLibCxxIncludePath() const {
+void MyriadToolChain::addLibCxxIncludePaths(
+    const llvm::opt::ArgList &DriverArgs,
+    llvm::opt::ArgStringList &CC1Args) const {
   std::string Path(getDriver().getInstalledDir());
-  return Path + "/../include/c++/v1";
+  addSystemInclude(DriverArgs, CC1Args, Path + "/../include/c++/v1");
 }
 
 void MyriadToolChain::addLibStdCxxIncludePaths(
index 4c213c726219d57ed928d87d09813ade8660f0c3..33307c3f871a4f4ee1908c0934d9a929c3e0b7aa 100644 (file)
@@ -76,7 +76,9 @@ public:
   void
   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                             llvm::opt::ArgStringList &CC1Args) const override;
-  std::string findLibCxxIncludePath() const override;
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override;
   void addLibStdCxxIncludePaths(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override;
index 128478d638719e81b2a7f0205a8dcc5715317951..2e5365b4814dc67519faae73ad3a9ec68cdeddf2 100644 (file)
@@ -309,25 +309,29 @@ void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
   CmdArgs.push_back("-lc++");
 }
 
-std::string NaClToolChain::findLibCxxIncludePath() const {
+void NaClToolChain::addLibCxxIncludePaths(
+    const llvm::opt::ArgList &DriverArgs,
+    llvm::opt::ArgStringList &CC1Args) const {
   const Driver &D = getDriver();
 
   SmallString<128> P(D.Dir + "/../");
   switch (getTriple().getArch()) {
   case llvm::Triple::arm:
     llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
-    return P.str();
+    addSystemInclude(DriverArgs, CC1Args, P.str());
+    break;
   case llvm::Triple::x86:
     llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
-    return P.str();
+    addSystemInclude(DriverArgs, CC1Args, P.str());
+    break;
   case llvm::Triple::x86_64:
     llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
-    return P.str();
+    addSystemInclude(DriverArgs, CC1Args, P.str());
+    break;
   case llvm::Triple::mipsel:
     llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
-    return P.str();
-  default:
-    return "";
+    addSystemInclude(DriverArgs, CC1Args, P.str());
+    break;
   }
 }
 
index 31af3a53ad3cfe347fa469a34cd56aa645e2be55..e0885b526d70f2c4e4f22edc91e7477f8a54114a 100644 (file)
@@ -53,7 +53,9 @@ public:
   void
   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                             llvm::opt::ArgStringList &CC1Args) const override;
-  std::string findLibCxxIncludePath() const override;
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override;
 
   CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;
 
index 0db6578f7407bd9d021e50ebcbeaa31a9e8d4e35..55fefdf26f6f76a3723be4abb965aacacbcee64d 100644 (file)
@@ -406,8 +406,10 @@ ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
   return ToolChain::CST_Libstdcxx;
 }
 
-std::string NetBSD::findLibCxxIncludePath() const {
-  return getDriver().SysRoot + "/usr/include/c++/";
+void NetBSD::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
+                                   llvm::opt::ArgStringList &CC1Args) const {
+  addSystemInclude(DriverArgs, CC1Args,
+                   getDriver().SysRoot + "/usr/include/c++/");
 }
 
 void NetBSD::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
index e98df72ce65c23c43dd9e429260adf528aa82f67..49e3a58d02c377504b24b83302ca539a5c2d2014 100644 (file)
@@ -60,7 +60,9 @@ public:
 
   CXXStdlibType GetDefaultCXXStdlibType() const override;
 
-  std::string findLibCxxIncludePath() const override;
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override;
   void addLibStdCxxIncludePaths(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override;
index e507edbad4d56763b10c2bb71dad8c9fdeb708ed..93752c40793154f0d92593f9ca8f5b8109f002a8 100644 (file)
@@ -61,7 +61,9 @@ public:
          const llvm::opt::ArgList &Args);
 
   // No support for finding a C++ standard library yet.
-  std::string findLibCxxIncludePath() const override { return ""; }
+  void addLibCxxIncludePaths(
+      const llvm::opt::ArgList &DriverArgs,
+      llvm::opt::ArgStringList &CC1Args) const override {}
   void addLibStdCxxIncludePaths(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override {}