clang 24.0.0git
Cygwin.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "Cygwin.h"
10#include "clang/Config/config.h"
13#include "clang/Driver/Driver.h"
15#include "llvm/Support/Path.h"
16#include "llvm/Support/VirtualFileSystem.h"
17
18using namespace clang::driver;
19using namespace clang::driver::toolchains;
20using namespace clang;
21using namespace llvm::opt;
22
24
25Cygwin::Cygwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
26 : Generic_GCC(D, Triple, Args) {
27 GCCInstallation.init(Triple, Args);
28 std::string SysRoot = computeSysRoot();
30
32
33 path_list &Paths = getFilePaths();
34 if (GCCInstallation.isValid())
35 Paths.push_back(GCCInstallation.getInstallPath().str());
36
37 Generic_GCC::AddMultiarchPaths(D, SysRoot, "lib", Paths);
38
39 // Similar to the logic for GCC above, if we are currently running Clang
40 // inside of the requested system root, add its parent library path to those
41 // searched.
42 // FIXME: It's not clear whether we should use the driver's installed
43 // directory ('Dir' below) or the ResourceDir.
44 if (StringRef(D.Dir).starts_with(SysRoot))
45 addPathIfExists(D, D.Dir + "/../lib", Paths);
46
47 addPathIfExists(D, SysRoot + "/lib", Paths);
48 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
49 addPathIfExists(D, SysRoot + "/usr/lib/w32api", Paths);
50}
51
52llvm::ExceptionHandling Cygwin::GetExceptionModel(const ArgList &Args) const {
53 if (getArch() == llvm::Triple::x86_64 || getArch() == llvm::Triple::aarch64 ||
54 getArch() == llvm::Triple::arm || getArch() == llvm::Triple::thumb)
55 return llvm::ExceptionHandling::WinEH;
56 return llvm::ExceptionHandling::DwarfCFI;
57}
58
59void Cygwin::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
60 ArgStringList &CC1Args) const {
61 const Driver &D = getDriver();
62 std::string SysRoot = computeSysRoot();
63
64 if (DriverArgs.hasArg(options::OPT_nostdinc))
65 return;
66
67 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
68 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
69
70 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
71 SmallString<128> P(D.ResourceDir);
72 llvm::sys::path::append(P, "include");
73 addSystemInclude(DriverArgs, CC1Args, P);
74 }
75
76 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
77 return;
78
79 // Check for configure-time C include directories.
80 StringRef CIncludeDirs(C_INCLUDE_DIRS);
81 if (CIncludeDirs != "") {
83 CIncludeDirs.split(Dirs, ":");
84 for (StringRef Dir : Dirs) {
85 StringRef Prefix =
86 llvm::sys::path::is_absolute(Dir) ? "" : StringRef(SysRoot);
87 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + Dir);
88 }
89 return;
90 }
91
92 // Lacking those, try to detect the correct set of system includes for the
93 // target triple.
94
95 AddMultilibIncludeArgs(DriverArgs, CC1Args);
96
97 // On systems using multiarch, add /usr/include/$triple before
98 // /usr/include.
99 std::string MultiarchIncludeDir = getTriple().str();
100 if (!MultiarchIncludeDir.empty() &&
101 D.getVFS().exists(SysRoot + "/usr/include/" + MultiarchIncludeDir))
102 addExternCSystemInclude(DriverArgs, CC1Args,
103 SysRoot + "/usr/include/" + MultiarchIncludeDir);
104
105 // Add an include of '/include' directly. This isn't provided by default by
106 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
107 // add even when Clang is acting as-if it were a system compiler.
108 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
109
110 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
111 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/w32api");
112}
113
115 const ArgList &DriverArgs, ArgStringList &CC1Args, BoundArch BA,
116 Action::OffloadKind DeviceOffloadKind) const {
117 CC1Args.push_back("-fno-use-init-array");
118}
119
121 const InputInfo &Output,
122 const InputInfoList &Inputs,
123 const ArgList &Args,
124 const char *LinkingOutput) const {
125 const auto &ToolChain = getToolChain();
126 const Driver &D = ToolChain.getDriver();
127
128 const bool IsStatic = Args.hasArg(options::OPT_static);
129
130 ArgStringList CmdArgs;
131
132 // Silence warning for "clang -g foo.o -o foo"
133 Args.ClaimAllArgs(options::OPT_g_Group);
134 // and "clang -emit-llvm foo.o -o foo"
135 Args.ClaimAllArgs(options::OPT_emit_llvm);
136 // and for "clang -w foo.o -o foo". Other warning options are already
137 // handled somewhere else.
138 Args.ClaimAllArgs(options::OPT_w);
139
140 if (!D.SysRoot.empty())
141 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
142
143 if (Args.hasArg(options::OPT_s))
144 CmdArgs.push_back("-s");
145
146 CmdArgs.push_back("-m");
147 switch (ToolChain.getArch()) {
148 case llvm::Triple::x86:
149 CmdArgs.push_back("i386pe");
150 break;
151 case llvm::Triple::x86_64:
152 CmdArgs.push_back("i386pep");
153 break;
154 case llvm::Triple::arm:
155 case llvm::Triple::thumb:
156 // FIXME: this is incorrect for WinCE
157 CmdArgs.push_back("thumb2pe");
158 break;
159 case llvm::Triple::aarch64:
160 if (Args.hasArg(options::OPT_marm64x))
161 CmdArgs.push_back("arm64xpe");
162 else if (ToolChain.getEffectiveTriple().isWindowsArm64EC())
163 CmdArgs.push_back("arm64ecpe");
164 else
165 CmdArgs.push_back("arm64pe");
166 break;
167 case llvm::Triple::mipsel:
168 CmdArgs.push_back("mipspe");
169 break;
170 default:
171 D.Diag(diag::err_target_unknown_triple)
172 << ToolChain.getEffectiveTriple().str();
173 }
174
175 Arg *SubsysArg =
176 Args.getLastArg(options::OPT_mwindows, options::OPT_mconsole);
177 if (SubsysArg && SubsysArg->getOption().matches(options::OPT_mwindows)) {
178 CmdArgs.push_back("--subsystem");
179 CmdArgs.push_back("windows");
180 } else if (SubsysArg &&
181 SubsysArg->getOption().matches(options::OPT_mconsole)) {
182 CmdArgs.push_back("--subsystem");
183 CmdArgs.push_back("console");
184 }
185
186 if (ToolChain.getTriple().isArch32Bit()) {
187 CmdArgs.push_back("--wrap=_Znwj");
188 CmdArgs.push_back("--wrap=_Znaj");
189 CmdArgs.push_back("--wrap=_ZdlPv");
190 CmdArgs.push_back("--wrap=_ZdaPv");
191 CmdArgs.push_back("--wrap=_ZnwjRKSt9nothrow_t");
192 CmdArgs.push_back("--wrap=_ZnajRKSt9nothrow_t");
193 CmdArgs.push_back("--wrap=_ZdlPvRKSt9nothrow_t");
194 CmdArgs.push_back("--wrap=_ZdaPvRKSt9nothrow_t");
195 } else {
196 CmdArgs.push_back("--wrap=_Znwm");
197 CmdArgs.push_back("--wrap=_Znam");
198 CmdArgs.push_back("--wrap=_ZdlPv");
199 CmdArgs.push_back("--wrap=_ZdaPv");
200 CmdArgs.push_back("--wrap=_ZnwmRKSt9nothrow_t");
201 CmdArgs.push_back("--wrap=_ZnamRKSt9nothrow_t");
202 CmdArgs.push_back("--wrap=_ZdlPvRKSt9nothrow_t");
203 CmdArgs.push_back("--wrap=_ZdaPvRKSt9nothrow_t");
204 }
205
206 if (Args.hasArg(options::OPT_mdll))
207 CmdArgs.push_back("--dll");
208 else if (Args.hasArg(options::OPT_shared))
209 CmdArgs.push_back("--shared");
210 if (Args.hasArg(options::OPT_static))
211 CmdArgs.push_back("-Bstatic");
212 else
213 CmdArgs.push_back("-Bdynamic");
214
215 CmdArgs.push_back("--dll-search-prefix=cyg");
216 if (Args.hasArg(options::OPT_rdynamic))
217 CmdArgs.push_back("--export-all-symbols");
218
219 // Cygwin-specific linker options for executables (matching GCC behavior).
220 // These flags must be set on the main executable header rather than DLLs.
221 if (!Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_mdll)) {
222 // 32-bit Cygwin relies heavily on a predictable memory layout to emulate
223 // fork(). Enabling '--large-address-aware' expands the virtual address
224 // space, reducing 'unable to remap' fatal errors during fork().
225 if (ToolChain.getTriple().isArch32Bit())
226 CmdArgs.push_back("--large-address-aware");
227 // Mark as Terminal Server Aware to prevent legacy Windows loader from
228 // applying file/registry virtualization, which breaks POSIX path
229 // expectations.
230 CmdArgs.push_back("--tsaware");
231 }
232
233 CmdArgs.push_back("-o");
234 // GCC implicitly adds an .exe extension if it is given an output file name
235 // that lacks an extension.
236 // GCC used to do this only when the compiler itself runs on windows, but
237 // since GCC 8 it does the same when cross compiling as well.
238 if (const char *OutputFile = Output.getFilename();
239 !llvm::sys::path::has_extension(OutputFile))
240 CmdArgs.push_back(Args.MakeArgString(Twine(OutputFile) + ".exe"));
241 else
242 CmdArgs.push_back(OutputFile);
243
244 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
245 options::OPT_r)) {
246 const bool IsShared = Args.hasArg(options::OPT_shared);
247 if (Args.hasArg(options::OPT_mdll) || IsShared) {
248 CmdArgs.push_back("-e");
249 CmdArgs.push_back(ToolChain.getArch() == llvm::Triple::x86
250 ? "__cygwin_dll_entry@12"
251 : "_cygwin_dll_entry");
252 CmdArgs.push_back("--enable-auto-image-base");
253 }
254
255 if (!Args.hasArg(options::OPT_mdll) && !IsShared)
256 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
257 if (IsShared)
258 CmdArgs.push_back(
259 Args.MakeArgString(ToolChain.GetFilePath("crtbeginS.o")));
260 else
261 CmdArgs.push_back(
262 Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
263
264 // Add crtfastmath.o if available and fast math is enabled.
266 }
267
268 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
269
270 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
271
272 if (auto LTO = ToolChain.getLTOMode(Args); LTO != LTOK_None)
273 tools::addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs,
274 LTO == LTOK_Thin);
275
276 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
277 CmdArgs.push_back("--no-demangle");
278
279 // Default. Can be overridden by the user by explicitly
280 // passing an option after this one.
281 if (ToolChain.getTriple().isArch64Bit())
282 CmdArgs.push_back("--disable-high-entropy-va");
283 CmdArgs.push_back("--disable-nxcompat");
284
285 bool NeedsSanitizerDeps =
286 tools::addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
287 bool NeedsXRayDeps = tools::addXRayRuntime(ToolChain, Args, CmdArgs);
289 tools::AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
290
291 // The profile runtime also needs access to system libraries.
292 getToolChain().addProfileRTLibs(Args, CmdArgs);
293
294 if (D.CCCIsCXX() &&
295 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
296 options::OPT_r)) {
297 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
298 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
299 !Args.hasArg(options::OPT_static);
300 if (OnlyLibstdcxxStatic)
301 CmdArgs.push_back("-Bstatic");
302 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
303 if (OnlyLibstdcxxStatic)
304 CmdArgs.push_back("-Bdynamic");
305 }
306 CmdArgs.push_back("-lm");
307 }
308
309 // Silence warnings when linking C code with a C++ '-stdlib' argument.
310 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
311
312 // Additional linker set-up and flags for Fortran. This is required in order
313 // to generate executables. As Fortran runtime depends on the C runtime,
314 // these dependencies need to be listed before the C runtime below (i.e.
315 // AddRunTimeLibs).
316 if (D.IsFlangMode() &&
317 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
319 ToolChain.addFortranRuntimeLibs(Args, CmdArgs);
320 CmdArgs.push_back("-lm");
321 }
322
323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_r)) {
324 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
325 if (IsStatic)
326 CmdArgs.push_back("--start-group");
327
328 if (NeedsSanitizerDeps)
330
331 if (NeedsXRayDeps)
333
334 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
335 Args.hasArg(options::OPT_pthreads);
336
337 // Use the static OpenMP runtime with -static-openmp
338 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
339 !Args.hasArg(options::OPT_static);
340
341 // FIXME: Only pass GompNeedsRT = true for platforms with libgomp that
342 // require librt. Most modern Linux platforms do, but some may not.
343 if (tools::addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP,
345 /* GompNeedsRT= */ true))
346 // OpenMP runtimes implies pthreads when using the GNU toolchain.
347 // FIXME: Does this really make sense for all GNU toolchains?
348 WantPthread = true;
349
350 tools::AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
351
352 if (WantPthread)
353 CmdArgs.push_back("-lpthread");
354
355 if (Args.hasArg(options::OPT_fsplit_stack))
356 CmdArgs.push_back("--wrap=pthread_create");
357
358 if (!Args.hasArg(options::OPT_nolibc))
359 CmdArgs.push_back("-lc");
360
361 // Cygwin specific
362 CmdArgs.push_back("-lcygwin");
363 if (Args.hasArg(options::OPT_mwindows)) {
364 CmdArgs.push_back("-lgdi32");
365 CmdArgs.push_back("-lcomdlg32");
366 }
367 CmdArgs.push_back("-ladvapi32");
368 CmdArgs.push_back("-lshell32");
369 CmdArgs.push_back("-luser32");
370 CmdArgs.push_back("-lkernel32");
371
372 if (IsStatic)
373 CmdArgs.push_back("--end-group");
374 else
375 tools::AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
376 }
377
378 if (!Args.hasArg(options::OPT_nostartfiles)) {
379 if (!Args.hasArg(options::OPT_mdll, options::OPT_shared)) {
380 if (auto O = ToolChain.GetFilePathIfExists("default-manifest.o"))
381 CmdArgs.push_back(Args.MakeArgString(std::move(*O)));
382 }
383 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
384 }
385 }
386
387 Args.addAllArgs(CmdArgs, {options::OPT_T, options::OPT_t});
388
389 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
390 C.addCommand(std::make_unique<Command>(JA, *this,
392 Exec, CmdArgs, Inputs, Output));
393}
394
395auto Cygwin::buildLinker() const -> Tool * { return new cygwin::Linker(*this); }
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
Definition Action.h:223
Compilation - A set of tasks to perform for a single driver invocation.
Definition Compilation.h:46
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Definition Driver.h:93
std::string SysRoot
sysroot, if present
Definition Driver.h:193
DiagnosticBuilder Diag(unsigned DiagID) const
Definition Driver.h:157
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
Definition Driver.h:233
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
Definition Driver.h:220
InputInfo - Wrapper for information about an input source.
Definition InputInfo.h:22
const char * getFilename() const
Definition InputInfo.h:83
ToolChain - Access to tools for a single platform.
Definition ToolChain.h:92
static void addSystemInclude(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const Twine &Path)
Utility function to add a system include directory to CC1 arguments.
virtual std::string computeSysRoot() const
Return the sysroot, possibly searching for a default sysroot using target-specific logic.
bool ShouldLinkCXXStdlib(const llvm::opt::ArgList &Args) const
Returns if the C++ standard library should be linked in.
static void addExternCSystemInclude(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const Twine &Path)
Utility function to add a system include directory with extern "C" semantics to CC1 arguments.
virtual void addFortranRuntimeLibraryPath(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
Adds the path for the Fortran runtime libraries to CmdArgs.
std::string GetFilePath(const char *Name) const
virtual void addFortranRuntimeLibs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
Adds Fortran runtime libraries to CmdArgs.
path_list & getFilePaths()
Definition ToolChain.h:322
llvm::Triple::ArchType getArch() const
Definition ToolChain.h:298
const Driver & getDriver() const
Definition ToolChain.h:282
bool addFastMathRuntimeIfAvailable(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
AddFastMathRuntimeIfAvailable - If a runtime library exists that sets global flags for unsafe floatin...
path_list & getProgramPaths()
Definition ToolChain.h:325
virtual LTOKind getLTOMode(const llvm::opt::ArgList &Args, Action::OffloadKind Kind=Action::OFK_None) const
Resolve the requested LTO mode for this toolchain.
const llvm::Triple & getEffectiveTriple() const
Get the toolchain's effective clang triple.
Definition ToolChain.h:310
virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
AddCXXStdlibLibArgs - Add the system specific linker arguments to use for the given C++ standard libr...
const llvm::Triple & getTriple() const
Definition ToolChain.h:284
virtual void addProfileRTLibs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
addProfileRTLibs - When -fprofile-instr-profile is specified, try to pass a suitable profile runtime ...
std::string GetLinkerPath(bool *LinkerIsLLD=nullptr) const
Returns the linker path, respecting the -fuse-ld= argument to determine the linker suffix or name.
virtual void AddFilePathLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
AddFilePathLibArgs - Add each thing in getFilePaths() as a "-L" option.
std::optional< std::string > GetFilePathIfExists(const char *Name) const
SmallVector< std::string, 16 > path_list
Definition ToolChain.h:94
Tool - Information on a specific compilation tool.
Definition Tool.h:32
const ToolChain & getToolChain() const
Definition Tool.h:52
llvm::ExceptionHandling GetExceptionModel(const llvm::opt::ArgList &Args) const override
GetExceptionModel - Return the tool chain exception model.
Definition Cygwin.cpp:52
void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
Add the clang cc1 arguments for system include paths.
Definition Cygwin.cpp:59
Tool * buildLinker() const override
Definition Cygwin.cpp:395
Cygwin(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args)
Definition Cygwin.cpp:25
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, BoundArch BA, Action::OffloadKind DeviceOffloadKind) const override
Add options that need to be passed to cc1 for this target.
Definition Cygwin.cpp:114
void PushPPaths(ToolChain::path_list &PPaths)
Definition Gnu.cpp:3137
Generic_GCC(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args)
Definition Gnu.cpp:3046
GCCInstallationDetector GCCInstallation
Definition Gnu.h:357
void AddMultilibIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
Definition Gnu.cpp:3232
void AddMultiarchPaths(const Driver &D, const std::string &SysRoot, const std::string &OSLibDir, path_list &Paths)
Definition Gnu.cpp:3217
void ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const override
ConstructJob - Construct jobs to perform the action JA, writing to Output and with Inputs,...
Definition Cygwin.cpp:120
bool addSanitizerRuntimes(const ToolChain &TC, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, Compilation &C)
void addLTOOptions(const ToolChain &ToolChain, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, const InputInfo &Output, const InputInfoList &Inputs, bool IsThinLTO)
void linkXRayRuntimeDeps(const ToolChain &TC, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs)
void AddRunTimeLibs(const ToolChain &TC, const Driver &D, llvm::opt::ArgStringList &CmdArgs, const llvm::opt::ArgList &Args)
void linkSanitizerRuntimeDeps(const ToolChain &TC, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs)
bool addXRayRuntime(const ToolChain &TC, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs)
void addPathIfExists(const Driver &D, const Twine &Path, ToolChain::path_list &Paths)
void addLinkerCompressDebugSectionsOption(const ToolChain &TC, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs)
bool addOpenMPRuntime(const Compilation &C, llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, const llvm::opt::ArgList &Args, bool ForceStaticHostRuntime=false, bool IsOffloadingHost=false, bool GompNeedsRT=false)
Returns true, if an OpenMP runtime has been added.
void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, const JobAction &JA)
SmallVector< InputInfo, 4 > InputInfoList
Definition Driver.h:49
Top level wrappers for InstallAPI frontend operations.
Represents a bound architecture for offload / multiple architecture compilation.
static constexpr ResponseFileSupport AtFileCurCP()
Definition Job.h:93