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" 1306c3fb27SDimitry Andric #include "LazyDetector.h" 145ffd83dbSDimitry Andric #include "ROCm.h" 150b57cec5SDimitry Andric #include "clang/Driver/Tool.h" 160b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h" 170b57cec5SDimitry Andric #include <set> 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric namespace clang { 200b57cec5SDimitry Andric namespace driver { 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric struct DetectedMultilibs { 230b57cec5SDimitry Andric /// The set of multilibs that the detected installation supports. 240b57cec5SDimitry Andric MultilibSet Multilibs; 250b57cec5SDimitry Andric 2606c3fb27SDimitry Andric /// The multilibs appropriate for the given flags. 2706c3fb27SDimitry Andric llvm::SmallVector<Multilib> SelectedMultilibs; 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric /// On Biarch systems, this corresponds to the default multilib when 300b57cec5SDimitry Andric /// targeting the non-default multilib. Otherwise, it is empty. 31bdd1243dSDimitry Andric std::optional<Multilib> BiarchSibling; 320b57cec5SDimitry Andric }; 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple, 350b57cec5SDimitry Andric StringRef Path, const llvm::opt::ArgList &Args, 360b57cec5SDimitry Andric DetectedMultilibs &Result); 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric namespace tools { 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric /// Directly call GNU Binutils' assembler and linker. 410b57cec5SDimitry Andric namespace gnutools { 425ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 430b57cec5SDimitry Andric public: 445ffd83dbSDimitry Andric Assembler(const ToolChain &TC) : Tool("GNU::Assembler", "assembler", TC) {} 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 490b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 500b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 510b57cec5SDimitry Andric const char *LinkingOutput) const override; 520b57cec5SDimitry Andric }; 530b57cec5SDimitry Andric 545ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 550b57cec5SDimitry Andric public: 565ffd83dbSDimitry Andric Linker(const ToolChain &TC) : Tool("GNU::Linker", "linker", TC) {} 575ffd83dbSDimitry Andric 585ffd83dbSDimitry Andric bool hasIntegratedCPP() const override { return false; } 595ffd83dbSDimitry Andric bool isLinkJob() const override { return true; } 605ffd83dbSDimitry Andric 615ffd83dbSDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 625ffd83dbSDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 635ffd83dbSDimitry Andric const llvm::opt::ArgList &TCArgs, 645ffd83dbSDimitry Andric const char *LinkingOutput) const override; 655ffd83dbSDimitry Andric }; 665ffd83dbSDimitry Andric 675ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY StaticLibTool : public Tool { 685ffd83dbSDimitry Andric public: 695ffd83dbSDimitry Andric StaticLibTool(const ToolChain &TC) 705ffd83dbSDimitry Andric : Tool("GNU::StaticLibTool", "static-lib-linker", TC) {} 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 730b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 760b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 770b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 780b57cec5SDimitry Andric const char *LinkingOutput) const override; 790b57cec5SDimitry Andric }; 800b57cec5SDimitry Andric } // end namespace gnutools 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric /// gcc - Generic GCC tool implementations. 830b57cec5SDimitry Andric namespace gcc { 845ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY Common : public Tool { 850b57cec5SDimitry Andric public: 860b57cec5SDimitry Andric Common(const char *Name, const char *ShortName, const ToolChain &TC) 875ffd83dbSDimitry Andric : Tool(Name, ShortName, TC) {} 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric // A gcc tool has an "integrated" assembler that it will call to produce an 900b57cec5SDimitry Andric // object. Let it use that assembler so that we don't have to deal with 910b57cec5SDimitry Andric // assembly syntax incompatibilities. 920b57cec5SDimitry Andric bool hasIntegratedAssembler() const override { return true; } 930b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 940b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 950b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 960b57cec5SDimitry Andric const char *LinkingOutput) const override; 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric /// RenderExtraToolArgs - Render any arguments necessary to force 990b57cec5SDimitry Andric /// the particular tool mode. 1000b57cec5SDimitry Andric virtual void RenderExtraToolArgs(const JobAction &JA, 1010b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const = 0; 1020b57cec5SDimitry Andric }; 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common { 1050b57cec5SDimitry Andric public: 1060b57cec5SDimitry Andric Preprocessor(const ToolChain &TC) 1070b57cec5SDimitry Andric : Common("gcc::Preprocessor", "gcc preprocessor", TC) {} 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric bool hasGoodDiagnostics() const override { return true; } 1100b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 1130b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 1140b57cec5SDimitry Andric }; 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Compiler : public Common { 1170b57cec5SDimitry Andric public: 1180b57cec5SDimitry Andric Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {} 1190b57cec5SDimitry Andric 1200b57cec5SDimitry Andric bool hasGoodDiagnostics() const override { return true; } 1210b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return true; } 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 1240b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 1250b57cec5SDimitry Andric }; 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker : public Common { 1280b57cec5SDimitry Andric public: 1290b57cec5SDimitry Andric Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {} 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 1320b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 1350b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 1360b57cec5SDimitry Andric }; 1370b57cec5SDimitry Andric } // end namespace gcc 1380b57cec5SDimitry Andric } // end namespace tools 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andric namespace toolchains { 1410b57cec5SDimitry Andric 1420b57cec5SDimitry Andric /// Generic_GCC - A tool chain using the 'gcc' command to perform 1430b57cec5SDimitry Andric /// all subcommands; this relies on gcc translating the majority of 1440b57cec5SDimitry Andric /// command line options. 1450b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 1460b57cec5SDimitry Andric public: 1470b57cec5SDimitry Andric /// Struct to store and manipulate GCC versions. 1480b57cec5SDimitry Andric /// 1490b57cec5SDimitry Andric /// We rely on assumptions about the form and structure of GCC version 1500b57cec5SDimitry Andric /// numbers: they consist of at most three '.'-separated components, and each 1510b57cec5SDimitry Andric /// component is a non-negative integer except for the last component. For 1520b57cec5SDimitry Andric /// the last component we are very flexible in order to tolerate release 1530b57cec5SDimitry Andric /// candidates or 'x' wildcards. 1540b57cec5SDimitry Andric /// 1550b57cec5SDimitry Andric /// Note that the ordering established among GCCVersions is based on the 1560b57cec5SDimitry Andric /// preferred version string to use. For example we prefer versions without 1570b57cec5SDimitry Andric /// a hard-coded patch number to those with a hard coded patch number. 1580b57cec5SDimitry Andric /// 1590b57cec5SDimitry Andric /// Currently this doesn't provide any logic for textual suffixes to patches 1600b57cec5SDimitry Andric /// in the way that (for example) Debian's version format does. If that ever 1610b57cec5SDimitry Andric /// becomes necessary, it can be added. 1620b57cec5SDimitry Andric struct GCCVersion { 1630b57cec5SDimitry Andric /// The unparsed text of the version. 1640b57cec5SDimitry Andric std::string Text; 1650b57cec5SDimitry Andric 1660b57cec5SDimitry Andric /// The parsed major, minor, and patch numbers. 1670b57cec5SDimitry Andric int Major, Minor, Patch; 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric /// The text of the parsed major, and major+minor versions. 1700b57cec5SDimitry Andric std::string MajorStr, MinorStr; 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric /// Any textual suffix on the patch number. 1730b57cec5SDimitry Andric std::string PatchSuffix; 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric static GCCVersion Parse(StringRef VersionText); 1760b57cec5SDimitry Andric bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch, 1770b57cec5SDimitry Andric StringRef RHSPatchSuffix = StringRef()) const; 1780b57cec5SDimitry Andric bool operator<(const GCCVersion &RHS) const { 1790b57cec5SDimitry Andric return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix); 1800b57cec5SDimitry Andric } 1810b57cec5SDimitry Andric bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 1820b57cec5SDimitry Andric bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 1830b57cec5SDimitry Andric bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 1840b57cec5SDimitry Andric }; 1850b57cec5SDimitry Andric 1860b57cec5SDimitry Andric /// This is a class to find a viable GCC installation for Clang to 1870b57cec5SDimitry Andric /// use. 1880b57cec5SDimitry Andric /// 1890b57cec5SDimitry Andric /// This class tries to find a GCC installation on the system, and report 1900b57cec5SDimitry Andric /// information about it. It starts from the host information provided to the 1910b57cec5SDimitry Andric /// Driver, and has logic for fuzzing that where appropriate. 1920b57cec5SDimitry Andric class GCCInstallationDetector { 1930b57cec5SDimitry Andric bool IsValid; 1940b57cec5SDimitry Andric llvm::Triple GCCTriple; 1950b57cec5SDimitry Andric const Driver &D; 1960b57cec5SDimitry Andric 1970b57cec5SDimitry Andric // FIXME: These might be better as path objects. 1980b57cec5SDimitry Andric std::string GCCInstallPath; 1990b57cec5SDimitry Andric std::string GCCParentLibPath; 2000b57cec5SDimitry Andric 2010b57cec5SDimitry Andric /// The primary multilib appropriate for the given flags. 2020b57cec5SDimitry Andric Multilib SelectedMultilib; 2030b57cec5SDimitry Andric /// On Biarch systems, this corresponds to the default multilib when 2040b57cec5SDimitry Andric /// targeting the non-default multilib. Otherwise, it is empty. 205bdd1243dSDimitry Andric std::optional<Multilib> BiarchSibling; 2060b57cec5SDimitry Andric 2070b57cec5SDimitry Andric GCCVersion Version; 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andric // We retain the list of install paths that were considered and rejected in 2100b57cec5SDimitry Andric // order to print out detailed information in verbose mode. 2110b57cec5SDimitry Andric std::set<std::string> CandidateGCCInstallPaths; 2120b57cec5SDimitry Andric 2130b57cec5SDimitry Andric /// The set of multilibs that the detected installation supports. 2140b57cec5SDimitry Andric MultilibSet Multilibs; 2150b57cec5SDimitry Andric 216e8d8bef9SDimitry Andric // Gentoo-specific toolchain configurations are stored here. 217e8d8bef9SDimitry Andric const std::string GentooConfigDir = "/etc/env.d/gcc"; 218e8d8bef9SDimitry Andric 2190b57cec5SDimitry Andric public: 2200b57cec5SDimitry Andric explicit GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {} 221*5f757f3fSDimitry Andric void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args); 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric /// Check whether we detected a valid GCC install. 2240b57cec5SDimitry Andric bool isValid() const { return IsValid; } 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric /// Get the GCC triple for the detected install. 2270b57cec5SDimitry Andric const llvm::Triple &getTriple() const { return GCCTriple; } 2280b57cec5SDimitry Andric 2290b57cec5SDimitry Andric /// Get the detected GCC installation path. 2300b57cec5SDimitry Andric StringRef getInstallPath() const { return GCCInstallPath; } 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andric /// Get the detected GCC parent lib path. 2330b57cec5SDimitry Andric StringRef getParentLibPath() const { return GCCParentLibPath; } 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andric /// Get the detected Multilib 2360b57cec5SDimitry Andric const Multilib &getMultilib() const { return SelectedMultilib; } 2370b57cec5SDimitry Andric 2380b57cec5SDimitry Andric /// Get the whole MultilibSet 2390b57cec5SDimitry Andric const MultilibSet &getMultilibs() const { return Multilibs; } 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andric /// Get the biarch sibling multilib (if it exists). 2420b57cec5SDimitry Andric /// \return true iff such a sibling exists 2430b57cec5SDimitry Andric bool getBiarchSibling(Multilib &M) const; 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andric /// Get the detected GCC version string. 2460b57cec5SDimitry Andric const GCCVersion &getVersion() const { return Version; } 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andric /// Print information about the detected GCC installation. 2490b57cec5SDimitry Andric void print(raw_ostream &OS) const; 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andric private: 2520b57cec5SDimitry Andric static void 2530b57cec5SDimitry Andric CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, 2540b57cec5SDimitry Andric const llvm::Triple &BiarchTriple, 2550b57cec5SDimitry Andric SmallVectorImpl<StringRef> &LibDirs, 2560b57cec5SDimitry Andric SmallVectorImpl<StringRef> &TripleAliases, 2570b57cec5SDimitry Andric SmallVectorImpl<StringRef> &BiarchLibDirs, 2580b57cec5SDimitry Andric SmallVectorImpl<StringRef> &BiarchTripleAliases); 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric void AddDefaultGCCPrefixes(const llvm::Triple &TargetTriple, 2610b57cec5SDimitry Andric SmallVectorImpl<std::string> &Prefixes, 2620b57cec5SDimitry Andric StringRef SysRoot); 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric bool ScanGCCForMultilibs(const llvm::Triple &TargetTriple, 2650b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 2660b57cec5SDimitry Andric StringRef Path, 2670b57cec5SDimitry Andric bool NeedsBiarchSuffix = false); 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andric void ScanLibDirForGCCTriple(const llvm::Triple &TargetArch, 2700b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 2710b57cec5SDimitry Andric const std::string &LibDir, 2720b57cec5SDimitry Andric StringRef CandidateTriple, 273e8d8bef9SDimitry Andric bool NeedsBiarchSuffix, bool GCCDirExists, 274e8d8bef9SDimitry Andric bool GCCCrossDirExists); 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric bool ScanGentooConfigs(const llvm::Triple &TargetTriple, 2770b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 2780b57cec5SDimitry Andric const SmallVectorImpl<StringRef> &CandidateTriples, 2790b57cec5SDimitry Andric const SmallVectorImpl<StringRef> &BiarchTriples); 2800b57cec5SDimitry Andric 2810b57cec5SDimitry Andric bool ScanGentooGccConfig(const llvm::Triple &TargetTriple, 2820b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 2830b57cec5SDimitry Andric StringRef CandidateTriple, 2840b57cec5SDimitry Andric bool NeedsBiarchSuffix = false); 2850b57cec5SDimitry Andric }; 2860b57cec5SDimitry Andric 2870b57cec5SDimitry Andric protected: 2880b57cec5SDimitry Andric GCCInstallationDetector GCCInstallation; 28906c3fb27SDimitry Andric LazyDetector<CudaInstallationDetector> CudaInstallation; 29006c3fb27SDimitry Andric LazyDetector<RocmInstallationDetector> RocmInstallation; 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric public: 2930b57cec5SDimitry Andric Generic_GCC(const Driver &D, const llvm::Triple &Triple, 2940b57cec5SDimitry Andric const llvm::opt::ArgList &Args); 2950b57cec5SDimitry Andric ~Generic_GCC() override; 2960b57cec5SDimitry Andric 2970b57cec5SDimitry Andric void printVerboseInfo(raw_ostream &OS) const override; 2980b57cec5SDimitry Andric 299bdd1243dSDimitry Andric UnwindTableLevel 300bdd1243dSDimitry Andric getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; 3010b57cec5SDimitry Andric bool isPICDefault() const override; 302349cc55cSDimitry Andric bool isPIEDefault(const llvm::opt::ArgList &Args) const override; 3030b57cec5SDimitry Andric bool isPICDefaultForced() const override; 3040b57cec5SDimitry Andric bool IsIntegratedAssemblerDefault() const override; 3050b57cec5SDimitry Andric llvm::opt::DerivedArgList * 3060b57cec5SDimitry Andric TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, 3070b57cec5SDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 3080b57cec5SDimitry Andric 3090b57cec5SDimitry Andric protected: 3100b57cec5SDimitry Andric Tool *getTool(Action::ActionClass AC) const override; 3110b57cec5SDimitry Andric Tool *buildAssembler() const override; 3120b57cec5SDimitry Andric Tool *buildLinker() const override; 3130b57cec5SDimitry 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 3235ffd83dbSDimitry Andric void PushPPaths(ToolChain::path_list &PPaths); 3245ffd83dbSDimitry Andric void AddMultilibPaths(const Driver &D, const std::string &SysRoot, 3255ffd83dbSDimitry Andric const std::string &OSLibDir, 3265ffd83dbSDimitry Andric const std::string &MultiarchTriple, 3275ffd83dbSDimitry Andric path_list &Paths); 3285ffd83dbSDimitry Andric void AddMultiarchPaths(const Driver &D, const std::string &SysRoot, 3295ffd83dbSDimitry Andric const std::string &OSLibDir, path_list &Paths); 3305ffd83dbSDimitry Andric void AddMultilibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 3315ffd83dbSDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 3325ffd83dbSDimitry 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 346fe6060f1SDimitry Andric bool addGCCLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 347fe6060f1SDimitry Andric llvm::opt::ArgStringList &CC1Args, 348fe6060f1SDimitry Andric StringRef DebianMultiarch) const; 349480093f4SDimitry Andric 350fe6060f1SDimitry Andric bool addLibStdCXXIncludePaths(Twine IncludeDir, StringRef Triple, 3510b57cec5SDimitry Andric Twine IncludeSuffix, 3520b57cec5SDimitry Andric const llvm::opt::ArgList &DriverArgs, 353fe6060f1SDimitry Andric llvm::opt::ArgStringList &CC1Args, 354fe6060f1SDimitry Andric bool DetectDebian = false) const; 3550b57cec5SDimitry Andric 3560b57cec5SDimitry Andric /// @} 3570b57cec5SDimitry Andric 3580b57cec5SDimitry Andric private: 3590b57cec5SDimitry Andric mutable std::unique_ptr<tools::gcc::Preprocessor> Preprocess; 3600b57cec5SDimitry Andric mutable std::unique_ptr<tools::gcc::Compiler> Compile; 3610b57cec5SDimitry Andric }; 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 3640b57cec5SDimitry Andric virtual void anchor(); 3650b57cec5SDimitry Andric 3660b57cec5SDimitry Andric public: 3670b57cec5SDimitry Andric Generic_ELF(const Driver &D, const llvm::Triple &Triple, 3680b57cec5SDimitry Andric const llvm::opt::ArgList &Args) 3690b57cec5SDimitry Andric : Generic_GCC(D, Triple, Args) {} 3700b57cec5SDimitry Andric 3710b57cec5SDimitry Andric void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 3720b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args, 3730b57cec5SDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 374d65cd7a5SDimitry Andric 375d65cd7a5SDimitry Andric virtual std::string getDynamicLinker(const llvm::opt::ArgList &Args) const { 376d65cd7a5SDimitry Andric return {}; 377d65cd7a5SDimitry Andric } 378d65cd7a5SDimitry Andric 379d65cd7a5SDimitry Andric virtual void addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const {} 3800b57cec5SDimitry Andric }; 3810b57cec5SDimitry Andric 3820b57cec5SDimitry Andric } // end namespace toolchains 3830b57cec5SDimitry Andric } // end namespace driver 3840b57cec5SDimitry Andric } // end namespace clang 3850b57cec5SDimitry Andric 3860b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_GNU_H 387