10b57cec5SDimitry Andric //===--- MinGW.h - MinGW 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_MINGW_H 100b57cec5SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MINGW_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "Cuda.h" 130b57cec5SDimitry Andric #include "Gnu.h" 14*7a6dacacSDimitry Andric #include "LazyDetector.h" 155ffd83dbSDimitry Andric #include "ROCm.h" 160b57cec5SDimitry Andric #include "clang/Driver/Tool.h" 170b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h" 185ffd83dbSDimitry Andric #include "llvm/Support/ErrorOr.h" 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric namespace clang { 210b57cec5SDimitry Andric namespace driver { 220b57cec5SDimitry Andric namespace tools { 230b57cec5SDimitry Andric 245f757f3fSDimitry Andric /// Directly call GNU Binutils assembler and linker 250b57cec5SDimitry Andric namespace MinGW { 260b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 270b57cec5SDimitry Andric public: Assembler(const ToolChain & TC)280b57cec5SDimitry Andric Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {} 290b57cec5SDimitry Andric hasIntegratedCPP()300b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 330b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 340b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 350b57cec5SDimitry Andric const char *LinkingOutput) const override; 360b57cec5SDimitry Andric }; 370b57cec5SDimitry Andric 385f757f3fSDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker final : public Tool { 390b57cec5SDimitry Andric public: Linker(const ToolChain & TC)405ffd83dbSDimitry Andric Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {} 410b57cec5SDimitry Andric hasIntegratedCPP()420b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } isLinkJob()430b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 460b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 470b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 480b57cec5SDimitry Andric const char *LinkingOutput) const override; 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric private: 510b57cec5SDimitry Andric void AddLibGCC(const llvm::opt::ArgList &Args, 520b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const; 530b57cec5SDimitry Andric }; 540b57cec5SDimitry Andric } // end namespace MinGW 550b57cec5SDimitry Andric } // end namespace tools 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric namespace toolchains { 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY MinGW : public ToolChain { 600b57cec5SDimitry Andric public: 610b57cec5SDimitry Andric MinGW(const Driver &D, const llvm::Triple &Triple, 620b57cec5SDimitry Andric const llvm::opt::ArgList &Args); 630b57cec5SDimitry Andric 64349cc55cSDimitry Andric static void fixTripleArch(const Driver &D, llvm::Triple &Triple, 65349cc55cSDimitry Andric const llvm::opt::ArgList &Args); 66349cc55cSDimitry Andric 670b57cec5SDimitry Andric bool HasNativeLLVMSupport() const override; 680b57cec5SDimitry Andric 69bdd1243dSDimitry Andric UnwindTableLevel 70bdd1243dSDimitry Andric getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; 710b57cec5SDimitry Andric bool isPICDefault() const override; 72349cc55cSDimitry Andric bool isPIEDefault(const llvm::opt::ArgList &Args) const override; 730b57cec5SDimitry Andric bool isPICDefaultForced() const override; 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric SanitizerMask getSupportedSanitizers() const override; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric llvm::ExceptionHandling GetExceptionModel( 780b57cec5SDimitry Andric const llvm::opt::ArgList &Args) const override; 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric void 810b57cec5SDimitry Andric AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 820b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 83bdd1243dSDimitry Andric void 84bdd1243dSDimitry Andric addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 85bdd1243dSDimitry Andric llvm::opt::ArgStringList &CC1Args, 86bdd1243dSDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 870b57cec5SDimitry Andric void AddClangCXXStdlibIncludeArgs( 880b57cec5SDimitry Andric const llvm::opt::ArgList &DriverArgs, 890b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 900b57cec5SDimitry Andric 910b57cec5SDimitry Andric void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, 920b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 935ffd83dbSDimitry Andric void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, 945ffd83dbSDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric void printVerboseInfo(raw_ostream &OS) const override; 970b57cec5SDimitry Andric GetDefaultDwarfVersion()98d56accc7SDimitry Andric unsigned GetDefaultDwarfVersion() const override { return 4; } 99d56accc7SDimitry Andric 1000b57cec5SDimitry Andric protected: 1010b57cec5SDimitry Andric Tool *getTool(Action::ActionClass AC) const override; 1020b57cec5SDimitry Andric Tool *buildLinker() const override; 1030b57cec5SDimitry Andric Tool *buildAssembler() const override; 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric private: 106*7a6dacacSDimitry Andric LazyDetector<CudaInstallationDetector> CudaInstallation; 107*7a6dacacSDimitry Andric LazyDetector<RocmInstallationDetector> RocmInstallation; 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric std::string Base; 1100b57cec5SDimitry Andric std::string GccLibDir; 111753f127fSDimitry Andric clang::driver::toolchains::Generic_GCC::GCCVersion GccVer; 1120b57cec5SDimitry Andric std::string Ver; 113349cc55cSDimitry Andric std::string SubdirName; 114bdd1243dSDimitry Andric std::string TripleDirName; 1150b57cec5SDimitry Andric mutable std::unique_ptr<tools::gcc::Preprocessor> Preprocessor; 1160b57cec5SDimitry Andric mutable std::unique_ptr<tools::gcc::Compiler> Compiler; 117bdd1243dSDimitry Andric void findGccLibDir(const llvm::Triple &LiteralTriple); 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric bool NativeLLVMSupport; 1200b57cec5SDimitry Andric }; 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric } // end namespace toolchains 1230b57cec5SDimitry Andric } // end namespace driver 1240b57cec5SDimitry Andric } // end namespace clang 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MINGW_H 127