xref: /freebsd-src/contrib/llvm-project/clang/lib/Driver/ToolChains/MSVC.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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