16 #include "llvm/Option/ArgList.h" 17 #include "llvm/Support/Path.h" 22 using llvm::opt::ArgList;
23 using llvm::opt::ArgStringList;
28 const char *LinkingOutput)
const {
32 ArgStringList CmdArgs;
35 switch (TC.getArch()) {
37 llvm_unreachable(
"unsupported architecture");
38 case llvm::Triple::arm:
39 case llvm::Triple::thumb:
40 case llvm::Triple::aarch64:
42 case llvm::Triple::x86:
43 CmdArgs.push_back(
"--32");
45 case llvm::Triple::x86_64:
46 CmdArgs.push_back(
"--64");
50 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
52 CmdArgs.push_back(
"-o");
55 for (
const auto &Input : Inputs)
56 CmdArgs.push_back(Input.getFilename());
58 const std::string
Assembler = TC.GetProgramPath(
"as");
59 Exec = Args.MakeArgString(Assembler);
61 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
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().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(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
210 const llvm::Triple &T,
211 const llvm::opt::ArgList &Args)
217 return getArch() == llvm::Triple::x86_64;
221 return getArch() == llvm::Triple::x86_64;
225 return getArch() == llvm::Triple::x86_64;
229 return getArch() == llvm::Triple::x86_64;
234 llvm::opt::ArgStringList &CC1Args)
const {
236 const std::string &SysRoot = D.
SysRoot;
238 auto AddSystemAfterIncludes = [&]() {
239 for (
const auto &
P : DriverArgs.getAllArgValues(options::OPT_isystem_after))
243 if (DriverArgs.hasArg(options::OPT_nostdinc)) {
244 AddSystemAfterIncludes();
249 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
251 llvm::sys::path::append(ResourceDir,
"include");
254 AddSystemAfterIncludes();
260 llvm::opt::ArgStringList &CC1Args)
const {
263 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
264 DriverArgs.hasArg(options::OPT_nostdincxx))
273 llvm::opt::ArgStringList &CC1Args)
const {
275 CC1Args.push_back(
"-lc++");
280 Res |= SanitizerKind::Address;
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.