1 //===--- Darwin.cpp - Darwin Tool and ToolChain Implementations -*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "Darwin.h" 11 #include "Arch/ARM.h" 12 #include "CommonArgs.h" 13 #include "clang/Basic/AlignedAllocation.h" 14 #include "clang/Basic/ObjCRuntime.h" 15 #include "clang/Driver/Compilation.h" 16 #include "clang/Driver/Driver.h" 17 #include "clang/Driver/DriverDiagnostic.h" 18 #include "clang/Driver/Options.h" 19 #include "clang/Driver/SanitizerArgs.h" 20 #include "llvm/ADT/StringSwitch.h" 21 #include "llvm/Option/ArgList.h" 22 #include "llvm/Support/Path.h" 23 #include "llvm/Support/ScopedPrinter.h" 24 #include "llvm/Support/TargetParser.h" 25 #include "llvm/Support/VirtualFileSystem.h" 26 #include <cstdlib> // ::getenv 27 28 using namespace clang::driver; 29 using namespace clang::driver::tools; 30 using namespace clang::driver::toolchains; 31 using namespace clang; 32 using namespace llvm::opt; 33 34 llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) { 35 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for 36 // archs which Darwin doesn't use. 37 38 // The matching this routine does is fairly pointless, since it is neither the 39 // complete architecture list, nor a reasonable subset. The problem is that 40 // historically the driver driver accepts this and also ties its -march= 41 // handling to the architecture name, so we need to be careful before removing 42 // support for it. 43 44 // This code must be kept in sync with Clang's Darwin specific argument 45 // translation. 46 47 return llvm::StringSwitch<llvm::Triple::ArchType>(Str) 48 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc) 49 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc) 50 .Case("ppc64", llvm::Triple::ppc64) 51 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86) 52 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4", 53 llvm::Triple::x86) 54 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64) 55 // This is derived from the driver driver. 56 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm) 57 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm) 58 .Cases("armv7s", "xscale", llvm::Triple::arm) 59 .Case("arm64", llvm::Triple::aarch64) 60 .Case("r600", llvm::Triple::r600) 61 .Case("amdgcn", llvm::Triple::amdgcn) 62 .Case("nvptx", llvm::Triple::nvptx) 63 .Case("nvptx64", llvm::Triple::nvptx64) 64 .Case("amdil", llvm::Triple::amdil) 65 .Case("spir", llvm::Triple::spir) 66 .Default(llvm::Triple::UnknownArch); 67 } 68 69 void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) { 70 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str); 71 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str); 72 T.setArch(Arch); 73 74 if (Str == "x86_64h") 75 T.setArchName(Str); 76 else if (ArchKind == llvm::ARM::ArchKind::ARMV6M || 77 ArchKind == llvm::ARM::ArchKind::ARMV7M || 78 ArchKind == llvm::ARM::ArchKind::ARMV7EM) { 79 T.setOS(llvm::Triple::UnknownOS); 80 T.setObjectFormat(llvm::Triple::MachO); 81 } 82 } 83 84 void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 85 const InputInfo &Output, 86 const InputInfoList &Inputs, 87 const ArgList &Args, 88 const char *LinkingOutput) const { 89 ArgStringList CmdArgs; 90 91 assert(Inputs.size() == 1 && "Unexpected number of inputs."); 92 const InputInfo &Input = Inputs[0]; 93 94 // Determine the original source input. 95 const Action *SourceAction = &JA; 96 while (SourceAction->getKind() != Action::InputClass) { 97 assert(!SourceAction->getInputs().empty() && "unexpected root action!"); 98 SourceAction = SourceAction->getInputs()[0]; 99 } 100 101 // If -fno-integrated-as is used add -Q to the darwin assembler driver to make 102 // sure it runs its system assembler not clang's integrated assembler. 103 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as. 104 // FIXME: at run-time detect assembler capabilities or rely on version 105 // information forwarded by -target-assembler-version. 106 if (Args.hasArg(options::OPT_fno_integrated_as)) { 107 const llvm::Triple &T(getToolChain().getTriple()); 108 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7))) 109 CmdArgs.push_back("-Q"); 110 } 111 112 // Forward -g, assuming we are dealing with an actual assembly file. 113 if (SourceAction->getType() == types::TY_Asm || 114 SourceAction->getType() == types::TY_PP_Asm) { 115 if (Args.hasArg(options::OPT_gstabs)) 116 CmdArgs.push_back("--gstabs"); 117 else if (Args.hasArg(options::OPT_g_Group)) 118 CmdArgs.push_back("-g"); 119 } 120 121 // Derived from asm spec. 122 AddMachOArch(Args, CmdArgs); 123 124 // Use -force_cpusubtype_ALL on x86 by default. 125 if (getToolChain().getArch() == llvm::Triple::x86 || 126 getToolChain().getArch() == llvm::Triple::x86_64 || 127 Args.hasArg(options::OPT_force__cpusubtype__ALL)) 128 CmdArgs.push_back("-force_cpusubtype_ALL"); 129 130 if (getToolChain().getArch() != llvm::Triple::x86_64 && 131 (((Args.hasArg(options::OPT_mkernel) || 132 Args.hasArg(options::OPT_fapple_kext)) && 133 getMachOToolChain().isKernelStatic()) || 134 Args.hasArg(options::OPT_static))) 135 CmdArgs.push_back("-static"); 136 137 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 138 139 assert(Output.isFilename() && "Unexpected lipo output."); 140 CmdArgs.push_back("-o"); 141 CmdArgs.push_back(Output.getFilename()); 142 143 assert(Input.isFilename() && "Invalid input."); 144 CmdArgs.push_back(Input.getFilename()); 145 146 // asm_final spec is empty. 147 148 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 149 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 150 } 151 152 void darwin::MachOTool::anchor() {} 153 154 void darwin::MachOTool::AddMachOArch(const ArgList &Args, 155 ArgStringList &CmdArgs) const { 156 StringRef ArchName = getMachOToolChain().getMachOArchName(Args); 157 158 // Derived from darwin_arch spec. 159 CmdArgs.push_back("-arch"); 160 CmdArgs.push_back(Args.MakeArgString(ArchName)); 161 162 // FIXME: Is this needed anymore? 163 if (ArchName == "arm") 164 CmdArgs.push_back("-force_cpusubtype_ALL"); 165 } 166 167 bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const { 168 // We only need to generate a temp path for LTO if we aren't compiling object 169 // files. When compiling source files, we run 'dsymutil' after linking. We 170 // don't run 'dsymutil' when compiling object files. 171 for (const auto &Input : Inputs) 172 if (Input.getType() != types::TY_Object) 173 return true; 174 175 return false; 176 } 177 178 /// Pass -no_deduplicate to ld64 under certain conditions: 179 /// 180 /// - Either -O0 or -O1 is explicitly specified 181 /// - No -O option is specified *and* this is a compile+link (implicit -O0) 182 /// 183 /// Also do *not* add -no_deduplicate when no -O option is specified and this 184 /// is just a link (we can't imply -O0) 185 static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args) { 186 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 187 if (A->getOption().matches(options::OPT_O0)) 188 return true; 189 if (A->getOption().matches(options::OPT_O)) 190 return llvm::StringSwitch<bool>(A->getValue()) 191 .Case("1", true) 192 .Default(false); 193 return false; // OPT_Ofast & OPT_O4 194 } 195 196 if (!IsLinkerOnlyAction) // Implicit -O0 for compile+linker only. 197 return true; 198 return false; 199 } 200 201 void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args, 202 ArgStringList &CmdArgs, 203 const InputInfoList &Inputs) const { 204 const Driver &D = getToolChain().getDriver(); 205 const toolchains::MachO &MachOTC = getMachOToolChain(); 206 207 unsigned Version[5] = {0, 0, 0, 0, 0}; 208 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 209 if (!Driver::GetReleaseVersion(A->getValue(), Version)) 210 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args); 211 } 212 213 // Newer linkers support -demangle. Pass it if supported and not disabled by 214 // the user. 215 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) 216 CmdArgs.push_back("-demangle"); 217 218 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137) 219 CmdArgs.push_back("-export_dynamic"); 220 221 // If we are using App Extension restrictions, pass a flag to the linker 222 // telling it that the compiled code has been audited. 223 if (Args.hasFlag(options::OPT_fapplication_extension, 224 options::OPT_fno_application_extension, false)) 225 CmdArgs.push_back("-application_extension"); 226 227 if (D.isUsingLTO()) { 228 // If we are using LTO, then automatically create a temporary file path for 229 // the linker to use, so that it's lifetime will extend past a possible 230 // dsymutil step. 231 if (Version[0] >= 116 && NeedsTempPath(Inputs)) { 232 const char *TmpPath = C.getArgs().MakeArgString( 233 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object))); 234 C.addTempFile(TmpPath); 235 CmdArgs.push_back("-object_path_lto"); 236 CmdArgs.push_back(TmpPath); 237 } 238 } 239 240 // Use -lto_library option to specify the libLTO.dylib path. Try to find 241 // it in clang installed libraries. ld64 will only look at this argument 242 // when it actually uses LTO, so libLTO.dylib only needs to exist at link 243 // time if ld64 decides that it needs to use LTO. 244 // Since this is passed unconditionally, ld64 will never look for libLTO.dylib 245 // next to it. That's ok since ld64 using a libLTO.dylib not matching the 246 // clang version won't work anyways. 247 if (Version[0] >= 133) { 248 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib 249 StringRef P = llvm::sys::path::parent_path(D.Dir); 250 SmallString<128> LibLTOPath(P); 251 llvm::sys::path::append(LibLTOPath, "lib"); 252 llvm::sys::path::append(LibLTOPath, "libLTO.dylib"); 253 CmdArgs.push_back("-lto_library"); 254 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath)); 255 } 256 257 // ld64 version 262 and above run the deduplicate pass by default. 258 if (Version[0] >= 262 && shouldLinkerNotDedup(C.getJobs().empty(), Args)) 259 CmdArgs.push_back("-no_deduplicate"); 260 261 // Derived from the "link" spec. 262 Args.AddAllArgs(CmdArgs, options::OPT_static); 263 if (!Args.hasArg(options::OPT_static)) 264 CmdArgs.push_back("-dynamic"); 265 if (Args.hasArg(options::OPT_fgnu_runtime)) { 266 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 267 // here. How do we wish to handle such things? 268 } 269 270 if (!Args.hasArg(options::OPT_dynamiclib)) { 271 AddMachOArch(Args, CmdArgs); 272 // FIXME: Why do this only on this path? 273 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL); 274 275 Args.AddLastArg(CmdArgs, options::OPT_bundle); 276 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 277 Args.AddAllArgs(CmdArgs, options::OPT_client__name); 278 279 Arg *A; 280 if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 281 (A = Args.getLastArg(options::OPT_current__version)) || 282 (A = Args.getLastArg(options::OPT_install__name))) 283 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args) 284 << "-dynamiclib"; 285 286 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 287 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 288 Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 289 } else { 290 CmdArgs.push_back("-dylib"); 291 292 Arg *A; 293 if ((A = Args.getLastArg(options::OPT_bundle)) || 294 (A = Args.getLastArg(options::OPT_bundle__loader)) || 295 (A = Args.getLastArg(options::OPT_client__name)) || 296 (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 297 (A = Args.getLastArg(options::OPT_keep__private__externs)) || 298 (A = Args.getLastArg(options::OPT_private__bundle))) 299 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) 300 << "-dynamiclib"; 301 302 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 303 "-dylib_compatibility_version"); 304 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 305 "-dylib_current_version"); 306 307 AddMachOArch(Args, CmdArgs); 308 309 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 310 "-dylib_install_name"); 311 } 312 313 Args.AddLastArg(CmdArgs, options::OPT_all__load); 314 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 315 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 316 if (MachOTC.isTargetIOSBased()) 317 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 318 Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 319 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 320 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 321 Args.AddLastArg(CmdArgs, options::OPT_dynamic); 322 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 323 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 324 Args.AddAllArgs(CmdArgs, options::OPT_force__load); 325 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 326 Args.AddAllArgs(CmdArgs, options::OPT_image__base); 327 Args.AddAllArgs(CmdArgs, options::OPT_init); 328 329 // Add the deployment target. 330 MachOTC.addMinVersionArgs(Args, CmdArgs); 331 332 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 333 Args.AddLastArg(CmdArgs, options::OPT_multi__module); 334 Args.AddLastArg(CmdArgs, options::OPT_single__module); 335 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 336 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 337 338 if (const Arg *A = 339 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE, 340 options::OPT_fno_pie, options::OPT_fno_PIE)) { 341 if (A->getOption().matches(options::OPT_fpie) || 342 A->getOption().matches(options::OPT_fPIE)) 343 CmdArgs.push_back("-pie"); 344 else 345 CmdArgs.push_back("-no_pie"); 346 } 347 348 // for embed-bitcode, use -bitcode_bundle in linker command 349 if (C.getDriver().embedBitcodeEnabled()) { 350 // Check if the toolchain supports bitcode build flow. 351 if (MachOTC.SupportsEmbeddedBitcode()) { 352 CmdArgs.push_back("-bitcode_bundle"); 353 if (C.getDriver().embedBitcodeMarkerOnly() && Version[0] >= 278) { 354 CmdArgs.push_back("-bitcode_process_mode"); 355 CmdArgs.push_back("marker"); 356 } 357 } else 358 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain); 359 } 360 361 Args.AddLastArg(CmdArgs, options::OPT_prebind); 362 Args.AddLastArg(CmdArgs, options::OPT_noprebind); 363 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 364 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 365 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 366 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 367 Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 368 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 369 Args.AddAllArgs(CmdArgs, options::OPT_segprot); 370 Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 371 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 372 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 373 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 374 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 375 Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 376 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 377 378 // Give --sysroot= preference, over the Apple specific behavior to also use 379 // --isysroot as the syslibroot. 380 StringRef sysroot = C.getSysRoot(); 381 if (sysroot != "") { 382 CmdArgs.push_back("-syslibroot"); 383 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); 384 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 385 CmdArgs.push_back("-syslibroot"); 386 CmdArgs.push_back(A->getValue()); 387 } 388 389 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 390 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 391 Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 392 Args.AddAllArgs(CmdArgs, options::OPT_undefined); 393 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 394 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 395 Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 396 Args.AddAllArgs(CmdArgs, options::OPT_y); 397 Args.AddLastArg(CmdArgs, options::OPT_w); 398 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 399 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 400 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 401 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 402 Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 403 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 404 Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 405 Args.AddLastArg(CmdArgs, options::OPT_whyload); 406 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 407 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 408 Args.AddLastArg(CmdArgs, options::OPT_dylinker); 409 Args.AddLastArg(CmdArgs, options::OPT_Mach); 410 } 411 412 /// Determine whether we are linking the ObjC runtime. 413 static bool isObjCRuntimeLinked(const ArgList &Args) { 414 if (isObjCAutoRefCount(Args)) { 415 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime); 416 return true; 417 } 418 return Args.hasArg(options::OPT_fobjc_link_runtime); 419 } 420 421 void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, 422 const InputInfo &Output, 423 const InputInfoList &Inputs, 424 const ArgList &Args, 425 const char *LinkingOutput) const { 426 assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 427 428 // If the number of arguments surpasses the system limits, we will encode the 429 // input files in a separate file, shortening the command line. To this end, 430 // build a list of input file names that can be passed via a file with the 431 // -filelist linker option. 432 llvm::opt::ArgStringList InputFileList; 433 434 // The logic here is derived from gcc's behavior; most of which 435 // comes from specs (starting with link_command). Consult gcc for 436 // more information. 437 ArgStringList CmdArgs; 438 439 /// Hack(tm) to ignore linking errors when we are doing ARC migration. 440 if (Args.hasArg(options::OPT_ccc_arcmt_check, 441 options::OPT_ccc_arcmt_migrate)) { 442 for (const auto &Arg : Args) 443 Arg->claim(); 444 const char *Exec = 445 Args.MakeArgString(getToolChain().GetProgramPath("touch")); 446 CmdArgs.push_back(Output.getFilename()); 447 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None)); 448 return; 449 } 450 451 // I'm not sure why this particular decomposition exists in gcc, but 452 // we follow suite for ease of comparison. 453 AddLinkArgs(C, Args, CmdArgs, Inputs); 454 455 // For LTO, pass the name of the optimization record file and other 456 // opt-remarks flags. 457 if (Args.hasFlag(options::OPT_fsave_optimization_record, 458 options::OPT_fno_save_optimization_record, false)) { 459 CmdArgs.push_back("-mllvm"); 460 CmdArgs.push_back("-lto-pass-remarks-output"); 461 CmdArgs.push_back("-mllvm"); 462 463 SmallString<128> F; 464 F = Output.getFilename(); 465 F += ".opt.yaml"; 466 CmdArgs.push_back(Args.MakeArgString(F)); 467 468 if (getLastProfileUseArg(Args)) { 469 CmdArgs.push_back("-mllvm"); 470 CmdArgs.push_back("-lto-pass-remarks-with-hotness"); 471 472 if (const Arg *A = 473 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) { 474 CmdArgs.push_back("-mllvm"); 475 std::string Opt = 476 std::string("-lto-pass-remarks-hotness-threshold=") + A->getValue(); 477 CmdArgs.push_back(Args.MakeArgString(Opt)); 478 } 479 } 480 } 481 482 // Propagate the -moutline flag to the linker in LTO. 483 if (Args.hasFlag(options::OPT_moutline, options::OPT_mno_outline, false)) { 484 if (getMachOToolChain().getMachOArchName(Args) == "arm64") { 485 CmdArgs.push_back("-mllvm"); 486 CmdArgs.push_back("-enable-machine-outliner"); 487 488 // Outline from linkonceodr functions by default in LTO. 489 CmdArgs.push_back("-mllvm"); 490 CmdArgs.push_back("-enable-linkonceodr-outlining"); 491 } 492 } 493 494 // It seems that the 'e' option is completely ignored for dynamic executables 495 // (the default), and with static executables, the last one wins, as expected. 496 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t, 497 options::OPT_Z_Flag, options::OPT_u_Group, 498 options::OPT_e, options::OPT_r}); 499 500 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading 501 // members of static archive libraries which implement Objective-C classes or 502 // categories. 503 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX)) 504 CmdArgs.push_back("-ObjC"); 505 506 CmdArgs.push_back("-o"); 507 CmdArgs.push_back(Output.getFilename()); 508 509 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) 510 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs); 511 512 Args.AddAllArgs(CmdArgs, options::OPT_L); 513 514 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA); 515 // Build the input file for -filelist (list of linker input files) in case we 516 // need it later 517 for (const auto &II : Inputs) { 518 if (!II.isFilename()) { 519 // This is a linker input argument. 520 // We cannot mix input arguments and file names in a -filelist input, thus 521 // we prematurely stop our list (remaining files shall be passed as 522 // arguments). 523 if (InputFileList.size() > 0) 524 break; 525 526 continue; 527 } 528 529 InputFileList.push_back(II.getFilename()); 530 } 531 532 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) 533 addOpenMPRuntime(CmdArgs, getToolChain(), Args); 534 535 if (isObjCRuntimeLinked(Args) && 536 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 537 // We use arclite library for both ARC and subscripting support. 538 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs); 539 540 CmdArgs.push_back("-framework"); 541 CmdArgs.push_back("Foundation"); 542 // Link libobj. 543 CmdArgs.push_back("-lobjc"); 544 } 545 546 if (LinkingOutput) { 547 CmdArgs.push_back("-arch_multiple"); 548 CmdArgs.push_back("-final_output"); 549 CmdArgs.push_back(LinkingOutput); 550 } 551 552 if (Args.hasArg(options::OPT_fnested_functions)) 553 CmdArgs.push_back("-allow_stack_execute"); 554 555 getMachOToolChain().addProfileRTLibs(Args, CmdArgs); 556 557 if (unsigned Parallelism = 558 getLTOParallelism(Args, getToolChain().getDriver())) { 559 CmdArgs.push_back("-mllvm"); 560 CmdArgs.push_back(Args.MakeArgString("-threads=" + Twine(Parallelism))); 561 } 562 563 if (getToolChain().ShouldLinkCXXStdlib(Args)) 564 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 565 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 566 // link_ssp spec is empty. 567 568 // Let the tool chain choose which runtime library to link. 569 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 570 571 // No need to do anything for pthreads. Claim argument to avoid warning. 572 Args.ClaimAllArgs(options::OPT_pthread); 573 Args.ClaimAllArgs(options::OPT_pthreads); 574 } 575 576 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 577 // endfile_spec is empty. 578 } 579 580 Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 581 Args.AddAllArgs(CmdArgs, options::OPT_F); 582 583 // -iframework should be forwarded as -F. 584 for (const Arg *A : Args.filtered(options::OPT_iframework)) 585 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue())); 586 587 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 588 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) { 589 if (A->getValue() == StringRef("Accelerate")) { 590 CmdArgs.push_back("-framework"); 591 CmdArgs.push_back("Accelerate"); 592 } 593 } 594 } 595 596 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 597 std::unique_ptr<Command> Cmd = 598 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs); 599 Cmd->setInputFileList(std::move(InputFileList)); 600 C.addCommand(std::move(Cmd)); 601 } 602 603 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 604 const InputInfo &Output, 605 const InputInfoList &Inputs, 606 const ArgList &Args, 607 const char *LinkingOutput) const { 608 ArgStringList CmdArgs; 609 610 CmdArgs.push_back("-create"); 611 assert(Output.isFilename() && "Unexpected lipo output."); 612 613 CmdArgs.push_back("-output"); 614 CmdArgs.push_back(Output.getFilename()); 615 616 for (const auto &II : Inputs) { 617 assert(II.isFilename() && "Unexpected lipo input."); 618 CmdArgs.push_back(II.getFilename()); 619 } 620 621 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo")); 622 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 623 } 624 625 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA, 626 const InputInfo &Output, 627 const InputInfoList &Inputs, 628 const ArgList &Args, 629 const char *LinkingOutput) const { 630 ArgStringList CmdArgs; 631 632 CmdArgs.push_back("-o"); 633 CmdArgs.push_back(Output.getFilename()); 634 635 assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 636 const InputInfo &Input = Inputs[0]; 637 assert(Input.isFilename() && "Unexpected dsymutil input."); 638 CmdArgs.push_back(Input.getFilename()); 639 640 const char *Exec = 641 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil")); 642 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 643 } 644 645 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA, 646 const InputInfo &Output, 647 const InputInfoList &Inputs, 648 const ArgList &Args, 649 const char *LinkingOutput) const { 650 ArgStringList CmdArgs; 651 CmdArgs.push_back("--verify"); 652 CmdArgs.push_back("--debug-info"); 653 CmdArgs.push_back("--eh-frame"); 654 CmdArgs.push_back("--quiet"); 655 656 assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 657 const InputInfo &Input = Inputs[0]; 658 assert(Input.isFilename() && "Unexpected verify input"); 659 660 // Grabbing the output of the earlier dsymutil run. 661 CmdArgs.push_back(Input.getFilename()); 662 663 const char *Exec = 664 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump")); 665 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 666 } 667 668 MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) 669 : ToolChain(D, Triple, Args) { 670 // We expect 'as', 'ld', etc. to be adjacent to our install dir. 671 getProgramPaths().push_back(getDriver().getInstalledDir()); 672 if (getDriver().getInstalledDir() != getDriver().Dir) 673 getProgramPaths().push_back(getDriver().Dir); 674 } 675 676 /// Darwin - Darwin tool chain for i386 and x86_64. 677 Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) 678 : MachO(D, Triple, Args), TargetInitialized(false), 679 CudaInstallation(D, Triple, Args) {} 680 681 types::ID MachO::LookupTypeForExtension(StringRef Ext) const { 682 types::ID Ty = types::lookupTypeForExtension(Ext); 683 684 // Darwin always preprocesses assembly files (unless -x is used explicitly). 685 if (Ty == types::TY_PP_Asm) 686 return types::TY_Asm; 687 688 return Ty; 689 } 690 691 bool MachO::HasNativeLLVMSupport() const { return true; } 692 693 ToolChain::CXXStdlibType Darwin::GetDefaultCXXStdlibType() const { 694 // Default to use libc++ on OS X 10.9+ and iOS 7+. 695 if ((isTargetMacOS() && !isMacosxVersionLT(10, 9)) || 696 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) || 697 isTargetWatchOSBased()) 698 return ToolChain::CST_Libcxx; 699 700 return ToolChain::CST_Libstdcxx; 701 } 702 703 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0. 704 ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const { 705 if (isTargetWatchOSBased()) 706 return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion); 707 if (isTargetIOSBased()) 708 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion); 709 if (isNonFragile) 710 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion); 711 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion); 712 } 713 714 /// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2. 715 bool Darwin::hasBlocksRuntime() const { 716 if (isTargetWatchOSBased()) 717 return true; 718 else if (isTargetIOSBased()) 719 return !isIPhoneOSVersionLT(3, 2); 720 else { 721 assert(isTargetMacOS() && "unexpected darwin target"); 722 return !isMacosxVersionLT(10, 6); 723 } 724 } 725 726 void Darwin::AddCudaIncludeArgs(const ArgList &DriverArgs, 727 ArgStringList &CC1Args) const { 728 CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args); 729 } 730 731 // This is just a MachO name translation routine and there's no 732 // way to join this into ARMTargetParser without breaking all 733 // other assumptions. Maybe MachO should consider standardising 734 // their nomenclature. 735 static const char *ArmMachOArchName(StringRef Arch) { 736 return llvm::StringSwitch<const char *>(Arch) 737 .Case("armv6k", "armv6") 738 .Case("armv6m", "armv6m") 739 .Case("armv5tej", "armv5") 740 .Case("xscale", "xscale") 741 .Case("armv4t", "armv4t") 742 .Case("armv7", "armv7") 743 .Cases("armv7a", "armv7-a", "armv7") 744 .Cases("armv7r", "armv7-r", "armv7") 745 .Cases("armv7em", "armv7e-m", "armv7em") 746 .Cases("armv7k", "armv7-k", "armv7k") 747 .Cases("armv7m", "armv7-m", "armv7m") 748 .Cases("armv7s", "armv7-s", "armv7s") 749 .Default(nullptr); 750 } 751 752 static const char *ArmMachOArchNameCPU(StringRef CPU) { 753 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU); 754 if (ArchKind == llvm::ARM::ArchKind::INVALID) 755 return nullptr; 756 StringRef Arch = llvm::ARM::getArchName(ArchKind); 757 758 // FIXME: Make sure this MachO triple mangling is really necessary. 759 // ARMv5* normalises to ARMv5. 760 if (Arch.startswith("armv5")) 761 Arch = Arch.substr(0, 5); 762 // ARMv6*, except ARMv6M, normalises to ARMv6. 763 else if (Arch.startswith("armv6") && !Arch.endswith("6m")) 764 Arch = Arch.substr(0, 5); 765 // ARMv7A normalises to ARMv7. 766 else if (Arch.endswith("v7a")) 767 Arch = Arch.substr(0, 5); 768 return Arch.data(); 769 } 770 771 StringRef MachO::getMachOArchName(const ArgList &Args) const { 772 switch (getTriple().getArch()) { 773 default: 774 return getDefaultUniversalArchName(); 775 776 case llvm::Triple::aarch64: 777 return "arm64"; 778 779 case llvm::Triple::thumb: 780 case llvm::Triple::arm: 781 if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) 782 if (const char *Arch = ArmMachOArchName(A->getValue())) 783 return Arch; 784 785 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 786 if (const char *Arch = ArmMachOArchNameCPU(A->getValue())) 787 return Arch; 788 789 return "arm"; 790 } 791 } 792 793 Darwin::~Darwin() {} 794 795 MachO::~MachO() {} 796 797 std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args, 798 types::ID InputType) const { 799 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); 800 801 // If the target isn't initialized (e.g., an unknown Darwin platform, return 802 // the default triple). 803 if (!isTargetInitialized()) 804 return Triple.getTriple(); 805 806 SmallString<16> Str; 807 if (isTargetWatchOSBased()) 808 Str += "watchos"; 809 else if (isTargetTvOSBased()) 810 Str += "tvos"; 811 else if (isTargetIOSBased()) 812 Str += "ios"; 813 else 814 Str += "macosx"; 815 Str += getTargetVersion().getAsString(); 816 Triple.setOSName(Str); 817 818 return Triple.getTriple(); 819 } 820 821 Tool *MachO::getTool(Action::ActionClass AC) const { 822 switch (AC) { 823 case Action::LipoJobClass: 824 if (!Lipo) 825 Lipo.reset(new tools::darwin::Lipo(*this)); 826 return Lipo.get(); 827 case Action::DsymutilJobClass: 828 if (!Dsymutil) 829 Dsymutil.reset(new tools::darwin::Dsymutil(*this)); 830 return Dsymutil.get(); 831 case Action::VerifyDebugInfoJobClass: 832 if (!VerifyDebug) 833 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this)); 834 return VerifyDebug.get(); 835 default: 836 return ToolChain::getTool(AC); 837 } 838 } 839 840 Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); } 841 842 Tool *MachO::buildAssembler() const { 843 return new tools::darwin::Assembler(*this); 844 } 845 846 DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple, 847 const ArgList &Args) 848 : Darwin(D, Triple, Args) {} 849 850 void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const { 851 // For modern targets, promote certain warnings to errors. 852 if (isTargetWatchOSBased() || getTriple().isArch64Bit()) { 853 // Always enable -Wdeprecated-objc-isa-usage and promote it 854 // to an error. 855 CC1Args.push_back("-Wdeprecated-objc-isa-usage"); 856 CC1Args.push_back("-Werror=deprecated-objc-isa-usage"); 857 858 // For iOS and watchOS, also error about implicit function declarations, 859 // as that can impact calling conventions. 860 if (!isTargetMacOS()) 861 CC1Args.push_back("-Werror=implicit-function-declaration"); 862 } 863 } 864 865 void DarwinClang::AddLinkARCArgs(const ArgList &Args, 866 ArgStringList &CmdArgs) const { 867 // Avoid linking compatibility stubs on i386 mac. 868 if (isTargetMacOS() && getArch() == llvm::Triple::x86) 869 return; 870 871 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true); 872 873 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) && 874 runtime.hasSubscripting()) 875 return; 876 877 CmdArgs.push_back("-force_load"); 878 SmallString<128> P(getDriver().ClangExecutable); 879 llvm::sys::path::remove_filename(P); // 'clang' 880 llvm::sys::path::remove_filename(P); // 'bin' 881 llvm::sys::path::append(P, "lib", "arc", "libarclite_"); 882 // Mash in the platform. 883 if (isTargetWatchOSSimulator()) 884 P += "watchsimulator"; 885 else if (isTargetWatchOS()) 886 P += "watchos"; 887 else if (isTargetTvOSSimulator()) 888 P += "appletvsimulator"; 889 else if (isTargetTvOS()) 890 P += "appletvos"; 891 else if (isTargetIOSSimulator()) 892 P += "iphonesimulator"; 893 else if (isTargetIPhoneOS()) 894 P += "iphoneos"; 895 else 896 P += "macosx"; 897 P += ".a"; 898 899 CmdArgs.push_back(Args.MakeArgString(P)); 900 } 901 902 unsigned DarwinClang::GetDefaultDwarfVersion() const { 903 // Default to use DWARF 2 on OS X 10.10 / iOS 8 and lower. 904 if ((isTargetMacOS() && isMacosxVersionLT(10, 11)) || 905 (isTargetIOSBased() && isIPhoneOSVersionLT(9))) 906 return 2; 907 return 4; 908 } 909 910 void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs, 911 StringRef Component, RuntimeLinkOptions Opts, 912 bool IsShared) const { 913 SmallString<64> DarwinLibName = StringRef("libclang_rt."); 914 // an Darwin the builtins compomnent is not in the library name 915 if (Component != "builtins") { 916 DarwinLibName += Component; 917 if (!(Opts & RLO_IsEmbedded)) 918 DarwinLibName += "_"; 919 DarwinLibName += getOSLibraryNameSuffix(); 920 } else 921 DarwinLibName += getOSLibraryNameSuffix(true); 922 923 DarwinLibName += IsShared ? "_dynamic.dylib" : ".a"; 924 SmallString<128> Dir(getDriver().ResourceDir); 925 llvm::sys::path::append( 926 Dir, "lib", (Opts & RLO_IsEmbedded) ? "macho_embedded" : "darwin"); 927 928 SmallString<128> P(Dir); 929 llvm::sys::path::append(P, DarwinLibName); 930 931 // For now, allow missing resource libraries to support developers who may 932 // not have compiler-rt checked out or integrated into their build (unless 933 // we explicitly force linking with this library). 934 if ((Opts & RLO_AlwaysLink) || getVFS().exists(P)) { 935 const char *LibArg = Args.MakeArgString(P); 936 if (Opts & RLO_FirstLink) 937 CmdArgs.insert(CmdArgs.begin(), LibArg); 938 else 939 CmdArgs.push_back(LibArg); 940 } 941 942 // Adding the rpaths might negatively interact when other rpaths are involved, 943 // so we should make sure we add the rpaths last, after all user-specified 944 // rpaths. This is currently true from this place, but we need to be 945 // careful if this function is ever called before user's rpaths are emitted. 946 if (Opts & RLO_AddRPath) { 947 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library"); 948 949 // Add @executable_path to rpath to support having the dylib copied with 950 // the executable. 951 CmdArgs.push_back("-rpath"); 952 CmdArgs.push_back("@executable_path"); 953 954 // Add the path to the resource dir to rpath to support using the dylib 955 // from the default location without copying. 956 CmdArgs.push_back("-rpath"); 957 CmdArgs.push_back(Args.MakeArgString(Dir)); 958 } 959 } 960 961 StringRef Darwin::getPlatformFamily() const { 962 switch (TargetPlatform) { 963 case DarwinPlatformKind::MacOS: 964 return "MacOSX"; 965 case DarwinPlatformKind::IPhoneOS: 966 return "iPhone"; 967 case DarwinPlatformKind::TvOS: 968 return "AppleTV"; 969 case DarwinPlatformKind::WatchOS: 970 return "Watch"; 971 } 972 llvm_unreachable("Unsupported platform"); 973 } 974 975 StringRef Darwin::getSDKName(StringRef isysroot) { 976 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk 977 llvm::sys::path::const_iterator SDKDir; 978 auto BeginSDK = llvm::sys::path::begin(isysroot); 979 auto EndSDK = llvm::sys::path::end(isysroot); 980 for (auto IT = BeginSDK; IT != EndSDK; ++IT) { 981 StringRef SDK = *IT; 982 if (SDK.endswith(".sdk")) 983 return SDK.slice(0, SDK.size() - 4); 984 } 985 return ""; 986 } 987 988 StringRef Darwin::getOSLibraryNameSuffix(bool IgnoreSim) const { 989 switch (TargetPlatform) { 990 case DarwinPlatformKind::MacOS: 991 return "osx"; 992 case DarwinPlatformKind::IPhoneOS: 993 return TargetEnvironment == NativeEnvironment || IgnoreSim ? "ios" 994 : "iossim"; 995 case DarwinPlatformKind::TvOS: 996 return TargetEnvironment == NativeEnvironment || IgnoreSim ? "tvos" 997 : "tvossim"; 998 case DarwinPlatformKind::WatchOS: 999 return TargetEnvironment == NativeEnvironment || IgnoreSim ? "watchos" 1000 : "watchossim"; 1001 } 1002 llvm_unreachable("Unsupported platform"); 1003 } 1004 1005 /// Check if the link command contains a symbol export directive. 1006 static bool hasExportSymbolDirective(const ArgList &Args) { 1007 for (Arg *A : Args) { 1008 if (A->getOption().matches(options::OPT_exported__symbols__list)) 1009 return true; 1010 if (!A->getOption().matches(options::OPT_Wl_COMMA) && 1011 !A->getOption().matches(options::OPT_Xlinker)) 1012 continue; 1013 if (A->containsValue("-exported_symbols_list") || 1014 A->containsValue("-exported_symbol")) 1015 return true; 1016 } 1017 return false; 1018 } 1019 1020 /// Add an export directive for \p Symbol to the link command. 1021 static void addExportedSymbol(ArgStringList &CmdArgs, const char *Symbol) { 1022 CmdArgs.push_back("-exported_symbol"); 1023 CmdArgs.push_back(Symbol); 1024 } 1025 1026 void Darwin::addProfileRTLibs(const ArgList &Args, 1027 ArgStringList &CmdArgs) const { 1028 if (!needsProfileRT(Args)) return; 1029 1030 AddLinkRuntimeLib(Args, CmdArgs, "profile", 1031 RuntimeLinkOptions(RLO_AlwaysLink | RLO_FirstLink)); 1032 1033 // If we have a symbol export directive and we're linking in the profile 1034 // runtime, automatically export symbols necessary to implement some of the 1035 // runtime's functionality. 1036 if (hasExportSymbolDirective(Args)) { 1037 if (needsGCovInstrumentation(Args)) { 1038 addExportedSymbol(CmdArgs, "___gcov_flush"); 1039 addExportedSymbol(CmdArgs, "_flush_fn_list"); 1040 addExportedSymbol(CmdArgs, "_writeout_fn_list"); 1041 } else { 1042 addExportedSymbol(CmdArgs, "___llvm_profile_filename"); 1043 addExportedSymbol(CmdArgs, "___llvm_profile_raw_version"); 1044 addExportedSymbol(CmdArgs, "_lprofCurFilename"); 1045 addExportedSymbol(CmdArgs, "_lprofMergeValueProfData"); 1046 } 1047 addExportedSymbol(CmdArgs, "_lprofDirMode"); 1048 } 1049 } 1050 1051 void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args, 1052 ArgStringList &CmdArgs, 1053 StringRef Sanitizer, 1054 bool Shared) const { 1055 auto RLO = RuntimeLinkOptions(RLO_AlwaysLink | (Shared ? RLO_AddRPath : 0U)); 1056 AddLinkRuntimeLib(Args, CmdArgs, Sanitizer, RLO, Shared); 1057 } 1058 1059 ToolChain::RuntimeLibType DarwinClang::GetRuntimeLibType( 1060 const ArgList &Args) const { 1061 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) { 1062 StringRef Value = A->getValue(); 1063 if (Value != "compiler-rt") 1064 getDriver().Diag(clang::diag::err_drv_unsupported_rtlib_for_platform) 1065 << Value << "darwin"; 1066 } 1067 1068 return ToolChain::RLT_CompilerRT; 1069 } 1070 1071 void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 1072 ArgStringList &CmdArgs) const { 1073 // Call once to ensure diagnostic is printed if wrong value was specified 1074 GetRuntimeLibType(Args); 1075 1076 // Darwin doesn't support real static executables, don't link any runtime 1077 // libraries with -static. 1078 if (Args.hasArg(options::OPT_static) || 1079 Args.hasArg(options::OPT_fapple_kext) || 1080 Args.hasArg(options::OPT_mkernel)) 1081 return; 1082 1083 // Reject -static-libgcc for now, we can deal with this when and if someone 1084 // cares. This is useful in situations where someone wants to statically link 1085 // something like libstdc++, and needs its runtime support routines. 1086 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 1087 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args); 1088 return; 1089 } 1090 1091 const SanitizerArgs &Sanitize = getSanitizerArgs(); 1092 if (Sanitize.needsAsanRt()) 1093 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan"); 1094 if (Sanitize.needsLsanRt()) 1095 AddLinkSanitizerLibArgs(Args, CmdArgs, "lsan"); 1096 if (Sanitize.needsUbsanRt()) 1097 AddLinkSanitizerLibArgs(Args, CmdArgs, 1098 Sanitize.requiresMinimalRuntime() ? "ubsan_minimal" 1099 : "ubsan", 1100 Sanitize.needsSharedRt()); 1101 if (Sanitize.needsTsanRt()) 1102 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan"); 1103 if (Sanitize.needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) { 1104 AddLinkSanitizerLibArgs(Args, CmdArgs, "fuzzer", /*shared=*/false); 1105 1106 // Libfuzzer is written in C++ and requires libcxx. 1107 AddCXXStdlibLibArgs(Args, CmdArgs); 1108 } 1109 if (Sanitize.needsStatsRt()) { 1110 AddLinkRuntimeLib(Args, CmdArgs, "stats_client", RLO_AlwaysLink); 1111 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats"); 1112 } 1113 if (Sanitize.needsEsanRt()) 1114 AddLinkSanitizerLibArgs(Args, CmdArgs, "esan"); 1115 1116 const XRayArgs &XRay = getXRayArgs(); 1117 if (XRay.needsXRayRt()) { 1118 AddLinkRuntimeLib(Args, CmdArgs, "xray"); 1119 AddLinkRuntimeLib(Args, CmdArgs, "xray-basic"); 1120 AddLinkRuntimeLib(Args, CmdArgs, "xray-fdr"); 1121 } 1122 1123 // Otherwise link libSystem, then the dynamic runtime library, and finally any 1124 // target specific static runtime library. 1125 CmdArgs.push_back("-lSystem"); 1126 1127 // Select the dynamic runtime library and the target specific static library. 1128 if (isTargetIOSBased()) { 1129 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1, 1130 // it never went into the SDK. 1131 // Linking against libgcc_s.1 isn't needed for iOS 5.0+ 1132 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() && 1133 getTriple().getArch() != llvm::Triple::aarch64) 1134 CmdArgs.push_back("-lgcc_s.1"); 1135 } 1136 AddLinkRuntimeLib(Args, CmdArgs, "builtins"); 1137 } 1138 1139 /// Returns the most appropriate macOS target version for the current process. 1140 /// 1141 /// If the macOS SDK version is the same or earlier than the system version, 1142 /// then the SDK version is returned. Otherwise the system version is returned. 1143 static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion) { 1144 unsigned Major, Minor, Micro; 1145 llvm::Triple SystemTriple(llvm::sys::getProcessTriple()); 1146 if (!SystemTriple.isMacOSX()) 1147 return MacOSSDKVersion; 1148 SystemTriple.getMacOSXVersion(Major, Minor, Micro); 1149 VersionTuple SystemVersion(Major, Minor, Micro); 1150 bool HadExtra; 1151 if (!Driver::GetReleaseVersion(MacOSSDKVersion, Major, Minor, Micro, 1152 HadExtra)) 1153 return MacOSSDKVersion; 1154 VersionTuple SDKVersion(Major, Minor, Micro); 1155 if (SDKVersion > SystemVersion) 1156 return SystemVersion.getAsString(); 1157 return MacOSSDKVersion; 1158 } 1159 1160 namespace { 1161 1162 /// The Darwin OS that was selected or inferred from arguments / environment. 1163 struct DarwinPlatform { 1164 enum SourceKind { 1165 /// The OS was specified using the -target argument. 1166 TargetArg, 1167 /// The OS was specified using the -m<os>-version-min argument. 1168 OSVersionArg, 1169 /// The OS was specified using the OS_DEPLOYMENT_TARGET environment. 1170 DeploymentTargetEnv, 1171 /// The OS was inferred from the SDK. 1172 InferredFromSDK, 1173 /// The OS was inferred from the -arch. 1174 InferredFromArch 1175 }; 1176 1177 using DarwinPlatformKind = Darwin::DarwinPlatformKind; 1178 using DarwinEnvironmentKind = Darwin::DarwinEnvironmentKind; 1179 1180 DarwinPlatformKind getPlatform() const { return Platform; } 1181 1182 DarwinEnvironmentKind getEnvironment() const { return Environment; } 1183 1184 void setEnvironment(DarwinEnvironmentKind Kind) { 1185 Environment = Kind; 1186 InferSimulatorFromArch = false; 1187 } 1188 1189 StringRef getOSVersion() const { 1190 if (Kind == OSVersionArg) 1191 return Argument->getValue(); 1192 return OSVersion; 1193 } 1194 1195 void setOSVersion(StringRef S) { 1196 assert(Kind == TargetArg && "Unexpected kind!"); 1197 OSVersion = S; 1198 } 1199 1200 bool hasOSVersion() const { return HasOSVersion; } 1201 1202 /// Returns true if the target OS was explicitly specified. 1203 bool isExplicitlySpecified() const { return Kind <= DeploymentTargetEnv; } 1204 1205 /// Returns true if the simulator environment can be inferred from the arch. 1206 bool canInferSimulatorFromArch() const { return InferSimulatorFromArch; } 1207 1208 /// Adds the -m<os>-version-min argument to the compiler invocation. 1209 void addOSVersionMinArgument(DerivedArgList &Args, const OptTable &Opts) { 1210 if (Argument) 1211 return; 1212 assert(Kind != TargetArg && Kind != OSVersionArg && "Invalid kind"); 1213 options::ID Opt; 1214 switch (Platform) { 1215 case DarwinPlatformKind::MacOS: 1216 Opt = options::OPT_mmacosx_version_min_EQ; 1217 break; 1218 case DarwinPlatformKind::IPhoneOS: 1219 Opt = options::OPT_miphoneos_version_min_EQ; 1220 break; 1221 case DarwinPlatformKind::TvOS: 1222 Opt = options::OPT_mtvos_version_min_EQ; 1223 break; 1224 case DarwinPlatformKind::WatchOS: 1225 Opt = options::OPT_mwatchos_version_min_EQ; 1226 break; 1227 } 1228 Argument = Args.MakeJoinedArg(nullptr, Opts.getOption(Opt), OSVersion); 1229 Args.append(Argument); 1230 } 1231 1232 /// Returns the OS version with the argument / environment variable that 1233 /// specified it. 1234 std::string getAsString(DerivedArgList &Args, const OptTable &Opts) { 1235 switch (Kind) { 1236 case TargetArg: 1237 case OSVersionArg: 1238 case InferredFromSDK: 1239 case InferredFromArch: 1240 assert(Argument && "OS version argument not yet inferred"); 1241 return Argument->getAsString(Args); 1242 case DeploymentTargetEnv: 1243 return (llvm::Twine(EnvVarName) + "=" + OSVersion).str(); 1244 } 1245 llvm_unreachable("Unsupported Darwin Source Kind"); 1246 } 1247 1248 static DarwinPlatform createFromTarget(const llvm::Triple &TT, 1249 StringRef OSVersion, Arg *A) { 1250 DarwinPlatform Result(TargetArg, getPlatformFromOS(TT.getOS()), OSVersion, 1251 A); 1252 switch (TT.getEnvironment()) { 1253 case llvm::Triple::Simulator: 1254 Result.Environment = DarwinEnvironmentKind::Simulator; 1255 break; 1256 default: 1257 break; 1258 } 1259 unsigned Major, Minor, Micro; 1260 TT.getOSVersion(Major, Minor, Micro); 1261 if (Major == 0) 1262 Result.HasOSVersion = false; 1263 return Result; 1264 } 1265 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, 1266 Arg *A) { 1267 return DarwinPlatform(OSVersionArg, Platform, A); 1268 } 1269 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform, 1270 StringRef EnvVarName, 1271 StringRef Value) { 1272 DarwinPlatform Result(DeploymentTargetEnv, Platform, Value); 1273 Result.EnvVarName = EnvVarName; 1274 return Result; 1275 } 1276 static DarwinPlatform createFromSDK(DarwinPlatformKind Platform, 1277 StringRef Value, 1278 bool IsSimulator = false) { 1279 DarwinPlatform Result(InferredFromSDK, Platform, Value); 1280 if (IsSimulator) 1281 Result.Environment = DarwinEnvironmentKind::Simulator; 1282 Result.InferSimulatorFromArch = false; 1283 return Result; 1284 } 1285 static DarwinPlatform createFromArch(llvm::Triple::OSType OS, 1286 StringRef Value) { 1287 return DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Value); 1288 } 1289 1290 private: 1291 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument) 1292 : Kind(Kind), Platform(Platform), Argument(Argument) {} 1293 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, StringRef Value, 1294 Arg *Argument = nullptr) 1295 : Kind(Kind), Platform(Platform), OSVersion(Value), Argument(Argument) {} 1296 1297 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) { 1298 switch (OS) { 1299 case llvm::Triple::Darwin: 1300 case llvm::Triple::MacOSX: 1301 return DarwinPlatformKind::MacOS; 1302 case llvm::Triple::IOS: 1303 return DarwinPlatformKind::IPhoneOS; 1304 case llvm::Triple::TvOS: 1305 return DarwinPlatformKind::TvOS; 1306 case llvm::Triple::WatchOS: 1307 return DarwinPlatformKind::WatchOS; 1308 default: 1309 llvm_unreachable("Unable to infer Darwin variant"); 1310 } 1311 } 1312 1313 SourceKind Kind; 1314 DarwinPlatformKind Platform; 1315 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment; 1316 std::string OSVersion; 1317 bool HasOSVersion = true, InferSimulatorFromArch = true; 1318 Arg *Argument; 1319 StringRef EnvVarName; 1320 }; 1321 1322 /// Returns the deployment target that's specified using the -m<os>-version-min 1323 /// argument. 1324 Optional<DarwinPlatform> 1325 getDeploymentTargetFromOSVersionArg(DerivedArgList &Args, 1326 const Driver &TheDriver) { 1327 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 1328 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ, 1329 options::OPT_mios_simulator_version_min_EQ); 1330 Arg *TvOSVersion = 1331 Args.getLastArg(options::OPT_mtvos_version_min_EQ, 1332 options::OPT_mtvos_simulator_version_min_EQ); 1333 Arg *WatchOSVersion = 1334 Args.getLastArg(options::OPT_mwatchos_version_min_EQ, 1335 options::OPT_mwatchos_simulator_version_min_EQ); 1336 if (OSXVersion) { 1337 if (iOSVersion || TvOSVersion || WatchOSVersion) { 1338 TheDriver.Diag(diag::err_drv_argument_not_allowed_with) 1339 << OSXVersion->getAsString(Args) 1340 << (iOSVersion ? iOSVersion 1341 : TvOSVersion ? TvOSVersion : WatchOSVersion) 1342 ->getAsString(Args); 1343 } 1344 return DarwinPlatform::createOSVersionArg(Darwin::MacOS, OSXVersion); 1345 } else if (iOSVersion) { 1346 if (TvOSVersion || WatchOSVersion) { 1347 TheDriver.Diag(diag::err_drv_argument_not_allowed_with) 1348 << iOSVersion->getAsString(Args) 1349 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args); 1350 } 1351 return DarwinPlatform::createOSVersionArg(Darwin::IPhoneOS, iOSVersion); 1352 } else if (TvOSVersion) { 1353 if (WatchOSVersion) { 1354 TheDriver.Diag(diag::err_drv_argument_not_allowed_with) 1355 << TvOSVersion->getAsString(Args) 1356 << WatchOSVersion->getAsString(Args); 1357 } 1358 return DarwinPlatform::createOSVersionArg(Darwin::TvOS, TvOSVersion); 1359 } else if (WatchOSVersion) 1360 return DarwinPlatform::createOSVersionArg(Darwin::WatchOS, WatchOSVersion); 1361 return None; 1362 } 1363 1364 /// Returns the deployment target that's specified using the 1365 /// OS_DEPLOYMENT_TARGET environment variable. 1366 Optional<DarwinPlatform> 1367 getDeploymentTargetFromEnvironmentVariables(const Driver &TheDriver, 1368 const llvm::Triple &Triple) { 1369 std::string Targets[Darwin::LastDarwinPlatform + 1]; 1370 const char *EnvVars[] = { 1371 "MACOSX_DEPLOYMENT_TARGET", 1372 "IPHONEOS_DEPLOYMENT_TARGET", 1373 "TVOS_DEPLOYMENT_TARGET", 1374 "WATCHOS_DEPLOYMENT_TARGET", 1375 }; 1376 static_assert(llvm::array_lengthof(EnvVars) == Darwin::LastDarwinPlatform + 1, 1377 "Missing platform"); 1378 for (const auto &I : llvm::enumerate(llvm::makeArrayRef(EnvVars))) { 1379 if (char *Env = ::getenv(I.value())) 1380 Targets[I.index()] = Env; 1381 } 1382 1383 // Do not allow conflicts with the watchOS target. 1384 if (!Targets[Darwin::WatchOS].empty() && 1385 (!Targets[Darwin::IPhoneOS].empty() || !Targets[Darwin::TvOS].empty())) { 1386 TheDriver.Diag(diag::err_drv_conflicting_deployment_targets) 1387 << "WATCHOS_DEPLOYMENT_TARGET" 1388 << (!Targets[Darwin::IPhoneOS].empty() ? "IPHONEOS_DEPLOYMENT_TARGET" 1389 : "TVOS_DEPLOYMENT_TARGET"); 1390 } 1391 1392 // Do not allow conflicts with the tvOS target. 1393 if (!Targets[Darwin::TvOS].empty() && !Targets[Darwin::IPhoneOS].empty()) { 1394 TheDriver.Diag(diag::err_drv_conflicting_deployment_targets) 1395 << "TVOS_DEPLOYMENT_TARGET" 1396 << "IPHONEOS_DEPLOYMENT_TARGET"; 1397 } 1398 1399 // Allow conflicts among OSX and iOS for historical reasons, but choose the 1400 // default platform. 1401 if (!Targets[Darwin::MacOS].empty() && 1402 (!Targets[Darwin::IPhoneOS].empty() || 1403 !Targets[Darwin::WatchOS].empty() || !Targets[Darwin::TvOS].empty())) { 1404 if (Triple.getArch() == llvm::Triple::arm || 1405 Triple.getArch() == llvm::Triple::aarch64 || 1406 Triple.getArch() == llvm::Triple::thumb) 1407 Targets[Darwin::MacOS] = ""; 1408 else 1409 Targets[Darwin::IPhoneOS] = Targets[Darwin::WatchOS] = 1410 Targets[Darwin::TvOS] = ""; 1411 } 1412 1413 for (const auto &Target : llvm::enumerate(llvm::makeArrayRef(Targets))) { 1414 if (!Target.value().empty()) 1415 return DarwinPlatform::createDeploymentTargetEnv( 1416 (Darwin::DarwinPlatformKind)Target.index(), EnvVars[Target.index()], 1417 Target.value()); 1418 } 1419 return None; 1420 } 1421 1422 /// Tries to infer the deployment target from the SDK specified by -isysroot 1423 /// (or SDKROOT). 1424 Optional<DarwinPlatform> inferDeploymentTargetFromSDK(DerivedArgList &Args) { 1425 const Arg *A = Args.getLastArg(options::OPT_isysroot); 1426 if (!A) 1427 return None; 1428 StringRef isysroot = A->getValue(); 1429 StringRef SDK = Darwin::getSDKName(isysroot); 1430 if (!SDK.size()) 1431 return None; 1432 // Slice the version number out. 1433 // Version number is between the first and the last number. 1434 size_t StartVer = SDK.find_first_of("0123456789"); 1435 size_t EndVer = SDK.find_last_of("0123456789"); 1436 if (StartVer != StringRef::npos && EndVer > StartVer) { 1437 StringRef Version = SDK.slice(StartVer, EndVer + 1); 1438 if (SDK.startswith("iPhoneOS") || SDK.startswith("iPhoneSimulator")) 1439 return DarwinPlatform::createFromSDK( 1440 Darwin::IPhoneOS, Version, 1441 /*IsSimulator=*/SDK.startswith("iPhoneSimulator")); 1442 else if (SDK.startswith("MacOSX")) 1443 return DarwinPlatform::createFromSDK(Darwin::MacOS, 1444 getSystemOrSDKMacOSVersion(Version)); 1445 else if (SDK.startswith("WatchOS") || SDK.startswith("WatchSimulator")) 1446 return DarwinPlatform::createFromSDK( 1447 Darwin::WatchOS, Version, 1448 /*IsSimulator=*/SDK.startswith("WatchSimulator")); 1449 else if (SDK.startswith("AppleTVOS") || SDK.startswith("AppleTVSimulator")) 1450 return DarwinPlatform::createFromSDK( 1451 Darwin::TvOS, Version, 1452 /*IsSimulator=*/SDK.startswith("AppleTVSimulator")); 1453 } 1454 return None; 1455 } 1456 1457 std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple, 1458 const Driver &TheDriver) { 1459 unsigned Major, Minor, Micro; 1460 llvm::Triple SystemTriple(llvm::sys::getProcessTriple()); 1461 switch (OS) { 1462 case llvm::Triple::Darwin: 1463 case llvm::Triple::MacOSX: 1464 // If there is no version specified on triple, and both host and target are 1465 // macos, use the host triple to infer OS version. 1466 if (Triple.isMacOSX() && SystemTriple.isMacOSX() && 1467 !Triple.getOSMajorVersion()) 1468 SystemTriple.getMacOSXVersion(Major, Minor, Micro); 1469 else if (!Triple.getMacOSXVersion(Major, Minor, Micro)) 1470 TheDriver.Diag(diag::err_drv_invalid_darwin_version) 1471 << Triple.getOSName(); 1472 break; 1473 case llvm::Triple::IOS: 1474 Triple.getiOSVersion(Major, Minor, Micro); 1475 break; 1476 case llvm::Triple::TvOS: 1477 Triple.getOSVersion(Major, Minor, Micro); 1478 break; 1479 case llvm::Triple::WatchOS: 1480 Triple.getWatchOSVersion(Major, Minor, Micro); 1481 break; 1482 default: 1483 llvm_unreachable("Unexpected OS type"); 1484 break; 1485 } 1486 1487 std::string OSVersion; 1488 llvm::raw_string_ostream(OSVersion) << Major << '.' << Minor << '.' << Micro; 1489 return OSVersion; 1490 } 1491 1492 /// Tries to infer the target OS from the -arch. 1493 Optional<DarwinPlatform> 1494 inferDeploymentTargetFromArch(DerivedArgList &Args, const Darwin &Toolchain, 1495 const llvm::Triple &Triple, 1496 const Driver &TheDriver) { 1497 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS; 1498 1499 StringRef MachOArchName = Toolchain.getMachOArchName(Args); 1500 if (MachOArchName == "armv7" || MachOArchName == "armv7s" || 1501 MachOArchName == "arm64") 1502 OSTy = llvm::Triple::IOS; 1503 else if (MachOArchName == "armv7k") 1504 OSTy = llvm::Triple::WatchOS; 1505 else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" && 1506 MachOArchName != "armv7em") 1507 OSTy = llvm::Triple::MacOSX; 1508 1509 if (OSTy == llvm::Triple::UnknownOS) 1510 return None; 1511 return DarwinPlatform::createFromArch(OSTy, 1512 getOSVersion(OSTy, Triple, TheDriver)); 1513 } 1514 1515 /// Returns the deployment target that's specified using the -target option. 1516 Optional<DarwinPlatform> getDeploymentTargetFromTargetArg( 1517 DerivedArgList &Args, const llvm::Triple &Triple, const Driver &TheDriver) { 1518 if (!Args.hasArg(options::OPT_target)) 1519 return None; 1520 if (Triple.getOS() == llvm::Triple::Darwin || 1521 Triple.getOS() == llvm::Triple::UnknownOS) 1522 return None; 1523 std::string OSVersion = getOSVersion(Triple.getOS(), Triple, TheDriver); 1524 return DarwinPlatform::createFromTarget(Triple, OSVersion, 1525 Args.getLastArg(options::OPT_target)); 1526 } 1527 1528 } // namespace 1529 1530 void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 1531 const OptTable &Opts = getDriver().getOpts(); 1532 1533 // Support allowing the SDKROOT environment variable used by xcrun and other 1534 // Xcode tools to define the default sysroot, by making it the default for 1535 // isysroot. 1536 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 1537 // Warn if the path does not exist. 1538 if (!getVFS().exists(A->getValue())) 1539 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue(); 1540 } else { 1541 if (char *env = ::getenv("SDKROOT")) { 1542 // We only use this value as the default if it is an absolute path, 1543 // exists, and it is not the root path. 1544 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) && 1545 StringRef(env) != "/") { 1546 Args.append(Args.MakeSeparateArg( 1547 nullptr, Opts.getOption(options::OPT_isysroot), env)); 1548 } 1549 } 1550 } 1551 1552 // The OS and the version can be specified using the -target argument. 1553 Optional<DarwinPlatform> OSTarget = 1554 getDeploymentTargetFromTargetArg(Args, getTriple(), getDriver()); 1555 if (OSTarget) { 1556 Optional<DarwinPlatform> OSVersionArgTarget = 1557 getDeploymentTargetFromOSVersionArg(Args, getDriver()); 1558 if (OSVersionArgTarget) { 1559 unsigned TargetMajor, TargetMinor, TargetMicro; 1560 bool TargetExtra; 1561 unsigned ArgMajor, ArgMinor, ArgMicro; 1562 bool ArgExtra; 1563 if (OSTarget->getPlatform() != OSVersionArgTarget->getPlatform() || 1564 (Driver::GetReleaseVersion(OSTarget->getOSVersion(), TargetMajor, 1565 TargetMinor, TargetMicro, TargetExtra) && 1566 Driver::GetReleaseVersion(OSVersionArgTarget->getOSVersion(), 1567 ArgMajor, ArgMinor, ArgMicro, ArgExtra) && 1568 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) != 1569 VersionTuple(ArgMajor, ArgMinor, ArgMicro) || 1570 TargetExtra != ArgExtra))) { 1571 // Select the OS version from the -m<os>-version-min argument when 1572 // the -target does not include an OS version. 1573 if (OSTarget->getPlatform() == OSVersionArgTarget->getPlatform() && 1574 !OSTarget->hasOSVersion()) { 1575 OSTarget->setOSVersion(OSVersionArgTarget->getOSVersion()); 1576 } else { 1577 // Warn about -m<os>-version-min that doesn't match the OS version 1578 // that's specified in the target. 1579 std::string OSVersionArg = 1580 OSVersionArgTarget->getAsString(Args, Opts); 1581 std::string TargetArg = OSTarget->getAsString(Args, Opts); 1582 getDriver().Diag(clang::diag::warn_drv_overriding_flag_option) 1583 << OSVersionArg << TargetArg; 1584 } 1585 } 1586 } 1587 } else { 1588 // The OS target can be specified using the -m<os>version-min argument. 1589 OSTarget = getDeploymentTargetFromOSVersionArg(Args, getDriver()); 1590 // If no deployment target was specified on the command line, check for 1591 // environment defines. 1592 if (!OSTarget) { 1593 OSTarget = 1594 getDeploymentTargetFromEnvironmentVariables(getDriver(), getTriple()); 1595 if (OSTarget) { 1596 // Don't infer simulator from the arch when the SDK is also specified. 1597 Optional<DarwinPlatform> SDKTarget = inferDeploymentTargetFromSDK(Args); 1598 if (SDKTarget) 1599 OSTarget->setEnvironment(SDKTarget->getEnvironment()); 1600 } 1601 } 1602 // If there is no command-line argument to specify the Target version and 1603 // no environment variable defined, see if we can set the default based 1604 // on -isysroot. 1605 if (!OSTarget) 1606 OSTarget = inferDeploymentTargetFromSDK(Args); 1607 // If no OS targets have been specified, try to guess platform from -target 1608 // or arch name and compute the version from the triple. 1609 if (!OSTarget) 1610 OSTarget = 1611 inferDeploymentTargetFromArch(Args, *this, getTriple(), getDriver()); 1612 } 1613 1614 assert(OSTarget && "Unable to infer Darwin variant"); 1615 OSTarget->addOSVersionMinArgument(Args, Opts); 1616 DarwinPlatformKind Platform = OSTarget->getPlatform(); 1617 1618 unsigned Major, Minor, Micro; 1619 bool HadExtra; 1620 // Set the tool chain target information. 1621 if (Platform == MacOS) { 1622 if (!Driver::GetReleaseVersion(OSTarget->getOSVersion(), Major, Minor, 1623 Micro, HadExtra) || 1624 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100) 1625 getDriver().Diag(diag::err_drv_invalid_version_number) 1626 << OSTarget->getAsString(Args, Opts); 1627 } else if (Platform == IPhoneOS) { 1628 if (!Driver::GetReleaseVersion(OSTarget->getOSVersion(), Major, Minor, 1629 Micro, HadExtra) || 1630 HadExtra || Major >= 100 || Minor >= 100 || Micro >= 100) 1631 getDriver().Diag(diag::err_drv_invalid_version_number) 1632 << OSTarget->getAsString(Args, Opts); 1633 ; 1634 // For 32-bit targets, the deployment target for iOS has to be earlier than 1635 // iOS 11. 1636 if (getTriple().isArch32Bit() && Major >= 11) { 1637 // If the deployment target is explicitly specified, print a diagnostic. 1638 if (OSTarget->isExplicitlySpecified()) { 1639 getDriver().Diag(diag::warn_invalid_ios_deployment_target) 1640 << OSTarget->getAsString(Args, Opts); 1641 // Otherwise, set it to 10.99.99. 1642 } else { 1643 Major = 10; 1644 Minor = 99; 1645 Micro = 99; 1646 } 1647 } 1648 } else if (Platform == TvOS) { 1649 if (!Driver::GetReleaseVersion(OSTarget->getOSVersion(), Major, Minor, 1650 Micro, HadExtra) || 1651 HadExtra || Major >= 100 || Minor >= 100 || Micro >= 100) 1652 getDriver().Diag(diag::err_drv_invalid_version_number) 1653 << OSTarget->getAsString(Args, Opts); 1654 } else if (Platform == WatchOS) { 1655 if (!Driver::GetReleaseVersion(OSTarget->getOSVersion(), Major, Minor, 1656 Micro, HadExtra) || 1657 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100) 1658 getDriver().Diag(diag::err_drv_invalid_version_number) 1659 << OSTarget->getAsString(Args, Opts); 1660 } else 1661 llvm_unreachable("unknown kind of Darwin platform"); 1662 1663 DarwinEnvironmentKind Environment = OSTarget->getEnvironment(); 1664 // Recognize iOS targets with an x86 architecture as the iOS simulator. 1665 if (Environment == NativeEnvironment && Platform != MacOS && 1666 OSTarget->canInferSimulatorFromArch() && 1667 (getTriple().getArch() == llvm::Triple::x86 || 1668 getTriple().getArch() == llvm::Triple::x86_64)) 1669 Environment = Simulator; 1670 1671 setTarget(Platform, Environment, Major, Minor, Micro); 1672 1673 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 1674 StringRef SDK = getSDKName(A->getValue()); 1675 if (SDK.size() > 0) { 1676 size_t StartVer = SDK.find_first_of("0123456789"); 1677 StringRef SDKName = SDK.slice(0, StartVer); 1678 if (!SDKName.startswith(getPlatformFamily())) 1679 getDriver().Diag(diag::warn_incompatible_sysroot) 1680 << SDKName << getPlatformFamily(); 1681 } 1682 } 1683 } 1684 1685 void DarwinClang::AddClangCXXStdlibIncludeArgs( 1686 const llvm::opt::ArgList &DriverArgs, 1687 llvm::opt::ArgStringList &CC1Args) const { 1688 // The implementation from a base class will pass through the -stdlib to 1689 // CC1Args. 1690 // FIXME: this should not be necessary, remove usages in the frontend 1691 // (e.g. HeaderSearchOptions::UseLibcxx) and don't pipe -stdlib. 1692 ToolChain::AddClangCXXStdlibIncludeArgs(DriverArgs, CC1Args); 1693 1694 if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 1695 DriverArgs.hasArg(options::OPT_nostdincxx)) 1696 return; 1697 1698 switch (GetCXXStdlibType(DriverArgs)) { 1699 case ToolChain::CST_Libcxx: { 1700 llvm::StringRef InstallDir = getDriver().getInstalledDir(); 1701 if (InstallDir.empty()) 1702 break; 1703 // On Darwin, libc++ may be installed alongside the compiler in 1704 // include/c++/v1. 1705 // Get from 'foo/bin' to 'foo'. 1706 SmallString<128> P = llvm::sys::path::parent_path(InstallDir); 1707 // Get to 'foo/include/c++/v1'. 1708 llvm::sys::path::append(P, "include", "c++", "v1"); 1709 addSystemInclude(DriverArgs, CC1Args, P); 1710 break; 1711 } 1712 case ToolChain::CST_Libstdcxx: 1713 // FIXME: should we do something about it? 1714 break; 1715 } 1716 } 1717 void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args, 1718 ArgStringList &CmdArgs) const { 1719 CXXStdlibType Type = GetCXXStdlibType(Args); 1720 1721 switch (Type) { 1722 case ToolChain::CST_Libcxx: 1723 CmdArgs.push_back("-lc++"); 1724 break; 1725 1726 case ToolChain::CST_Libstdcxx: 1727 // Unfortunately, -lstdc++ doesn't always exist in the standard search path; 1728 // it was previously found in the gcc lib dir. However, for all the Darwin 1729 // platforms we care about it was -lstdc++.6, so we search for that 1730 // explicitly if we can't see an obvious -lstdc++ candidate. 1731 1732 // Check in the sysroot first. 1733 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 1734 SmallString<128> P(A->getValue()); 1735 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib"); 1736 1737 if (!getVFS().exists(P)) { 1738 llvm::sys::path::remove_filename(P); 1739 llvm::sys::path::append(P, "libstdc++.6.dylib"); 1740 if (getVFS().exists(P)) { 1741 CmdArgs.push_back(Args.MakeArgString(P)); 1742 return; 1743 } 1744 } 1745 } 1746 1747 // Otherwise, look in the root. 1748 // FIXME: This should be removed someday when we don't have to care about 1749 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist. 1750 if (!getVFS().exists("/usr/lib/libstdc++.dylib") && 1751 getVFS().exists("/usr/lib/libstdc++.6.dylib")) { 1752 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib"); 1753 return; 1754 } 1755 1756 // Otherwise, let the linker search. 1757 CmdArgs.push_back("-lstdc++"); 1758 break; 1759 } 1760 } 1761 1762 void DarwinClang::AddCCKextLibArgs(const ArgList &Args, 1763 ArgStringList &CmdArgs) const { 1764 // For Darwin platforms, use the compiler-rt-based support library 1765 // instead of the gcc-provided one (which is also incidentally 1766 // only present in the gcc lib dir, which makes it hard to find). 1767 1768 SmallString<128> P(getDriver().ResourceDir); 1769 llvm::sys::path::append(P, "lib", "darwin"); 1770 1771 // Use the newer cc_kext for iOS ARM after 6.0. 1772 if (isTargetWatchOS()) { 1773 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a"); 1774 } else if (isTargetTvOS()) { 1775 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a"); 1776 } else if (isTargetIPhoneOS()) { 1777 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a"); 1778 } else { 1779 llvm::sys::path::append(P, "libclang_rt.cc_kext.a"); 1780 } 1781 1782 // For now, allow missing resource libraries to support developers who may 1783 // not have compiler-rt checked out or integrated into their build. 1784 if (getVFS().exists(P)) 1785 CmdArgs.push_back(Args.MakeArgString(P)); 1786 } 1787 1788 DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args, 1789 StringRef BoundArch, 1790 Action::OffloadKind) const { 1791 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 1792 const OptTable &Opts = getDriver().getOpts(); 1793 1794 // FIXME: We really want to get out of the tool chain level argument 1795 // translation business, as it makes the driver functionality much 1796 // more opaque. For now, we follow gcc closely solely for the 1797 // purpose of easily achieving feature parity & testability. Once we 1798 // have something that works, we should reevaluate each translation 1799 // and try to push it down into tool specific logic. 1800 1801 for (Arg *A : Args) { 1802 if (A->getOption().matches(options::OPT_Xarch__)) { 1803 // Skip this argument unless the architecture matches either the toolchain 1804 // triple arch, or the arch being bound. 1805 llvm::Triple::ArchType XarchArch = 1806 tools::darwin::getArchTypeForMachOArchName(A->getValue(0)); 1807 if (!(XarchArch == getArch() || 1808 (!BoundArch.empty() && 1809 XarchArch == 1810 tools::darwin::getArchTypeForMachOArchName(BoundArch)))) 1811 continue; 1812 1813 Arg *OriginalArg = A; 1814 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1)); 1815 unsigned Prev = Index; 1816 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index)); 1817 1818 // If the argument parsing failed or more than one argument was 1819 // consumed, the -Xarch_ argument's parameter tried to consume 1820 // extra arguments. Emit an error and ignore. 1821 // 1822 // We also want to disallow any options which would alter the 1823 // driver behavior; that isn't going to work in our model. We 1824 // use isDriverOption() as an approximation, although things 1825 // like -O4 are going to slip through. 1826 if (!XarchArg || Index > Prev + 1) { 1827 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args) 1828 << A->getAsString(Args); 1829 continue; 1830 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) { 1831 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver) 1832 << A->getAsString(Args); 1833 continue; 1834 } 1835 1836 XarchArg->setBaseArg(A); 1837 1838 A = XarchArg.release(); 1839 DAL->AddSynthesizedArg(A); 1840 1841 // Linker input arguments require custom handling. The problem is that we 1842 // have already constructed the phase actions, so we can not treat them as 1843 // "input arguments". 1844 if (A->getOption().hasFlag(options::LinkerInput)) { 1845 // Convert the argument into individual Zlinker_input_args. 1846 for (const char *Value : A->getValues()) { 1847 DAL->AddSeparateArg( 1848 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value); 1849 } 1850 continue; 1851 } 1852 } 1853 1854 // Sob. These is strictly gcc compatible for the time being. Apple 1855 // gcc translates options twice, which means that self-expanding 1856 // options add duplicates. 1857 switch ((options::ID)A->getOption().getID()) { 1858 default: 1859 DAL->append(A); 1860 break; 1861 1862 case options::OPT_mkernel: 1863 case options::OPT_fapple_kext: 1864 DAL->append(A); 1865 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 1866 break; 1867 1868 case options::OPT_dependency_file: 1869 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue()); 1870 break; 1871 1872 case options::OPT_gfull: 1873 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 1874 DAL->AddFlagArg( 1875 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 1876 break; 1877 1878 case options::OPT_gused: 1879 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 1880 DAL->AddFlagArg( 1881 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 1882 break; 1883 1884 case options::OPT_shared: 1885 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 1886 break; 1887 1888 case options::OPT_fconstant_cfstrings: 1889 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 1890 break; 1891 1892 case options::OPT_fno_constant_cfstrings: 1893 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 1894 break; 1895 1896 case options::OPT_Wnonportable_cfstrings: 1897 DAL->AddFlagArg(A, 1898 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 1899 break; 1900 1901 case options::OPT_Wno_nonportable_cfstrings: 1902 DAL->AddFlagArg( 1903 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 1904 break; 1905 1906 case options::OPT_fpascal_strings: 1907 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 1908 break; 1909 1910 case options::OPT_fno_pascal_strings: 1911 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 1912 break; 1913 } 1914 } 1915 1916 if (getTriple().getArch() == llvm::Triple::x86 || 1917 getTriple().getArch() == llvm::Triple::x86_64) 1918 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 1919 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ), 1920 "core2"); 1921 1922 // Add the arch options based on the particular spelling of -arch, to match 1923 // how the driver driver works. 1924 if (!BoundArch.empty()) { 1925 StringRef Name = BoundArch; 1926 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ); 1927 const Option MArch = Opts.getOption(clang::driver::options::OPT_march_EQ); 1928 1929 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 1930 // which defines the list of which architectures we accept. 1931 if (Name == "ppc") 1932 ; 1933 else if (Name == "ppc601") 1934 DAL->AddJoinedArg(nullptr, MCpu, "601"); 1935 else if (Name == "ppc603") 1936 DAL->AddJoinedArg(nullptr, MCpu, "603"); 1937 else if (Name == "ppc604") 1938 DAL->AddJoinedArg(nullptr, MCpu, "604"); 1939 else if (Name == "ppc604e") 1940 DAL->AddJoinedArg(nullptr, MCpu, "604e"); 1941 else if (Name == "ppc750") 1942 DAL->AddJoinedArg(nullptr, MCpu, "750"); 1943 else if (Name == "ppc7400") 1944 DAL->AddJoinedArg(nullptr, MCpu, "7400"); 1945 else if (Name == "ppc7450") 1946 DAL->AddJoinedArg(nullptr, MCpu, "7450"); 1947 else if (Name == "ppc970") 1948 DAL->AddJoinedArg(nullptr, MCpu, "970"); 1949 1950 else if (Name == "ppc64" || Name == "ppc64le") 1951 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64)); 1952 1953 else if (Name == "i386") 1954 ; 1955 else if (Name == "i486") 1956 DAL->AddJoinedArg(nullptr, MArch, "i486"); 1957 else if (Name == "i586") 1958 DAL->AddJoinedArg(nullptr, MArch, "i586"); 1959 else if (Name == "i686") 1960 DAL->AddJoinedArg(nullptr, MArch, "i686"); 1961 else if (Name == "pentium") 1962 DAL->AddJoinedArg(nullptr, MArch, "pentium"); 1963 else if (Name == "pentium2") 1964 DAL->AddJoinedArg(nullptr, MArch, "pentium2"); 1965 else if (Name == "pentpro") 1966 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro"); 1967 else if (Name == "pentIIm3") 1968 DAL->AddJoinedArg(nullptr, MArch, "pentium2"); 1969 1970 else if (Name == "x86_64") 1971 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64)); 1972 else if (Name == "x86_64h") { 1973 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64)); 1974 DAL->AddJoinedArg(nullptr, MArch, "x86_64h"); 1975 } 1976 1977 else if (Name == "arm") 1978 DAL->AddJoinedArg(nullptr, MArch, "armv4t"); 1979 else if (Name == "armv4t") 1980 DAL->AddJoinedArg(nullptr, MArch, "armv4t"); 1981 else if (Name == "armv5") 1982 DAL->AddJoinedArg(nullptr, MArch, "armv5tej"); 1983 else if (Name == "xscale") 1984 DAL->AddJoinedArg(nullptr, MArch, "xscale"); 1985 else if (Name == "armv6") 1986 DAL->AddJoinedArg(nullptr, MArch, "armv6k"); 1987 else if (Name == "armv6m") 1988 DAL->AddJoinedArg(nullptr, MArch, "armv6m"); 1989 else if (Name == "armv7") 1990 DAL->AddJoinedArg(nullptr, MArch, "armv7a"); 1991 else if (Name == "armv7em") 1992 DAL->AddJoinedArg(nullptr, MArch, "armv7em"); 1993 else if (Name == "armv7k") 1994 DAL->AddJoinedArg(nullptr, MArch, "armv7k"); 1995 else if (Name == "armv7m") 1996 DAL->AddJoinedArg(nullptr, MArch, "armv7m"); 1997 else if (Name == "armv7s") 1998 DAL->AddJoinedArg(nullptr, MArch, "armv7s"); 1999 } 2000 2001 return DAL; 2002 } 2003 2004 void MachO::AddLinkRuntimeLibArgs(const ArgList &Args, 2005 ArgStringList &CmdArgs) const { 2006 // Embedded targets are simple at the moment, not supporting sanitizers and 2007 // with different libraries for each member of the product { static, PIC } x 2008 // { hard-float, soft-float } 2009 llvm::SmallString<32> CompilerRT = StringRef(""); 2010 CompilerRT += 2011 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard) 2012 ? "hard" 2013 : "soft"; 2014 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic" : "_static"; 2015 2016 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, RLO_IsEmbedded); 2017 } 2018 2019 bool Darwin::isAlignedAllocationUnavailable() const { 2020 llvm::Triple::OSType OS; 2021 2022 switch (TargetPlatform) { 2023 case MacOS: // Earlier than 10.13. 2024 OS = llvm::Triple::MacOSX; 2025 break; 2026 case IPhoneOS: 2027 OS = llvm::Triple::IOS; 2028 break; 2029 case TvOS: // Earlier than 11.0. 2030 OS = llvm::Triple::TvOS; 2031 break; 2032 case WatchOS: // Earlier than 4.0. 2033 OS = llvm::Triple::WatchOS; 2034 break; 2035 } 2036 2037 return TargetVersion < alignedAllocMinVersion(OS); 2038 } 2039 2040 void Darwin::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 2041 llvm::opt::ArgStringList &CC1Args, 2042 Action::OffloadKind DeviceOffloadKind) const { 2043 // Pass "-faligned-alloc-unavailable" only when the user hasn't manually 2044 // enabled or disabled aligned allocations. 2045 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation, 2046 options::OPT_fno_aligned_allocation) && 2047 isAlignedAllocationUnavailable()) 2048 CC1Args.push_back("-faligned-alloc-unavailable"); 2049 } 2050 2051 DerivedArgList * 2052 Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch, 2053 Action::OffloadKind DeviceOffloadKind) const { 2054 // First get the generic Apple args, before moving onto Darwin-specific ones. 2055 DerivedArgList *DAL = 2056 MachO::TranslateArgs(Args, BoundArch, DeviceOffloadKind); 2057 const OptTable &Opts = getDriver().getOpts(); 2058 2059 // If no architecture is bound, none of the translations here are relevant. 2060 if (BoundArch.empty()) 2061 return DAL; 2062 2063 // Add an explicit version min argument for the deployment target. We do this 2064 // after argument translation because -Xarch_ arguments may add a version min 2065 // argument. 2066 AddDeploymentTarget(*DAL); 2067 2068 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext. 2069 // FIXME: It would be far better to avoid inserting those -static arguments, 2070 // but we can't check the deployment target in the translation code until 2071 // it is set here. 2072 if (isTargetWatchOSBased() || 2073 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) { 2074 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) { 2075 Arg *A = *it; 2076 ++it; 2077 if (A->getOption().getID() != options::OPT_mkernel && 2078 A->getOption().getID() != options::OPT_fapple_kext) 2079 continue; 2080 assert(it != ie && "unexpected argument translation"); 2081 A = *it; 2082 assert(A->getOption().getID() == options::OPT_static && 2083 "missing expected -static argument"); 2084 *it = nullptr; 2085 ++it; 2086 } 2087 } 2088 2089 if (!Args.getLastArg(options::OPT_stdlib_EQ) && 2090 GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) 2091 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ), 2092 "libc++"); 2093 2094 // Validate the C++ standard library choice. 2095 CXXStdlibType Type = GetCXXStdlibType(*DAL); 2096 if (Type == ToolChain::CST_Libcxx) { 2097 // Check whether the target provides libc++. 2098 StringRef where; 2099 2100 // Complain about targeting iOS < 5.0 in any way. 2101 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0)) 2102 where = "iOS 5.0"; 2103 2104 if (where != StringRef()) { 2105 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where; 2106 } 2107 } 2108 2109 auto Arch = tools::darwin::getArchTypeForMachOArchName(BoundArch); 2110 if ((Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)) { 2111 if (Args.hasFlag(options::OPT_fomit_frame_pointer, 2112 options::OPT_fno_omit_frame_pointer, false)) 2113 getDriver().Diag(clang::diag::warn_drv_unsupported_opt_for_target) 2114 << "-fomit-frame-pointer" << BoundArch; 2115 } 2116 2117 return DAL; 2118 } 2119 2120 bool MachO::IsUnwindTablesDefault(const ArgList &Args) const { 2121 // Unwind tables are not emitted if -fno-exceptions is supplied (except when 2122 // targeting x86_64). 2123 return getArch() == llvm::Triple::x86_64 || 2124 (GetExceptionModel(Args) != llvm::ExceptionHandling::SjLj && 2125 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, 2126 true)); 2127 } 2128 2129 bool MachO::UseDwarfDebugFlags() const { 2130 if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 2131 return S[0] != '\0'; 2132 return false; 2133 } 2134 2135 llvm::ExceptionHandling Darwin::GetExceptionModel(const ArgList &Args) const { 2136 // Darwin uses SjLj exceptions on ARM. 2137 if (getTriple().getArch() != llvm::Triple::arm && 2138 getTriple().getArch() != llvm::Triple::thumb) 2139 return llvm::ExceptionHandling::None; 2140 2141 // Only watchOS uses the new DWARF/Compact unwinding method. 2142 llvm::Triple Triple(ComputeLLVMTriple(Args)); 2143 if (Triple.isWatchABI()) 2144 return llvm::ExceptionHandling::DwarfCFI; 2145 2146 return llvm::ExceptionHandling::SjLj; 2147 } 2148 2149 bool Darwin::SupportsEmbeddedBitcode() const { 2150 assert(TargetInitialized && "Target not initialized!"); 2151 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(6, 0)) 2152 return false; 2153 return true; 2154 } 2155 2156 bool MachO::isPICDefault() const { return true; } 2157 2158 bool MachO::isPIEDefault() const { return false; } 2159 2160 bool MachO::isPICDefaultForced() const { 2161 return (getArch() == llvm::Triple::x86_64 || 2162 getArch() == llvm::Triple::aarch64); 2163 } 2164 2165 bool MachO::SupportsProfiling() const { 2166 // Profiling instrumentation is only supported on x86. 2167 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64; 2168 } 2169 2170 void Darwin::addMinVersionArgs(const ArgList &Args, 2171 ArgStringList &CmdArgs) const { 2172 VersionTuple TargetVersion = getTargetVersion(); 2173 2174 if (isTargetWatchOS()) 2175 CmdArgs.push_back("-watchos_version_min"); 2176 else if (isTargetWatchOSSimulator()) 2177 CmdArgs.push_back("-watchos_simulator_version_min"); 2178 else if (isTargetTvOS()) 2179 CmdArgs.push_back("-tvos_version_min"); 2180 else if (isTargetTvOSSimulator()) 2181 CmdArgs.push_back("-tvos_simulator_version_min"); 2182 else if (isTargetIOSSimulator()) 2183 CmdArgs.push_back("-ios_simulator_version_min"); 2184 else if (isTargetIOSBased()) 2185 CmdArgs.push_back("-iphoneos_version_min"); 2186 else { 2187 assert(isTargetMacOS() && "unexpected target"); 2188 CmdArgs.push_back("-macosx_version_min"); 2189 } 2190 2191 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString())); 2192 } 2193 2194 void Darwin::addStartObjectFileArgs(const ArgList &Args, 2195 ArgStringList &CmdArgs) const { 2196 // Derived from startfile spec. 2197 if (Args.hasArg(options::OPT_dynamiclib)) { 2198 // Derived from darwin_dylib1 spec. 2199 if (isTargetWatchOSBased()) { 2200 ; // watchOS does not need dylib1.o. 2201 } else if (isTargetIOSSimulator()) { 2202 ; // iOS simulator does not need dylib1.o. 2203 } else if (isTargetIPhoneOS()) { 2204 if (isIPhoneOSVersionLT(3, 1)) 2205 CmdArgs.push_back("-ldylib1.o"); 2206 } else { 2207 if (isMacosxVersionLT(10, 5)) 2208 CmdArgs.push_back("-ldylib1.o"); 2209 else if (isMacosxVersionLT(10, 6)) 2210 CmdArgs.push_back("-ldylib1.10.5.o"); 2211 } 2212 } else { 2213 if (Args.hasArg(options::OPT_bundle)) { 2214 if (!Args.hasArg(options::OPT_static)) { 2215 // Derived from darwin_bundle1 spec. 2216 if (isTargetWatchOSBased()) { 2217 ; // watchOS does not need bundle1.o. 2218 } else if (isTargetIOSSimulator()) { 2219 ; // iOS simulator does not need bundle1.o. 2220 } else if (isTargetIPhoneOS()) { 2221 if (isIPhoneOSVersionLT(3, 1)) 2222 CmdArgs.push_back("-lbundle1.o"); 2223 } else { 2224 if (isMacosxVersionLT(10, 6)) 2225 CmdArgs.push_back("-lbundle1.o"); 2226 } 2227 } 2228 } else { 2229 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) { 2230 if (Args.hasArg(options::OPT_static) || 2231 Args.hasArg(options::OPT_object) || 2232 Args.hasArg(options::OPT_preload)) { 2233 CmdArgs.push_back("-lgcrt0.o"); 2234 } else { 2235 CmdArgs.push_back("-lgcrt1.o"); 2236 2237 // darwin_crt2 spec is empty. 2238 } 2239 // By default on OS X 10.8 and later, we don't link with a crt1.o 2240 // file and the linker knows to use _main as the entry point. But, 2241 // when compiling with -pg, we need to link with the gcrt1.o file, 2242 // so pass the -no_new_main option to tell the linker to use the 2243 // "start" symbol as the entry point. 2244 if (isTargetMacOS() && !isMacosxVersionLT(10, 8)) 2245 CmdArgs.push_back("-no_new_main"); 2246 } else { 2247 if (Args.hasArg(options::OPT_static) || 2248 Args.hasArg(options::OPT_object) || 2249 Args.hasArg(options::OPT_preload)) { 2250 CmdArgs.push_back("-lcrt0.o"); 2251 } else { 2252 // Derived from darwin_crt1 spec. 2253 if (isTargetWatchOSBased()) { 2254 ; // watchOS does not need crt1.o. 2255 } else if (isTargetIOSSimulator()) { 2256 ; // iOS simulator does not need crt1.o. 2257 } else if (isTargetIPhoneOS()) { 2258 if (getArch() == llvm::Triple::aarch64) 2259 ; // iOS does not need any crt1 files for arm64 2260 else if (isIPhoneOSVersionLT(3, 1)) 2261 CmdArgs.push_back("-lcrt1.o"); 2262 else if (isIPhoneOSVersionLT(6, 0)) 2263 CmdArgs.push_back("-lcrt1.3.1.o"); 2264 } else { 2265 if (isMacosxVersionLT(10, 5)) 2266 CmdArgs.push_back("-lcrt1.o"); 2267 else if (isMacosxVersionLT(10, 6)) 2268 CmdArgs.push_back("-lcrt1.10.5.o"); 2269 else if (isMacosxVersionLT(10, 8)) 2270 CmdArgs.push_back("-lcrt1.10.6.o"); 2271 2272 // darwin_crt2 spec is empty. 2273 } 2274 } 2275 } 2276 } 2277 } 2278 2279 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) && 2280 !isTargetWatchOS() && isMacosxVersionLT(10, 5)) { 2281 const char *Str = Args.MakeArgString(GetFilePath("crt3.o")); 2282 CmdArgs.push_back(Str); 2283 } 2284 } 2285 2286 void Darwin::CheckObjCARC() const { 2287 if (isTargetIOSBased() || isTargetWatchOSBased() || 2288 (isTargetMacOS() && !isMacosxVersionLT(10, 6))) 2289 return; 2290 getDriver().Diag(diag::err_arc_unsupported_on_toolchain); 2291 } 2292 2293 SanitizerMask Darwin::getSupportedSanitizers() const { 2294 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64; 2295 SanitizerMask Res = ToolChain::getSupportedSanitizers(); 2296 Res |= SanitizerKind::Address; 2297 Res |= SanitizerKind::Leak; 2298 Res |= SanitizerKind::Fuzzer; 2299 Res |= SanitizerKind::FuzzerNoLink; 2300 Res |= SanitizerKind::Function; 2301 2302 // Prior to 10.9, macOS shipped a version of the C++ standard library without 2303 // C++11 support. The same is true of iOS prior to version 5. These OS'es are 2304 // incompatible with -fsanitize=vptr. 2305 if (!(isTargetMacOS() && isMacosxVersionLT(10, 9)) 2306 && !(isTargetIPhoneOS() && isIPhoneOSVersionLT(5, 0))) 2307 Res |= SanitizerKind::Vptr; 2308 2309 if (isTargetMacOS()) { 2310 if (IsX86_64) 2311 Res |= SanitizerKind::Thread; 2312 } else if (isTargetIOSSimulator() || isTargetTvOSSimulator()) { 2313 if (IsX86_64) 2314 Res |= SanitizerKind::Thread; 2315 } 2316 return Res; 2317 } 2318 2319 void Darwin::printVerboseInfo(raw_ostream &OS) const { 2320 CudaInstallation.print(OS); 2321 } 2322