xref: /openbsd-src/gnu/llvm/clang/lib/Driver/ToolChains/MSVC.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
1e5dd7070Spatrick //===--- MSVC.h - MSVC ToolChain Implementations ----------------*- C++ -*-===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick 
9e5dd7070Spatrick #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MSVC_H
10e5dd7070Spatrick #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MSVC_H
11e5dd7070Spatrick 
12ec727ea7Spatrick #include "AMDGPU.h"
13e5dd7070Spatrick #include "Cuda.h"
14e5dd7070Spatrick #include "clang/Basic/DebugInfoOptions.h"
15e5dd7070Spatrick #include "clang/Driver/Compilation.h"
16e5dd7070Spatrick #include "clang/Driver/Tool.h"
17e5dd7070Spatrick #include "clang/Driver/ToolChain.h"
18*12c85518Srobert #include "llvm/WindowsDriver/MSVCPaths.h"
19e5dd7070Spatrick 
20e5dd7070Spatrick namespace clang {
21e5dd7070Spatrick namespace driver {
22e5dd7070Spatrick namespace tools {
23e5dd7070Spatrick 
24e5dd7070Spatrick /// Visual studio tools.
25e5dd7070Spatrick namespace visualstudio {
26e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
27e5dd7070Spatrick public:
Linker(const ToolChain & TC)28ec727ea7Spatrick   Linker(const ToolChain &TC) : Tool("visualstudio::Linker", "linker", TC) {}
29e5dd7070Spatrick 
hasIntegratedCPP()30e5dd7070Spatrick   bool hasIntegratedCPP() const override { return false; }
isLinkJob()31e5dd7070Spatrick   bool isLinkJob() const override { return true; }
32e5dd7070Spatrick 
33e5dd7070Spatrick   void ConstructJob(Compilation &C, const JobAction &JA,
34e5dd7070Spatrick                     const InputInfo &Output, const InputInfoList &Inputs,
35e5dd7070Spatrick                     const llvm::opt::ArgList &TCArgs,
36e5dd7070Spatrick                     const char *LinkingOutput) const override;
37e5dd7070Spatrick };
38e5dd7070Spatrick } // end namespace visualstudio
39e5dd7070Spatrick 
40e5dd7070Spatrick } // end namespace tools
41e5dd7070Spatrick 
42e5dd7070Spatrick namespace toolchains {
43e5dd7070Spatrick 
44e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain {
45e5dd7070Spatrick public:
46e5dd7070Spatrick   MSVCToolChain(const Driver &D, const llvm::Triple &Triple,
47e5dd7070Spatrick                 const llvm::opt::ArgList &Args);
48e5dd7070Spatrick 
49e5dd7070Spatrick   llvm::opt::DerivedArgList *
50e5dd7070Spatrick   TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
51e5dd7070Spatrick                 Action::OffloadKind DeviceOffloadKind) const override;
52e5dd7070Spatrick 
53e5dd7070Spatrick   bool IsIntegratedAssemblerDefault() const override;
54*12c85518Srobert   UnwindTableLevel
55*12c85518Srobert   getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override;
56e5dd7070Spatrick   bool isPICDefault() const override;
57*12c85518Srobert   bool isPIEDefault(const llvm::opt::ArgList &Args) const override;
58e5dd7070Spatrick   bool isPICDefaultForced() const override;
59e5dd7070Spatrick 
60e5dd7070Spatrick   /// Set CodeView as the default debug info format for non-MachO binary
61e5dd7070Spatrick   /// formats, and to DWARF otherwise. Users can use -gcodeview and -gdwarf to
62e5dd7070Spatrick   /// override the default.
getDefaultDebugFormat()63e5dd7070Spatrick   codegenoptions::DebugInfoFormat getDefaultDebugFormat() const override {
64e5dd7070Spatrick     return getTriple().isOSBinFormatMachO() ? codegenoptions::DIF_DWARF
65e5dd7070Spatrick                                             : codegenoptions::DIF_CodeView;
66e5dd7070Spatrick   }
67e5dd7070Spatrick 
68e5dd7070Spatrick   /// Set the debugger tuning to "default", since we're definitely not tuning
69e5dd7070Spatrick   /// for GDB.
getDefaultDebuggerTuning()70e5dd7070Spatrick   llvm::DebuggerKind getDefaultDebuggerTuning() const override {
71e5dd7070Spatrick     return llvm::DebuggerKind::Default;
72e5dd7070Spatrick   }
73e5dd7070Spatrick 
GetDefaultDwarfVersion()74*12c85518Srobert   unsigned GetDefaultDwarfVersion() const override {
75*12c85518Srobert     return 4;
76e5dd7070Spatrick   }
77e5dd7070Spatrick 
78*12c85518Srobert   std::string getSubDirectoryPath(llvm::SubDirectoryType Type,
79*12c85518Srobert                                   llvm::StringRef SubdirParent = "") const;
80*12c85518Srobert   std::string getSubDirectoryPath(llvm::SubDirectoryType Type,
81*12c85518Srobert                                   llvm::Triple::ArchType TargetArch) const;
82*12c85518Srobert 
getIsVS2017OrNewer()83*12c85518Srobert   bool getIsVS2017OrNewer() const {
84*12c85518Srobert     return VSLayout == llvm::ToolsetLayout::VS2017OrNewer;
85*12c85518Srobert   }
86e5dd7070Spatrick 
87e5dd7070Spatrick   void
88e5dd7070Spatrick   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
89e5dd7070Spatrick                             llvm::opt::ArgStringList &CC1Args) const override;
90e5dd7070Spatrick   void AddClangCXXStdlibIncludeArgs(
91e5dd7070Spatrick       const llvm::opt::ArgList &DriverArgs,
92e5dd7070Spatrick       llvm::opt::ArgStringList &CC1Args) const override;
93e5dd7070Spatrick 
94e5dd7070Spatrick   void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,
95e5dd7070Spatrick                           llvm::opt::ArgStringList &CC1Args) const override;
96e5dd7070Spatrick 
97ec727ea7Spatrick   void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs,
98ec727ea7Spatrick                          llvm::opt::ArgStringList &CC1Args) const override;
99ec727ea7Spatrick 
100*12c85518Srobert   void AddHIPRuntimeLibArgs(const llvm::opt::ArgList &Args,
101*12c85518Srobert                             llvm::opt::ArgStringList &CmdArgs) const override;
102*12c85518Srobert 
103a9ac8606Spatrick   bool getWindowsSDKLibraryPath(
104a9ac8606Spatrick       const llvm::opt::ArgList &Args, std::string &path) const;
105a9ac8606Spatrick   bool getUniversalCRTLibraryPath(const llvm::opt::ArgList &Args,
106a9ac8606Spatrick                                   std::string &path) const;
107e5dd7070Spatrick   bool useUniversalCRT() const;
108e5dd7070Spatrick   VersionTuple
109e5dd7070Spatrick   computeMSVCVersion(const Driver *D,
110e5dd7070Spatrick                      const llvm::opt::ArgList &Args) const override;
111e5dd7070Spatrick 
112e5dd7070Spatrick   std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
113e5dd7070Spatrick                                           types::ID InputType) const override;
114e5dd7070Spatrick   SanitizerMask getSupportedSanitizers() const override;
115e5dd7070Spatrick 
116e5dd7070Spatrick   void printVerboseInfo(raw_ostream &OS) const override;
117e5dd7070Spatrick 
FoundMSVCInstall()118e5dd7070Spatrick   bool FoundMSVCInstall() const { return !VCToolChainPath.empty(); }
119e5dd7070Spatrick 
120a9ac8606Spatrick   void
121a9ac8606Spatrick   addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
122a9ac8606Spatrick                         llvm::opt::ArgStringList &CC1Args,
123a9ac8606Spatrick                         Action::OffloadKind DeviceOffloadKind) const override;
124a9ac8606Spatrick 
125e5dd7070Spatrick protected:
126e5dd7070Spatrick   void AddSystemIncludeWithSubfolder(const llvm::opt::ArgList &DriverArgs,
127e5dd7070Spatrick                                      llvm::opt::ArgStringList &CC1Args,
128e5dd7070Spatrick                                      const std::string &folder,
129e5dd7070Spatrick                                      const Twine &subfolder1,
130e5dd7070Spatrick                                      const Twine &subfolder2 = "",
131e5dd7070Spatrick                                      const Twine &subfolder3 = "") const;
132e5dd7070Spatrick 
133e5dd7070Spatrick   Tool *buildLinker() const override;
134e5dd7070Spatrick   Tool *buildAssembler() const override;
135e5dd7070Spatrick private:
136*12c85518Srobert   std::optional<llvm::StringRef> WinSdkDir, WinSdkVersion, WinSysRoot;
137e5dd7070Spatrick   std::string VCToolChainPath;
138*12c85518Srobert   llvm::ToolsetLayout VSLayout = llvm::ToolsetLayout::OlderVS;
139e5dd7070Spatrick   CudaInstallationDetector CudaInstallation;
140ec727ea7Spatrick   RocmInstallationDetector RocmInstallation;
141e5dd7070Spatrick };
142e5dd7070Spatrick 
143e5dd7070Spatrick } // end namespace toolchains
144e5dd7070Spatrick } // end namespace driver
145e5dd7070Spatrick } // end namespace clang
146e5dd7070Spatrick 
147e5dd7070Spatrick #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MSVC_H
148