1*0b57cec5SDimitry Andric //===--- Gnu.h - Gnu Tool and ToolChain Implementations ---------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_GNU_H 10*0b57cec5SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_GNU_H 11*0b57cec5SDimitry Andric 12*0b57cec5SDimitry Andric #include "Cuda.h" 13*0b57cec5SDimitry Andric #include "clang/Driver/Tool.h" 14*0b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h" 15*0b57cec5SDimitry Andric #include <set> 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric namespace clang { 18*0b57cec5SDimitry Andric namespace driver { 19*0b57cec5SDimitry Andric 20*0b57cec5SDimitry Andric struct DetectedMultilibs { 21*0b57cec5SDimitry Andric /// The set of multilibs that the detected installation supports. 22*0b57cec5SDimitry Andric MultilibSet Multilibs; 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric /// The primary multilib appropriate for the given flags. 25*0b57cec5SDimitry Andric Multilib SelectedMultilib; 26*0b57cec5SDimitry Andric 27*0b57cec5SDimitry Andric /// On Biarch systems, this corresponds to the default multilib when 28*0b57cec5SDimitry Andric /// targeting the non-default multilib. Otherwise, it is empty. 29*0b57cec5SDimitry Andric llvm::Optional<Multilib> BiarchSibling; 30*0b57cec5SDimitry Andric }; 31*0b57cec5SDimitry Andric 32*0b57cec5SDimitry Andric bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple, 33*0b57cec5SDimitry Andric StringRef Path, const llvm::opt::ArgList &Args, 34*0b57cec5SDimitry Andric DetectedMultilibs &Result); 35*0b57cec5SDimitry Andric 36*0b57cec5SDimitry Andric namespace tools { 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric /// Base class for all GNU tools that provide the same behavior when 39*0b57cec5SDimitry Andric /// it comes to response files support 40*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool { 41*0b57cec5SDimitry Andric virtual void anchor(); 42*0b57cec5SDimitry Andric 43*0b57cec5SDimitry Andric public: 44*0b57cec5SDimitry Andric GnuTool(const char *Name, const char *ShortName, const ToolChain &TC) 45*0b57cec5SDimitry Andric : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {} 46*0b57cec5SDimitry Andric }; 47*0b57cec5SDimitry Andric 48*0b57cec5SDimitry Andric /// Directly call GNU Binutils' assembler and linker. 49*0b57cec5SDimitry Andric namespace gnutools { 50*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 51*0b57cec5SDimitry Andric public: 52*0b57cec5SDimitry Andric Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {} 53*0b57cec5SDimitry Andric 54*0b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 57*0b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 58*0b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 59*0b57cec5SDimitry Andric const char *LinkingOutput) const override; 60*0b57cec5SDimitry Andric }; 61*0b57cec5SDimitry Andric 62*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 63*0b57cec5SDimitry Andric public: 64*0b57cec5SDimitry Andric Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {} 65*0b57cec5SDimitry Andric 66*0b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 67*0b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 68*0b57cec5SDimitry Andric 69*0b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 70*0b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 71*0b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 72*0b57cec5SDimitry Andric const char *LinkingOutput) const override; 73*0b57cec5SDimitry Andric }; 74*0b57cec5SDimitry Andric } // end namespace gnutools 75*0b57cec5SDimitry Andric 76*0b57cec5SDimitry Andric /// gcc - Generic GCC tool implementations. 77*0b57cec5SDimitry Andric namespace gcc { 78*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Common : public GnuTool { 79*0b57cec5SDimitry Andric public: 80*0b57cec5SDimitry Andric Common(const char *Name, const char *ShortName, const ToolChain &TC) 81*0b57cec5SDimitry Andric : GnuTool(Name, ShortName, TC) {} 82*0b57cec5SDimitry Andric 83*0b57cec5SDimitry Andric // A gcc tool has an "integrated" assembler that it will call to produce an 84*0b57cec5SDimitry Andric // object. Let it use that assembler so that we don't have to deal with 85*0b57cec5SDimitry Andric // assembly syntax incompatibilities. 86*0b57cec5SDimitry Andric bool hasIntegratedAssembler() const override { return true; } 87*0b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 88*0b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 89*0b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 90*0b57cec5SDimitry Andric const char *LinkingOutput) const override; 91*0b57cec5SDimitry Andric 92*0b57cec5SDimitry Andric /// RenderExtraToolArgs - Render any arguments necessary to force 93*0b57cec5SDimitry Andric /// the particular tool mode. 94*0b57cec5SDimitry Andric virtual void RenderExtraToolArgs(const JobAction &JA, 95*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const = 0; 96*0b57cec5SDimitry Andric }; 97*0b57cec5SDimitry Andric 98*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common { 99*0b57cec5SDimitry Andric public: 100*0b57cec5SDimitry Andric Preprocessor(const ToolChain &TC) 101*0b57cec5SDimitry Andric : Common("gcc::Preprocessor", "gcc preprocessor", TC) {} 102*0b57cec5SDimitry Andric 103*0b57cec5SDimitry Andric bool hasGoodDiagnostics() const override { return true; } 104*0b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 105*0b57cec5SDimitry Andric 106*0b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 107*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 108*0b57cec5SDimitry Andric }; 109*0b57cec5SDimitry Andric 110*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Compiler : public Common { 111*0b57cec5SDimitry Andric public: 112*0b57cec5SDimitry Andric Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {} 113*0b57cec5SDimitry Andric 114*0b57cec5SDimitry Andric bool hasGoodDiagnostics() const override { return true; } 115*0b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return true; } 116*0b57cec5SDimitry Andric 117*0b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 118*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 119*0b57cec5SDimitry Andric }; 120*0b57cec5SDimitry Andric 121*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker : public Common { 122*0b57cec5SDimitry Andric public: 123*0b57cec5SDimitry Andric Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {} 124*0b57cec5SDimitry Andric 125*0b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 126*0b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 127*0b57cec5SDimitry Andric 128*0b57cec5SDimitry Andric void RenderExtraToolArgs(const JobAction &JA, 129*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 130*0b57cec5SDimitry Andric }; 131*0b57cec5SDimitry Andric } // end namespace gcc 132*0b57cec5SDimitry Andric } // end namespace tools 133*0b57cec5SDimitry Andric 134*0b57cec5SDimitry Andric namespace toolchains { 135*0b57cec5SDimitry Andric 136*0b57cec5SDimitry Andric /// Generic_GCC - A tool chain using the 'gcc' command to perform 137*0b57cec5SDimitry Andric /// all subcommands; this relies on gcc translating the majority of 138*0b57cec5SDimitry Andric /// command line options. 139*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 140*0b57cec5SDimitry Andric public: 141*0b57cec5SDimitry Andric /// Struct to store and manipulate GCC versions. 142*0b57cec5SDimitry Andric /// 143*0b57cec5SDimitry Andric /// We rely on assumptions about the form and structure of GCC version 144*0b57cec5SDimitry Andric /// numbers: they consist of at most three '.'-separated components, and each 145*0b57cec5SDimitry Andric /// component is a non-negative integer except for the last component. For 146*0b57cec5SDimitry Andric /// the last component we are very flexible in order to tolerate release 147*0b57cec5SDimitry Andric /// candidates or 'x' wildcards. 148*0b57cec5SDimitry Andric /// 149*0b57cec5SDimitry Andric /// Note that the ordering established among GCCVersions is based on the 150*0b57cec5SDimitry Andric /// preferred version string to use. For example we prefer versions without 151*0b57cec5SDimitry Andric /// a hard-coded patch number to those with a hard coded patch number. 152*0b57cec5SDimitry Andric /// 153*0b57cec5SDimitry Andric /// Currently this doesn't provide any logic for textual suffixes to patches 154*0b57cec5SDimitry Andric /// in the way that (for example) Debian's version format does. If that ever 155*0b57cec5SDimitry Andric /// becomes necessary, it can be added. 156*0b57cec5SDimitry Andric struct GCCVersion { 157*0b57cec5SDimitry Andric /// The unparsed text of the version. 158*0b57cec5SDimitry Andric std::string Text; 159*0b57cec5SDimitry Andric 160*0b57cec5SDimitry Andric /// The parsed major, minor, and patch numbers. 161*0b57cec5SDimitry Andric int Major, Minor, Patch; 162*0b57cec5SDimitry Andric 163*0b57cec5SDimitry Andric /// The text of the parsed major, and major+minor versions. 164*0b57cec5SDimitry Andric std::string MajorStr, MinorStr; 165*0b57cec5SDimitry Andric 166*0b57cec5SDimitry Andric /// Any textual suffix on the patch number. 167*0b57cec5SDimitry Andric std::string PatchSuffix; 168*0b57cec5SDimitry Andric 169*0b57cec5SDimitry Andric static GCCVersion Parse(StringRef VersionText); 170*0b57cec5SDimitry Andric bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch, 171*0b57cec5SDimitry Andric StringRef RHSPatchSuffix = StringRef()) const; 172*0b57cec5SDimitry Andric bool operator<(const GCCVersion &RHS) const { 173*0b57cec5SDimitry Andric return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix); 174*0b57cec5SDimitry Andric } 175*0b57cec5SDimitry Andric bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 176*0b57cec5SDimitry Andric bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 177*0b57cec5SDimitry Andric bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 178*0b57cec5SDimitry Andric }; 179*0b57cec5SDimitry Andric 180*0b57cec5SDimitry Andric /// This is a class to find a viable GCC installation for Clang to 181*0b57cec5SDimitry Andric /// use. 182*0b57cec5SDimitry Andric /// 183*0b57cec5SDimitry Andric /// This class tries to find a GCC installation on the system, and report 184*0b57cec5SDimitry Andric /// information about it. It starts from the host information provided to the 185*0b57cec5SDimitry Andric /// Driver, and has logic for fuzzing that where appropriate. 186*0b57cec5SDimitry Andric class GCCInstallationDetector { 187*0b57cec5SDimitry Andric bool IsValid; 188*0b57cec5SDimitry Andric llvm::Triple GCCTriple; 189*0b57cec5SDimitry Andric const Driver &D; 190*0b57cec5SDimitry Andric 191*0b57cec5SDimitry Andric // FIXME: These might be better as path objects. 192*0b57cec5SDimitry Andric std::string GCCInstallPath; 193*0b57cec5SDimitry Andric std::string GCCParentLibPath; 194*0b57cec5SDimitry Andric 195*0b57cec5SDimitry Andric /// The primary multilib appropriate for the given flags. 196*0b57cec5SDimitry Andric Multilib SelectedMultilib; 197*0b57cec5SDimitry Andric /// On Biarch systems, this corresponds to the default multilib when 198*0b57cec5SDimitry Andric /// targeting the non-default multilib. Otherwise, it is empty. 199*0b57cec5SDimitry Andric llvm::Optional<Multilib> BiarchSibling; 200*0b57cec5SDimitry Andric 201*0b57cec5SDimitry Andric GCCVersion Version; 202*0b57cec5SDimitry Andric 203*0b57cec5SDimitry Andric // We retain the list of install paths that were considered and rejected in 204*0b57cec5SDimitry Andric // order to print out detailed information in verbose mode. 205*0b57cec5SDimitry Andric std::set<std::string> CandidateGCCInstallPaths; 206*0b57cec5SDimitry Andric 207*0b57cec5SDimitry Andric /// The set of multilibs that the detected installation supports. 208*0b57cec5SDimitry Andric MultilibSet Multilibs; 209*0b57cec5SDimitry Andric 210*0b57cec5SDimitry Andric public: 211*0b57cec5SDimitry Andric explicit GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {} 212*0b57cec5SDimitry Andric void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args, 213*0b57cec5SDimitry Andric ArrayRef<std::string> ExtraTripleAliases = None); 214*0b57cec5SDimitry Andric 215*0b57cec5SDimitry Andric /// Check whether we detected a valid GCC install. 216*0b57cec5SDimitry Andric bool isValid() const { return IsValid; } 217*0b57cec5SDimitry Andric 218*0b57cec5SDimitry Andric /// Get the GCC triple for the detected install. 219*0b57cec5SDimitry Andric const llvm::Triple &getTriple() const { return GCCTriple; } 220*0b57cec5SDimitry Andric 221*0b57cec5SDimitry Andric /// Get the detected GCC installation path. 222*0b57cec5SDimitry Andric StringRef getInstallPath() const { return GCCInstallPath; } 223*0b57cec5SDimitry Andric 224*0b57cec5SDimitry Andric /// Get the detected GCC parent lib path. 225*0b57cec5SDimitry Andric StringRef getParentLibPath() const { return GCCParentLibPath; } 226*0b57cec5SDimitry Andric 227*0b57cec5SDimitry Andric /// Get the detected Multilib 228*0b57cec5SDimitry Andric const Multilib &getMultilib() const { return SelectedMultilib; } 229*0b57cec5SDimitry Andric 230*0b57cec5SDimitry Andric /// Get the whole MultilibSet 231*0b57cec5SDimitry Andric const MultilibSet &getMultilibs() const { return Multilibs; } 232*0b57cec5SDimitry Andric 233*0b57cec5SDimitry Andric /// Get the biarch sibling multilib (if it exists). 234*0b57cec5SDimitry Andric /// \return true iff such a sibling exists 235*0b57cec5SDimitry Andric bool getBiarchSibling(Multilib &M) const; 236*0b57cec5SDimitry Andric 237*0b57cec5SDimitry Andric /// Get the detected GCC version string. 238*0b57cec5SDimitry Andric const GCCVersion &getVersion() const { return Version; } 239*0b57cec5SDimitry Andric 240*0b57cec5SDimitry Andric /// Print information about the detected GCC installation. 241*0b57cec5SDimitry Andric void print(raw_ostream &OS) const; 242*0b57cec5SDimitry Andric 243*0b57cec5SDimitry Andric private: 244*0b57cec5SDimitry Andric static void 245*0b57cec5SDimitry Andric CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, 246*0b57cec5SDimitry Andric const llvm::Triple &BiarchTriple, 247*0b57cec5SDimitry Andric SmallVectorImpl<StringRef> &LibDirs, 248*0b57cec5SDimitry Andric SmallVectorImpl<StringRef> &TripleAliases, 249*0b57cec5SDimitry Andric SmallVectorImpl<StringRef> &BiarchLibDirs, 250*0b57cec5SDimitry Andric SmallVectorImpl<StringRef> &BiarchTripleAliases); 251*0b57cec5SDimitry Andric 252*0b57cec5SDimitry Andric void AddDefaultGCCPrefixes(const llvm::Triple &TargetTriple, 253*0b57cec5SDimitry Andric SmallVectorImpl<std::string> &Prefixes, 254*0b57cec5SDimitry Andric StringRef SysRoot); 255*0b57cec5SDimitry Andric 256*0b57cec5SDimitry Andric bool ScanGCCForMultilibs(const llvm::Triple &TargetTriple, 257*0b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 258*0b57cec5SDimitry Andric StringRef Path, 259*0b57cec5SDimitry Andric bool NeedsBiarchSuffix = false); 260*0b57cec5SDimitry Andric 261*0b57cec5SDimitry Andric void ScanLibDirForGCCTriple(const llvm::Triple &TargetArch, 262*0b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 263*0b57cec5SDimitry Andric const std::string &LibDir, 264*0b57cec5SDimitry Andric StringRef CandidateTriple, 265*0b57cec5SDimitry Andric bool NeedsBiarchSuffix = false); 266*0b57cec5SDimitry Andric 267*0b57cec5SDimitry Andric bool ScanGentooConfigs(const llvm::Triple &TargetTriple, 268*0b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 269*0b57cec5SDimitry Andric const SmallVectorImpl<StringRef> &CandidateTriples, 270*0b57cec5SDimitry Andric const SmallVectorImpl<StringRef> &BiarchTriples); 271*0b57cec5SDimitry Andric 272*0b57cec5SDimitry Andric bool ScanGentooGccConfig(const llvm::Triple &TargetTriple, 273*0b57cec5SDimitry Andric const llvm::opt::ArgList &Args, 274*0b57cec5SDimitry Andric StringRef CandidateTriple, 275*0b57cec5SDimitry Andric bool NeedsBiarchSuffix = false); 276*0b57cec5SDimitry Andric }; 277*0b57cec5SDimitry Andric 278*0b57cec5SDimitry Andric protected: 279*0b57cec5SDimitry Andric GCCInstallationDetector GCCInstallation; 280*0b57cec5SDimitry Andric CudaInstallationDetector CudaInstallation; 281*0b57cec5SDimitry Andric 282*0b57cec5SDimitry Andric public: 283*0b57cec5SDimitry Andric Generic_GCC(const Driver &D, const llvm::Triple &Triple, 284*0b57cec5SDimitry Andric const llvm::opt::ArgList &Args); 285*0b57cec5SDimitry Andric ~Generic_GCC() override; 286*0b57cec5SDimitry Andric 287*0b57cec5SDimitry Andric void printVerboseInfo(raw_ostream &OS) const override; 288*0b57cec5SDimitry Andric 289*0b57cec5SDimitry Andric bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; 290*0b57cec5SDimitry Andric bool isPICDefault() const override; 291*0b57cec5SDimitry Andric bool isPIEDefault() const override; 292*0b57cec5SDimitry Andric bool isPICDefaultForced() const override; 293*0b57cec5SDimitry Andric bool IsIntegratedAssemblerDefault() const override; 294*0b57cec5SDimitry Andric llvm::opt::DerivedArgList * 295*0b57cec5SDimitry Andric TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, 296*0b57cec5SDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 297*0b57cec5SDimitry Andric 298*0b57cec5SDimitry Andric protected: 299*0b57cec5SDimitry Andric Tool *getTool(Action::ActionClass AC) const override; 300*0b57cec5SDimitry Andric Tool *buildAssembler() const override; 301*0b57cec5SDimitry Andric Tool *buildLinker() const override; 302*0b57cec5SDimitry Andric 303*0b57cec5SDimitry Andric /// \name ToolChain Implementation Helper Functions 304*0b57cec5SDimitry Andric /// @{ 305*0b57cec5SDimitry Andric 306*0b57cec5SDimitry Andric /// Check whether the target triple's architecture is 64-bits. 307*0b57cec5SDimitry Andric bool isTarget64Bit() const { return getTriple().isArch64Bit(); } 308*0b57cec5SDimitry Andric 309*0b57cec5SDimitry Andric /// Check whether the target triple's architecture is 32-bits. 310*0b57cec5SDimitry Andric bool isTarget32Bit() const { return getTriple().isArch32Bit(); } 311*0b57cec5SDimitry Andric 312*0b57cec5SDimitry Andric // FIXME: This should be final, but the CrossWindows toolchain does weird 313*0b57cec5SDimitry Andric // things that can't be easily generalized. 314*0b57cec5SDimitry Andric void AddClangCXXStdlibIncludeArgs( 315*0b57cec5SDimitry Andric const llvm::opt::ArgList &DriverArgs, 316*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 317*0b57cec5SDimitry Andric 318*0b57cec5SDimitry Andric virtual void 319*0b57cec5SDimitry Andric addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 320*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 321*0b57cec5SDimitry Andric virtual void 322*0b57cec5SDimitry Andric addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 323*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 324*0b57cec5SDimitry Andric 325*0b57cec5SDimitry Andric bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, StringRef GCCTriple, 326*0b57cec5SDimitry Andric StringRef GCCMultiarchTriple, 327*0b57cec5SDimitry Andric StringRef TargetMultiarchTriple, 328*0b57cec5SDimitry Andric Twine IncludeSuffix, 329*0b57cec5SDimitry Andric const llvm::opt::ArgList &DriverArgs, 330*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const; 331*0b57cec5SDimitry Andric 332*0b57cec5SDimitry Andric /// @} 333*0b57cec5SDimitry Andric 334*0b57cec5SDimitry Andric private: 335*0b57cec5SDimitry Andric mutable std::unique_ptr<tools::gcc::Preprocessor> Preprocess; 336*0b57cec5SDimitry Andric mutable std::unique_ptr<tools::gcc::Compiler> Compile; 337*0b57cec5SDimitry Andric }; 338*0b57cec5SDimitry Andric 339*0b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 340*0b57cec5SDimitry Andric virtual void anchor(); 341*0b57cec5SDimitry Andric 342*0b57cec5SDimitry Andric public: 343*0b57cec5SDimitry Andric Generic_ELF(const Driver &D, const llvm::Triple &Triple, 344*0b57cec5SDimitry Andric const llvm::opt::ArgList &Args) 345*0b57cec5SDimitry Andric : Generic_GCC(D, Triple, Args) {} 346*0b57cec5SDimitry Andric 347*0b57cec5SDimitry Andric void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 348*0b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args, 349*0b57cec5SDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 350*0b57cec5SDimitry Andric }; 351*0b57cec5SDimitry Andric 352*0b57cec5SDimitry Andric } // end namespace toolchains 353*0b57cec5SDimitry Andric } // end namespace driver 354*0b57cec5SDimitry Andric } // end namespace clang 355*0b57cec5SDimitry Andric 356*0b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_GNU_H 357