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