11 #include "clang/Config/config.h" 17 #include "llvm/Option/ArgList.h" 18 #include "llvm/Support/FileSystem.h" 19 #include "llvm/Support/Path.h" 20 #include "llvm/Support/VirtualFileSystem.h" 25 using namespace clang;
34 const char *LinkingOutput)
const {
39 ArgStringList CmdArgs;
42 Args.ClaimAllArgs(options::OPT_g_Group);
44 Args.ClaimAllArgs(options::OPT_emit_llvm);
47 Args.ClaimAllArgs(options::OPT_w);
49 const char *Exec = Args.MakeArgString(ToolChain.
GetLinkerPath());
50 if (llvm::sys::path::filename(Exec).equals_lower(
"ld.lld") ||
51 llvm::sys::path::stem(Exec).equals_lower(
"ld.lld")) {
52 CmdArgs.push_back(
"-z");
53 CmdArgs.push_back(
"rodynamic");
57 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
59 if (!Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_r))
60 CmdArgs.push_back(
"-pie");
62 if (Args.hasArg(options::OPT_rdynamic))
63 CmdArgs.push_back(
"-export-dynamic");
65 if (Args.hasArg(options::OPT_s))
66 CmdArgs.push_back(
"-s");
68 if (Args.hasArg(options::OPT_r)) {
69 CmdArgs.push_back(
"-r");
71 CmdArgs.push_back(
"--build-id");
72 CmdArgs.push_back(
"--hash-style=gnu");
75 CmdArgs.push_back(
"--eh-frame-hdr");
77 if (Args.hasArg(options::OPT_static))
78 CmdArgs.push_back(
"-Bstatic");
79 else if (Args.hasArg(options::OPT_shared))
80 CmdArgs.push_back(
"-shared");
84 if (!Args.hasArg(options::OPT_shared)) {
89 CmdArgs.push_back(
"-dynamic-linker");
90 CmdArgs.push_back(Args.MakeArgString(Dyld));
93 CmdArgs.push_back(
"-o");
96 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
97 if (!Args.hasArg(options::OPT_shared)) {
98 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"Scrt1.o")));
102 Args.AddAllArgs(CmdArgs, options::OPT_L);
103 Args.AddAllArgs(CmdArgs, options::OPT_u);
108 assert(!Inputs.empty() &&
"Must have at least one input.");
118 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
119 if (Args.hasArg(options::OPT_static))
120 CmdArgs.push_back(
"-Bdynamic");
124 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
125 !Args.hasArg(options::OPT_static);
126 CmdArgs.push_back(
"--push-state");
127 CmdArgs.push_back(
"--as-needed");
128 if (OnlyLibstdcxxStatic)
129 CmdArgs.push_back(
"-Bstatic");
131 if (OnlyLibstdcxxStatic)
132 CmdArgs.push_back(
"-Bdynamic");
133 CmdArgs.push_back(
"-lm");
134 CmdArgs.push_back(
"--pop-state");
138 if (NeedsSanitizerDeps)
146 if (Args.hasArg(options::OPT_pthread) ||
147 Args.hasArg(options::OPT_pthreads))
148 CmdArgs.push_back(
"-lpthread");
150 if (Args.hasArg(options::OPT_fsplit_stack))
151 CmdArgs.push_back(
"--wrap=pthread_create");
153 if (!Args.hasArg(options::OPT_nolibc))
154 CmdArgs.push_back(
"-lc");
157 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
171 llvm::sys::path::append(P,
"lib");
175 auto FilePaths = [&](
const Multilib &M) -> std::vector<std::string> {
176 std::vector<std::string> FP;
180 llvm::sys::path::append(P, M.gccSuffix());
181 FP.push_back(P.str());
190 .flag(
"-fexceptions")
191 .flag(
"+fno-exceptions"));
194 .flag(
"+fsanitize=address"));
197 .flag(
"+fsanitize=address")
198 .flag(
"-fexceptions")
199 .flag(
"+fno-exceptions"));
201 std::vector<std::string> RD = FilePaths(M);
202 return std::all_of(RD.begin(), RD.end(), [&](std::string
P) {
209 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
true),
210 "fexceptions", Flags);
225 return (Triple.getArchName() +
"-" + Triple.getOSName()).str();
233 const ArgList &Args)
const {
234 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_rtlib_EQ)) {
235 StringRef
Value = A->getValue();
236 if (Value !=
"compiler-rt")
238 << A->getAsString(Args);
246 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
247 StringRef
Value = A->getValue();
248 if (Value !=
"libc++")
250 << A->getAsString(Args);
257 ArgStringList &CC1Args,
259 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
260 options::OPT_fno_use_init_array,
true))
261 CC1Args.push_back(
"-fuse-init-array");
265 ArgStringList &CC1Args)
const {
268 if (DriverArgs.hasArg(options::OPT_nostdinc))
271 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
273 llvm::sys::path::append(P,
"include");
277 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
281 StringRef CIncludeDirs(C_INCLUDE_DIRS);
282 if (CIncludeDirs !=
"") {
284 CIncludeDirs.split(dirs,
":");
285 for (StringRef dir : dirs) {
287 llvm::sys::path::is_absolute(dir) ? StringRef(D.
SysRoot) :
"";
295 llvm::sys::path::append(P,
"include");
301 ArgStringList &CC1Args)
const {
302 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
303 DriverArgs.hasArg(options::OPT_nostdincxx))
309 llvm::sys::path::append(P,
"..",
"include",
"c++",
"v1");
315 llvm_unreachable(
"invalid stdlib name");
320 ArgStringList &CmdArgs)
const {
323 CmdArgs.push_back(
"-lc++");
327 llvm_unreachable(
"invalid stdlib name");
333 Res |= SanitizerKind::Address;
334 Res |= SanitizerKind::PointerCompare;
335 Res |= SanitizerKind::PointerSubtract;
336 Res |= SanitizerKind::Fuzzer;
337 Res |= SanitizerKind::FuzzerNoLink;
338 Res |= SanitizerKind::SafeStack;
339 Res |= SanitizerKind::Scudo;
344 return SanitizerKind::SafeStack;
bool isDefault() const
Check whether the default is selected.
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.
std::string DyldPrefix
Dynamic loader prefix, if present.
const IncludeDirsFunc & filePathsCallback() const
LTOKind getLTOMode() const
Get the specific kind of LTO being performed.
DiagnosticBuilder Diag(unsigned DiagID) const
bool select(const Multilib::flags_list &Flags, Multilib &M) const
Pick the best multilib in the set,.
std::string Dir
The path the driver executable was in, as invoked from the command line.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::vector< std::string > flags_list
void push_back(const Multilib &M)
Add a completed Multilib to the set.
void addCommand(std::unique_ptr< Command > C)
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag...
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
MultilibSet & setFilePathsCallback(IncludeDirsFunc F)
Dataflow Directional Tag Classes.
std::string SysRoot
sysroot, if present
Compilation - A set of tasks to perform for a single driver invocation.
MultilibSet & FilterOut(FilterCallback F)
Filter out some subset of the Multilibs using a user defined callback.
bool needsSharedRt() const
std::string ResourceDir
The path to the compiler resource directory.