This change breaks cmake build: undefined reference to `clang::DiagnosticIDs::DiagnosticIDs()' /home/jvesely/llvm/tools/clang/unittests/Driver/ToolChainTest.cpp:33: undefined reference to `clang::DiagnosticsEngine::DiagnosticsEngine(llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> const&, clang::DiagnosticOptions*, clang::DiagnosticConsumer*, bool)' /home/jvesely/llvm/tools/clang/unittests/Driver/ToolChainTest.cpp:35: undefined reference to `clang::vfs::InMemoryFileSystem::InMemoryFileSystem()' /home/jvesely/llvm/tools/clang/unittests/Driver/ToolChainTest.cpp:59: undefined reference to `clang::vfs::InMemoryFileSystem::addFile(llvm::Twine const&, long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >)' /home/jvesely/llvm/tools/clang/unittests/Driver/ToolChainTest.cpp:33: undefined reference to `clang::DiagnosticsEngine::~DiagnosticsEngine()' CMakeFiles/ClangDriverTests.dir/ToolChainTest.cpp.o: In function `~TestDiagnosticConsumer': /home/jvesely/llvm/tools/clang/unittests/Driver/ToolChainTest.cpp:32: undefined reference to `clang::DiagnosticConsumer::~DiagnosticConsumer()' CMakeFiles/ClangDriverTests.dir/ToolChainTest.cpp.o: In function `clang::DiagnosticConsumer::DiagnosticConsumer()': /home/jvesely/llvm/tools/clang/include/clang/Basic/Diagnostic.h:1313: undefined reference to `vtable for clang::DiagnosticConsumer' CMakeFiles/ClangDriverTests.dir/ToolChainTest.cpp.o: In function `llvm::RefCountedBase<clang::DiagnosticIDs>::Release() const': /home/jvesely/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:54: undefined reference to `clang::DiagnosticIDs::~DiagnosticIDs()' CMakeFiles/ClangDriverTests.dir/ToolChainTest.cpp.o:(.data.rel.ro+0x80): undefined reference to `clang::DiagnosticConsumer::IncludeInDiagnosticCounts() const' CMakeFiles/ClangDriverTests.dir/ToolChainTest.cpp.o:(.data.rel.ro+0x88): undefined reference to `clang::DiagnosticConsumer::HandleDiagnostic(clang::DiagnosticsEngine::Level, clang::Diagnostic const&)' collect2: error: ld returned 1 exit status
using Diagnostics requires linking to libclangBasic. Please consider the attached patch. BR, Jan On Wed, Oct 7, 2015 at 10:48 AM, Benjamin Kramer via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: d0k > Date: Wed Oct 7 10:48:01 2015 > New Revision: 249556 > > URL: http://llvm.org/viewvc/llvm-project?rev=249556&view=rev > Log: > [VFS] Port driver tool chains to VFS. > > There are still some loose ends here but it's sufficient so we can detect > GCC headers that are inside of a VFS. > > Added: > cfe/trunk/unittests/Driver/ToolChainTest.cpp > Modified: > cfe/trunk/include/clang/Basic/VirtualFileSystem.h > cfe/trunk/include/clang/Driver/Driver.h > cfe/trunk/include/clang/Driver/ToolChain.h > cfe/trunk/lib/Basic/VirtualFileSystem.cpp > cfe/trunk/lib/Driver/Driver.cpp > cfe/trunk/lib/Driver/ToolChain.cpp > cfe/trunk/lib/Driver/ToolChains.cpp > cfe/trunk/lib/Driver/ToolChains.h > cfe/trunk/lib/Driver/Tools.cpp > cfe/trunk/unittests/Driver/CMakeLists.txt > > Modified: cfe/trunk/include/clang/Basic/VirtualFileSystem.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VirtualFileSystem.h?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/VirtualFileSystem.h (original) > +++ cfe/trunk/include/clang/Basic/VirtualFileSystem.h Wed Oct 7 10:48:01 > 2015 > @@ -206,6 +206,9 @@ public: > /// Get the working directory of this file system. > virtual llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const = > 0; > > + /// Check whether a file exists. Provided for convenience. > + bool exists(const Twine &Path); > + > /// Make \a Path an absolute path. > /// > /// Makes \a Path absolute using the current directory if it is not > already. > > Modified: cfe/trunk/include/clang/Driver/Driver.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Driver.h?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Driver/Driver.h (original) > +++ cfe/trunk/include/clang/Driver/Driver.h Wed Oct 7 10:48:01 2015 > @@ -36,6 +36,11 @@ namespace opt { > } > > namespace clang { > + > +namespace vfs { > +class FileSystem; > +} > + > namespace driver { > > class Action; > @@ -54,6 +59,8 @@ class Driver { > > DiagnosticsEngine &Diags; > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS; > + > enum DriverMode { > GCCMode, > GXXMode, > @@ -201,9 +208,9 @@ private: > SmallVectorImpl<std::string> &Names) > const; > > public: > - Driver(StringRef _ClangExecutable, > - StringRef _DefaultTargetTriple, > - DiagnosticsEngine &_Diags); > + Driver(StringRef ClangExecutable, StringRef DefaultTargetTriple, > + DiagnosticsEngine &Diags, > + IntrusiveRefCntPtr<vfs::FileSystem> VFS = nullptr); > ~Driver(); > > /// @name Accessors > @@ -216,6 +223,8 @@ public: > > const DiagnosticsEngine &getDiags() const { return Diags; } > > + vfs::FileSystem &getVFS() const { return *VFS; } > + > bool getCheckInputsExist() const { return CheckInputsExist; } > > void setCheckInputsExist(bool Value) { CheckInputsExist = Value; } > > Modified: cfe/trunk/include/clang/Driver/ToolChain.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Driver/ToolChain.h (original) > +++ cfe/trunk/include/clang/Driver/ToolChain.h Wed Oct 7 10:48:01 2015 > @@ -30,7 +30,10 @@ namespace opt { > } > > namespace clang { > - class ObjCRuntime; > +class ObjCRuntime; > +namespace vfs { > +class FileSystem; > +} > > namespace driver { > class Compilation; > @@ -119,7 +122,8 @@ public: > > // Accessors > > - const Driver &getDriver() const; > + const Driver &getDriver() const { return D; } > + vfs::FileSystem &getVFS() const; > const llvm::Triple &getTriple() const { return Triple; } > > llvm::Triple::ArchType getArch() const { return Triple.getArch(); } > > Modified: cfe/trunk/lib/Basic/VirtualFileSystem.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/lib/Basic/VirtualFileSystem.cpp (original) > +++ cfe/trunk/lib/Basic/VirtualFileSystem.cpp Wed Oct 7 10:48:01 2015 > @@ -105,6 +105,11 @@ std::error_code FileSystem::makeAbsolute > return llvm::sys::fs::make_absolute(WorkingDir.get(), Path); > } > > +bool FileSystem::exists(const Twine &Path) { > + auto Status = status(Path); > + return Status && Status->exists(); > +} > + > > > //===-----------------------------------------------------------------------===/ > // RealFileSystem implementation > > > //===-----------------------------------------------------------------------===/ > > Modified: cfe/trunk/lib/Driver/Driver.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/lib/Driver/Driver.cpp (original) > +++ cfe/trunk/lib/Driver/Driver.cpp Wed Oct 7 10:48:01 2015 > @@ -11,6 +11,7 @@ > #include "InputInfo.h" > #include "ToolChains.h" > #include "clang/Basic/Version.h" > +#include "clang/Basic/VirtualFileSystem.h" > #include "clang/Config/config.h" > #include "clang/Driver/Action.h" > #include "clang/Driver/Compilation.h" > @@ -46,8 +47,9 @@ using namespace clang; > using namespace llvm::opt; > > Driver::Driver(StringRef ClangExecutable, StringRef DefaultTargetTriple, > - DiagnosticsEngine &Diags) > - : Opts(createDriverOptTable()), Diags(Diags), Mode(GCCMode), > + DiagnosticsEngine &Diags, > + IntrusiveRefCntPtr<vfs::FileSystem> VFS) > + : Opts(createDriverOptTable()), Diags(Diags), VFS(VFS), Mode(GCCMode), > SaveTemps(SaveTempsNone), ClangExecutable(ClangExecutable), > SysRoot(DEFAULT_SYSROOT), UseStdLib(true), > DefaultTargetTriple(DefaultTargetTriple), > @@ -57,6 +59,10 @@ Driver::Driver(StringRef ClangExecutable > CCGenDiagnostics(false), CCCGenericGCCName(""), > CheckInputsExist(true), > CCCUsePCH(true), SuppressMissingInputWarning(false) { > > + // Provide a sane fallback if no VFS is specified. > + if (!this->VFS) > + this->VFS = vfs::getRealFileSystem(); > + > Name = llvm::sys::path::filename(ClangExecutable); > Dir = llvm::sys::path::parent_path(ClangExecutable); > > > Modified: cfe/trunk/lib/Driver/ToolChain.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/lib/Driver/ToolChain.cpp (original) > +++ cfe/trunk/lib/Driver/ToolChain.cpp Wed Oct 7 10:48:01 2015 > @@ -75,9 +75,7 @@ ToolChain::ToolChain(const Driver &D, co > ToolChain::~ToolChain() { > } > > -const Driver &ToolChain::getDriver() const { > - return D; > -} > +vfs::FileSystem &ToolChain::getVFS() const { return getDriver().getVFS(); > } > > bool ToolChain::useIntegratedAs() const { > return Args.hasFlag(options::OPT_fintegrated_as, > > Modified: cfe/trunk/lib/Driver/ToolChains.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/lib/Driver/ToolChains.cpp (original) > +++ cfe/trunk/lib/Driver/ToolChains.cpp Wed Oct 7 10:48:01 2015 > @@ -10,6 +10,7 @@ > #include "ToolChains.h" > #include "clang/Basic/ObjCRuntime.h" > #include "clang/Basic/Version.h" > +#include "clang/Basic/VirtualFileSystem.h" > #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX > #include "clang/Driver/Compilation.h" > #include "clang/Driver/Driver.h" > @@ -275,7 +276,7 @@ void MachO::AddLinkRuntimeLib(const ArgL > // For now, allow missing resource libraries to support developers who > may > // not have compiler-rt checked out or integrated into their build > (unless > // we explicitly force linking with this library). > - if (AlwaysLink || llvm::sys::fs::exists(P)) > + if (AlwaysLink || getVFS().exists(P)) > CmdArgs.push_back(Args.MakeArgString(P)); > > // Adding the rpaths might negatively interact when other rpaths are > involved, > @@ -424,13 +425,13 @@ void Darwin::AddDeploymentTarget(Derived > // isysroot. > if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { > // Warn if the path does not exist. > - if (!llvm::sys::fs::exists(A->getValue())) > + if (!getVFS().exists(A->getValue())) > getDriver().Diag(clang::diag::warn_missing_sysroot) << > A->getValue(); > } else { > if (char *env = ::getenv("SDKROOT")) { > // We only use this value as the default if it is an absolute path, > // exists, and it is not the root path. > - if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) > && > + if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) && > StringRef(env) != "/") { > Args.append(Args.MakeSeparateArg( > nullptr, Opts.getOption(options::OPT_isysroot), env)); > @@ -582,10 +583,10 @@ void DarwinClang::AddCXXStdlibLibArgs(co > SmallString<128> P(A->getValue()); > llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib"); > > - if (!llvm::sys::fs::exists(P)) { > + if (!getVFS().exists(P)) { > llvm::sys::path::remove_filename(P); > llvm::sys::path::append(P, "libstdc++.6.dylib"); > - if (llvm::sys::fs::exists(P)) { > + if (getVFS().exists(P)) { > CmdArgs.push_back(Args.MakeArgString(P)); > return; > } > @@ -595,8 +596,8 @@ void DarwinClang::AddCXXStdlibLibArgs(co > // Otherwise, look in the root. > // FIXME: This should be removed someday when we don't have to care > about > // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist. > - if (!llvm::sys::fs::exists("/usr/lib/libstdc++.dylib") && > - llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib")) { > + if (!getVFS().exists("/usr/lib/libstdc++.dylib") && > + getVFS().exists("/usr/lib/libstdc++.6.dylib")) { > CmdArgs.push_back("/usr/lib/libstdc++.6.dylib"); > return; > } > @@ -626,7 +627,7 @@ void DarwinClang::AddCCKextLibArgs(const > > // For now, allow missing resource libraries to support developers who > may > // not have compiler-rt checked out or integrated into their build. > - if (llvm::sys::fs::exists(P)) > + if (getVFS().exists(P)) > CmdArgs.push_back(Args.MakeArgString(P)); > } > > @@ -1166,7 +1167,7 @@ static llvm::StringRef getGCCToolchainDi > /// necessary because the driver doesn't store the final version of the > target > /// triple. > void Generic_GCC::GCCInstallationDetector::init( > - const Driver &D, const llvm::Triple &TargetTriple, const ArgList > &Args, > + const llvm::Triple &TargetTriple, const ArgList &Args, > ArrayRef<std::string> ExtraTripleAliases) { > llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit() > ? > TargetTriple.get64BitArchVariant() > @@ -1209,11 +1210,11 @@ void Generic_GCC::GCCInstallationDetecto > // installation available. GCC installs are ranked by version number. > Version = GCCVersion::Parse("0.0.0"); > for (const std::string &Prefix : Prefixes) { > - if (!llvm::sys::fs::exists(Prefix)) > + if (!D.getVFS().exists(Prefix)) > continue; > for (StringRef Suffix : CandidateLibDirs) { > const std::string LibDir = Prefix + Suffix.str(); > - if (!llvm::sys::fs::exists(LibDir)) > + if (!D.getVFS().exists(LibDir)) > continue; > for (StringRef Candidate : ExtraTripleAliases) // Try these first. > ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate); > @@ -1222,7 +1223,7 @@ void Generic_GCC::GCCInstallationDetecto > } > for (StringRef Suffix : CandidateBiarchLibDirs) { > const std::string LibDir = Prefix + Suffix.str(); > - if (!llvm::sys::fs::exists(LibDir)) > + if (!D.getVFS().exists(LibDir)) > continue; > for (StringRef Candidate : CandidateBiarchTripleAliases) > ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate, > @@ -1480,10 +1481,8 @@ bool Generic_GCC::GCCInstallationDetecto > // \brief -- try common CUDA installation paths looking for files we need > for > // CUDA compilation. > > -void > -Generic_GCC::CudaInstallationDetector::init(const Driver &D, > - const llvm::Triple > &TargetTriple, > - const llvm::opt::ArgList > &Args) { > +void Generic_GCC::CudaInstallationDetector::init( > + const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) { > SmallVector<std::string, 4> CudaPathCandidates; > > if (Args.hasArg(options::OPT_cuda_path_EQ)) > @@ -1495,7 +1494,7 @@ Generic_GCC::CudaInstallationDetector::i > } > > for (const auto &CudaPath : CudaPathCandidates) { > - if (CudaPath.empty() || !llvm::sys::fs::exists(CudaPath)) > + if (CudaPath.empty() || !D.getVFS().exists(CudaPath)) > continue; > > CudaInstallPath = CudaPath; > @@ -1504,9 +1503,9 @@ Generic_GCC::CudaInstallationDetector::i > CudaLibPath = > CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : > "/lib"); > > - if (!(llvm::sys::fs::exists(CudaIncludePath) && > - llvm::sys::fs::exists(CudaLibPath) && > - llvm::sys::fs::exists(CudaLibDevicePath))) > + if (!(D.getVFS().exists(CudaIncludePath) && > + D.getVFS().exists(CudaLibPath) && > + D.getVFS().exists(CudaLibDevicePath))) > continue; > > IsValid = true; > @@ -1967,13 +1966,13 @@ void Generic_GCC::GCCInstallationDetecto > // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, > so we > // need to iterate twice. > std::error_code EC; > - for (llvm::sys::fs::directory_iterator LI(LibDir, EC), LE; !EC && LI != > LE; > - LI = LI.increment(EC)) { > - StringRef VersionText = llvm::sys::path::filename(LI->path()); > + for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE; > + !EC && LI != LE; LI = LI.increment(EC)) { > + StringRef VersionText = llvm::sys::path::filename(LI->getName()); > GCCVersion CandidateVersion = GCCVersion::Parse(VersionText); > > if (CandidateVersion.Major != -1) // Filter obviously bad entries. > - if (!CandidateGCCInstallPaths.insert(LI->path()).second) > + if (!CandidateGCCInstallPaths.insert(LI->getName()).second) > continue; // Saw this path before; no need to look at it again. > if (CandidateVersion.isOlderThan(4, 1, 1)) > continue; > @@ -1982,16 +1981,18 @@ void Generic_GCC::GCCInstallationDetecto > > GCCInstallPath = > LibDir + "/" + VersionText.str() + "/lib/gcc/" + > CandidateTriple.str(); > - if (!llvm::sys::fs::exists(GCCInstallPath)) > + if (!D.getVFS().exists(GCCInstallPath)) > continue; > > // If we make it here there has to be at least one GCC version, let's > just > // use the latest one. > std::error_code EEC; > - for (llvm::sys::fs::directory_iterator LLI(GCCInstallPath, EEC), LLE; > + for (vfs::directory_iterator > + LLI = D.getVFS().dir_begin(GCCInstallPath, EEC), > + LLE; > !EEC && LLI != LLE; LLI = LLI.increment(EEC)) { > > - StringRef SubVersionText = llvm::sys::path::filename(LLI->path()); > + StringRef SubVersionText = > llvm::sys::path::filename(LLI->getName()); > GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText); > > if (CandidateSubVersion > Version) > @@ -2048,12 +2049,14 @@ void Generic_GCC::GCCInstallationDetecto > for (unsigned i = 0; i < NumLibSuffixes; ++i) { > StringRef LibSuffix = LibAndInstallSuffixes[i][0]; > std::error_code EC; > - for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE; > + for (vfs::directory_iterator > + LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC), > + LE; > !EC && LI != LE; LI = LI.increment(EC)) { > - StringRef VersionText = llvm::sys::path::filename(LI->path()); > + StringRef VersionText = llvm::sys::path::filename(LI->getName()); > GCCVersion CandidateVersion = GCCVersion::Parse(VersionText); > if (CandidateVersion.Major != -1) // Filter obviously bad entries. > - if (!CandidateGCCInstallPaths.insert(LI->path()).second) > + if (!CandidateGCCInstallPaths.insert(LI->getName()).second) > continue; // Saw this path before; no need to look at it again. > if (CandidateVersion.isOlderThan(4, 1, 1)) > continue; > @@ -2065,9 +2068,9 @@ void Generic_GCC::GCCInstallationDetecto > // Debian mips multilibs behave more like the rest of the biarch > ones, > // so handle them there > if (isMipsArch(TargetArch)) { > - if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected)) > + if (!findMIPSMultilibs(TargetTriple, LI->getName(), Args, > Detected)) > continue; > - } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args, > + } else if (!findBiarchMultilibs(TargetTriple, LI->getName(), Args, > NeedsBiarchSuffix, Detected)) { > continue; > } > @@ -2090,7 +2093,7 @@ void Generic_GCC::GCCInstallationDetecto > > Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple, > const ArgList &Args) > - : ToolChain(D, Triple, Args), GCCInstallation(), CudaInstallation() { > + : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) > { > getProgramPaths().push_back(getDriver().getInstalledDir()); > if (getDriver().getInstalledDir() != getDriver().Dir) > getProgramPaths().push_back(getDriver().Dir); > @@ -2183,7 +2186,7 @@ void Generic_ELF::addClangTargetOptions( > /// Hexagon Toolchain > > std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir, > - const ArgList &Args) { > + const ArgList &Args) const { > // Locate the rest of the toolchain ... > std::string GccToolchain = getGCCToolchainDir(Args); > > @@ -2191,11 +2194,11 @@ std::string HexagonToolChain::GetGnuDir( > return GccToolchain; > > std::string InstallRelDir = InstalledDir + "/../../gnu"; > - if (llvm::sys::fs::exists(InstallRelDir)) > + if (getVFS().exists(InstallRelDir)) > return InstallRelDir; > > std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu"; > - if (llvm::sys::fs::exists(PrefixRelDir)) > + if (getVFS().exists(PrefixRelDir)) > return PrefixRelDir; > > return InstallRelDir; > @@ -2221,7 +2224,8 @@ bool HexagonToolChain::UsesG0(const char > return smallDataThreshold && smallDataThreshold[0] == '0'; > } > > -static void GetHexagonLibraryPaths(const ArgList &Args, const std::string > &Ver, > +static void GetHexagonLibraryPaths(const HexagonToolChain &TC, > + const ArgList &Args, const std::string > &Ver, > const std::string &MarchString, > const std::string &InstalledDir, > ToolChain::path_list *LibPaths) { > @@ -2240,8 +2244,7 @@ static void GetHexagonLibraryPaths(const > const std::string MarchSuffix = "/" + MarchString; > const std::string G0Suffix = "/G0"; > const std::string MarchG0Suffix = MarchSuffix + G0Suffix; > - const std::string RootDir = > - HexagonToolChain::GetGnuDir(InstalledDir, Args) + "/"; > + const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/"; > > // lib/gcc/hexagon/... > std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/"; > @@ -2269,21 +2272,21 @@ HexagonToolChain::HexagonToolChain(const > const ArgList &Args) > : Linux(D, Triple, Args) { > const std::string InstalledDir(getDriver().getInstalledDir()); > - const std::string GnuDir = HexagonToolChain::GetGnuDir(InstalledDir, > Args); > + const std::string GnuDir = GetGnuDir(InstalledDir, Args); > > // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir > to > // program paths > const std::string BinDir(GnuDir + "/bin"); > - if (llvm::sys::fs::exists(BinDir)) > + if (D.getVFS().exists(BinDir)) > getProgramPaths().push_back(BinDir); > > // Determine version of GCC libraries and headers to use. > const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon"); > std::error_code ec; > GCCVersion MaxVersion = GCCVersion::Parse("0.0.0"); > - for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de; > + for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), > de; > !ec && di != de; di = di.increment(ec)) { > - GCCVersion cv = > GCCVersion::Parse(llvm::sys::path::filename(di->path())); > + GCCVersion cv = > GCCVersion::Parse(llvm::sys::path::filename(di->getName())); > if (MaxVersion < cv) > MaxVersion = cv; > } > @@ -2296,8 +2299,8 @@ HexagonToolChain::HexagonToolChain(const > // support 'linux' we'll need to fix this up > LibPaths->clear(); > > - GetHexagonLibraryPaths(Args, GetGCCLibAndIncVersion(), > GetTargetCPU(Args), > - InstalledDir, LibPaths); > + GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(), > + GetTargetCPU(Args), InstalledDir, LibPaths); > } > > HexagonToolChain::~HexagonToolChain() {} > @@ -2319,7 +2322,7 @@ void HexagonToolChain::AddClangSystemInc > return; > > std::string Ver(GetGCCLibAndIncVersion()); > - std::string GnuDir = HexagonToolChain::GetGnuDir(D.InstalledDir, > DriverArgs); > + std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs); > std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver); > addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include"); > addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + > "/include-fixed"); > @@ -2334,8 +2337,7 @@ void HexagonToolChain::AddClangCXXStdlib > > const Driver &D = getDriver(); > std::string Ver(GetGCCLibAndIncVersion()); > - SmallString<128> IncludeDir( > - HexagonToolChain::GetGnuDir(D.InstalledDir, DriverArgs)); > + SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs)); > > llvm::sys::path::append(IncludeDir, "hexagon/include/c++/"); > llvm::sys::path::append(IncludeDir, Ver); > @@ -2742,7 +2744,7 @@ FreeBSD::FreeBSD(const Driver &D, const > // back to '/usr/lib' if it doesn't exist. > if ((Triple.getArch() == llvm::Triple::x86 || > Triple.getArch() == llvm::Triple::ppc) && > - llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o")) > + D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o")) > getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32"); > else > getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); > @@ -2952,8 +2954,9 @@ Tool *Minix::buildAssembler() const { > > Tool *Minix::buildLinker() const { return new > tools::minix::Linker(*this); } > > -static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) { > - if (llvm::sys::fs::exists(Path)) > +static void addPathIfExists(const Driver &D, const Twine &Path, > + ToolChain::path_list &Paths) { > + if (D.getVFS().exists(Path)) > Paths.push_back(Path.str()); > } > > @@ -2963,17 +2966,17 @@ Solaris::Solaris(const Driver &D, const > const ArgList &Args) > : Generic_GCC(D, Triple, Args) { > > - GCCInstallation.init(D, Triple, Args); > + GCCInstallation.init(Triple, Args); > > path_list &Paths = getFilePaths(); > if (GCCInstallation.isValid()) > - addPathIfExists(GCCInstallation.getInstallPath(), Paths); > + addPathIfExists(D, GCCInstallation.getInstallPath(), Paths); > > - addPathIfExists(getDriver().getInstalledDir(), Paths); > + addPathIfExists(D, getDriver().getInstalledDir(), Paths); > if (getDriver().getInstalledDir() != getDriver().Dir) > - addPathIfExists(getDriver().Dir, Paths); > + addPathIfExists(D, getDriver().Dir, Paths); > > - addPathIfExists(getDriver().SysRoot + getDriver().Dir + "/../lib", > Paths); > + addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", > Paths); > > std::string LibPath = "/usr/lib/"; > switch (Triple.getArch()) { > @@ -2990,7 +2993,7 @@ Solaris::Solaris(const Driver &D, const > llvm_unreachable("Unsupported architecture"); > } > > - addPathIfExists(getDriver().SysRoot + LibPath, Paths); > + addPathIfExists(D, getDriver().SysRoot + LibPath, Paths); > } > > Tool *Solaris::buildAssembler() const { > @@ -3076,7 +3079,7 @@ static bool IsUbuntu(enum Distro Distro) > return Distro >= UbuntuHardy && Distro <= UbuntuWily; > } > > -static Distro DetectDistro(llvm::Triple::ArchType Arch) { > +static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) { > llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File = > llvm::MemoryBuffer::getFile("/etc/lsb-release"); > if (File) { > @@ -3142,13 +3145,13 @@ static Distro DetectDistro(llvm::Triple: > return UnknownDistro; > } > > - if (llvm::sys::fs::exists("/etc/SuSE-release")) > + if (D.getVFS().exists("/etc/SuSE-release")) > return OpenSUSE; > > - if (llvm::sys::fs::exists("/etc/exherbo-release")) > + if (D.getVFS().exists("/etc/exherbo-release")) > return Exherbo; > > - if (llvm::sys::fs::exists("/etc/arch-release")) > + if (D.getVFS().exists("/etc/arch-release")) > return ArchLinux; > > return UnknownDistro; > @@ -3160,7 +3163,8 @@ static Distro DetectDistro(llvm::Triple: > /// a target-triple directory in the library and header search paths. > /// Unfortunately, this triple does not align with the vanilla target > triple, > /// so we provide a rough mapping here. > -static std::string getMultiarchTriple(const llvm::Triple &TargetTriple, > +static std::string getMultiarchTriple(const Driver &D, > + const llvm::Triple &TargetTriple, > StringRef SysRoot) { > llvm::Triple::EnvironmentType TargetEnvironment = > TargetTriple.getEnvironment(); > > @@ -3177,85 +3181,85 @@ static std::string getMultiarchTriple(co > case llvm::Triple::arm: > case llvm::Triple::thumb: > if (TargetEnvironment == llvm::Triple::GNUEABIHF) { > - if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf")) > + if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf")) > return "arm-linux-gnueabihf"; > } else { > - if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi")) > + if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi")) > return "arm-linux-gnueabi"; > } > break; > case llvm::Triple::armeb: > case llvm::Triple::thumbeb: > if (TargetEnvironment == llvm::Triple::GNUEABIHF) { > - if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf")) > + if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf")) > return "armeb-linux-gnueabihf"; > } else { > - if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi")) > + if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi")) > return "armeb-linux-gnueabi"; > } > break; > case llvm::Triple::x86: > - if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu")) > return "i386-linux-gnu"; > break; > case llvm::Triple::x86_64: > // We don't want this for x32, otherwise it will match x86_64 libs > if (TargetEnvironment != llvm::Triple::GNUX32 && > - llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu")) > + D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu")) > return "x86_64-linux-gnu"; > break; > case llvm::Triple::aarch64: > - if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu")) > return "aarch64-linux-gnu"; > break; > case llvm::Triple::aarch64_be: > - if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu")) > return "aarch64_be-linux-gnu"; > break; > case llvm::Triple::mips: > - if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu")) > return "mips-linux-gnu"; > break; > case llvm::Triple::mipsel: > - if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu")) > return "mipsel-linux-gnu"; > break; > case llvm::Triple::mips64: > - if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu")) > return "mips64-linux-gnu"; > - if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64")) > + if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64")) > return "mips64-linux-gnuabi64"; > break; > case llvm::Triple::mips64el: > - if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu")) > return "mips64el-linux-gnu"; > - if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64")) > + if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64")) > return "mips64el-linux-gnuabi64"; > break; > case llvm::Triple::ppc: > - if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe")) > + if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe")) > return "powerpc-linux-gnuspe"; > - if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu")) > return "powerpc-linux-gnu"; > break; > case llvm::Triple::ppc64: > - if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu")) > return "powerpc64-linux-gnu"; > break; > case llvm::Triple::ppc64le: > - if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu")) > return "powerpc64le-linux-gnu"; > break; > case llvm::Triple::sparc: > - if (llvm::sys::fs::exists(SysRoot + "/lib/sparc-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu")) > return "sparc-linux-gnu"; > break; > case llvm::Triple::sparcv9: > - if (llvm::sys::fs::exists(SysRoot + "/lib/sparc64-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu")) > return "sparc64-linux-gnu"; > break; > case llvm::Triple::systemz: > - if (llvm::sys::fs::exists(SysRoot + "/lib/s390x-linux-gnu")) > + if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu")) > return "s390x-linux-gnu"; > break; > } > @@ -3294,8 +3298,8 @@ static StringRef getOSLibDir(const llvm: > > Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList > &Args) > : Generic_ELF(D, Triple, Args) { > - GCCInstallation.init(D, Triple, Args); > - CudaInstallation.init(D, Triple, Args); > + GCCInstallation.init(Triple, Args); > + CudaInstallation.init(Triple, Args); > Multilibs = GCCInstallation.getMultilibs(); > llvm::Triple::ArchType Arch = Triple.getArch(); > std::string SysRoot = computeSysRoot(); > @@ -3315,7 +3319,7 @@ Linux::Linux(const Driver &D, const llvm > > Linker = GetLinkerPath(); > > - Distro Distro = DetectDistro(Arch); > + Distro Distro = DetectDistro(D, Arch); > > if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) { > ExtraOpts.push_back("-z"); > @@ -3365,7 +3369,7 @@ Linux::Linux(const Driver &D, const llvm > path_list &Paths = getFilePaths(); > > const std::string OSLibDir = getOSLibDir(Triple, Args); > - const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot); > + const std::string MultiarchTriple = getMultiarchTriple(D, Triple, > SysRoot); > > // Add the multilib suffixed paths where they are available. > if (GCCInstallation.isValid()) { > @@ -3375,7 +3379,7 @@ Linux::Linux(const Driver &D, const llvm > > // Sourcery CodeBench MIPS toolchain holds some libraries under > // a biarch-like suffix of the GCC installation. > - addPathIfExists((GCCInstallation.getInstallPath() + > Multilib.gccSuffix()), > + addPathIfExists(D, GCCInstallation.getInstallPath() + > Multilib.gccSuffix(), > Paths); > > // GCC cross compiling toolchains will install target libraries which > ship > @@ -3396,8 +3400,8 @@ Linux::Linux(const Driver &D, const llvm > // > // Note that this matches the GCC behavior. See the below comment for > where > // Clang diverges from GCC's behavior. > - addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + > OSLibDir + > - Multilib.osSuffix(), > + addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" + > + OSLibDir + Multilib.osSuffix(), > Paths); > > // If the GCC installation we found is inside of the sysroot, we want > to > @@ -3410,8 +3414,8 @@ Linux::Linux(const Driver &D, const llvm > // configurations but this seems somewhere between questionable and > simply > // a bug. > if (StringRef(LibPath).startswith(SysRoot)) { > - addPathIfExists(LibPath + "/" + MultiarchTriple, Paths); > - addPathIfExists(LibPath + "/../" + OSLibDir, Paths); > + addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths); > + addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths); > } > } > > @@ -3421,27 +3425,29 @@ Linux::Linux(const Driver &D, const llvm > // FIXME: It's not clear whether we should use the driver's installed > // directory ('Dir' below) or the ResourceDir. > if (StringRef(D.Dir).startswith(SysRoot)) { > - addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths); > - addPathIfExists(D.Dir + "/../" + OSLibDir, Paths); > + addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths); > + addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths); > } > > - addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths); > - addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths); > - addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths); > - addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths); > + addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths); > + addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths); > + addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths); > + addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths); > > // Try walking via the GCC triple path in case of biarch or multiarch > GCC > // installations with strange symlinks. > if (GCCInstallation.isValid()) { > - addPathIfExists(SysRoot + "/usr/lib/" + > GCCInstallation.getTriple().str() + > + addPathIfExists(D, > + SysRoot + "/usr/lib/" + > GCCInstallation.getTriple().str() + > "/../../" + OSLibDir, > Paths); > > // Add the 'other' biarch variant path > Multilib BiarchSibling; > if (GCCInstallation.getBiarchSibling(BiarchSibling)) { > - addPathIfExists( > - GCCInstallation.getInstallPath() + BiarchSibling.gccSuffix(), > Paths); > + addPathIfExists(D, GCCInstallation.getInstallPath() + > + BiarchSibling.gccSuffix(), > + Paths); > } > > // See comments above on the multilib variant for details of why this > is > @@ -3449,14 +3455,14 @@ Linux::Linux(const Driver &D, const llvm > const std::string &LibPath = GCCInstallation.getParentLibPath(); > const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); > const Multilib &Multilib = GCCInstallation.getMultilib(); > - addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib" + > - Multilib.osSuffix(), > + addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" + > + Multilib.osSuffix(), > Paths); > > // See comments above on the multilib variant for details of why this > is > // only included from within the sysroot. > if (StringRef(LibPath).startswith(SysRoot)) > - addPathIfExists(LibPath, Paths); > + addPathIfExists(D, LibPath, Paths); > } > > // Similar to the logic for GCC above, if we are currently running Clang > @@ -3465,10 +3471,10 @@ Linux::Linux(const Driver &D, const llvm > // FIXME: It's not clear whether we should use the driver's installed > // directory ('Dir' below) or the ResourceDir. > if (StringRef(D.Dir).startswith(SysRoot)) > - addPathIfExists(D.Dir + "/../lib", Paths); > + addPathIfExists(D, D.Dir + "/../lib", Paths); > > - addPathIfExists(SysRoot + "/lib", Paths); > - addPathIfExists(SysRoot + "/usr/lib", Paths); > + addPathIfExists(D, SysRoot + "/lib", Paths); > + addPathIfExists(D, SysRoot + "/usr/lib", Paths); > } > > bool Linux::HasNativeLLVMSupport() const { return true; } > @@ -3498,12 +3504,12 @@ std::string Linux::computeSysRoot() cons > (InstallDir + "/../../../../" + TripleStr + "/libc" + > Multilib.osSuffix()) > .str(); > > - if (llvm::sys::fs::exists(Path)) > + if (getVFS().exists(Path)) > return Path; > > Path = (InstallDir + "/../../../../sysroot" + > Multilib.osSuffix()).str(); > > - if (llvm::sys::fs::exists(Path)) > + if (getVFS().exists(Path)) > return Path; > > return std::string(); > @@ -3651,7 +3657,7 @@ void Linux::AddClangSystemIncludeArgs(co > break; > } > for (StringRef Dir : MultiarchIncludeDirs) { > - if (llvm::sys::fs::exists(SysRoot + Dir)) { > + if (D.getVFS().exists(SysRoot + Dir)) { > addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir); > break; > } > @@ -3669,11 +3675,11 @@ void Linux::AddClangSystemIncludeArgs(co > } > > /// \brief Helper to add the variant paths of a libstdc++ installation. > -/*static*/ bool Linux::addLibStdCXXIncludePaths( > +bool Linux::addLibStdCXXIncludePaths( > Twine Base, Twine Suffix, StringRef GCCTriple, StringRef > GCCMultiarchTriple, > StringRef TargetMultiarchTriple, Twine IncludeSuffix, > - const ArgList &DriverArgs, ArgStringList &CC1Args) { > - if (!llvm::sys::fs::exists(Base + Suffix)) > + const ArgList &DriverArgs, ArgStringList &CC1Args) const { > + if (!getVFS().exists(Base + Suffix)) > return false; > > addSystemInclude(DriverArgs, CC1Args, Base + Suffix); > @@ -3682,7 +3688,7 @@ void Linux::AddClangSystemIncludeArgs(co > // that path exists or we have neither a GCC nor target multiarch > triple, use > // this vanilla search path. > if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) || > - llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + > IncludeSuffix)) { > + getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) { > addSystemInclude(DriverArgs, CC1Args, > Base + Suffix + "/" + GCCTriple + IncludeSuffix); > } else { > @@ -3720,7 +3726,7 @@ void Linux::AddClangCXXStdlibIncludeArgs > // FIXME: We should really remove this. It doesn't make any sense. > getDriver().SysRoot + "/usr/include/c++/v1"}; > for (const auto &IncludePath : LibCXXIncludePathCandidates) { > - if (!llvm::sys::fs::exists(IncludePath)) > + if (!getVFS().exists(IncludePath)) > continue; > // Add the first candidate that exists. > addSystemInclude(DriverArgs, CC1Args, IncludePath); > @@ -3741,10 +3747,10 @@ void Linux::AddClangCXXStdlibIncludeArgs > StringRef InstallDir = GCCInstallation.getInstallPath(); > StringRef TripleStr = GCCInstallation.getTriple().str(); > const Multilib &Multilib = GCCInstallation.getMultilib(); > - const std::string GCCMultiarchTriple = > - getMultiarchTriple(GCCInstallation.getTriple(), > getDriver().SysRoot); > + const std::string GCCMultiarchTriple = getMultiarchTriple( > + getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot); > const std::string TargetMultiarchTriple = > - getMultiarchTriple(getTriple(), getDriver().SysRoot); > + getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot); > const GCCVersion &Version = GCCInstallation.getVersion(); > > // The primary search for libstdc++ supports multiarch variants. > @@ -3821,7 +3827,7 @@ DragonFly::DragonFly(const Driver &D, co > > getFilePaths().push_back(getDriver().Dir + "/../lib"); > getFilePaths().push_back("/usr/lib"); > - if (llvm::sys::fs::exists("/usr/lib/gcc47")) > + if (D.getVFS().exists("/usr/lib/gcc47")) > getFilePaths().push_back("/usr/lib/gcc47"); > else > getFilePaths().push_back("/usr/lib/gcc44"); > @@ -3973,7 +3979,7 @@ MyriadToolChain::MyriadToolChain(const D > case llvm::Triple::sparc: > case llvm::Triple::sparcel: > case llvm::Triple::shave: > - GCCInstallation.init(D, Triple, Args, {"sparc-myriad-elf"}); > + GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"}); > } > } > > > Modified: cfe/trunk/lib/Driver/ToolChains.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/lib/Driver/ToolChains.h (original) > +++ cfe/trunk/lib/Driver/ToolChains.h Wed Oct 7 10:48:01 2015 > @@ -78,6 +78,7 @@ public: > class GCCInstallationDetector { > bool IsValid; > llvm::Triple GCCTriple; > + const Driver &D; > > // FIXME: These might be better as path objects. > std::string GCCInstallPath; > @@ -99,9 +100,8 @@ public: > MultilibSet Multilibs; > > public: > - GCCInstallationDetector() : IsValid(false) {} > - void init(const Driver &D, const llvm::Triple &TargetTriple, > - const llvm::opt::ArgList &Args, > + explicit GCCInstallationDetector(const Driver &D) : IsValid(false), > D(D) {} > + void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList > &Args, > ArrayRef<std::string> ExtraTripleAliases = None); > > /// \brief Check whether we detected a valid GCC install. > @@ -161,15 +161,15 @@ protected: > > class CudaInstallationDetector { > bool IsValid; > + const Driver &D; > std::string CudaInstallPath; > std::string CudaLibPath; > std::string CudaLibDevicePath; > std::string CudaIncludePath; > > public: > - CudaInstallationDetector() : IsValid(false) {} > - void init(const Driver &D, const llvm::Triple &TargetTriple, > - const llvm::opt::ArgList &Args); > + CudaInstallationDetector(const Driver &D) : IsValid(false), D(D) {} > + void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList > &Args); > > /// \brief Check whether we detected a valid Cuda install. > bool isValid() const { return IsValid; } > @@ -733,13 +733,12 @@ protected: > Tool *buildLinker() const override; > > private: > - static bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, > - StringRef GCCTriple, > - StringRef GCCMultiarchTriple, > - StringRef TargetMultiarchTriple, > - Twine IncludeSuffix, > - const llvm::opt::ArgList > &DriverArgs, > - llvm::opt::ArgStringList &CC1Args); > + bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, StringRef > GCCTriple, > + StringRef GCCMultiarchTriple, > + StringRef TargetMultiarchTriple, > + Twine IncludeSuffix, > + const llvm::opt::ArgList &DriverArgs, > + llvm::opt::ArgStringList &CC1Args) const; > > std::string computeSysRoot() const; > }; > @@ -777,8 +776,8 @@ public: > > StringRef GetGCCLibAndIncVersion() const { return > GCCLibAndIncVersion.Text; } > > - static std::string GetGnuDir(const std::string &InstalledDir, > - const llvm::opt::ArgList &Args); > + std::string GetGnuDir(const std::string &InstalledDir, > + const llvm::opt::ArgList &Args) const; > > static StringRef GetTargetCPU(const llvm::opt::ArgList &Args); > > > Modified: cfe/trunk/lib/Driver/Tools.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/lib/Driver/Tools.cpp (original) > +++ cfe/trunk/lib/Driver/Tools.cpp Wed Oct 7 10:48:01 2015 > @@ -5955,8 +5955,7 @@ constructHexagonLinkArgs(Compilation &C, > const std::string MarchSuffix = "/" + MarchString; > const std::string G0Suffix = "/G0"; > const std::string MarchG0Suffix = MarchSuffix + G0Suffix; > - const std::string RootDir = > - toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/"; > + const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + > "/"; > const std::string StartFilesDir = > RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix); > > > Modified: cfe/trunk/unittests/Driver/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Driver/CMakeLists.txt?rev=249556&r1=249555&r2=249556&view=diff > > ============================================================================== > --- cfe/trunk/unittests/Driver/CMakeLists.txt (original) > +++ cfe/trunk/unittests/Driver/CMakeLists.txt Wed Oct 7 10:48:01 2015 > @@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS > ) > > add_clang_unittest(ClangDriverTests > + ToolChainTest.cpp > MultilibTest.cpp > ) > > > Added: cfe/trunk/unittests/Driver/ToolChainTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Driver/ToolChainTest.cpp?rev=249556&view=auto > > ============================================================================== > --- cfe/trunk/unittests/Driver/ToolChainTest.cpp (added) > +++ cfe/trunk/unittests/Driver/ToolChainTest.cpp Wed Oct 7 10:48:01 2015 > @@ -0,0 +1,74 @@ > +//===- unittests/Driver/ToolChainTest.cpp --- ToolChain tests > -------------===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > > +//===----------------------------------------------------------------------===// > +// > +// Unit tests for ToolChains. > +// > > +//===----------------------------------------------------------------------===// > + > +#include "clang/Driver/ToolChain.h" > +#include "clang/Basic/DiagnosticIDs.h" > +#include "clang/Basic/DiagnosticOptions.h" > +#include "clang/Basic/LLVM.h" > +#include "clang/Basic/VirtualFileSystem.h" > +#include "clang/Driver/Compilation.h" > +#include "clang/Driver/Driver.h" > +#include "llvm/Support/raw_ostream.h" > +#include "gtest/gtest.h" > +using namespace clang; > +using namespace clang::driver; > + > +namespace { > + > +TEST(ToolChainTest, VFSGCCInstallation) { > + IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new > DiagnosticOptions(); > + > + IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); > + struct TestDiagnosticConsumer : public DiagnosticConsumer {}; > + DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer); > + IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem( > + new vfs::InMemoryFileSystem); > + Driver TheDriver("/usr/bin/clang", "arm-linux-gnueabihf", Diags, > + InMemoryFileSystem); > + > + const char *EmptyFiles[] = { > + "foo.cpp", > + "/usr/bin/clang", > + "/usr/lib/gcc/arm-linux-gnueabi/4.6.1/crtbegin.o", > + "/usr/lib/gcc/arm-linux-gnueabi/4.6.1/crtend.o", > + "/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/crtbegin.o", > + "/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/crtend.o", > + "/usr/lib/arm-linux-gnueabi/crt1.o", > + "/usr/lib/arm-linux-gnueabi/crti.o", > + "/usr/lib/arm-linux-gnueabi/crtn.o", > + "/usr/lib/arm-linux-gnueabihf/crt1.o", > + "/usr/lib/arm-linux-gnueabihf/crti.o", > + "/usr/lib/arm-linux-gnueabihf/crtn.o", > + "/usr/include/arm-linux-gnueabi/.keep", > + "/usr/include/arm-linux-gnueabihf/.keep", > + "/lib/arm-linux-gnueabi/.keep", > + "/lib/arm-linux-gnueabihf/.keep"}; > + > + for (const char *Path : EmptyFiles) > + InMemoryFileSystem->addFile(Path, 0, > + llvm::MemoryBuffer::getMemBuffer("\n")); > + > + std::unique_ptr<Compilation> C( > + TheDriver.BuildCompilation({"-fsyntax-only", "foo.cpp"})); > + > + std::string S; > + { > + llvm::raw_string_ostream OS(S); > + C->getDefaultToolChain().printVerboseInfo(OS); > + } > + EXPECT_EQ("Found candidate GCC installation: " > + "/usr/lib/gcc/arm-linux-gnueabihf/4.6.3\n", > + S); > +} > + > +} // end anonymous namespace > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
From aff96cf49f965b18b00c04dad3318e9aa663376f Mon Sep 17 00:00:00 2001 From: Jan Vesely <jan.ves...@amd.com> Date: Wed, 7 Oct 2015 14:41:21 -0500 Subject: [PATCH] [Driver] link with clangBasic fixes cmake build failure --- unittests/Driver/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/unittests/Driver/CMakeLists.txt b/unittests/Driver/CMakeLists.txt index acd0b76..2df1eb2 100644 --- a/unittests/Driver/CMakeLists.txt +++ b/unittests/Driver/CMakeLists.txt @@ -9,4 +9,5 @@ add_clang_unittest(ClangDriverTests target_link_libraries(ClangDriverTests clangDriver + clangBasic ) -- 2.4.3
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits