10b57cec5SDimitry Andric //===--- Gnu.h - Gnu Tool and ToolChain Implementations ---------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_GNU_H 100b57cec5SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_GNU_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "Cuda.h" 13*5ffd83dbSDimitry Andric #include "ROCm.h" 140b57cec5SDimitry Andric #include "clang/Driver/Tool.h" 150b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h" 160b57cec5SDimitry Andric #include <set> 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric namespace clang { 190b57cec5SDimitry Andric namespace driver { 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric struct DetectedMultilibs { 220b57cec5SDimitry Andric /// The set of multilibs that the detected installation supports. 230b57cec5SDimitry Andric MultilibSet Multilibs; 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric /// The primary multilib appropriate for the given flags. 260b57cec5SDimitry Andric Multilib SelectedMultilib; 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric /// On Biarch systems, this corresponds to the default multilib when 290b57cec5SDimitry Andric /// targeting the non-default multilib. Otherwise, it is empty. 300b57cec5SDimitry Andric llvm::Optional<Multilib> BiarchSibling; 310b57cec5SDimitry Andric }; 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple, 340b57cec5SDimitry Andric StringRef Path, const llvm::opt::ArgList &Args, 350b57cec5SDimitry Andric DetectedMultilibs &Result); 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric namespace tools { 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric /// Directly call GNU Binutils' assembler and linker. 400b57cec5SDimitry Andric namespace gnutools { 41*5ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 420b57cec5SDimitry Andric public: 43*5ffd83dbSDimitry Andric Assembler(const ToolChain &TC) : Tool("GNU::Assembler", "assembler", TC) {} 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 480b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 490b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 500b57cec5SDimitry Andric const char *LinkingOutput) const override; 510b57cec5SDimitry Andric }; 520b57cec5SDimitry Andric 53*5ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 540b57cec5SDimitry Andric public: 55*5ffd83dbSDimitry Andric Linker(const ToolChain &TC) : Tool("GNU::Linker", "linker", TC) {} 56*5ffd83dbSDimitry Andric 57*5ffd83dbSDimitry Andric bool hasIntegratedCPP() const override { return false; } 58*5ffd83dbSDimitry Andric bool isLinkJob() const override { return true; } 59*5ffd83dbSDimitry Andric 60*5ffd83dbSDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 61*5ffd83dbSDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 62*5ffd83dbSDimitry Andric const llvm::opt::ArgList &TCArgs, 63*5ffd83dbSDimitry Andric const char *LinkingOutput) const override; 64*5ffd83dbSDimitry Andric }; 65*5ffd83dbSDimitry Andric 66*5ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY StaticLibTool : public Tool { 67*5ffd83dbSDimitry Andric public: 68*5ffd83dbSDimitry Andric StaticLibTool(const ToolChain &TC) 69*5ffd83dbSDimitry Andric : Tool("GNU::StaticLibTool", "static-lib-linker", TC) {} 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 720b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 750b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 760b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 770b57cec5SDimitry Andric const char *LinkingOutput) const override; 780b57cec5SDimitry Andric }; 790b57cec5SDimitry Andric } // end namespace gnutools 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric /// gcc - Generic GCC tool implementations. 820b57cec5SDimitry Andric namespace gcc { 83*5ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY Common : public Tool { 840b57cec5SDimitry Andric public: 850b57cec5SDimitry Andric Common(const char *Name, const char *ShortName, const ToolChain &TC) 86*5ffd83dbSDimitry Andric : Tool(Name, ShortName, TC) {} 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric // A gcc tool has an "integrated" assembler that it will call to produce an 890b57cec5SDimitry Andric // object. Let it use that assembler so that we don't have to deal with 900b57cec5SDimitry Andric // assembly syntax incompatibilities. 910b57cec5SDimitry Andric bool hasIntegratedAssembler() const override { return true; } 920b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 930b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 940b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 950b57cec5SDimitry Andric const char *LinkingOutput) const override; 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric /// RenderExtraToolArgs - Render any arguments necessary to force 980b57cec5SDimitry Andric /// the particular tool mode. 990b57cec5SDimitry Andric virtual void RenderExtraToolArgs(const JobAction &JA, 1000b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const = 0; 1010b57cec5SDimitry Andric }; 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common { 1040b57cec5SDimitry Andric public: 1050b57cec5SDimitry Andric Preprocessor(const ToolChain &TC) 1060b57cec5SDimitry Andric : Common("gcc::Preprocessor", "gcc preprocessor", TC) {} 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric bool hasGoodDiagnostics() const override { return true; } 1090b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 1120b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 1130b57cec5SDimitry Andric }; 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Compiler : public Common { 1160b57cec5SDimitry Andric public: 1170b57cec5SDimitry Andric Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {} 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric bool hasGoodDiagnostics() const override { return true; } 1200b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return true; } 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 1230b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 1240b57cec5SDimitry Andric }; 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker : public Common { 1270b57cec5SDimitry Andric public: 1280b57cec5SDimitry Andric Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {} 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 1310b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 1320b57cec5SDimitry Andric 1330b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 1340b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 1350b57cec5SDimitry Andric }; 1360b57cec5SDimitry Andric } // end namespace gcc 1370b57cec5SDimitry Andric } // end namespace tools 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric namespace toolchains { 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric /// Generic_GCC - A tool chain using the 'gcc' command to perform 1420b57cec5SDimitry Andric /// all subcommands; this relies on gcc translating the majority of 1430b57cec5SDimitry Andric /// command line options. 1440b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 1450b57cec5SDimitry Andric public: 1460b57cec5SDimitry Andric /// Struct to store and manipulate GCC versions. 1470b57cec5SDimitry Andric /// 1480b57cec5SDimitry Andric /// We rely on assumptions about the form and structure of GCC version 1490b57cec5SDimitry Andric /// numbers: they consist of at most three '.'-separated components, and each 1500b57cec5SDimitry Andric /// component is a non-negative integer except for the last component. For 1510b57cec5SDimitry Andric /// the last component we are very flexible in order to tolerate release 1520b57cec5SDimitry Andric /// candidates or 'x' wildcards. 1530b57cec5SDimitry Andric /// 1540b57cec5SDimitry Andric /// Note that the ordering established among GCCVersions is based on the 1550b57cec5SDimitry Andric /// preferred version string to use. For example we prefer versions without 1560b57cec5SDimitry Andric /// a hard-coded patch number to those with a hard coded patch number. 1570b57cec5SDimitry Andric /// 1580b57cec5SDimitry Andric /// Currently this doesn't provide any logic for textual suffixes to patches 1590b57cec5SDimitry Andric /// in the way that (for example) Debian's version format does. If that ever 1600b57cec5SDimitry Andric /// becomes necessary, it can be added. 1610b57cec5SDimitry Andric struct GCCVersion { 1620b57cec5SDimitry Andric /// The unparsed text of the version. 1630b57cec5SDimitry Andric std::string Text; 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric /// The parsed major, minor, and patch numbers. 1660b57cec5SDimitry Andric int Major, Minor, Patch; 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric /// The text of the parsed major, and major+minor versions. 1690b57cec5SDimitry Andric std::string MajorStr, MinorStr; 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric /// Any textual suffix on the patch number. 1720b57cec5SDimitry Andric std::string PatchSuffix; 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric static GCCVersion Parse(StringRef VersionText); 1750b57cec5SDimitry Andric bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch, 1760b57cec5SDimitry Andric StringRef RHSPatchSuffix = StringRef()) const; 1770b57cec5SDimitry Andric bool operator<(const GCCVersion &RHS) const { 1780b57cec5SDimitry Andric return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix); 1790b57cec5SDimitry Andric } 1800b57cec5SDimitry Andric bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 1810b57cec5SDimitry Andric bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 1820b57cec5SDimitry Andric bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 1830b57cec5SDimitry Andric }; 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andric /// This is a class to find a viable GCC installation for Clang to 1860b57cec5SDimitry Andric /// use. 1870b57cec5SDimitry Andric /// 1880b57cec5SDimitry Andric /// This class tries to find a GCC installation on the system, and report 1890b57cec5SDimitry Andric /// information about it. It starts from the host information provided to the 1900b57cec5SDimitry Andric /// Driver, and has logic for fuzzing that where appropriate. 1910b57cec5SDimitry Andric class GCCInstallationDetector { 1920b57cec5SDimitry Andric bool IsValid; 1930b57cec5SDimitry Andric llvm::Triple GCCTriple; 1940b57cec5SDimitry Andric const Driver &D; 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric // FIXME: These might be better as path objects. 1970b57cec5SDimitry Andric std::string GCCInstallPath; 1980b57cec5SDimitry Andric std::string GCCParentLibPath; 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andric /// The primary multilib appropriate for the given flags. 2010b57cec5SDimitry Andric Multilib SelectedMultilib; 2020b57cec5SDimitry Andric /// On Biarch systems, this corresponds to the default multilib when 2030b57cec5SDimitry Andric /// targeting the non-default multilib. Otherwise, it is empty. 2040b57cec5SDimitry Andric llvm::Optional<Multilib> BiarchSibling; 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andric GCCVersion Version; 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric // We retain the list of install paths that were considered and rejected in 2090b57cec5SDimitry Andric // order to print out detailed information in verbose mode. 2100b57cec5SDimitry Andric std::set<std::string> CandidateGCCInstallPaths; 2110b57cec5SDimitry Andric 2120b57cec5SDimitry Andric /// The set of multilibs that the detected installation supports. 2130b57cec5SDimitry Andric MultilibSet Multilibs; 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andric public: 2160b57cec5SDimitry Andric explicit GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {} 2170b57cec5SDimitry Andric void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args, 2180b57cec5SDimitry Andric ArrayRef<std::string> ExtraTripleAliases = None); 2190b57cec5SDimitry Andric 2200b57cec5SDimitry Andric /// Check whether we detected a valid GCC install. 2210b57cec5SDimitry Andric bool isValid() const { return IsValid; } 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric /// Get the GCC triple for the detected install. 2240b57cec5SDimitry Andric const llvm::Triple &getTriple() const { return GCCTriple; } 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric /// Get the detected GCC installation path. 2270b57cec5SDimitry Andric StringRef getInstallPath() const { return GCCInstallPath; } 2280b57cec5SDimitry Andric 2290b57cec5SDimitry Andric /// Get the detected GCC parent lib path. 2300b57cec5SDimitry Andric StringRef getParentLibPath() const { return GCCParentLibPath; } 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andric /// Get the detected Multilib 2330b57cec5SDimitry Andric const Multilib &getMultilib() const { return SelectedMultilib; } 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andric /// Get the whole MultilibSet 2360b57cec5SDimitry Andric const MultilibSet &getMultilibs() const { return Multilibs; } 2370b57cec5SDimitry Andric 2380b57cec5SDimitry Andric /// Get the biarch sibling multilib (if it exists). 2390b57cec5SDimitry Andric /// \return true iff such a sibling exists 2400b57cec5SDimitry Andric bool getBiarchSibling(Multilib &M) const; 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric /// Get the detected GCC version string. 2430b57cec5SDimitry Andric const GCCVersion &getVersion() const { return Version; } 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andric /// Print information about the detected GCC installation. 2460b57cec5SDimitry Andric void print(raw_ostream &OS) const; 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andric private: 2490b57cec5SDimitry Andric static void 2500b57cec5SDimitry Andric CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, 2510b57cec5SDimitry Andric const llvm::Triple &BiarchTriple, 2520b57cec5SDimitry Andric SmallVectorImpl<StringRef> &LibDirs, 2530b57cec5SDimitry Andric SmallVectorImpl<StringRef> &TripleAliases, 2540b57cec5SDimitry Andric SmallVectorImpl<StringRef> &BiarchLibDirs, 2550b57cec5SDimitry Andric SmallVectorImpl<StringRef> &BiarchTripleAliases); 2560b57cec5SDimitry Andric 2570b57cec5SDimitry Andric void AddDefaultGCCPrefixes(const llvm::Triple &TargetTriple, 2580b57cec5SDimitry Andric SmallVectorImpl<std::string> &Prefixes, 2590b57cec5SDimitry Andric StringRef SysRoot); 2600b57cec5SDimitry Andric 2610b57cec5SDimitry Andric bool ScanGCCForMultilibs(const llvm::Triple &TargetTriple, 2620b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 2630b57cec5SDimitry Andric StringRef Path, 2640b57cec5SDimitry Andric bool NeedsBiarchSuffix = false); 2650b57cec5SDimitry Andric 2660b57cec5SDimitry Andric void ScanLibDirForGCCTriple(const llvm::Triple &TargetArch, 2670b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 2680b57cec5SDimitry Andric const std::string &LibDir, 2690b57cec5SDimitry Andric StringRef CandidateTriple, 2700b57cec5SDimitry Andric bool NeedsBiarchSuffix = false); 2710b57cec5SDimitry Andric 2720b57cec5SDimitry Andric bool ScanGentooConfigs(const llvm::Triple &TargetTriple, 2730b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 2740b57cec5SDimitry Andric const SmallVectorImpl<StringRef> &CandidateTriples, 2750b57cec5SDimitry Andric const SmallVectorImpl<StringRef> &BiarchTriples); 2760b57cec5SDimitry Andric 2770b57cec5SDimitry Andric bool ScanGentooGccConfig(const llvm::Triple &TargetTriple, 2780b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 2790b57cec5SDimitry Andric StringRef CandidateTriple, 2800b57cec5SDimitry Andric bool NeedsBiarchSuffix = false); 2810b57cec5SDimitry Andric }; 2820b57cec5SDimitry Andric 2830b57cec5SDimitry Andric protected: 2840b57cec5SDimitry Andric GCCInstallationDetector GCCInstallation; 2850b57cec5SDimitry Andric CudaInstallationDetector CudaInstallation; 286*5ffd83dbSDimitry Andric RocmInstallationDetector RocmInstallation; 2870b57cec5SDimitry Andric 2880b57cec5SDimitry Andric public: 2890b57cec5SDimitry Andric Generic_GCC(const Driver &D, const llvm::Triple &Triple, 2900b57cec5SDimitry Andric const llvm::opt::ArgList &Args); 2910b57cec5SDimitry Andric ~Generic_GCC() override; 2920b57cec5SDimitry Andric 2930b57cec5SDimitry Andric void printVerboseInfo(raw_ostream &OS) const override; 2940b57cec5SDimitry Andric 2950b57cec5SDimitry Andric bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; 2960b57cec5SDimitry Andric bool isPICDefault() const override; 2970b57cec5SDimitry Andric bool isPIEDefault() const override; 2980b57cec5SDimitry Andric bool isPICDefaultForced() const override; 2990b57cec5SDimitry Andric bool IsIntegratedAssemblerDefault() const override; 3000b57cec5SDimitry Andric llvm::opt::DerivedArgList * 3010b57cec5SDimitry Andric TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, 3020b57cec5SDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric protected: 3050b57cec5SDimitry Andric Tool *getTool(Action::ActionClass AC) const override; 3060b57cec5SDimitry Andric Tool *buildAssembler() const override; 3070b57cec5SDimitry Andric Tool *buildLinker() const override; 3080b57cec5SDimitry Andric 309480093f4SDimitry Andric virtual std::string getMultiarchTriple(const Driver &D, 310480093f4SDimitry Andric const llvm::Triple &TargetTriple, 311480093f4SDimitry Andric StringRef SysRoot) const 312480093f4SDimitry Andric { return TargetTriple.str(); } 313480093f4SDimitry Andric 3140b57cec5SDimitry Andric /// \name ToolChain Implementation Helper Functions 3150b57cec5SDimitry Andric /// @{ 3160b57cec5SDimitry Andric 3170b57cec5SDimitry Andric /// Check whether the target triple's architecture is 64-bits. 3180b57cec5SDimitry Andric bool isTarget64Bit() const { return getTriple().isArch64Bit(); } 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andric /// Check whether the target triple's architecture is 32-bits. 3210b57cec5SDimitry Andric bool isTarget32Bit() const { return getTriple().isArch32Bit(); } 3220b57cec5SDimitry Andric 323*5ffd83dbSDimitry Andric void PushPPaths(ToolChain::path_list &PPaths); 324*5ffd83dbSDimitry Andric void AddMultilibPaths(const Driver &D, const std::string &SysRoot, 325*5ffd83dbSDimitry Andric const std::string &OSLibDir, 326*5ffd83dbSDimitry Andric const std::string &MultiarchTriple, 327*5ffd83dbSDimitry Andric path_list &Paths); 328*5ffd83dbSDimitry Andric void AddMultiarchPaths(const Driver &D, const std::string &SysRoot, 329*5ffd83dbSDimitry Andric const std::string &OSLibDir, path_list &Paths); 330*5ffd83dbSDimitry Andric void AddMultilibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 331*5ffd83dbSDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 332*5ffd83dbSDimitry Andric 3330b57cec5SDimitry Andric // FIXME: This should be final, but the CrossWindows toolchain does weird 3340b57cec5SDimitry Andric // things that can't be easily generalized. 3350b57cec5SDimitry Andric void AddClangCXXStdlibIncludeArgs( 3360b57cec5SDimitry Andric const llvm::opt::ArgList &DriverArgs, 3370b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric virtual void 3400b57cec5SDimitry Andric addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 3410b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 3420b57cec5SDimitry Andric virtual void 3430b57cec5SDimitry Andric addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 3440b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 3450b57cec5SDimitry Andric 346480093f4SDimitry Andric bool 347480093f4SDimitry Andric addGCCLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 348480093f4SDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 349480093f4SDimitry Andric 3500b57cec5SDimitry Andric bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, StringRef GCCTriple, 3510b57cec5SDimitry Andric StringRef GCCMultiarchTriple, 3520b57cec5SDimitry Andric StringRef TargetMultiarchTriple, 3530b57cec5SDimitry Andric Twine IncludeSuffix, 3540b57cec5SDimitry Andric const llvm::opt::ArgList &DriverArgs, 3550b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andric /// @} 3580b57cec5SDimitry Andric 3590b57cec5SDimitry Andric private: 3600b57cec5SDimitry Andric mutable std::unique_ptr<tools::gcc::Preprocessor> Preprocess; 3610b57cec5SDimitry Andric mutable std::unique_ptr<tools::gcc::Compiler> Compile; 3620b57cec5SDimitry Andric }; 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 3650b57cec5SDimitry Andric virtual void anchor(); 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andric public: 3680b57cec5SDimitry Andric Generic_ELF(const Driver &D, const llvm::Triple &Triple, 3690b57cec5SDimitry Andric const llvm::opt::ArgList &Args) 3700b57cec5SDimitry Andric : Generic_GCC(D, Triple, Args) {} 3710b57cec5SDimitry Andric 3720b57cec5SDimitry Andric void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 3730b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args, 3740b57cec5SDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 375d65cd7a5SDimitry Andric 376d65cd7a5SDimitry Andric virtual std::string getDynamicLinker(const llvm::opt::ArgList &Args) const { 377d65cd7a5SDimitry Andric return {}; 378d65cd7a5SDimitry Andric } 379d65cd7a5SDimitry Andric 380d65cd7a5SDimitry Andric virtual void addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const {} 3810b57cec5SDimitry Andric }; 3820b57cec5SDimitry Andric 3830b57cec5SDimitry Andric } // end namespace toolchains 3840b57cec5SDimitry Andric } // end namespace driver 3850b57cec5SDimitry Andric } // end namespace clang 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_GNU_H 388