16 #include "llvm/Option/ArgList.h" 17 #include "llvm/Support/Path.h" 22 using llvm::opt::ArgList;
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(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
66 const char *LinkingOutput)
const {
69 const llvm::Triple &
T = TC.getTriple();
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(
"-Bdynamic");
132 CmdArgs.push_back(
"--enable-auto-image-base");
134 CmdArgs.push_back(
"--entry");
135 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
137 EntryPoint.append(
"mainCRTStartup");
139 CmdArgs.push_back(Args.hasArg(options::OPT_static) ?
"-Bstatic" 142 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
143 CmdArgs.push_back(
"--entry");
144 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
151 CmdArgs.push_back(
"--allow-multiple-definition");
153 CmdArgs.push_back(
"-o");
156 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
158 llvm::sys::path::replace_extension(ImpLib,
".lib");
160 CmdArgs.push_back(
"--out-implib");
161 CmdArgs.push_back(Args.MakeArgString(ImpLib));
164 Args.AddAllArgs(CmdArgs, options::OPT_L);
165 TC.AddFilePathLibArgs(Args, CmdArgs);
168 if (TC.ShouldLinkCXXStdlib(Args)) {
169 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
170 !Args.hasArg(options::OPT_static);
172 CmdArgs.push_back(
"-Bstatic");
173 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
175 CmdArgs.push_back(
"-Bdynamic");
178 if (!Args.hasArg(options::OPT_nostdlib)) {
179 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
181 CmdArgs.push_back(
"-lmsvcrt");
186 if (TC.getSanitizerArgs().needsAsanRt()) {
188 if (Args.hasArg(options::OPT_shared)) {
189 CmdArgs.push_back(TC.getCompilerRTArgString(Args,
"asan_dll_thunk"));
191 for (
const auto &Lib : {
"asan_dynamic",
"asan_dynamic_runtime_thunk"})
192 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
195 CmdArgs.push_back(Args.MakeArgString(
"--undefined"));
196 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
197 ?
"___asan_seh_interceptor" 198 :
"__asan_seh_interceptor"));
202 Exec = Args.MakeArgString(TC.GetLinkerPath());
204 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
208 const llvm::Triple &
T,
209 const llvm::opt::ArgList &Args)
215 return getArch() == llvm::Triple::x86_64;
219 return getArch() == llvm::Triple::x86_64;
223 return getArch() == llvm::Triple::x86_64;
227 return getArch() == llvm::Triple::x86_64;
232 llvm::opt::ArgStringList &CC1Args)
const {
234 const std::string &SysRoot = D.
SysRoot;
236 auto AddSystemAfterIncludes = [&]() {
237 for (
const auto &
P : DriverArgs.getAllArgValues(options::OPT_isystem_after))
241 if (DriverArgs.hasArg(options::OPT_nostdinc)) {
242 AddSystemAfterIncludes();
247 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
249 llvm::sys::path::append(ResourceDir,
"include");
252 AddSystemAfterIncludes();
258 llvm::opt::ArgStringList &CC1Args)
const {
261 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
262 DriverArgs.hasArg(options::OPT_nostdincxx))
271 llvm::opt::ArgStringList &CC1Args)
const {
273 CC1Args.push_back(
"-lc++");
278 Res |= SanitizerKind::Address;
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
const FunctionProtoType * T
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.