15#include "llvm/Option/ArgList.h"
16#include "llvm/Support/Path.h"
21using llvm::opt::ArgList;
22using llvm::opt::ArgStringList;
27 const char *LinkingOutput)
const {
31 ArgStringList CmdArgs;
34 switch (TC.getArch()) {
36 llvm_unreachable(
"unsupported architecture");
37 case llvm::Triple::arm:
38 case llvm::Triple::thumb:
39 case llvm::Triple::aarch64:
41 case llvm::Triple::x86:
42 CmdArgs.push_back(
"--32");
44 case llvm::Triple::x86_64:
45 CmdArgs.push_back(
"--64");
49 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
51 CmdArgs.push_back(
"-o");
54 for (
const auto &Input : Inputs)
55 CmdArgs.push_back(Input.getFilename());
57 const std::string
Assembler = TC.GetProgramPath(
"as");
61 Exec, CmdArgs, Inputs, Output));
67 const char *LinkingOutput)
const {
71 const Driver &D = TC.getDriver();
73 ArgStringList CmdArgs;
77 Args.ClaimAllArgs(options::OPT_g_Group);
79 Args.ClaimAllArgs(options::OPT_emit_llvm);
81 Args.ClaimAllArgs(options::OPT_w);
85 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
87 if (Args.hasArg(options::OPT_pie))
88 CmdArgs.push_back(
"-pie");
89 if (Args.hasArg(options::OPT_rdynamic))
90 CmdArgs.push_back(
"-export-dynamic");
91 if (Args.hasArg(options::OPT_s))
92 CmdArgs.push_back(
"--strip-all");
94 CmdArgs.push_back(
"-m");
95 switch (TC.getArch()) {
97 llvm_unreachable(
"unsupported architecture");
98 case llvm::Triple::arm:
99 case llvm::Triple::thumb:
101 CmdArgs.push_back(
"thumb2pe");
103 case llvm::Triple::aarch64:
104 CmdArgs.push_back(
"arm64pe");
106 case llvm::Triple::x86:
107 CmdArgs.push_back(
"i386pe");
108 EntryPoint.append(
"_");
110 case llvm::Triple::x86_64:
111 CmdArgs.push_back(
"i386pep");
115 if (Args.hasArg(options::OPT_shared)) {
116 switch (T.getArch()) {
118 llvm_unreachable(
"unsupported architecture");
119 case llvm::Triple::aarch64:
120 case llvm::Triple::arm:
121 case llvm::Triple::thumb:
122 case llvm::Triple::x86_64:
123 EntryPoint.append(
"_DllMainCRTStartup");
125 case llvm::Triple::x86:
126 EntryPoint.append(
"_DllMainCRTStartup@12");
130 CmdArgs.push_back(
"-shared");
131 CmdArgs.push_back(Args.hasArg(options::OPT_static) ?
"-Bstatic"
134 CmdArgs.push_back(
"--enable-auto-image-base");
136 CmdArgs.push_back(
"--entry");
137 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
139 EntryPoint.append(
"mainCRTStartup");
141 CmdArgs.push_back(Args.hasArg(options::OPT_static) ?
"-Bstatic"
144 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
145 CmdArgs.push_back(
"--entry");
146 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
153 CmdArgs.push_back(
"--allow-multiple-definition");
155 CmdArgs.push_back(
"-o");
158 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
160 llvm::sys::path::replace_extension(ImpLib,
".lib");
162 CmdArgs.push_back(
"--out-implib");
163 CmdArgs.push_back(Args.MakeArgString(ImpLib));
166 Args.AddAllArgs(CmdArgs, options::OPT_L);
167 TC.AddFilePathLibArgs(Args, CmdArgs);
170 if (TC.ShouldLinkCXXStdlib(Args)) {
171 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
172 !Args.hasArg(options::OPT_static);
174 CmdArgs.push_back(
"-Bstatic");
175 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
177 CmdArgs.push_back(
"-Bdynamic");
180 if (!Args.hasArg(options::OPT_nostdlib)) {
181 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
183 CmdArgs.push_back(
"-lmsvcrt");
188 if (TC.getSanitizerArgs(Args).needsAsanRt()) {
190 if (Args.hasArg(options::OPT_shared)) {
191 CmdArgs.push_back(TC.getCompilerRTArgString(Args,
"asan_dll_thunk"));
193 for (
const auto &Lib : {
"asan_dynamic",
"asan_dynamic_runtime_thunk"})
194 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
197 CmdArgs.push_back(Args.MakeArgString(
"--undefined"));
198 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
199 ?
"___asan_seh_interceptor"
200 :
"__asan_seh_interceptor"));
204 Exec = Args.MakeArgString(TC.GetLinkerPath());
206 C.addCommand(std::make_unique<Command>(JA, *
this,
208 Exec, CmdArgs, Inputs, Output));
212 const llvm::Triple &T,
213 const llvm::opt::ArgList &Args)
224 return getArch() == llvm::Triple::x86_64;
228 return getArch() == llvm::Triple::x86_64;
232 return getArch() == llvm::Triple::x86_64;
237 llvm::opt::ArgStringList &CC1Args)
const {
239 const std::string &SysRoot = D.
SysRoot;
241 auto AddSystemAfterIncludes = [&]() {
242 for (
const auto &
P : DriverArgs.getAllArgValues(options::OPT_isystem_after))
246 if (DriverArgs.hasArg(options::OPT_nostdinc)) {
247 AddSystemAfterIncludes();
252 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
254 llvm::sys::path::append(ResourceDir,
"include");
257 AddSystemAfterIncludes();
263 llvm::opt::ArgStringList &CC1Args)
const {
266 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
267 DriverArgs.hasArg(options::OPT_nostdincxx))
276 llvm::opt::ArgStringList &CmdArgs)
const {
278 CmdArgs.push_back(
"-lc++");
279 if (Args.hasArg(options::OPT_fexperimental_library))
280 CmdArgs.push_back(
"-lc++experimental");
286 Res |= SanitizerKind::Address;
287 Res |= SanitizerKind::PointerCompare;
288 Res |= SanitizerKind::PointerSubtract;
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
std::string ResourceDir
The path to the compiler resource directory.
@ C
Languages that the frontend can parse and compile.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()