blob: 7823a5bbeccc472e0d28cdc890aa9586acdab3bf [file] [log] [blame]
David L. Jonesf561aba2017-03-08 01:02:16 +00001//===--- Gnu.cpp - Gnu Tool and ToolChain Implementations -------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Gnu.h"
11#include "Linux.h"
12#include "Arch/ARM.h"
13#include "Arch/Mips.h"
Nemanja Ivanovicf88f81c2017-07-27 08:58:28 +000014#include "Arch/PPC.h"
David L. Jonesf561aba2017-03-08 01:02:16 +000015#include "Arch/Sparc.h"
16#include "Arch/SystemZ.h"
17#include "CommonArgs.h"
18#include "clang/Basic/VirtualFileSystem.h"
19#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
20#include "clang/Driver/Compilation.h"
21#include "clang/Driver/Driver.h"
22#include "clang/Driver/DriverDiagnostic.h"
23#include "clang/Driver/Options.h"
24#include "clang/Driver/Tool.h"
25#include "llvm/Option/ArgList.h"
26#include "llvm/Support/CodeGen.h"
27#include "llvm/Support/Path.h"
28#include "llvm/Support/TargetParser.h"
29#include <system_error>
30
31using namespace clang::driver;
32using namespace clang::driver::toolchains;
33using namespace clang;
34using namespace llvm::opt;
35
36void tools::GnuTool::anchor() {}
37
38static bool forwardToGCC(const Option &O) {
39 // Don't forward inputs from the original command line. They are added from
40 // InputInfoList.
41 return O.getKind() != Option::InputClass &&
42 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
43}
44
45void tools::gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
46 const InputInfo &Output,
47 const InputInfoList &Inputs,
48 const ArgList &Args,
49 const char *LinkingOutput) const {
50 const Driver &D = getToolChain().getDriver();
51 ArgStringList CmdArgs;
52
53 for (const auto &A : Args) {
54 if (forwardToGCC(A->getOption())) {
55 // It is unfortunate that we have to claim here, as this means
56 // we will basically never report anything interesting for
57 // platforms using a generic gcc, even if we are just using gcc
58 // to get to the assembler.
59 A->claim();
60
61 // Don't forward any -g arguments to assembly steps.
62 if (isa<AssembleJobAction>(JA) &&
63 A->getOption().matches(options::OPT_g_Group))
64 continue;
65
66 // Don't forward any -W arguments to assembly and link steps.
67 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
68 A->getOption().matches(options::OPT_W_Group))
69 continue;
70
71 A->render(Args, CmdArgs);
72 }
73 }
74
75 RenderExtraToolArgs(JA, CmdArgs);
76
77 // If using a driver driver, force the arch.
78 if (getToolChain().getTriple().isOSDarwin()) {
79 CmdArgs.push_back("-arch");
80 CmdArgs.push_back(
81 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
82 }
83
84 // Try to force gcc to match the tool chain we want, if we recognize
85 // the arch.
86 //
87 // FIXME: The triple class should directly provide the information we want
88 // here.
89 switch (getToolChain().getArch()) {
90 default:
91 break;
92 case llvm::Triple::x86:
93 case llvm::Triple::ppc:
94 CmdArgs.push_back("-m32");
95 break;
96 case llvm::Triple::x86_64:
97 case llvm::Triple::ppc64:
98 case llvm::Triple::ppc64le:
99 CmdArgs.push_back("-m64");
100 break;
101 case llvm::Triple::sparcel:
102 CmdArgs.push_back("-EL");
103 break;
104 }
105
106 if (Output.isFilename()) {
107 CmdArgs.push_back("-o");
108 CmdArgs.push_back(Output.getFilename());
109 } else {
110 assert(Output.isNothing() && "Unexpected output");
111 CmdArgs.push_back("-fsyntax-only");
112 }
113
114 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
115
116 // Only pass -x if gcc will understand it; otherwise hope gcc
117 // understands the suffix correctly. The main use case this would go
118 // wrong in is for linker inputs if they happened to have an odd
119 // suffix; really the only way to get this to happen is a command
120 // like '-x foobar a.c' which will treat a.c like a linker input.
121 //
122 // FIXME: For the linker case specifically, can we safely convert
123 // inputs into '-Wl,' options?
124 for (const auto &II : Inputs) {
125 // Don't try to pass LLVM or AST inputs to a generic gcc.
126 if (types::isLLVMIR(II.getType()))
127 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
128 << getToolChain().getTripleString();
129 else if (II.getType() == types::TY_AST)
130 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
131 else if (II.getType() == types::TY_ModuleFile)
132 D.Diag(diag::err_drv_no_module_support)
133 << getToolChain().getTripleString();
134
135 if (types::canTypeBeUserSpecified(II.getType())) {
136 CmdArgs.push_back("-x");
137 CmdArgs.push_back(types::getTypeName(II.getType()));
138 }
139
140 if (II.isFilename())
141 CmdArgs.push_back(II.getFilename());
142 else {
143 const Arg &A = II.getInputArg();
144
145 // Reverse translate some rewritten options.
146 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
147 CmdArgs.push_back("-lstdc++");
148 continue;
149 }
150
151 // Don't render as input, we need gcc to do the translations.
152 A.render(Args, CmdArgs);
153 }
154 }
155
156 const std::string &customGCCName = D.getCCCGenericGCCName();
157 const char *GCCName;
158 if (!customGCCName.empty())
159 GCCName = customGCCName.c_str();
160 else if (D.CCCIsCXX()) {
161 GCCName = "g++";
162 } else
163 GCCName = "gcc";
164
165 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
166 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
167}
168
169void tools::gcc::Preprocessor::RenderExtraToolArgs(
170 const JobAction &JA, ArgStringList &CmdArgs) const {
171 CmdArgs.push_back("-E");
172}
173
174void tools::gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
175 ArgStringList &CmdArgs) const {
176 const Driver &D = getToolChain().getDriver();
177
178 switch (JA.getType()) {
179 // If -flto, etc. are present then make sure not to force assembly output.
180 case types::TY_LLVM_IR:
181 case types::TY_LTO_IR:
182 case types::TY_LLVM_BC:
183 case types::TY_LTO_BC:
184 CmdArgs.push_back("-c");
185 break;
186 // We assume we've got an "integrated" assembler in that gcc will produce an
187 // object file itself.
188 case types::TY_Object:
189 CmdArgs.push_back("-c");
190 break;
191 case types::TY_PP_Asm:
192 CmdArgs.push_back("-S");
193 break;
194 case types::TY_Nothing:
195 CmdArgs.push_back("-fsyntax-only");
196 break;
197 default:
198 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
199 }
200}
201
202void tools::gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
203 ArgStringList &CmdArgs) const {
204 // The types are (hopefully) good enough.
205}
206
207/// Add OpenMP linker script arguments at the end of the argument list so that
208/// the fat binary is built by embedding each of the device images into the
209/// host. The linker script also defines a few symbols required by the code
210/// generation so that the images can be easily retrieved at runtime by the
211/// offloading library. This should be used only in tool chains that support
212/// linker scripts.
213static void AddOpenMPLinkerScript(const ToolChain &TC, Compilation &C,
214 const InputInfo &Output,
215 const InputInfoList &Inputs,
216 const ArgList &Args, ArgStringList &CmdArgs,
217 const JobAction &JA) {
218
219 // If this is not an OpenMP host toolchain, we don't need to do anything.
220 if (!JA.isHostOffloading(Action::OFK_OpenMP))
221 return;
222
223 // Create temporary linker script. Keep it if save-temps is enabled.
224 const char *LKS;
225 SmallString<256> Name = llvm::sys::path::filename(Output.getFilename());
226 if (C.getDriver().isSaveTempsEnabled()) {
227 llvm::sys::path::replace_extension(Name, "lk");
228 LKS = C.getArgs().MakeArgString(Name.c_str());
229 } else {
230 llvm::sys::path::replace_extension(Name, "");
231 Name = C.getDriver().GetTemporaryPath(Name, "lk");
232 LKS = C.addTempFile(C.getArgs().MakeArgString(Name.c_str()));
233 }
234
235 // Add linker script option to the command.
236 CmdArgs.push_back("-T");
237 CmdArgs.push_back(LKS);
238
239 // Create a buffer to write the contents of the linker script.
240 std::string LksBuffer;
241 llvm::raw_string_ostream LksStream(LksBuffer);
242
243 // Get the OpenMP offload tool chains so that we can extract the triple
244 // associated with each device input.
245 auto OpenMPToolChains = C.getOffloadToolChains<Action::OFK_OpenMP>();
246 assert(OpenMPToolChains.first != OpenMPToolChains.second &&
247 "No OpenMP toolchains??");
248
249 // Track the input file name and device triple in order to build the script,
250 // inserting binaries in the designated sections.
251 SmallVector<std::pair<std::string, const char *>, 8> InputBinaryInfo;
252
253 // Add commands to embed target binaries. We ensure that each section and
254 // image is 16-byte aligned. This is not mandatory, but increases the
255 // likelihood of data to be aligned with a cache block in several main host
256 // machines.
257 LksStream << "/*\n";
258 LksStream << " OpenMP Offload Linker Script\n";
259 LksStream << " *** Automatically generated by Clang ***\n";
260 LksStream << "*/\n";
261 LksStream << "TARGET(binary)\n";
262 auto DTC = OpenMPToolChains.first;
263 for (auto &II : Inputs) {
264 const Action *A = II.getAction();
265 // Is this a device linking action?
266 if (A && isa<LinkJobAction>(A) &&
267 A->isDeviceOffloading(Action::OFK_OpenMP)) {
268 assert(DTC != OpenMPToolChains.second &&
269 "More device inputs than device toolchains??");
270 InputBinaryInfo.push_back(std::make_pair(
271 DTC->second->getTriple().normalize(), II.getFilename()));
272 ++DTC;
273 LksStream << "INPUT(" << II.getFilename() << ")\n";
274 }
275 }
276
277 assert(DTC == OpenMPToolChains.second &&
278 "Less device inputs than device toolchains??");
279
280 LksStream << "SECTIONS\n";
281 LksStream << "{\n";
David L. Jonesf561aba2017-03-08 01:02:16 +0000282
Alexey Bataev9780faa2017-05-30 18:57:51 +0000283 // Put each target binary into a separate section.
284 for (const auto &BI : InputBinaryInfo) {
285 LksStream << " .omp_offloading." << BI.first << " :\n";
286 LksStream << " ALIGN(0x10)\n";
287 LksStream << " {\n";
David L. Jonesf561aba2017-03-08 01:02:16 +0000288 LksStream << " PROVIDE_HIDDEN(.omp_offloading.img_start." << BI.first
289 << " = .);\n";
290 LksStream << " " << BI.second << "\n";
291 LksStream << " PROVIDE_HIDDEN(.omp_offloading.img_end." << BI.first
292 << " = .);\n";
Alexey Bataev9780faa2017-05-30 18:57:51 +0000293 LksStream << " }\n";
David L. Jonesf561aba2017-03-08 01:02:16 +0000294 }
295
David L. Jonesf561aba2017-03-08 01:02:16 +0000296 // Add commands to define host entries begin and end. We use 1-byte subalign
297 // so that the linker does not add any padding and the elements in this
298 // section form an array.
299 LksStream << " .omp_offloading.entries :\n";
300 LksStream << " ALIGN(0x10)\n";
301 LksStream << " SUBALIGN(0x01)\n";
302 LksStream << " {\n";
303 LksStream << " PROVIDE_HIDDEN(.omp_offloading.entries_begin = .);\n";
304 LksStream << " *(.omp_offloading.entries)\n";
305 LksStream << " PROVIDE_HIDDEN(.omp_offloading.entries_end = .);\n";
306 LksStream << " }\n";
307 LksStream << "}\n";
308 LksStream << "INSERT BEFORE .data\n";
309 LksStream.flush();
310
311 // Dump the contents of the linker script if the user requested that. We
312 // support this option to enable testing of behavior with -###.
313 if (C.getArgs().hasArg(options::OPT_fopenmp_dump_offload_linker_script))
314 llvm::errs() << LksBuffer;
315
316 // If this is a dry run, do not create the linker script file.
317 if (C.getArgs().hasArg(options::OPT__HASH_HASH_HASH))
318 return;
319
320 // Open script file and write the contents.
321 std::error_code EC;
322 llvm::raw_fd_ostream Lksf(LKS, EC, llvm::sys::fs::F_None);
323
324 if (EC) {
325 C.getDriver().Diag(clang::diag::err_unable_to_make_temp) << EC.message();
326 return;
327 }
328
329 Lksf << LksBuffer;
330}
331
332static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args,
333 ArgStringList &CmdArgs) {
334 if (Args.hasFlag(options::OPT_fxray_instrument,
335 options::OPT_fnoxray_instrument, false)) {
336 CmdArgs.push_back("-whole-archive");
337 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray", false));
338 CmdArgs.push_back("-no-whole-archive");
339 return true;
340 }
341 return false;
342}
343
344static void linkXRayRuntimeDeps(const ToolChain &TC, const ArgList &Args,
345 ArgStringList &CmdArgs) {
346 CmdArgs.push_back("--no-as-needed");
347 CmdArgs.push_back("-lpthread");
348 CmdArgs.push_back("-lrt");
349 CmdArgs.push_back("-lm");
Jonas Hahnfeld34120d62017-03-08 12:06:44 +0000350
David L. Jonesf561aba2017-03-08 01:02:16 +0000351 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
352 CmdArgs.push_back("-ldl");
353}
354
355static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
356 switch (T.getArch()) {
357 case llvm::Triple::x86:
358 if (T.isOSIAMCU())
359 return "elf_iamcu";
360 return "elf_i386";
361 case llvm::Triple::aarch64:
362 return "aarch64linux";
363 case llvm::Triple::aarch64_be:
364 return "aarch64_be_linux";
365 case llvm::Triple::arm:
366 case llvm::Triple::thumb:
367 return "armelf_linux_eabi";
368 case llvm::Triple::armeb:
369 case llvm::Triple::thumbeb:
370 return "armelfb_linux_eabi";
371 case llvm::Triple::ppc:
372 return "elf32ppclinux";
373 case llvm::Triple::ppc64:
374 return "elf64ppc";
375 case llvm::Triple::ppc64le:
376 return "elf64lppc";
377 case llvm::Triple::sparc:
378 case llvm::Triple::sparcel:
379 return "elf32_sparc";
380 case llvm::Triple::sparcv9:
381 return "elf64_sparc";
382 case llvm::Triple::mips:
383 return "elf32btsmip";
384 case llvm::Triple::mipsel:
385 return "elf32ltsmip";
386 case llvm::Triple::mips64:
387 if (tools::mips::hasMipsAbiArg(Args, "n32"))
388 return "elf32btsmipn32";
389 return "elf64btsmip";
390 case llvm::Triple::mips64el:
391 if (tools::mips::hasMipsAbiArg(Args, "n32"))
392 return "elf32ltsmipn32";
393 return "elf64ltsmip";
394 case llvm::Triple::systemz:
395 return "elf64_s390";
396 case llvm::Triple::x86_64:
397 if (T.getEnvironment() == llvm::Triple::GNUX32)
398 return "elf32_x86_64";
399 return "elf_x86_64";
400 default:
401 return nullptr;
402 }
403}
404
405void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
406 const InputInfo &Output,
407 const InputInfoList &Inputs,
408 const ArgList &Args,
409 const char *LinkingOutput) const {
410 const toolchains::Linux &ToolChain =
411 static_cast<const toolchains::Linux &>(getToolChain());
412 const Driver &D = ToolChain.getDriver();
413
414 const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
415
416 const llvm::Triple::ArchType Arch = ToolChain.getArch();
417 const bool isAndroid = ToolChain.getTriple().isAndroid();
418 const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
419 const bool IsPIE =
420 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
421 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
422 const bool HasCRTBeginEndFiles =
423 ToolChain.getTriple().hasEnvironment() ||
424 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
425
426 ArgStringList CmdArgs;
427
428 // Silence warning for "clang -g foo.o -o foo"
429 Args.ClaimAllArgs(options::OPT_g_Group);
430 // and "clang -emit-llvm foo.o -o foo"
431 Args.ClaimAllArgs(options::OPT_emit_llvm);
432 // and for "clang -w foo.o -o foo". Other warning options are already
433 // handled somewhere else.
434 Args.ClaimAllArgs(options::OPT_w);
435
436 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
437 if (llvm::sys::path::stem(Exec) == "lld") {
438 CmdArgs.push_back("-flavor");
439 CmdArgs.push_back("old-gnu");
440 CmdArgs.push_back("-target");
441 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
442 }
443
444 if (!D.SysRoot.empty())
445 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
446
447 if (IsPIE)
448 CmdArgs.push_back("-pie");
449
450 if (Args.hasArg(options::OPT_rdynamic))
451 CmdArgs.push_back("-export-dynamic");
452
453 if (Args.hasArg(options::OPT_s))
454 CmdArgs.push_back("-s");
455
456 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
457 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
458
459 // Most Android ARM64 targets should enable the linker fix for erratum
460 // 843419. Only non-Cortex-A53 devices are allowed to skip this flag.
461 if (Arch == llvm::Triple::aarch64 && isAndroid) {
462 std::string CPU = getCPUName(Args, Triple);
463 if (CPU.empty() || CPU == "generic" || CPU == "cortex-a53")
464 CmdArgs.push_back("--fix-cortex-a53-843419");
465 }
466
467 for (const auto &Opt : ToolChain.ExtraOpts)
468 CmdArgs.push_back(Opt.c_str());
469
470 if (!Args.hasArg(options::OPT_static)) {
471 CmdArgs.push_back("--eh-frame-hdr");
472 }
473
474 if (const char *LDMOption = getLDMOption(ToolChain.getTriple(), Args)) {
475 CmdArgs.push_back("-m");
476 CmdArgs.push_back(LDMOption);
477 } else {
478 D.Diag(diag::err_target_unknown_triple) << Triple.str();
479 return;
480 }
481
482 if (Args.hasArg(options::OPT_static)) {
483 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
484 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
485 CmdArgs.push_back("-Bstatic");
486 else
487 CmdArgs.push_back("-static");
488 } else if (Args.hasArg(options::OPT_shared)) {
489 CmdArgs.push_back("-shared");
490 }
491
492 if (!Args.hasArg(options::OPT_static)) {
493 if (Args.hasArg(options::OPT_rdynamic))
494 CmdArgs.push_back("-export-dynamic");
495
496 if (!Args.hasArg(options::OPT_shared)) {
497 const std::string Loader =
498 D.DyldPrefix + ToolChain.getDynamicLinker(Args);
499 CmdArgs.push_back("-dynamic-linker");
500 CmdArgs.push_back(Args.MakeArgString(Loader));
501 }
502 }
503
504 CmdArgs.push_back("-o");
505 CmdArgs.push_back(Output.getFilename());
506
507 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
508 if (!isAndroid && !IsIAMCU) {
509 const char *crt1 = nullptr;
510 if (!Args.hasArg(options::OPT_shared)) {
511 if (Args.hasArg(options::OPT_pg))
512 crt1 = "gcrt1.o";
513 else if (IsPIE)
514 crt1 = "Scrt1.o";
515 else
516 crt1 = "crt1.o";
517 }
518 if (crt1)
519 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
520
521 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
522 }
523
524 if (IsIAMCU)
525 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
526 else {
527 const char *crtbegin;
528 if (Args.hasArg(options::OPT_static))
529 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
530 else if (Args.hasArg(options::OPT_shared))
531 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
532 else if (IsPIE)
533 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
534 else
535 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
536
537 if (HasCRTBeginEndFiles)
538 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
539 }
540
541 // Add crtfastmath.o if available and fast math is enabled.
542 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
543 }
544
545 Args.AddAllArgs(CmdArgs, options::OPT_L);
546 Args.AddAllArgs(CmdArgs, options::OPT_u);
547
548 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
549
550 if (D.isUsingLTO())
551 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin, D);
552
553 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
554 CmdArgs.push_back("--no-demangle");
555
556 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
557 bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
558 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
559 // The profile runtime also needs access to system libraries.
560 getToolChain().addProfileRTLibs(Args, CmdArgs);
561
562 if (D.CCCIsCXX() &&
563 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Nico Weber0ee47d92017-07-25 18:02:57 +0000564 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
565 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
566 !Args.hasArg(options::OPT_static);
567 if (OnlyLibstdcxxStatic)
568 CmdArgs.push_back("-Bstatic");
569 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
570 if (OnlyLibstdcxxStatic)
571 CmdArgs.push_back("-Bdynamic");
572 }
David L. Jonesf561aba2017-03-08 01:02:16 +0000573 CmdArgs.push_back("-lm");
574 }
575 // Silence warnings when linking C code with a C++ '-stdlib' argument.
576 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
577
578 if (!Args.hasArg(options::OPT_nostdlib)) {
579 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
580 if (Args.hasArg(options::OPT_static))
581 CmdArgs.push_back("--start-group");
582
583 if (NeedsSanitizerDeps)
584 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
585
586 if (NeedsXRayDeps)
587 linkXRayRuntimeDeps(ToolChain, Args, CmdArgs);
588
589 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
590 Args.hasArg(options::OPT_pthreads);
591
Jonas Hahnfeld8ea76fa2017-04-19 13:55:39 +0000592 // FIXME: Only pass GompNeedsRT = true for platforms with libgomp that
593 // require librt. Most modern Linux platforms do, but some may not.
594 if (addOpenMPRuntime(CmdArgs, ToolChain, Args,
595 JA.isHostOffloading(Action::OFK_OpenMP),
596 /* GompNeedsRT= */ true))
David L. Jonesf561aba2017-03-08 01:02:16 +0000597 // OpenMP runtimes implies pthreads when using the GNU toolchain.
598 // FIXME: Does this really make sense for all GNU toolchains?
599 WantPthread = true;
600
David L. Jonesf561aba2017-03-08 01:02:16 +0000601 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
602
603 if (WantPthread && !isAndroid)
604 CmdArgs.push_back("-lpthread");
605
606 if (Args.hasArg(options::OPT_fsplit_stack))
607 CmdArgs.push_back("--wrap=pthread_create");
608
609 CmdArgs.push_back("-lc");
610
611 // Add IAMCU specific libs, if needed.
612 if (IsIAMCU)
613 CmdArgs.push_back("-lgloss");
614
615 if (Args.hasArg(options::OPT_static))
616 CmdArgs.push_back("--end-group");
617 else
618 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
619
620 // Add IAMCU specific libs (outside the group), if needed.
621 if (IsIAMCU) {
622 CmdArgs.push_back("--as-needed");
623 CmdArgs.push_back("-lsoftfp");
624 CmdArgs.push_back("--no-as-needed");
625 }
626 }
627
628 if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) {
629 const char *crtend;
630 if (Args.hasArg(options::OPT_shared))
631 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
632 else if (IsPIE)
633 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
634 else
635 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
636
637 if (HasCRTBeginEndFiles)
638 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
639 if (!isAndroid)
640 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
641 }
642 }
643
644 // Add OpenMP offloading linker script args if required.
645 AddOpenMPLinkerScript(getToolChain(), C, Output, Inputs, Args, CmdArgs, JA);
646
647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
648}
649
650void tools::gnutools::Assembler::ConstructJob(Compilation &C,
651 const JobAction &JA,
652 const InputInfo &Output,
653 const InputInfoList &Inputs,
654 const ArgList &Args,
655 const char *LinkingOutput) const {
Saleem Abdulrasoold064e912017-06-23 15:34:16 +0000656 const auto &D = getToolChain().getDriver();
657
David L. Jonesf561aba2017-03-08 01:02:16 +0000658 claimNoWarnArgs(Args);
659
660 ArgStringList CmdArgs;
661
662 llvm::Reloc::Model RelocationModel;
663 unsigned PICLevel;
664 bool IsPIE;
665 std::tie(RelocationModel, PICLevel, IsPIE) =
666 ParsePICArgs(getToolChain(), Args);
667
Saleem Abdulrasoold064e912017-06-23 15:34:16 +0000668 if (const Arg *A = Args.getLastArg(options::OPT_gz, options::OPT_gz_EQ)) {
669 if (A->getOption().getID() == options::OPT_gz) {
670 CmdArgs.push_back("-compress-debug-sections");
671 } else {
672 StringRef Value = A->getValue();
673 if (Value == "none") {
674 CmdArgs.push_back("-compress-debug-sections=none");
675 } else if (Value == "zlib" || Value == "zlib-gnu") {
676 CmdArgs.push_back(
677 Args.MakeArgString("-compress-debug-sections=" + Twine(Value)));
678 } else {
679 D.Diag(diag::err_drv_unsupported_option_argument)
680 << A->getOption().getName() << Value;
681 }
682 }
683 }
684
David L. Jonesf561aba2017-03-08 01:02:16 +0000685 switch (getToolChain().getArch()) {
686 default:
687 break;
688 // Add --32/--64 to make sure we get the format we want.
689 // This is incomplete
690 case llvm::Triple::x86:
691 CmdArgs.push_back("--32");
692 break;
693 case llvm::Triple::x86_64:
694 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
695 CmdArgs.push_back("--x32");
696 else
697 CmdArgs.push_back("--64");
698 break;
Nemanja Ivanovicf88f81c2017-07-27 08:58:28 +0000699 case llvm::Triple::ppc: {
David L. Jonesf561aba2017-03-08 01:02:16 +0000700 CmdArgs.push_back("-a32");
701 CmdArgs.push_back("-mppc");
Nemanja Ivanovicf88f81c2017-07-27 08:58:28 +0000702 CmdArgs.push_back(
703 ppc::getPPCAsmModeForCPU(getCPUName(Args, getToolChain().getTriple())));
David L. Jonesf561aba2017-03-08 01:02:16 +0000704 break;
Nemanja Ivanovicf88f81c2017-07-27 08:58:28 +0000705 }
706 case llvm::Triple::ppc64: {
David L. Jonesf561aba2017-03-08 01:02:16 +0000707 CmdArgs.push_back("-a64");
708 CmdArgs.push_back("-mppc64");
Nemanja Ivanovicf88f81c2017-07-27 08:58:28 +0000709 CmdArgs.push_back(
710 ppc::getPPCAsmModeForCPU(getCPUName(Args, getToolChain().getTriple())));
David L. Jonesf561aba2017-03-08 01:02:16 +0000711 break;
Nemanja Ivanovicf88f81c2017-07-27 08:58:28 +0000712 }
713 case llvm::Triple::ppc64le: {
David L. Jonesf561aba2017-03-08 01:02:16 +0000714 CmdArgs.push_back("-a64");
715 CmdArgs.push_back("-mppc64");
David L. Jonesf561aba2017-03-08 01:02:16 +0000716 CmdArgs.push_back("-mlittle-endian");
Nemanja Ivanovicf88f81c2017-07-27 08:58:28 +0000717 CmdArgs.push_back(
718 ppc::getPPCAsmModeForCPU(getCPUName(Args, getToolChain().getTriple())));
David L. Jonesf561aba2017-03-08 01:02:16 +0000719 break;
Nemanja Ivanovicf88f81c2017-07-27 08:58:28 +0000720 }
David L. Jonesf561aba2017-03-08 01:02:16 +0000721 case llvm::Triple::sparc:
722 case llvm::Triple::sparcel: {
723 CmdArgs.push_back("-32");
724 std::string CPU = getCPUName(Args, getToolChain().getTriple());
725 CmdArgs.push_back(sparc::getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
726 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
727 break;
728 }
729 case llvm::Triple::sparcv9: {
730 CmdArgs.push_back("-64");
731 std::string CPU = getCPUName(Args, getToolChain().getTriple());
732 CmdArgs.push_back(sparc::getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
733 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
734 break;
735 }
736 case llvm::Triple::arm:
737 case llvm::Triple::armeb:
738 case llvm::Triple::thumb:
739 case llvm::Triple::thumbeb: {
740 const llvm::Triple &Triple2 = getToolChain().getTriple();
741 switch (Triple2.getSubArch()) {
742 case llvm::Triple::ARMSubArch_v7:
743 CmdArgs.push_back("-mfpu=neon");
744 break;
745 case llvm::Triple::ARMSubArch_v8:
746 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
747 break;
748 default:
749 break;
750 }
751
752 switch (arm::getARMFloatABI(getToolChain(), Args)) {
753 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
754 case arm::FloatABI::Soft:
755 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
756 break;
757 case arm::FloatABI::SoftFP:
758 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
759 break;
760 case arm::FloatABI::Hard:
761 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
762 break;
763 }
764
765 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
766
767 // FIXME: remove krait check when GNU tools support krait cpu
768 // for now replace it with -mcpu=cortex-a15 to avoid a lower
769 // march from being picked in the absence of a cpu flag.
770 Arg *A;
771 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
772 StringRef(A->getValue()).equals_lower("krait"))
773 CmdArgs.push_back("-mcpu=cortex-a15");
774 else
775 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
776 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
777 break;
778 }
Manoj Guptabb75b352017-04-18 17:36:10 +0000779 case llvm::Triple::aarch64:
780 case llvm::Triple::aarch64_be: {
781 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
782 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
783 break;
784 }
David L. Jonesf561aba2017-03-08 01:02:16 +0000785 case llvm::Triple::mips:
786 case llvm::Triple::mipsel:
787 case llvm::Triple::mips64:
788 case llvm::Triple::mips64el: {
789 StringRef CPUName;
790 StringRef ABIName;
791 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
792 ABIName = mips::getGnuCompatibleMipsABIName(ABIName);
793
794 CmdArgs.push_back("-march");
795 CmdArgs.push_back(CPUName.data());
796
797 CmdArgs.push_back("-mabi");
798 CmdArgs.push_back(ABIName.data());
799
800 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
801 // or -mshared (not implemented) is in effect.
802 if (RelocationModel == llvm::Reloc::Static)
803 CmdArgs.push_back("-mno-shared");
804
805 // LLVM doesn't support -mplt yet and acts as if it is always given.
806 // However, -mplt has no effect with the N64 ABI.
807 if (ABIName != "64" && !Args.hasArg(options::OPT_mno_abicalls))
808 CmdArgs.push_back("-call_nonpic");
809
810 if (getToolChain().getArch() == llvm::Triple::mips ||
811 getToolChain().getArch() == llvm::Triple::mips64)
812 CmdArgs.push_back("-EB");
813 else
814 CmdArgs.push_back("-EL");
815
816 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
817 if (StringRef(A->getValue()) == "2008")
818 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
819 }
820
821 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
822 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
823 options::OPT_mfp64)) {
824 A->claim();
825 A->render(Args, CmdArgs);
826 } else if (mips::shouldUseFPXX(
827 Args, getToolChain().getTriple(), CPUName, ABIName,
828 mips::getMipsFloatABI(getToolChain().getDriver(), Args)))
829 CmdArgs.push_back("-mfpxx");
830
831 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
832 // -mno-mips16 is actually -no-mips16.
833 if (Arg *A =
834 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
835 if (A->getOption().matches(options::OPT_mips16)) {
836 A->claim();
837 A->render(Args, CmdArgs);
838 } else {
839 A->claim();
840 CmdArgs.push_back("-no-mips16");
841 }
842 }
843
844 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
845 options::OPT_mno_micromips);
846 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
847 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
848
849 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
850 // Do not use AddLastArg because not all versions of MIPS assembler
851 // support -mmsa / -mno-msa options.
852 if (A->getOption().matches(options::OPT_mmsa))
853 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
854 }
855
856 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
857 options::OPT_msoft_float);
858
859 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
860 options::OPT_msingle_float);
861
862 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
863 options::OPT_mno_odd_spreg);
864
865 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
866 break;
867 }
868 case llvm::Triple::systemz: {
869 // Always pass an -march option, since our default of z10 is later
870 // than the GNU assembler's default.
871 StringRef CPUName = systemz::getSystemZTargetCPU(Args);
872 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
873 break;
874 }
875 }
876
877 Args.AddAllArgs(CmdArgs, options::OPT_I);
878 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
879
880 CmdArgs.push_back("-o");
881 CmdArgs.push_back(Output.getFilename());
882
883 for (const auto &II : Inputs)
884 CmdArgs.push_back(II.getFilename());
885
886 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
887 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
888
889 // Handle the debug info splitting at object creation time if we're
890 // creating an object.
891 // TODO: Currently only works on linux with newer objcopy.
892 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
893 getToolChain().getTriple().isOSLinux())
894 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
895 SplitDebugName(Args, Inputs[0]));
896}
897
898namespace {
899// Filter to remove Multilibs that don't exist as a suffix to Path
900class FilterNonExistent {
901 StringRef Base, File;
902 vfs::FileSystem &VFS;
903
904public:
905 FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem &VFS)
906 : Base(Base), File(File), VFS(VFS) {}
907 bool operator()(const Multilib &M) {
908 return !VFS.exists(Base + M.gccSuffix() + File);
909 }
910};
911} // end anonymous namespace
912
913static bool isSoftFloatABI(const ArgList &Args) {
914 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
915 options::OPT_mfloat_abi_EQ);
916 if (!A)
917 return false;
918
919 return A->getOption().matches(options::OPT_msoft_float) ||
920 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
921 A->getValue() == StringRef("soft"));
922}
923
Jonathan Roelofs55bec442017-05-05 00:18:27 +0000924/// \p Flag must be a flag accepted by the driver with its leading '-' removed,
925// otherwise '-print-multi-lib' will not emit them correctly.
David L. Jonesf561aba2017-03-08 01:02:16 +0000926static void addMultilibFlag(bool Enabled, const char *const Flag,
927 std::vector<std::string> &Flags) {
928 if (Enabled)
929 Flags.push_back(std::string("+") + Flag);
930 else
931 Flags.push_back(std::string("-") + Flag);
932}
933
934static bool isArmOrThumbArch(llvm::Triple::ArchType Arch) {
935 return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
936}
937
938static bool isMips32(llvm::Triple::ArchType Arch) {
939 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
940}
941
942static bool isMips64(llvm::Triple::ArchType Arch) {
943 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
944}
945
946static bool isMipsEL(llvm::Triple::ArchType Arch) {
947 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
948}
949
950static bool isMips16(const ArgList &Args) {
951 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
952 return A && A->getOption().matches(options::OPT_mips16);
953}
954
955static bool isMicroMips(const ArgList &Args) {
956 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
957 return A && A->getOption().matches(options::OPT_mmicromips);
958}
959
960static Multilib makeMultilib(StringRef commonSuffix) {
961 return Multilib(commonSuffix, commonSuffix, commonSuffix);
962}
963
964static bool findMipsCsMultilibs(const Multilib::flags_list &Flags,
965 FilterNonExistent &NonExistent,
966 DetectedMultilibs &Result) {
967 // Check for Code Sourcery toolchain multilibs
968 MultilibSet CSMipsMultilibs;
969 {
970 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
971
972 auto MArchMicroMips =
973 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
974
975 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
976
977 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
978
979 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
980
981 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
982
983 auto DefaultFloat =
984 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
985
986 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
987
988 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
989
990 // Note that this one's osSuffix is ""
991 auto MAbi64 = makeMultilib("")
992 .gccSuffix("/64")
993 .includeSuffix("/64")
994 .flag("+mabi=n64")
995 .flag("-mabi=n32")
996 .flag("-m32");
997
998 CSMipsMultilibs =
999 MultilibSet()
1000 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1001 .Maybe(UCLibc)
1002 .Either(SoftFloat, Nan2008, DefaultFloat)
1003 .FilterOut("/micromips/nan2008")
1004 .FilterOut("/mips16/nan2008")
1005 .Either(BigEndian, LittleEndian)
1006 .Maybe(MAbi64)
1007 .FilterOut("/mips16.*/64")
1008 .FilterOut("/micromips.*/64")
1009 .FilterOut(NonExistent)
1010 .setIncludeDirsCallback([](const Multilib &M) {
1011 std::vector<std::string> Dirs({"/include"});
1012 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1013 Dirs.push_back(
1014 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
1015 else
1016 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
1017 return Dirs;
1018 });
1019 }
1020
1021 MultilibSet DebianMipsMultilibs;
1022 {
1023 Multilib MAbiN32 =
1024 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
1025
1026 Multilib M64 = Multilib()
1027 .gccSuffix("/64")
1028 .includeSuffix("/64")
1029 .flag("+m64")
1030 .flag("-m32")
1031 .flag("-mabi=n32");
1032
1033 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
1034
1035 DebianMipsMultilibs =
1036 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
1037 }
1038
1039 // Sort candidates. Toolchain that best meets the directories tree goes first.
1040 // Then select the first toolchains matches command line flags.
1041 MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
1042 if (CSMipsMultilibs.size() < DebianMipsMultilibs.size())
1043 std::iter_swap(Candidates, Candidates + 1);
1044 for (const MultilibSet *Candidate : Candidates) {
1045 if (Candidate->select(Flags, Result.SelectedMultilib)) {
1046 if (Candidate == &DebianMipsMultilibs)
1047 Result.BiarchSibling = Multilib();
1048 Result.Multilibs = *Candidate;
1049 return true;
1050 }
1051 }
1052 return false;
1053}
1054
1055static bool findMipsAndroidMultilibs(vfs::FileSystem &VFS, StringRef Path,
1056 const Multilib::flags_list &Flags,
1057 FilterNonExistent &NonExistent,
1058 DetectedMultilibs &Result) {
1059
1060 MultilibSet AndroidMipsMultilibs =
1061 MultilibSet()
1062 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1063 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1064 .FilterOut(NonExistent);
1065
1066 MultilibSet AndroidMipselMultilibs =
1067 MultilibSet()
1068 .Either(Multilib().flag("+march=mips32"),
1069 Multilib("/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
1070 Multilib("/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
1071 .FilterOut(NonExistent);
1072
1073 MultilibSet AndroidMips64elMultilibs =
1074 MultilibSet()
1075 .Either(
1076 Multilib().flag("+march=mips64r6"),
1077 Multilib("/32/mips-r1", "", "/mips-r1").flag("+march=mips32"),
1078 Multilib("/32/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
1079 Multilib("/32/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
1080 .FilterOut(NonExistent);
1081
1082 MultilibSet *MS = &AndroidMipsMultilibs;
1083 if (VFS.exists(Path + "/mips-r6"))
1084 MS = &AndroidMipselMultilibs;
1085 else if (VFS.exists(Path + "/32"))
1086 MS = &AndroidMips64elMultilibs;
1087 if (MS->select(Flags, Result.SelectedMultilib)) {
1088 Result.Multilibs = *MS;
1089 return true;
1090 }
1091 return false;
1092}
1093
1094static bool findMipsMuslMultilibs(const Multilib::flags_list &Flags,
1095 FilterNonExistent &NonExistent,
1096 DetectedMultilibs &Result) {
1097 // Musl toolchain multilibs
1098 MultilibSet MuslMipsMultilibs;
1099 {
1100 auto MArchMipsR2 = makeMultilib("")
1101 .osSuffix("/mips-r2-hard-musl")
1102 .flag("+EB")
1103 .flag("-EL")
1104 .flag("+march=mips32r2");
1105
1106 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1107 .flag("-EB")
1108 .flag("+EL")
1109 .flag("+march=mips32r2");
1110
1111 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1112
1113 // Specify the callback that computes the include directories.
1114 MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
1115 return std::vector<std::string>(
1116 {"/../sysroot" + M.osSuffix() + "/usr/include"});
1117 });
1118 }
1119 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1120 Result.Multilibs = MuslMipsMultilibs;
1121 return true;
1122 }
1123 return false;
1124}
1125
1126static bool findMipsMtiMultilibs(const Multilib::flags_list &Flags,
1127 FilterNonExistent &NonExistent,
1128 DetectedMultilibs &Result) {
1129 // CodeScape MTI toolchain v1.2 and early.
1130 MultilibSet MtiMipsMultilibsV1;
1131 {
1132 auto MArchMips32 = makeMultilib("/mips32")
1133 .flag("+m32")
1134 .flag("-m64")
1135 .flag("-mmicromips")
1136 .flag("+march=mips32");
1137
1138 auto MArchMicroMips = makeMultilib("/micromips")
1139 .flag("+m32")
1140 .flag("-m64")
1141 .flag("+mmicromips");
1142
1143 auto MArchMips64r2 = makeMultilib("/mips64r2")
1144 .flag("-m32")
1145 .flag("+m64")
1146 .flag("+march=mips64r2");
1147
1148 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1149 "-march=mips64r2");
1150
1151 auto MArchDefault = makeMultilib("")
1152 .flag("+m32")
1153 .flag("-m64")
1154 .flag("-mmicromips")
1155 .flag("+march=mips32r2");
1156
1157 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
1158
1159 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
1160
1161 auto MAbi64 =
1162 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1163
1164 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
1165
1166 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1167
1168 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
1169
1170 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
1171
1172 MtiMipsMultilibsV1 =
1173 MultilibSet()
1174 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1175 MArchDefault)
1176 .Maybe(UCLibc)
1177 .Maybe(Mips16)
1178 .FilterOut("/mips64/mips16")
1179 .FilterOut("/mips64r2/mips16")
1180 .FilterOut("/micromips/mips16")
1181 .Maybe(MAbi64)
1182 .FilterOut("/micromips/64")
1183 .FilterOut("/mips32/64")
1184 .FilterOut("^/64")
1185 .FilterOut("/mips16/64")
1186 .Either(BigEndian, LittleEndian)
1187 .Maybe(SoftFloat)
1188 .Maybe(Nan2008)
1189 .FilterOut(".*sof/nan2008")
1190 .FilterOut(NonExistent)
1191 .setIncludeDirsCallback([](const Multilib &M) {
1192 std::vector<std::string> Dirs({"/include"});
1193 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1194 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
1195 else
1196 Dirs.push_back("/../../../../sysroot/usr/include");
1197 return Dirs;
1198 });
1199 }
1200
1201 // CodeScape IMG toolchain starting from v1.3.
1202 MultilibSet MtiMipsMultilibsV2;
1203 {
1204 auto BeHard = makeMultilib("/mips-r2-hard")
1205 .flag("+EB")
1206 .flag("-msoft-float")
1207 .flag("-mnan=2008")
1208 .flag("-muclibc");
1209 auto BeSoft = makeMultilib("/mips-r2-soft")
1210 .flag("+EB")
1211 .flag("+msoft-float")
1212 .flag("-mnan=2008");
1213 auto ElHard = makeMultilib("/mipsel-r2-hard")
1214 .flag("+EL")
1215 .flag("-msoft-float")
1216 .flag("-mnan=2008")
1217 .flag("-muclibc");
1218 auto ElSoft = makeMultilib("/mipsel-r2-soft")
1219 .flag("+EL")
1220 .flag("+msoft-float")
1221 .flag("-mnan=2008")
1222 .flag("-mmicromips");
1223 auto BeHardNan = makeMultilib("/mips-r2-hard-nan2008")
1224 .flag("+EB")
1225 .flag("-msoft-float")
1226 .flag("+mnan=2008")
1227 .flag("-muclibc");
1228 auto ElHardNan = makeMultilib("/mipsel-r2-hard-nan2008")
1229 .flag("+EL")
1230 .flag("-msoft-float")
1231 .flag("+mnan=2008")
1232 .flag("-muclibc")
1233 .flag("-mmicromips");
1234 auto BeHardNanUclibc = makeMultilib("/mips-r2-hard-nan2008-uclibc")
1235 .flag("+EB")
1236 .flag("-msoft-float")
1237 .flag("+mnan=2008")
1238 .flag("+muclibc");
1239 auto ElHardNanUclibc = makeMultilib("/mipsel-r2-hard-nan2008-uclibc")
1240 .flag("+EL")
1241 .flag("-msoft-float")
1242 .flag("+mnan=2008")
1243 .flag("+muclibc");
1244 auto BeHardUclibc = makeMultilib("/mips-r2-hard-uclibc")
1245 .flag("+EB")
1246 .flag("-msoft-float")
1247 .flag("-mnan=2008")
1248 .flag("+muclibc");
1249 auto ElHardUclibc = makeMultilib("/mipsel-r2-hard-uclibc")
1250 .flag("+EL")
1251 .flag("-msoft-float")
1252 .flag("-mnan=2008")
1253 .flag("+muclibc");
1254 auto ElMicroHardNan = makeMultilib("/micromipsel-r2-hard-nan2008")
1255 .flag("+EL")
1256 .flag("-msoft-float")
1257 .flag("+mnan=2008")
1258 .flag("+mmicromips");
1259 auto ElMicroSoft = makeMultilib("/micromipsel-r2-soft")
1260 .flag("+EL")
1261 .flag("+msoft-float")
1262 .flag("-mnan=2008")
1263 .flag("+mmicromips");
1264
1265 auto O32 =
1266 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
1267 auto N32 =
1268 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
1269 auto N64 =
1270 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
1271
1272 MtiMipsMultilibsV2 =
1273 MultilibSet()
1274 .Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
1275 BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
1276 ElHardUclibc, ElMicroHardNan, ElMicroSoft})
1277 .Either(O32, N32, N64)
1278 .FilterOut(NonExistent)
1279 .setIncludeDirsCallback([](const Multilib &M) {
1280 return std::vector<std::string>({"/../../../../sysroot" +
1281 M.includeSuffix() +
1282 "/../usr/include"});
1283 })
1284 .setFilePathsCallback([](const Multilib &M) {
1285 return std::vector<std::string>(
1286 {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
1287 });
1288 }
1289 for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
1290 if (Candidate->select(Flags, Result.SelectedMultilib)) {
1291 Result.Multilibs = *Candidate;
1292 return true;
1293 }
1294 }
1295 return false;
1296}
1297
1298static bool findMipsImgMultilibs(const Multilib::flags_list &Flags,
1299 FilterNonExistent &NonExistent,
1300 DetectedMultilibs &Result) {
1301 // CodeScape IMG toolchain v1.2 and early.
1302 MultilibSet ImgMultilibsV1;
1303 {
1304 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
1305
1306 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1307
1308 auto MAbi64 =
1309 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1310
1311 ImgMultilibsV1 =
1312 MultilibSet()
1313 .Maybe(Mips64r6)
1314 .Maybe(MAbi64)
1315 .Maybe(LittleEndian)
1316 .FilterOut(NonExistent)
1317 .setIncludeDirsCallback([](const Multilib &M) {
1318 return std::vector<std::string>(
1319 {"/include", "/../../../../sysroot/usr/include"});
1320 });
1321 }
1322
1323 // CodeScape IMG toolchain starting from v1.3.
1324 MultilibSet ImgMultilibsV2;
1325 {
1326 auto BeHard = makeMultilib("/mips-r6-hard")
1327 .flag("+EB")
1328 .flag("-msoft-float")
1329 .flag("-mmicromips");
1330 auto BeSoft = makeMultilib("/mips-r6-soft")
1331 .flag("+EB")
1332 .flag("+msoft-float")
1333 .flag("-mmicromips");
1334 auto ElHard = makeMultilib("/mipsel-r6-hard")
1335 .flag("+EL")
1336 .flag("-msoft-float")
1337 .flag("-mmicromips");
1338 auto ElSoft = makeMultilib("/mipsel-r6-soft")
1339 .flag("+EL")
1340 .flag("+msoft-float")
1341 .flag("-mmicromips");
1342 auto BeMicroHard = makeMultilib("/micromips-r6-hard")
1343 .flag("+EB")
1344 .flag("-msoft-float")
1345 .flag("+mmicromips");
1346 auto BeMicroSoft = makeMultilib("/micromips-r6-soft")
1347 .flag("+EB")
1348 .flag("+msoft-float")
1349 .flag("+mmicromips");
1350 auto ElMicroHard = makeMultilib("/micromipsel-r6-hard")
1351 .flag("+EL")
1352 .flag("-msoft-float")
1353 .flag("+mmicromips");
1354 auto ElMicroSoft = makeMultilib("/micromipsel-r6-soft")
1355 .flag("+EL")
1356 .flag("+msoft-float")
1357 .flag("+mmicromips");
1358
1359 auto O32 =
1360 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
1361 auto N32 =
1362 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
1363 auto N64 =
1364 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
1365
1366 ImgMultilibsV2 =
1367 MultilibSet()
1368 .Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
1369 ElMicroHard, ElMicroSoft})
1370 .Either(O32, N32, N64)
1371 .FilterOut(NonExistent)
1372 .setIncludeDirsCallback([](const Multilib &M) {
1373 return std::vector<std::string>({"/../../../../sysroot" +
1374 M.includeSuffix() +
1375 "/../usr/include"});
1376 })
1377 .setFilePathsCallback([](const Multilib &M) {
1378 return std::vector<std::string>(
1379 {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
1380 });
1381 }
1382 for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
1383 if (Candidate->select(Flags, Result.SelectedMultilib)) {
1384 Result.Multilibs = *Candidate;
1385 return true;
1386 }
1387 }
1388 return false;
1389}
1390
1391bool clang::driver::findMIPSMultilibs(const Driver &D,
1392 const llvm::Triple &TargetTriple,
1393 StringRef Path, const ArgList &Args,
1394 DetectedMultilibs &Result) {
1395 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
1396
1397 StringRef CPUName;
1398 StringRef ABIName;
1399 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1400
1401 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1402
1403 Multilib::flags_list Flags;
1404 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1405 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1406 addMultilibFlag(isMips16(Args), "mips16", Flags);
1407 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
1408 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
1409 CPUName == "mips32r5" || CPUName == "p5600",
1410 "march=mips32r2", Flags);
1411 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
1412 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
1413 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1414 CPUName == "mips64r5" || CPUName == "octeon",
1415 "march=mips64r2", Flags);
1416 addMultilibFlag(CPUName == "mips64r6", "march=mips64r6", Flags);
1417 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
1418 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
1419 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1420 Flags);
1421 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1422 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
1423 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
1424 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
1425 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
1426 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
1427
1428 if (TargetTriple.isAndroid())
1429 return findMipsAndroidMultilibs(D.getVFS(), Path, Flags, NonExistent,
1430 Result);
1431
1432 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
1433 TargetTriple.getOS() == llvm::Triple::Linux &&
1434 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
1435 return findMipsMuslMultilibs(Flags, NonExistent, Result);
1436
1437 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
1438 TargetTriple.getOS() == llvm::Triple::Linux &&
1439 TargetTriple.getEnvironment() == llvm::Triple::GNU)
1440 return findMipsMtiMultilibs(Flags, NonExistent, Result);
1441
1442 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1443 TargetTriple.getOS() == llvm::Triple::Linux &&
1444 TargetTriple.getEnvironment() == llvm::Triple::GNU)
1445 return findMipsImgMultilibs(Flags, NonExistent, Result);
1446
1447 if (findMipsCsMultilibs(Flags, NonExistent, Result))
1448 return true;
1449
1450 // Fallback to the regular toolchain-tree structure.
1451 Multilib Default;
1452 Result.Multilibs.push_back(Default);
1453 Result.Multilibs.FilterOut(NonExistent);
1454
1455 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1456 Result.BiarchSibling = Multilib();
1457 return true;
1458 }
1459
1460 return false;
1461}
1462
1463static void findAndroidArmMultilibs(const Driver &D,
1464 const llvm::Triple &TargetTriple,
1465 StringRef Path, const ArgList &Args,
1466 DetectedMultilibs &Result) {
1467 // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb.
1468 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
1469 Multilib ArmV7Multilib = makeMultilib("/armv7-a")
Jonathan Roelofs55bec442017-05-05 00:18:27 +00001470 .flag("+march=armv7-a")
1471 .flag("-mthumb");
David L. Jonesf561aba2017-03-08 01:02:16 +00001472 Multilib ThumbMultilib = makeMultilib("/thumb")
Jonathan Roelofs55bec442017-05-05 00:18:27 +00001473 .flag("-march=armv7-a")
1474 .flag("+mthumb");
David L. Jonesf561aba2017-03-08 01:02:16 +00001475 Multilib ArmV7ThumbMultilib = makeMultilib("/armv7-a/thumb")
Jonathan Roelofs55bec442017-05-05 00:18:27 +00001476 .flag("+march=armv7-a")
1477 .flag("+mthumb");
David L. Jonesf561aba2017-03-08 01:02:16 +00001478 Multilib DefaultMultilib = makeMultilib("")
Jonathan Roelofs55bec442017-05-05 00:18:27 +00001479 .flag("-march=armv7-a")
1480 .flag("-mthumb");
David L. Jonesf561aba2017-03-08 01:02:16 +00001481 MultilibSet AndroidArmMultilibs =
1482 MultilibSet()
1483 .Either(ThumbMultilib, ArmV7Multilib,
1484 ArmV7ThumbMultilib, DefaultMultilib)
1485 .FilterOut(NonExistent);
1486
1487 Multilib::flags_list Flags;
1488 llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
1489 bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
1490 bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
1491 bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
1492 bool IsThumbMode = IsThumbArch ||
1493 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, false) ||
1494 (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::IK_THUMB);
1495 bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
1496 (llvm::ARM::parseArchVersion(Arch) == 7 ||
1497 (IsArmArch && Arch == "" && IsV7SubArch));
Jonathan Roelofs55bec442017-05-05 00:18:27 +00001498 addMultilibFlag(IsArmV7Mode, "march=armv7-a", Flags);
1499 addMultilibFlag(IsThumbMode, "mthumb", Flags);
David L. Jonesf561aba2017-03-08 01:02:16 +00001500
1501 if (AndroidArmMultilibs.select(Flags, Result.SelectedMultilib))
1502 Result.Multilibs = AndroidArmMultilibs;
1503}
1504
1505static bool findBiarchMultilibs(const Driver &D,
1506 const llvm::Triple &TargetTriple,
1507 StringRef Path, const ArgList &Args,
1508 bool NeedsBiarchSuffix,
1509 DetectedMultilibs &Result) {
1510 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1511 // in what would normally be GCCInstallPath and put the 64-bit
1512 // libs in a subdirectory named 64. The simple logic we follow is that
1513 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1514 // we use that. If not, and if not a biarch triple alias, we look for
1515 // crtbegin.o without the subdirectory.
1516
1517 Multilib Default;
1518 Multilib Alt64 = Multilib()
1519 .gccSuffix("/64")
1520 .includeSuffix("/64")
1521 .flag("-m32")
1522 .flag("+m64")
1523 .flag("-mx32");
1524 Multilib Alt32 = Multilib()
1525 .gccSuffix("/32")
1526 .includeSuffix("/32")
1527 .flag("+m32")
1528 .flag("-m64")
1529 .flag("-mx32");
1530 Multilib Altx32 = Multilib()
1531 .gccSuffix("/x32")
1532 .includeSuffix("/x32")
1533 .flag("-m32")
1534 .flag("-m64")
1535 .flag("+mx32");
1536
1537 // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
1538 FilterNonExistent NonExistent(
1539 Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS());
1540
1541 // Determine default multilib from: 32, 64, x32
1542 // Also handle cases such as 64 on 32, 32 on 64, etc.
1543 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
1544 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
1545 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
1546 Want = WANT64;
1547 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
1548 Want = WANT64;
1549 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
1550 Want = WANT32;
1551 else {
1552 if (TargetTriple.isArch32Bit())
1553 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
1554 else if (IsX32)
1555 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
1556 else
1557 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
1558 }
1559
1560 if (Want == WANT32)
1561 Default.flag("+m32").flag("-m64").flag("-mx32");
1562 else if (Want == WANT64)
1563 Default.flag("-m32").flag("+m64").flag("-mx32");
1564 else if (Want == WANTX32)
1565 Default.flag("-m32").flag("-m64").flag("+mx32");
1566 else
1567 return false;
1568
1569 Result.Multilibs.push_back(Default);
1570 Result.Multilibs.push_back(Alt64);
1571 Result.Multilibs.push_back(Alt32);
1572 Result.Multilibs.push_back(Altx32);
1573
1574 Result.Multilibs.FilterOut(NonExistent);
1575
1576 Multilib::flags_list Flags;
1577 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
1578 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
1579 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
1580
1581 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
1582 return false;
1583
1584 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
1585 Result.SelectedMultilib == Altx32)
1586 Result.BiarchSibling = Default;
1587
1588 return true;
1589}
1590
1591/// Generic_GCC - A tool chain using the 'gcc' command to perform
1592/// all subcommands; this relies on gcc translating the majority of
1593/// command line options.
1594
1595/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
1596bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1597 int RHSPatch,
1598 StringRef RHSPatchSuffix) const {
1599 if (Major != RHSMajor)
1600 return Major < RHSMajor;
1601 if (Minor != RHSMinor)
1602 return Minor < RHSMinor;
1603 if (Patch != RHSPatch) {
1604 // Note that versions without a specified patch sort higher than those with
1605 // a patch.
1606 if (RHSPatch == -1)
1607 return true;
1608 if (Patch == -1)
1609 return false;
1610
1611 // Otherwise just sort on the patch itself.
1612 return Patch < RHSPatch;
1613 }
1614 if (PatchSuffix != RHSPatchSuffix) {
1615 // Sort empty suffixes higher.
1616 if (RHSPatchSuffix.empty())
1617 return true;
1618 if (PatchSuffix.empty())
1619 return false;
1620
1621 // Provide a lexicographic sort to make this a total ordering.
1622 return PatchSuffix < RHSPatchSuffix;
1623 }
1624
1625 // The versions are equal.
1626 return false;
1627}
1628
Jonathan Roelofs901c7762017-05-25 15:42:13 +00001629/// \brief Parse a GCCVersion object out of a string of text.
1630///
1631/// This is the primary means of forming GCCVersion objects.
1632/*static*/
1633Generic_GCC::GCCVersion Generic_GCC::GCCVersion::Parse(StringRef VersionText) {
1634 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1635 std::pair<StringRef, StringRef> First = VersionText.split('.');
1636 std::pair<StringRef, StringRef> Second = First.second.split('.');
1637
1638 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1639 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
1640 return BadVersion;
1641 GoodVersion.MajorStr = First.first.str();
1642 if (First.second.empty())
1643 return GoodVersion;
1644 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
1645 return BadVersion;
1646 GoodVersion.MinorStr = Second.first.str();
1647
1648 // First look for a number prefix and parse that if present. Otherwise just
1649 // stash the entire patch string in the suffix, and leave the number
1650 // unspecified. This covers versions strings such as:
1651 // 5 (handled above)
1652 // 4.4
1653 // 4.4.0
1654 // 4.4.x
1655 // 4.4.2-rc4
1656 // 4.4.x-patched
1657 // And retains any patch number it finds.
1658 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1659 if (!PatchText.empty()) {
1660 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
1661 // Try to parse the number and any suffix.
1662 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1663 GoodVersion.Patch < 0)
1664 return BadVersion;
1665 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
1666 }
1667 }
1668
1669 return GoodVersion;
1670}
1671
David L. Jonesf561aba2017-03-08 01:02:16 +00001672static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
1673 const Arg *A = Args.getLastArg(clang::driver::options::OPT_gcc_toolchain);
1674 if (A)
1675 return A->getValue();
1676 return GCC_INSTALL_PREFIX;
1677}
1678
1679/// \brief Initialize a GCCInstallationDetector from the driver.
1680///
1681/// This performs all of the autodetection and sets up the various paths.
1682/// Once constructed, a GCCInstallationDetector is essentially immutable.
1683///
1684/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1685/// should instead pull the target out of the driver. This is currently
1686/// necessary because the driver doesn't store the final version of the target
1687/// triple.
1688void Generic_GCC::GCCInstallationDetector::init(
1689 const llvm::Triple &TargetTriple, const ArgList &Args,
1690 ArrayRef<std::string> ExtraTripleAliases) {
1691 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1692 ? TargetTriple.get64BitArchVariant()
1693 : TargetTriple.get32BitArchVariant();
1694 // The library directories which may contain GCC installations.
1695 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
1696 // The compatible GCC triples for this particular architecture.
1697 SmallVector<StringRef, 16> CandidateTripleAliases;
1698 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
1699 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1700 CandidateTripleAliases, CandidateBiarchLibDirs,
1701 CandidateBiarchTripleAliases);
1702
1703 // Compute the set of prefixes for our search.
1704 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1705 D.PrefixDirs.end());
1706
1707 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1708 if (GCCToolchainDir != "") {
1709 if (GCCToolchainDir.back() == '/')
1710 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1711
1712 Prefixes.push_back(GCCToolchainDir);
1713 } else {
1714 // If we have a SysRoot, try that first.
1715 if (!D.SysRoot.empty()) {
1716 Prefixes.push_back(D.SysRoot);
1717 Prefixes.push_back(D.SysRoot + "/usr");
1718 }
1719
1720 // Then look for gcc installed alongside clang.
1721 Prefixes.push_back(D.InstalledDir + "/..");
1722
1723 // Then look for distribution supplied gcc installations.
1724 if (D.SysRoot.empty()) {
1725 // Look for RHEL devtoolsets.
1726 Prefixes.push_back("/opt/rh/devtoolset-6/root/usr");
1727 Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
1728 Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
1729 Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
1730 // And finally in /usr.
1731 Prefixes.push_back("/usr");
1732 }
1733 }
1734
1735 // Try to respect gcc-config on Gentoo. However, do that only
1736 // if --gcc-toolchain is not provided or equal to the Gentoo install
1737 // in /usr. This avoids accidentally enforcing the system GCC version
1738 // when using a custom toolchain.
1739 if (GCCToolchainDir == "" || GCCToolchainDir == D.SysRoot + "/usr") {
1740 for (StringRef CandidateTriple : ExtraTripleAliases) {
1741 if (ScanGentooGccConfig(TargetTriple, Args, CandidateTriple))
1742 return;
1743 }
1744 for (StringRef CandidateTriple : CandidateTripleAliases) {
1745 if (ScanGentooGccConfig(TargetTriple, Args, CandidateTriple))
1746 return;
1747 }
1748 for (StringRef CandidateTriple : CandidateBiarchTripleAliases) {
1749 if (ScanGentooGccConfig(TargetTriple, Args, CandidateTriple, true))
1750 return;
1751 }
1752 }
1753
1754 // Loop over the various components which exist and select the best GCC
1755 // installation available. GCC installs are ranked by version number.
1756 Version = GCCVersion::Parse("0.0.0");
1757 for (const std::string &Prefix : Prefixes) {
1758 if (!D.getVFS().exists(Prefix))
1759 continue;
1760 for (StringRef Suffix : CandidateLibDirs) {
1761 const std::string LibDir = Prefix + Suffix.str();
1762 if (!D.getVFS().exists(LibDir))
1763 continue;
1764 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
1765 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
1766 for (StringRef Candidate : CandidateTripleAliases)
1767 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
1768 }
1769 for (StringRef Suffix : CandidateBiarchLibDirs) {
1770 const std::string LibDir = Prefix + Suffix.str();
1771 if (!D.getVFS().exists(LibDir))
1772 continue;
1773 for (StringRef Candidate : CandidateBiarchTripleAliases)
1774 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
1775 /*NeedsBiarchSuffix=*/ true);
1776 }
1777 }
1778}
1779
1780void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
1781 for (const auto &InstallPath : CandidateGCCInstallPaths)
1782 OS << "Found candidate GCC installation: " << InstallPath << "\n";
1783
1784 if (!GCCInstallPath.empty())
1785 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1786
1787 for (const auto &Multilib : Multilibs)
1788 OS << "Candidate multilib: " << Multilib << "\n";
1789
1790 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1791 OS << "Selected multilib: " << SelectedMultilib << "\n";
1792}
1793
1794bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1795 if (BiarchSibling.hasValue()) {
1796 M = BiarchSibling.getValue();
1797 return true;
1798 }
1799 return false;
1800}
1801
1802/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
1803 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
1804 SmallVectorImpl<StringRef> &LibDirs,
1805 SmallVectorImpl<StringRef> &TripleAliases,
1806 SmallVectorImpl<StringRef> &BiarchLibDirs,
1807 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
1808 // Declare a bunch of static data sets that we'll select between below. These
1809 // are specifically designed to always refer to string literals to avoid any
1810 // lifetime or initialization issues.
1811 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1812 static const char *const AArch64Triples[] = {
1813 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1814 "aarch64-redhat-linux", "aarch64-suse-linux"};
1815 static const char *const AArch64beLibDirs[] = {"/lib"};
1816 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1817 "aarch64_be-linux-gnu"};
1818
1819 static const char *const ARMLibDirs[] = {"/lib"};
1820 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1821 "arm-linux-androideabi"};
1822 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
Ismail Donmezca9cdad2017-04-21 12:26:43 +00001823 "armv7hl-redhat-linux-gnueabi",
1824 "armv6hl-suse-linux-gnueabi",
1825 "armv7hl-suse-linux-gnueabi"};
David L. Jonesf561aba2017-03-08 01:02:16 +00001826 static const char *const ARMebLibDirs[] = {"/lib"};
1827 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1828 "armeb-linux-androideabi"};
1829 static const char *const ARMebHFTriples[] = {
1830 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
1831
1832 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
1833 static const char *const X86_64Triples[] = {
1834 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1835 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1836 "x86_64-redhat-linux", "x86_64-suse-linux",
1837 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1838 "x86_64-slackware-linux", "x86_64-linux-android",
1839 "x86_64-unknown-linux"};
1840 static const char *const X32LibDirs[] = {"/libx32"};
1841 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
1842 static const char *const X86Triples[] = {
1843 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1844 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1845 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1846 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1847 "i586-linux-gnu"};
1848
1849 static const char *const MIPSLibDirs[] = {"/lib"};
1850 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1851 "mips-mti-linux-gnu",
1852 "mips-img-linux-gnu"};
1853 static const char *const MIPSELLibDirs[] = {"/lib"};
1854 static const char *const MIPSELTriples[] = {"mipsel-linux-gnu",
1855 "mips-img-linux-gnu"};
1856
1857 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1858 static const char *const MIPS64Triples[] = {
1859 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1860 "mips64-linux-gnuabi64"};
1861 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1862 static const char *const MIPS64ELTriples[] = {
1863 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1864 "mips64el-linux-gnuabi64"};
1865
1866 static const char *const MIPSELAndroidLibDirs[] = {"/lib", "/libr2",
1867 "/libr6"};
1868 static const char *const MIPSELAndroidTriples[] = {"mipsel-linux-android"};
1869 static const char *const MIPS64ELAndroidLibDirs[] = {"/lib64", "/lib",
1870 "/libr2", "/libr6"};
1871 static const char *const MIPS64ELAndroidTriples[] = {
1872 "mips64el-linux-android"};
1873
1874 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
1875 static const char *const PPCTriples[] = {
1876 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1877 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1878 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1879 static const char *const PPC64Triples[] = {
1880 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1881 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1882 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1883 static const char *const PPC64LETriples[] = {
1884 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1885 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
1886
1887 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1888 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1889 "sparcv8-linux-gnu"};
1890 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1891 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1892 "sparcv9-linux-gnu"};
1893
1894 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
1895 static const char *const SystemZTriples[] = {
1896 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1897 "s390x-suse-linux", "s390x-redhat-linux"};
1898
1899 // Solaris.
1900 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1901 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1902 "i386-pc-solaris2.11"};
1903
1904 using std::begin;
1905 using std::end;
1906
1907 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1908 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1909 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
1910 return;
1911 }
1912
1913 switch (TargetTriple.getArch()) {
1914 case llvm::Triple::aarch64:
1915 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1916 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1917 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1918 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1919 break;
1920 case llvm::Triple::aarch64_be:
1921 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1922 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1923 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1924 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1925 break;
1926 case llvm::Triple::arm:
1927 case llvm::Triple::thumb:
1928 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
1929 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1930 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
1931 } else {
1932 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
1933 }
1934 break;
1935 case llvm::Triple::armeb:
1936 case llvm::Triple::thumbeb:
1937 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
1938 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1939 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
1940 } else {
1941 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
1942 }
1943 break;
1944 case llvm::Triple::x86_64:
1945 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1946 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1947 // x32 is always available when x86_64 is available, so adding it as
1948 // secondary arch with x86_64 triples
1949 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
1950 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1951 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1952 } else {
1953 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1954 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
1955 }
1956 break;
1957 case llvm::Triple::x86:
1958 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1959 // MCU toolchain is 32 bit only and its triple alias is TargetTriple
1960 // itself, which will be appended below.
1961 if (!TargetTriple.isOSIAMCU()) {
1962 TripleAliases.append(begin(X86Triples), end(X86Triples));
1963 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1964 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1965 }
1966 break;
1967 case llvm::Triple::mips:
1968 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1969 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1970 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1971 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1972 break;
1973 case llvm::Triple::mipsel:
1974 if (TargetTriple.isAndroid()) {
1975 LibDirs.append(begin(MIPSELAndroidLibDirs), end(MIPSELAndroidLibDirs));
1976 TripleAliases.append(begin(MIPSELAndroidTriples),
1977 end(MIPSELAndroidTriples));
1978 BiarchLibDirs.append(begin(MIPS64ELAndroidLibDirs),
1979 end(MIPS64ELAndroidLibDirs));
1980 BiarchTripleAliases.append(begin(MIPS64ELAndroidTriples),
1981 end(MIPS64ELAndroidTriples));
1982
1983 } else {
1984 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1985 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1986 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1987 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1988 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1989 }
1990 break;
1991 case llvm::Triple::mips64:
1992 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1993 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1994 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1995 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1996 break;
1997 case llvm::Triple::mips64el:
1998 if (TargetTriple.isAndroid()) {
1999 LibDirs.append(begin(MIPS64ELAndroidLibDirs),
2000 end(MIPS64ELAndroidLibDirs));
2001 TripleAliases.append(begin(MIPS64ELAndroidTriples),
2002 end(MIPS64ELAndroidTriples));
2003 BiarchLibDirs.append(begin(MIPSELAndroidLibDirs),
2004 end(MIPSELAndroidLibDirs));
2005 BiarchTripleAliases.append(begin(MIPSELAndroidTriples),
2006 end(MIPSELAndroidTriples));
2007
2008 } else {
2009 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
2010 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
2011 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
2012 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
2013 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2014 }
2015 break;
2016 case llvm::Triple::ppc:
2017 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
2018 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
2019 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
2020 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
2021 break;
2022 case llvm::Triple::ppc64:
2023 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
2024 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
2025 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
2026 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
2027 break;
2028 case llvm::Triple::ppc64le:
2029 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
2030 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
2031 break;
2032 case llvm::Triple::sparc:
2033 case llvm::Triple::sparcel:
2034 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
2035 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
2036 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
2037 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
2038 break;
2039 case llvm::Triple::sparcv9:
2040 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
2041 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
2042 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
2043 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
2044 break;
2045 case llvm::Triple::systemz:
2046 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
2047 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
2048 break;
2049 default:
2050 // By default, just rely on the standard lib directories and the original
2051 // triple.
2052 break;
2053 }
2054
2055 // Always append the drivers target triple to the end, in case it doesn't
2056 // match any of our aliases.
2057 TripleAliases.push_back(TargetTriple.str());
2058
2059 // Also include the multiarch variant if it's different.
2060 if (TargetTriple.str() != BiarchTriple.str())
2061 BiarchTripleAliases.push_back(BiarchTriple.str());
2062}
2063
2064void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2065 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2066 const std::string &LibDir, StringRef CandidateTriple,
2067 bool NeedsBiarchSuffix) {
2068 // Solaris is a special case. The GCC installation is under
2069 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2070 // need to iterate twice.
2071 std::error_code EC;
2072 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2073 !EC && LI != LE; LI = LI.increment(EC)) {
2074 StringRef VersionText = llvm::sys::path::filename(LI->getName());
2075 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2076
2077 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
2078 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
2079 continue; // Saw this path before; no need to look at it again.
2080 if (CandidateVersion.isOlderThan(4, 1, 1))
2081 continue;
2082 if (CandidateVersion <= Version)
2083 continue;
2084
2085 GCCInstallPath =
2086 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
2087 if (!D.getVFS().exists(GCCInstallPath))
2088 continue;
2089
2090 // If we make it here there has to be at least one GCC version, let's just
2091 // use the latest one.
2092 std::error_code EEC;
2093 for (vfs::directory_iterator
2094 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2095 LLE;
2096 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2097
2098 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
2099 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2100
2101 if (CandidateSubVersion > Version)
2102 Version = CandidateSubVersion;
2103 }
2104
2105 GCCTriple.setTriple(CandidateTriple);
2106
2107 GCCInstallPath += "/" + Version.Text;
2108 GCCParentLibPath = GCCInstallPath + "/../../../../";
2109
2110 IsValid = true;
2111 }
2112}
2113
2114bool Generic_GCC::GCCInstallationDetector::ScanGCCForMultilibs(
2115 const llvm::Triple &TargetTriple, const ArgList &Args,
2116 StringRef Path, bool NeedsBiarchSuffix) {
2117 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2118 DetectedMultilibs Detected;
2119
2120 // Android standalone toolchain could have multilibs for ARM and Thumb.
2121 // Debian mips multilibs behave more like the rest of the biarch ones,
2122 // so handle them there
2123 if (isArmOrThumbArch(TargetArch) && TargetTriple.isAndroid()) {
2124 // It should also work without multilibs in a simplified toolchain.
2125 findAndroidArmMultilibs(D, TargetTriple, Path, Args, Detected);
2126 } else if (tools::isMipsArch(TargetArch)) {
2127 if (!findMIPSMultilibs(D, TargetTriple, Path, Args, Detected))
2128 return false;
2129 } else if (!findBiarchMultilibs(D, TargetTriple, Path, Args,
2130 NeedsBiarchSuffix, Detected)) {
2131 return false;
2132 }
2133
2134 Multilibs = Detected.Multilibs;
2135 SelectedMultilib = Detected.SelectedMultilib;
2136 BiarchSibling = Detected.BiarchSibling;
2137
2138 return true;
2139}
2140
2141void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
2142 const llvm::Triple &TargetTriple, const ArgList &Args,
2143 const std::string &LibDir, StringRef CandidateTriple,
2144 bool NeedsBiarchSuffix) {
2145 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2146 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2147 NeedsBiarchSuffix);
2148 return;
2149 }
2150
2151 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2152 // Locations relative to the system lib directory where GCC's triple-specific
2153 // directories might reside.
2154 struct GCCLibSuffix {
2155 // Path from system lib directory to GCC triple-specific directory.
2156 std::string LibSuffix;
2157 // Path from GCC triple-specific directory back to system lib directory.
2158 // This is one '..' component per component in LibSuffix.
2159 StringRef ReversePath;
2160 // Whether this library suffix is relevant for the triple.
2161 bool Active;
2162 } Suffixes[] = {
2163 // This is the normal place.
2164 {"gcc/" + CandidateTriple.str(), "../..", true},
2165
2166 // Debian puts cross-compilers in gcc-cross.
2167 {"gcc-cross/" + CandidateTriple.str(), "../..", true},
2168
2169 // The Freescale PPC SDK has the gcc libraries in
2170 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. Only do
2171 // this on Freescale triples, though, since some systems put a *lot* of
2172 // files in that location, not just GCC installation data.
2173 {CandidateTriple.str(), "..",
2174 TargetTriple.getVendor() == llvm::Triple::Freescale},
2175
2176 // Natively multiarch systems sometimes put the GCC triple-specific
2177 // directory within their multiarch lib directory, resulting in the
2178 // triple appearing twice.
2179 {CandidateTriple.str() + "/gcc/" + CandidateTriple.str(), "../../..", true},
2180
2181 // Deal with cases (on Ubuntu) where the system architecture could be i386
2182 // but the GCC target architecture could be (say) i686.
2183 // FIXME: It may be worthwhile to generalize this and look for a second
2184 // triple.
2185 {"i386-linux-gnu/gcc/" + CandidateTriple.str(), "../../..",
2186 TargetArch == llvm::Triple::x86}
2187 };
2188
2189 for (auto &Suffix : Suffixes) {
2190 if (!Suffix.Active)
2191 continue;
2192
2193 StringRef LibSuffix = Suffix.LibSuffix;
2194 std::error_code EC;
2195 for (vfs::directory_iterator
2196 LI = D.getVFS().dir_begin(LibDir + "/" + LibSuffix, EC),
2197 LE;
2198 !EC && LI != LE; LI = LI.increment(EC)) {
2199 StringRef VersionText = llvm::sys::path::filename(LI->getName());
2200 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2201 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
2202 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
2203 continue; // Saw this path before; no need to look at it again.
2204 if (CandidateVersion.isOlderThan(4, 1, 1))
2205 continue;
2206 if (CandidateVersion <= Version)
2207 continue;
2208
2209 if (!ScanGCCForMultilibs(TargetTriple, Args, LI->getName(),
2210 NeedsBiarchSuffix))
2211 continue;
2212
2213 Version = CandidateVersion;
2214 GCCTriple.setTriple(CandidateTriple);
2215 // FIXME: We hack together the directory name here instead of
2216 // using LI to ensure stable path separators across Windows and
2217 // Linux.
2218 GCCInstallPath = (LibDir + "/" + LibSuffix + "/" + VersionText).str();
2219 GCCParentLibPath = (GCCInstallPath + "/../" + Suffix.ReversePath).str();
2220 IsValid = true;
2221 }
2222 }
2223}
2224
2225bool Generic_GCC::GCCInstallationDetector::ScanGentooGccConfig(
2226 const llvm::Triple &TargetTriple, const ArgList &Args,
2227 StringRef CandidateTriple, bool NeedsBiarchSuffix) {
2228 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
2229 D.getVFS().getBufferForFile(D.SysRoot + "/etc/env.d/gcc/config-" +
2230 CandidateTriple.str());
2231 if (File) {
2232 SmallVector<StringRef, 2> Lines;
2233 File.get()->getBuffer().split(Lines, "\n");
2234 for (StringRef Line : Lines) {
Erich Keane750fe222017-04-14 15:21:18 +00002235 Line = Line.trim();
David L. Jonesf561aba2017-03-08 01:02:16 +00002236 // CURRENT=triple-version
2237 if (Line.consume_front("CURRENT=")) {
2238 const std::pair<StringRef, StringRef> ActiveVersion =
2239 Line.rsplit('-');
2240 // Note: Strictly speaking, we should be reading
2241 // /etc/env.d/gcc/${CURRENT} now. However, the file doesn't
2242 // contain anything new or especially useful to us.
2243 const std::string GentooPath = D.SysRoot + "/usr/lib/gcc/" +
2244 ActiveVersion.first.str() + "/" +
2245 ActiveVersion.second.str();
2246 if (D.getVFS().exists(GentooPath + "/crtbegin.o")) {
2247 if (!ScanGCCForMultilibs(TargetTriple, Args, GentooPath,
2248 NeedsBiarchSuffix))
2249 return false;
2250
2251 Version = GCCVersion::Parse(ActiveVersion.second);
2252 GCCInstallPath = GentooPath;
2253 GCCParentLibPath = GentooPath + "/../../..";
2254 GCCTriple.setTriple(ActiveVersion.first);
2255 IsValid = true;
2256 return true;
2257 }
2258 }
2259 }
2260 }
2261
2262 return false;
2263}
2264
2265Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
2266 const ArgList &Args)
2267 : ToolChain(D, Triple, Args), GCCInstallation(D),
2268 CudaInstallation(D, Triple, Args) {
2269 getProgramPaths().push_back(getDriver().getInstalledDir());
2270 if (getDriver().getInstalledDir() != getDriver().Dir)
2271 getProgramPaths().push_back(getDriver().Dir);
2272}
2273
2274Generic_GCC::~Generic_GCC() {}
2275
2276Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
2277 switch (AC) {
2278 case Action::PreprocessJobClass:
2279 if (!Preprocess)
2280 Preprocess.reset(new clang::driver::tools::gcc::Preprocessor(*this));
2281 return Preprocess.get();
2282 case Action::CompileJobClass:
2283 if (!Compile)
2284 Compile.reset(new tools::gcc::Compiler(*this));
2285 return Compile.get();
2286 default:
2287 return ToolChain::getTool(AC);
2288 }
2289}
2290
2291Tool *Generic_GCC::buildAssembler() const {
2292 return new tools::gnutools::Assembler(*this);
2293}
2294
2295Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
2296
2297void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2298 // Print the information about how we detected the GCC installation.
2299 GCCInstallation.print(OS);
2300 CudaInstallation.print(OS);
2301}
2302
2303bool Generic_GCC::IsUnwindTablesDefault() const {
2304 return getArch() == llvm::Triple::x86_64;
2305}
2306
2307bool Generic_GCC::isPICDefault() const {
2308 switch (getArch()) {
2309 case llvm::Triple::x86_64:
2310 return getTriple().isOSWindows();
2311 case llvm::Triple::ppc64:
2312 case llvm::Triple::ppc64le:
2313 return !getTriple().isOSBinFormatMachO() && !getTriple().isMacOSX();
2314 case llvm::Triple::mips64:
2315 case llvm::Triple::mips64el:
2316 return true;
2317 default:
2318 return false;
2319 }
2320}
2321
2322bool Generic_GCC::isPIEDefault() const { return false; }
2323
2324bool Generic_GCC::isPICDefaultForced() const {
2325 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2326}
2327
2328bool Generic_GCC::IsIntegratedAssemblerDefault() const {
2329 switch (getTriple().getArch()) {
2330 case llvm::Triple::x86:
2331 case llvm::Triple::x86_64:
2332 case llvm::Triple::aarch64:
2333 case llvm::Triple::aarch64_be:
2334 case llvm::Triple::arm:
2335 case llvm::Triple::armeb:
2336 case llvm::Triple::avr:
2337 case llvm::Triple::bpfel:
2338 case llvm::Triple::bpfeb:
2339 case llvm::Triple::thumb:
2340 case llvm::Triple::thumbeb:
2341 case llvm::Triple::ppc:
2342 case llvm::Triple::ppc64:
2343 case llvm::Triple::ppc64le:
2344 case llvm::Triple::systemz:
2345 case llvm::Triple::mips:
2346 case llvm::Triple::mipsel:
2347 return true;
2348 case llvm::Triple::mips64:
2349 case llvm::Triple::mips64el:
Petar Jovanovicc02bda32017-06-26 09:58:01 +00002350 // Enabled for Debian and Android mips64/mipsel, as they can precisely
2351 // identify the ABI in use (Debian) or only use N64 for MIPS64 (Android).
2352 // Other targets are unable to distinguish N32 from N64.
2353 if (getTriple().getEnvironment() == llvm::Triple::GNUABI64 ||
2354 getTriple().isAndroid())
David L. Jonesf561aba2017-03-08 01:02:16 +00002355 return true;
2356 return false;
2357 default:
2358 return false;
2359 }
2360}
2361
2362void Generic_GCC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2363 ArgStringList &CC1Args) const {
2364 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2365 DriverArgs.hasArg(options::OPT_nostdincxx))
2366 return;
2367
2368 switch (GetCXXStdlibType(DriverArgs)) {
2369 case ToolChain::CST_Libcxx: {
2370 std::string Path = findLibCxxIncludePath();
2371 if (!Path.empty())
2372 addSystemInclude(DriverArgs, CC1Args, Path);
2373 break;
2374 }
2375
2376 case ToolChain::CST_Libstdcxx:
2377 addLibStdCxxIncludePaths(DriverArgs, CC1Args);
2378 break;
2379 }
2380}
2381
2382std::string Generic_GCC::findLibCxxIncludePath() const {
2383 // FIXME: The Linux behavior would probaby be a better approach here.
2384 return getDriver().SysRoot + "/usr/include/c++/v1";
2385}
2386
2387void
2388Generic_GCC::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
2389 llvm::opt::ArgStringList &CC1Args) const {
2390 // By default, we don't assume we know where libstdc++ might be installed.
2391 // FIXME: If we have a valid GCCInstallation, use it.
2392}
2393
2394/// \brief Helper to add the variant paths of a libstdc++ installation.
2395bool Generic_GCC::addLibStdCXXIncludePaths(
2396 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2397 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2398 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2399 if (!getVFS().exists(Base + Suffix))
2400 return false;
2401
2402 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2403
2404 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2405 // that path exists or we have neither a GCC nor target multiarch triple, use
2406 // this vanilla search path.
2407 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2408 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2409 addSystemInclude(DriverArgs, CC1Args,
2410 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2411 } else {
2412 // Otherwise try to use multiarch naming schemes which have normalized the
2413 // triples and put the triple before the suffix.
2414 //
2415 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2416 // the target triple, so we support that here.
2417 addSystemInclude(DriverArgs, CC1Args,
2418 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2419 addSystemInclude(DriverArgs, CC1Args,
2420 Base + "/" + TargetMultiarchTriple + Suffix);
2421 }
2422
2423 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2424 return true;
2425}
2426
2427llvm::opt::DerivedArgList *
2428Generic_GCC::TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef,
2429 Action::OffloadKind DeviceOffloadKind) const {
2430
2431 // If this tool chain is used for an OpenMP offloading device we have to make
2432 // sure we always generate a shared library regardless of the commands the
2433 // user passed to the host. This is required because the runtime library
2434 // is required to load the device image dynamically at run time.
2435 if (DeviceOffloadKind == Action::OFK_OpenMP) {
2436 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
2437 const OptTable &Opts = getDriver().getOpts();
2438
2439 // Request the shared library. Given that these options are decided
2440 // implicitly, they do not refer to any base argument.
2441 DAL->AddFlagArg(/*BaseArg=*/nullptr, Opts.getOption(options::OPT_shared));
2442 DAL->AddFlagArg(/*BaseArg=*/nullptr, Opts.getOption(options::OPT_fPIC));
2443
2444 // Filter all the arguments we don't care passing to the offloading
2445 // toolchain as they can mess up with the creation of a shared library.
2446 for (auto *A : Args) {
2447 switch ((options::ID)A->getOption().getID()) {
2448 default:
2449 DAL->append(A);
2450 break;
2451 case options::OPT_shared:
2452 case options::OPT_dynamic:
2453 case options::OPT_static:
2454 case options::OPT_fPIC:
2455 case options::OPT_fno_PIC:
2456 case options::OPT_fpic:
2457 case options::OPT_fno_pic:
2458 case options::OPT_fPIE:
2459 case options::OPT_fno_PIE:
2460 case options::OPT_fpie:
2461 case options::OPT_fno_pie:
2462 break;
2463 }
2464 }
2465 return DAL;
2466 }
2467 return nullptr;
2468}
2469
2470void Generic_ELF::anchor() {}
2471
2472void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
Gheorghe-Teodor Berceaf0f29602017-07-06 16:22:21 +00002473 ArgStringList &CC1Args,
2474 Action::OffloadKind) const {
David L. Jonesf561aba2017-03-08 01:02:16 +00002475 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2476 bool UseInitArrayDefault =
2477 getTriple().getArch() == llvm::Triple::aarch64 ||
2478 getTriple().getArch() == llvm::Triple::aarch64_be ||
2479 (getTriple().getOS() == llvm::Triple::Linux &&
2480 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
2481 getTriple().getOS() == llvm::Triple::NaCl ||
2482 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
Aaron Ballman4a6d7d42017-07-14 17:49:52 +00002483 !getTriple().hasEnvironment()) ||
2484 getTriple().getOS() == llvm::Triple::Solaris;
David L. Jonesf561aba2017-03-08 01:02:16 +00002485
2486 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2487 options::OPT_fno_use_init_array, UseInitArrayDefault))
2488 CC1Args.push_back("-fuse-init-array");
2489}