16 #include "llvm/Option/ArgList.h"
17 #include "llvm/Support/Path.h"
19 using namespace clang::driver;
20 using namespace clang::driver::toolchains;
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:
40 case llvm::Triple::x86:
41 CmdArgs.push_back(
"--32");
43 case llvm::Triple::x86_64:
44 CmdArgs.push_back(
"--64");
48 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
50 CmdArgs.push_back(
"-o");
53 for (
const auto &
Input : Inputs)
54 CmdArgs.push_back(
Input.getFilename());
56 const std::string
Assembler = TC.GetProgramPath(
"as");
57 Exec = Args.MakeArgString(Assembler);
59 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
65 const char *LinkingOutput)
const {
69 const Driver &D = TC.getDriver();
71 ArgStringList CmdArgs;
75 Args.ClaimAllArgs(options::OPT_g_Group);
77 Args.ClaimAllArgs(options::OPT_emit_llvm);
79 Args.ClaimAllArgs(options::OPT_w);
83 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
85 if (Args.hasArg(options::OPT_pie))
86 CmdArgs.push_back(
"-pie");
87 if (Args.hasArg(options::OPT_rdynamic))
88 CmdArgs.push_back(
"-export-dynamic");
89 if (Args.hasArg(options::OPT_s))
90 CmdArgs.push_back(
"--strip-all");
92 CmdArgs.push_back(
"-m");
93 switch (TC.getArch()) {
95 llvm_unreachable(
"unsupported architecture");
96 case llvm::Triple::arm:
97 case llvm::Triple::thumb:
99 CmdArgs.push_back(
"thumb2pe");
101 case llvm::Triple::x86:
102 CmdArgs.push_back(
"i386pe");
103 EntryPoint.append(
"_");
105 case llvm::Triple::x86_64:
106 CmdArgs.push_back(
"i386pep");
110 if (Args.hasArg(options::OPT_shared)) {
111 switch (T.getArch()) {
113 llvm_unreachable(
"unsupported architecture");
114 case llvm::Triple::arm:
115 case llvm::Triple::thumb:
116 case llvm::Triple::x86_64:
117 EntryPoint.append(
"_DllMainCRTStartup");
119 case llvm::Triple::x86:
120 EntryPoint.append(
"_DllMainCRTStartup@12");
124 CmdArgs.push_back(
"-shared");
125 CmdArgs.push_back(
"-Bdynamic");
127 CmdArgs.push_back(
"--enable-auto-image-base");
129 CmdArgs.push_back(
"--entry");
130 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
132 EntryPoint.append(
"mainCRTStartup");
134 CmdArgs.push_back(Args.hasArg(options::OPT_static) ?
"-Bstatic"
137 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
138 CmdArgs.push_back(
"--entry");
139 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
146 CmdArgs.push_back(
"--allow-multiple-definition");
148 CmdArgs.push_back(
"-o");
151 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
153 llvm::sys::path::replace_extension(ImpLib,
".lib");
155 CmdArgs.push_back(
"--out-implib");
156 CmdArgs.push_back(Args.MakeArgString(ImpLib));
159 Args.AddAllArgs(CmdArgs, options::OPT_L);
160 TC.AddFilePathLibArgs(Args, CmdArgs);
163 if (D.
CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
164 !Args.hasArg(options::OPT_nodefaultlibs)) {
165 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
166 !Args.hasArg(options::OPT_static);
168 CmdArgs.push_back(
"-Bstatic");
169 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
171 CmdArgs.push_back(
"-Bdynamic");
174 if (!Args.hasArg(options::OPT_nostdlib)) {
175 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
177 CmdArgs.push_back(
"-lmsvcrt");
182 if (TC.getSanitizerArgs().needsAsanRt()) {
184 if (Args.hasArg(options::OPT_shared)) {
185 CmdArgs.push_back(TC.getCompilerRTArgString(Args,
"asan_dll_thunk"));
187 for (
const auto &Lib : {
"asan_dynamic",
"asan_dynamic_runtime_thunk"})
188 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
191 CmdArgs.push_back(Args.MakeArgString(
"--undefined"));
192 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
193 ?
"___asan_seh_interceptor"
194 :
"__asan_seh_interceptor"));
198 Exec = Args.MakeArgString(TC.GetLinkerPath());
200 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
204 const llvm::Triple &T,
205 const llvm::opt::ArgList &Args)
208 const std::string &SysRoot = D.
SysRoot;
220 return getArch() == llvm::Triple::x86_64;
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 {
264 const llvm::Triple &Triple =
getTriple();
267 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
268 DriverArgs.hasArg(options::OPT_nostdincxx))
279 SysRoot +
"/usr/include/c++/" + Triple.str());
281 SysRoot +
"/usr/include/c++/backwards");
287 llvm::opt::ArgStringList &CC1Args)
const {
290 CC1Args.push_back(
"-lc++");
293 CC1Args.push_back(
"-lstdc++");
294 CC1Args.push_back(
"-lmingw32");
295 CC1Args.push_back(
"-lmingwex");
296 CC1Args.push_back(
"-lgcc");
297 CC1Args.push_back(
"-lmoldname");
298 CC1Args.push_back(
"-lmingw32");
305 Res |= SanitizerKind::Address;
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
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.