15 #include "llvm/Option/ArgList.h" 16 #include "llvm/Support/Path.h" 21 using llvm::opt::ArgList;
22 using 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");
58 Exec = Args.MakeArgString(Assembler);
60 C.
addCommand(std::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
66 const char *LinkingOutput)
const {
70 const Driver &D = TC.getDriver();
72 ArgStringList CmdArgs;
76 Args.ClaimAllArgs(options::OPT_g_Group);
78 Args.ClaimAllArgs(options::OPT_emit_llvm);
80 Args.ClaimAllArgs(options::OPT_w);
84 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
86 if (Args.hasArg(options::OPT_pie))
87 CmdArgs.push_back(
"-pie");
88 if (Args.hasArg(options::OPT_rdynamic))
89 CmdArgs.push_back(
"-export-dynamic");
90 if (Args.hasArg(options::OPT_s))
91 CmdArgs.push_back(
"--strip-all");
93 CmdArgs.push_back(
"-m");
94 switch (TC.getArch()) {
96 llvm_unreachable(
"unsupported architecture");
97 case llvm::Triple::arm:
98 case llvm::Triple::thumb:
100 CmdArgs.push_back(
"thumb2pe");
102 case llvm::Triple::aarch64:
103 CmdArgs.push_back(
"arm64pe");
105 case llvm::Triple::x86:
106 CmdArgs.push_back(
"i386pe");
107 EntryPoint.append(
"_");
109 case llvm::Triple::x86_64:
110 CmdArgs.push_back(
"i386pep");
114 if (Args.hasArg(options::OPT_shared)) {
115 switch (T.getArch()) {
117 llvm_unreachable(
"unsupported architecture");
118 case llvm::Triple::aarch64:
119 case llvm::Triple::arm:
120 case llvm::Triple::thumb:
121 case llvm::Triple::x86_64:
122 EntryPoint.append(
"_DllMainCRTStartup");
124 case llvm::Triple::x86:
125 EntryPoint.append(
"_DllMainCRTStartup@12");
129 CmdArgs.push_back(
"-shared");
130 CmdArgs.push_back(Args.hasArg(options::OPT_static) ?
"-Bstatic" 133 CmdArgs.push_back(
"--enable-auto-image-base");
135 CmdArgs.push_back(
"--entry");
136 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
138 EntryPoint.append(
"mainCRTStartup");
140 CmdArgs.push_back(Args.hasArg(options::OPT_static) ?
"-Bstatic" 143 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
144 CmdArgs.push_back(
"--entry");
145 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
152 CmdArgs.push_back(
"--allow-multiple-definition");
154 CmdArgs.push_back(
"-o");
157 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
159 llvm::sys::path::replace_extension(ImpLib,
".lib");
161 CmdArgs.push_back(
"--out-implib");
162 CmdArgs.push_back(Args.MakeArgString(ImpLib));
165 Args.AddAllArgs(CmdArgs, options::OPT_L);
166 TC.AddFilePathLibArgs(Args, CmdArgs);
169 if (TC.ShouldLinkCXXStdlib(Args)) {
170 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
171 !Args.hasArg(options::OPT_static);
173 CmdArgs.push_back(
"-Bstatic");
174 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
176 CmdArgs.push_back(
"-Bdynamic");
179 if (!Args.hasArg(options::OPT_nostdlib)) {
180 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
182 CmdArgs.push_back(
"-lmsvcrt");
187 if (TC.getSanitizerArgs().needsAsanRt()) {
189 if (Args.hasArg(options::OPT_shared)) {
190 CmdArgs.push_back(TC.getCompilerRTArgString(Args,
"asan_dll_thunk"));
192 for (
const auto &Lib : {
"asan_dynamic",
"asan_dynamic_runtime_thunk"})
193 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
196 CmdArgs.push_back(Args.MakeArgString(
"--undefined"));
197 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
198 ?
"___asan_seh_interceptor" 199 :
"__asan_seh_interceptor"));
203 Exec = Args.MakeArgString(TC.GetLinkerPath());
205 C.
addCommand(std::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
209 const llvm::Triple &T,
210 const llvm::opt::ArgList &Args)
216 return getArch() == llvm::Triple::x86_64;
220 return getArch() == llvm::Triple::x86_64;
224 return getArch() == llvm::Triple::x86_64;
228 return getArch() == llvm::Triple::x86_64;
233 llvm::opt::ArgStringList &CC1Args)
const {
235 const std::string &SysRoot = D.
SysRoot;
237 auto AddSystemAfterIncludes = [&]() {
238 for (
const auto &
P : DriverArgs.getAllArgValues(options::OPT_isystem_after))
242 if (DriverArgs.hasArg(options::OPT_nostdinc)) {
243 AddSystemAfterIncludes();
248 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
250 llvm::sys::path::append(ResourceDir,
"include");
253 AddSystemAfterIncludes();
259 llvm::opt::ArgStringList &CC1Args)
const {
262 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
263 DriverArgs.hasArg(options::OPT_nostdincxx))
272 llvm::opt::ArgStringList &CC1Args)
const {
274 CC1Args.push_back(
"-lc++");
279 Res |= SanitizerKind::Address;
280 Res |= SanitizerKind::PointerCompare;
281 Res |= SanitizerKind::PointerSubtract;
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
void addCommand(std::unique_ptr< Command > C)
std::string SysRoot
sysroot, if present
Compilation - A set of tasks to perform for a single driver invocation.
std::string ResourceDir
The path to the compiler resource directory.