Gnu.cpp 105 KB

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