10b57cec5SDimitry Andric //===--- MSVC.h - MSVC 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_MSVC_H 100b57cec5SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MSVC_H 110b57cec5SDimitry Andric 125ffd83dbSDimitry Andric #include "AMDGPU.h" 130b57cec5SDimitry Andric #include "Cuda.h" 147a6dacacSDimitry Andric #include "LazyDetector.h" 150b57cec5SDimitry Andric #include "clang/Driver/Compilation.h" 160b57cec5SDimitry Andric #include "clang/Driver/Tool.h" 170b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h" 1806c3fb27SDimitry Andric #include "llvm/Frontend/Debug/Options.h" 1981ad6265SDimitry Andric #include "llvm/WindowsDriver/MSVCPaths.h" 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric namespace clang { 220b57cec5SDimitry Andric namespace driver { 230b57cec5SDimitry Andric namespace tools { 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric /// Visual studio tools. 260b57cec5SDimitry Andric namespace visualstudio { 275f757f3fSDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker final : public Tool { 280b57cec5SDimitry Andric public: 295ffd83dbSDimitry Andric Linker(const ToolChain &TC) : Tool("visualstudio::Linker", "linker", TC) {} 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 320b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 350b57cec5SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 360b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 370b57cec5SDimitry Andric const char *LinkingOutput) const override; 380b57cec5SDimitry Andric }; 390b57cec5SDimitry Andric } // end namespace visualstudio 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric } // end namespace tools 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric namespace toolchains { 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { 460b57cec5SDimitry Andric public: 470b57cec5SDimitry Andric MSVCToolChain(const Driver &D, const llvm::Triple &Triple, 480b57cec5SDimitry Andric const llvm::opt::ArgList &Args); 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric llvm::opt::DerivedArgList * 510b57cec5SDimitry Andric TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, 520b57cec5SDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 530b57cec5SDimitry Andric 54bdd1243dSDimitry Andric UnwindTableLevel 55bdd1243dSDimitry Andric getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; 560b57cec5SDimitry Andric bool isPICDefault() const override; 57349cc55cSDimitry Andric bool isPIEDefault(const llvm::opt::ArgList &Args) const override; 580b57cec5SDimitry Andric bool isPICDefaultForced() const override; 590b57cec5SDimitry Andric 60a7dea167SDimitry Andric /// Set CodeView as the default debug info format for non-MachO binary 61a7dea167SDimitry Andric /// formats, and to DWARF otherwise. Users can use -gcodeview and -gdwarf to 62a7dea167SDimitry Andric /// override the default. 6306c3fb27SDimitry Andric llvm::codegenoptions::DebugInfoFormat getDefaultDebugFormat() const override { 64*0fca6ea1SDimitry Andric return getTriple().isOSBinFormatCOFF() ? llvm::codegenoptions::DIF_CodeView 65*0fca6ea1SDimitry Andric : llvm::codegenoptions::DIF_DWARF; 660b57cec5SDimitry Andric } 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric /// Set the debugger tuning to "default", since we're definitely not tuning 690b57cec5SDimitry Andric /// for GDB. 700b57cec5SDimitry Andric llvm::DebuggerKind getDefaultDebuggerTuning() const override { 710b57cec5SDimitry Andric return llvm::DebuggerKind::Default; 720b57cec5SDimitry Andric } 730b57cec5SDimitry Andric 7404eeddc0SDimitry Andric unsigned GetDefaultDwarfVersion() const override { 7504eeddc0SDimitry Andric return 4; 7604eeddc0SDimitry Andric } 7704eeddc0SDimitry Andric 7881ad6265SDimitry Andric std::string getSubDirectoryPath(llvm::SubDirectoryType Type, 7981ad6265SDimitry Andric llvm::StringRef SubdirParent = "") const; 8081ad6265SDimitry Andric std::string getSubDirectoryPath(llvm::SubDirectoryType Type, 810b57cec5SDimitry Andric llvm::Triple::ArchType TargetArch) const; 820b57cec5SDimitry Andric 8381ad6265SDimitry Andric bool getIsVS2017OrNewer() const { 8481ad6265SDimitry Andric return VSLayout == llvm::ToolsetLayout::VS2017OrNewer; 850b57cec5SDimitry Andric } 860b57cec5SDimitry Andric 870b57cec5SDimitry Andric void 880b57cec5SDimitry Andric AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 890b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 900b57cec5SDimitry Andric void AddClangCXXStdlibIncludeArgs( 910b57cec5SDimitry Andric const llvm::opt::ArgList &DriverArgs, 920b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, 950b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 960b57cec5SDimitry Andric 975ffd83dbSDimitry Andric void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, 985ffd83dbSDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 995ffd83dbSDimitry Andric 10081ad6265SDimitry Andric void AddHIPRuntimeLibArgs(const llvm::opt::ArgList &Args, 10181ad6265SDimitry Andric llvm::opt::ArgStringList &CmdArgs) const override; 10281ad6265SDimitry Andric 103fe6060f1SDimitry Andric bool getWindowsSDKLibraryPath( 104fe6060f1SDimitry Andric const llvm::opt::ArgList &Args, std::string &path) const; 105fe6060f1SDimitry Andric bool getUniversalCRTLibraryPath(const llvm::opt::ArgList &Args, 106fe6060f1SDimitry Andric std::string &path) const; 1070b57cec5SDimitry Andric bool useUniversalCRT() const; 1080b57cec5SDimitry Andric VersionTuple 1090b57cec5SDimitry Andric computeMSVCVersion(const Driver *D, 1100b57cec5SDimitry Andric const llvm::opt::ArgList &Args) const override; 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 1130b57cec5SDimitry Andric types::ID InputType) const override; 1140b57cec5SDimitry Andric SanitizerMask getSupportedSanitizers() const override; 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andric void printVerboseInfo(raw_ostream &OS) const override; 1170b57cec5SDimitry Andric 1180b57cec5SDimitry Andric bool FoundMSVCInstall() const { return !VCToolChainPath.empty(); } 1190b57cec5SDimitry Andric 120fe6060f1SDimitry Andric void 121fe6060f1SDimitry Andric addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 122fe6060f1SDimitry Andric llvm::opt::ArgStringList &CC1Args, 123fe6060f1SDimitry Andric Action::OffloadKind DeviceOffloadKind) const override; 124fe6060f1SDimitry Andric 1250b57cec5SDimitry Andric protected: 1260b57cec5SDimitry Andric void AddSystemIncludeWithSubfolder(const llvm::opt::ArgList &DriverArgs, 1270b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args, 1280b57cec5SDimitry Andric const std::string &folder, 1290b57cec5SDimitry Andric const Twine &subfolder1, 1300b57cec5SDimitry Andric const Twine &subfolder2 = "", 1310b57cec5SDimitry Andric const Twine &subfolder3 = "") const; 1320b57cec5SDimitry Andric 1330b57cec5SDimitry Andric Tool *buildLinker() const override; 1340b57cec5SDimitry Andric Tool *buildAssembler() const override; 1350b57cec5SDimitry Andric private: 136bdd1243dSDimitry Andric std::optional<llvm::StringRef> WinSdkDir, WinSdkVersion, WinSysRoot; 1370b57cec5SDimitry Andric std::string VCToolChainPath; 13881ad6265SDimitry Andric llvm::ToolsetLayout VSLayout = llvm::ToolsetLayout::OlderVS; 1397a6dacacSDimitry Andric LazyDetector<CudaInstallationDetector> CudaInstallation; 1407a6dacacSDimitry Andric LazyDetector<RocmInstallationDetector> RocmInstallation; 1410b57cec5SDimitry Andric }; 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric } // end namespace toolchains 1440b57cec5SDimitry Andric } // end namespace driver 1450b57cec5SDimitry Andric } // end namespace clang 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MSVC_H 148