1 //===--- ToolChains.cpp - ToolChain Implementations -----------------------===// 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 "ToolChains.h" 11 #include "clang/Basic/ObjCRuntime.h" 12 #include "clang/Basic/Version.h" 13 #include "clang/Driver/Compilation.h" 14 #include "clang/Driver/Driver.h" 15 #include "clang/Driver/DriverDiagnostic.h" 16 #include "clang/Driver/Options.h" 17 #include "clang/Driver/SanitizerArgs.h" 18 #include "llvm/ADT/STLExtras.h" 19 #include "llvm/ADT/SmallString.h" 20 #include "llvm/ADT/StringExtras.h" 21 #include "llvm/ADT/StringSwitch.h" 22 #include "llvm/Option/Arg.h" 23 #include "llvm/Option/ArgList.h" 24 #include "llvm/Option/OptTable.h" 25 #include "llvm/Option/Option.h" 26 #include "llvm/Support/ErrorHandling.h" 27 #include "llvm/Support/FileSystem.h" 28 #include "llvm/Support/MemoryBuffer.h" 29 #include "llvm/Support/Path.h" 30 #include "llvm/Support/raw_ostream.h" 31 #include "llvm/Support/system_error.h" 32 #include "llvm/Support/Program.h" 33 34 // FIXME: This needs to be listed last until we fix the broken include guards 35 // in these files and the LLVM config.h files. 36 #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX 37 38 #include <cstdlib> // ::getenv 39 40 using namespace clang::driver; 41 using namespace clang::driver::toolchains; 42 using namespace clang; 43 using namespace llvm::opt; 44 45 /// Darwin - Darwin tool chain for i386 and x86_64. 46 47 Darwin::Darwin(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 48 : ToolChain(D, Triple, Args), TargetInitialized(false) 49 { 50 // Compute the initial Darwin version from the triple 51 unsigned Major, Minor, Micro; 52 if (!Triple.getMacOSXVersion(Major, Minor, Micro)) 53 getDriver().Diag(diag::err_drv_invalid_darwin_version) << 54 Triple.getOSName(); 55 llvm::raw_string_ostream(MacosxVersionMin) 56 << Major << '.' << Minor << '.' << Micro; 57 58 // FIXME: DarwinVersion is only used to find GCC's libexec directory. 59 // It should be removed when we stop supporting that. 60 DarwinVersion[0] = Minor + 4; 61 DarwinVersion[1] = Micro; 62 DarwinVersion[2] = 0; 63 64 // Compute the initial iOS version from the triple 65 Triple.getiOSVersion(Major, Minor, Micro); 66 llvm::raw_string_ostream(iOSVersionMin) 67 << Major << '.' << Minor << '.' << Micro; 68 } 69 70 types::ID Darwin::LookupTypeForExtension(const char *Ext) const { 71 types::ID Ty = types::lookupTypeForExtension(Ext); 72 73 // Darwin always preprocesses assembly files (unless -x is used explicitly). 74 if (Ty == types::TY_PP_Asm) 75 return types::TY_Asm; 76 77 return Ty; 78 } 79 80 bool Darwin::HasNativeLLVMSupport() const { 81 return true; 82 } 83 84 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0. 85 ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const { 86 if (isTargetIPhoneOS()) 87 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion); 88 if (isNonFragile) 89 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion); 90 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion); 91 } 92 93 /// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2. 94 bool Darwin::hasBlocksRuntime() const { 95 if (isTargetIPhoneOS()) 96 return !isIPhoneOSVersionLT(3, 2); 97 else 98 return !isMacosxVersionLT(10, 6); 99 } 100 101 static const char *GetArmArchForMArch(StringRef Value) { 102 return llvm::StringSwitch<const char*>(Value) 103 .Case("armv6k", "armv6") 104 .Case("armv6m", "armv6m") 105 .Case("armv5tej", "armv5") 106 .Case("xscale", "xscale") 107 .Case("armv4t", "armv4t") 108 .Case("armv7", "armv7") 109 .Cases("armv7a", "armv7-a", "armv7") 110 .Cases("armv7r", "armv7-r", "armv7") 111 .Cases("armv7em", "armv7e-m", "armv7em") 112 .Cases("armv7f", "armv7-f", "armv7f") 113 .Cases("armv7k", "armv7-k", "armv7k") 114 .Cases("armv7m", "armv7-m", "armv7m") 115 .Cases("armv7s", "armv7-s", "armv7s") 116 .Default(0); 117 } 118 119 static const char *GetArmArchForMCpu(StringRef Value) { 120 return llvm::StringSwitch<const char *>(Value) 121 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5") 122 .Cases("arm10e", "arm10tdmi", "armv5") 123 .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5") 124 .Case("xscale", "xscale") 125 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6") 126 .Case("cortex-m0", "armv6m") 127 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "armv7") 128 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "armv7") 129 .Cases("cortex-r4", "cortex-r5", "armv7r") 130 .Case("cortex-a9-mp", "armv7f") 131 .Case("cortex-m3", "armv7m") 132 .Case("cortex-m4", "armv7em") 133 .Case("swift", "armv7s") 134 .Default(0); 135 } 136 137 StringRef Darwin::getDarwinArchName(const ArgList &Args) const { 138 switch (getTriple().getArch()) { 139 default: 140 return getArchName(); 141 142 case llvm::Triple::thumb: 143 case llvm::Triple::arm: { 144 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 145 if (const char *Arch = GetArmArchForMArch(A->getValue())) 146 return Arch; 147 148 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 149 if (const char *Arch = GetArmArchForMCpu(A->getValue())) 150 return Arch; 151 152 return "arm"; 153 } 154 } 155 } 156 157 Darwin::~Darwin() { 158 } 159 160 std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args, 161 types::ID InputType) const { 162 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); 163 164 // If the target isn't initialized (e.g., an unknown Darwin platform, return 165 // the default triple). 166 if (!isTargetInitialized()) 167 return Triple.getTriple(); 168 169 if (Triple.getArchName() == "thumbv6m" || 170 Triple.getArchName() == "thumbv7m" || 171 Triple.getArchName() == "thumbv7em") { 172 // OS is ios or macosx unless it's the v6m or v7m. 173 Triple.setOS(llvm::Triple::Darwin); 174 Triple.setEnvironment(llvm::Triple::EABI); 175 } else { 176 SmallString<16> Str; 177 Str += isTargetIPhoneOS() ? "ios" : "macosx"; 178 Str += getTargetVersion().getAsString(); 179 Triple.setOSName(Str); 180 } 181 182 return Triple.getTriple(); 183 } 184 185 void Generic_ELF::anchor() {} 186 187 Tool *Darwin::getTool(Action::ActionClass AC) const { 188 switch (AC) { 189 case Action::LipoJobClass: 190 if (!Lipo) 191 Lipo.reset(new tools::darwin::Lipo(*this)); 192 return Lipo.get(); 193 case Action::DsymutilJobClass: 194 if (!Dsymutil) 195 Dsymutil.reset(new tools::darwin::Dsymutil(*this)); 196 return Dsymutil.get(); 197 case Action::VerifyJobClass: 198 if (!VerifyDebug) 199 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this)); 200 return VerifyDebug.get(); 201 default: 202 return ToolChain::getTool(AC); 203 } 204 } 205 206 Tool *Darwin::buildLinker() const { 207 return new tools::darwin::Link(*this); 208 } 209 210 Tool *Darwin::buildAssembler() const { 211 return new tools::darwin::Assemble(*this); 212 } 213 214 DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple, 215 const ArgList &Args) 216 : Darwin(D, Triple, Args) 217 { 218 getProgramPaths().push_back(getDriver().getInstalledDir()); 219 if (getDriver().getInstalledDir() != getDriver().Dir) 220 getProgramPaths().push_back(getDriver().Dir); 221 222 // We expect 'as', 'ld', etc. to be adjacent to our install dir. 223 getProgramPaths().push_back(getDriver().getInstalledDir()); 224 if (getDriver().getInstalledDir() != getDriver().Dir) 225 getProgramPaths().push_back(getDriver().Dir); 226 } 227 228 void DarwinClang::AddLinkARCArgs(const ArgList &Args, 229 ArgStringList &CmdArgs) const { 230 231 CmdArgs.push_back("-force_load"); 232 SmallString<128> P(getDriver().ClangExecutable); 233 llvm::sys::path::remove_filename(P); // 'clang' 234 llvm::sys::path::remove_filename(P); // 'bin' 235 llvm::sys::path::append(P, "lib", "arc", "libarclite_"); 236 // Mash in the platform. 237 if (isTargetIOSSimulator()) 238 P += "iphonesimulator"; 239 else if (isTargetIPhoneOS()) 240 P += "iphoneos"; 241 else 242 P += "macosx"; 243 P += ".a"; 244 245 CmdArgs.push_back(Args.MakeArgString(P)); 246 } 247 248 void DarwinClang::AddLinkRuntimeLib(const ArgList &Args, 249 ArgStringList &CmdArgs, 250 const char *DarwinStaticLib, 251 bool AlwaysLink) const { 252 SmallString<128> P(getDriver().ResourceDir); 253 llvm::sys::path::append(P, "lib", "darwin", DarwinStaticLib); 254 255 // For now, allow missing resource libraries to support developers who may 256 // not have compiler-rt checked out or integrated into their build (unless 257 // we explicitly force linking with this library). 258 if (AlwaysLink || llvm::sys::fs::exists(P.str())) 259 CmdArgs.push_back(Args.MakeArgString(P.str())); 260 } 261 262 void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 263 ArgStringList &CmdArgs) const { 264 // Darwin only supports the compiler-rt based runtime libraries. 265 switch (GetRuntimeLibType(Args)) { 266 case ToolChain::RLT_CompilerRT: 267 break; 268 default: 269 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform) 270 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin"; 271 return; 272 } 273 274 // Darwin doesn't support real static executables, don't link any runtime 275 // libraries with -static. 276 if (Args.hasArg(options::OPT_static) || 277 Args.hasArg(options::OPT_fapple_kext) || 278 Args.hasArg(options::OPT_mkernel)) 279 return; 280 281 // Reject -static-libgcc for now, we can deal with this when and if someone 282 // cares. This is useful in situations where someone wants to statically link 283 // something like libstdc++, and needs its runtime support routines. 284 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 285 getDriver().Diag(diag::err_drv_unsupported_opt) 286 << A->getAsString(Args); 287 return; 288 } 289 290 // If we are building profile support, link that library in. 291 if (Args.hasArg(options::OPT_fprofile_arcs) || 292 Args.hasArg(options::OPT_fprofile_generate) || 293 Args.hasArg(options::OPT_fcreate_profile) || 294 Args.hasArg(options::OPT_coverage)) { 295 // Select the appropriate runtime library for the target. 296 if (isTargetIPhoneOS()) { 297 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a"); 298 } else { 299 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a"); 300 } 301 } 302 303 const SanitizerArgs &Sanitize = getSanitizerArgs(); 304 305 // Add Ubsan runtime library, if required. 306 if (Sanitize.needsUbsanRt()) { 307 // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds. 308 if (isTargetIPhoneOS()) { 309 getDriver().Diag(diag::err_drv_clang_unsupported_per_platform) 310 << "-fsanitize=undefined"; 311 } else { 312 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true); 313 314 // The Ubsan runtime library requires C++. 315 AddCXXStdlibLibArgs(Args, CmdArgs); 316 } 317 } 318 319 // Add ASAN runtime library, if required. Dynamic libraries and bundles 320 // should not be linked with the runtime library. 321 if (Sanitize.needsAsanRt()) { 322 // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds. 323 if (isTargetIPhoneOS() && !isTargetIOSSimulator()) { 324 getDriver().Diag(diag::err_drv_clang_unsupported_per_platform) 325 << "-fsanitize=address"; 326 } else { 327 if (!Args.hasArg(options::OPT_dynamiclib) && 328 !Args.hasArg(options::OPT_bundle)) { 329 // The ASAN runtime library requires C++. 330 AddCXXStdlibLibArgs(Args, CmdArgs); 331 } 332 if (isTargetMacOS()) { 333 AddLinkRuntimeLib(Args, CmdArgs, 334 "libclang_rt.asan_osx_dynamic.dylib", 335 true); 336 } else { 337 if (isTargetIOSSimulator()) { 338 AddLinkRuntimeLib(Args, CmdArgs, 339 "libclang_rt.asan_iossim_dynamic.dylib", 340 true); 341 } 342 } 343 } 344 } 345 346 // Otherwise link libSystem, then the dynamic runtime library, and finally any 347 // target specific static runtime library. 348 CmdArgs.push_back("-lSystem"); 349 350 // Select the dynamic runtime library and the target specific static library. 351 if (isTargetIPhoneOS()) { 352 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1, 353 // it never went into the SDK. 354 // Linking against libgcc_s.1 isn't needed for iOS 5.0+ 355 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator()) 356 CmdArgs.push_back("-lgcc_s.1"); 357 358 // We currently always need a static runtime library for iOS. 359 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a"); 360 } else { 361 // The dynamic runtime library was merged with libSystem for 10.6 and 362 // beyond; only 10.4 and 10.5 need an additional runtime library. 363 if (isMacosxVersionLT(10, 5)) 364 CmdArgs.push_back("-lgcc_s.10.4"); 365 else if (isMacosxVersionLT(10, 6)) 366 CmdArgs.push_back("-lgcc_s.10.5"); 367 368 // For OS X, we thought we would only need a static runtime library when 369 // targeting 10.4, to provide versions of the static functions which were 370 // omitted from 10.4.dylib. 371 // 372 // Unfortunately, that turned out to not be true, because Darwin system 373 // headers can still use eprintf on i386, and it is not exported from 374 // libSystem. Therefore, we still must provide a runtime library just for 375 // the tiny tiny handful of projects that *might* use that symbol. 376 if (isMacosxVersionLT(10, 5)) { 377 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a"); 378 } else { 379 if (getTriple().getArch() == llvm::Triple::x86) 380 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a"); 381 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a"); 382 } 383 } 384 } 385 386 void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 387 const OptTable &Opts = getDriver().getOpts(); 388 389 // Support allowing the SDKROOT environment variable used by xcrun and other 390 // Xcode tools to define the default sysroot, by making it the default for 391 // isysroot. 392 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 393 // Warn if the path does not exist. 394 if (!llvm::sys::fs::exists(A->getValue())) 395 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue(); 396 } else { 397 if (char *env = ::getenv("SDKROOT")) { 398 // We only use this value as the default if it is an absolute path, 399 // exists, and it is not the root path. 400 if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) && 401 StringRef(env) != "/") { 402 Args.append(Args.MakeSeparateArg( 403 0, Opts.getOption(options::OPT_isysroot), env)); 404 } 405 } 406 } 407 408 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 409 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 410 Arg *iOSSimVersion = Args.getLastArg( 411 options::OPT_mios_simulator_version_min_EQ); 412 413 if (OSXVersion && (iOSVersion || iOSSimVersion)) { 414 getDriver().Diag(diag::err_drv_argument_not_allowed_with) 415 << OSXVersion->getAsString(Args) 416 << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args); 417 iOSVersion = iOSSimVersion = 0; 418 } else if (iOSVersion && iOSSimVersion) { 419 getDriver().Diag(diag::err_drv_argument_not_allowed_with) 420 << iOSVersion->getAsString(Args) 421 << iOSSimVersion->getAsString(Args); 422 iOSSimVersion = 0; 423 } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) { 424 // If no deployment target was specified on the command line, check for 425 // environment defines. 426 StringRef OSXTarget; 427 StringRef iOSTarget; 428 StringRef iOSSimTarget; 429 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET")) 430 OSXTarget = env; 431 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET")) 432 iOSTarget = env; 433 if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET")) 434 iOSSimTarget = env; 435 436 // If no '-miphoneos-version-min' specified on the command line and 437 // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default 438 // based on -isysroot. 439 if (iOSTarget.empty()) { 440 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 441 StringRef first, second; 442 StringRef isysroot = A->getValue(); 443 llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS")); 444 if (second != "") 445 iOSTarget = second.substr(0,3); 446 } 447 } 448 449 // If no OSX or iOS target has been specified and we're compiling for armv7, 450 // go ahead as assume we're targeting iOS. 451 if (OSXTarget.empty() && iOSTarget.empty() && 452 (getDarwinArchName(Args) == "armv7" || 453 getDarwinArchName(Args) == "armv7s")) 454 iOSTarget = iOSVersionMin; 455 456 // Handle conflicting deployment targets 457 // 458 // FIXME: Don't hardcode default here. 459 460 // Do not allow conflicts with the iOS simulator target. 461 if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) { 462 getDriver().Diag(diag::err_drv_conflicting_deployment_targets) 463 << "IOS_SIMULATOR_DEPLOYMENT_TARGET" 464 << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" : 465 "IPHONEOS_DEPLOYMENT_TARGET"); 466 } 467 468 // Allow conflicts among OSX and iOS for historical reasons, but choose the 469 // default platform. 470 if (!OSXTarget.empty() && !iOSTarget.empty()) { 471 if (getTriple().getArch() == llvm::Triple::arm || 472 getTriple().getArch() == llvm::Triple::thumb) 473 OSXTarget = ""; 474 else 475 iOSTarget = ""; 476 } 477 478 if (!OSXTarget.empty()) { 479 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 480 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget); 481 Args.append(OSXVersion); 482 } else if (!iOSTarget.empty()) { 483 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 484 iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget); 485 Args.append(iOSVersion); 486 } else if (!iOSSimTarget.empty()) { 487 const Option O = Opts.getOption( 488 options::OPT_mios_simulator_version_min_EQ); 489 iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget); 490 Args.append(iOSSimVersion); 491 } else { 492 // Otherwise, assume we are targeting OS X. 493 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 494 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin); 495 Args.append(OSXVersion); 496 } 497 } 498 499 // Reject invalid architecture combinations. 500 if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 && 501 getTriple().getArch() != llvm::Triple::x86_64)) { 502 getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target) 503 << getTriple().getArchName() << iOSSimVersion->getAsString(Args); 504 } 505 506 // Set the tool chain target information. 507 unsigned Major, Minor, Micro; 508 bool HadExtra; 509 if (OSXVersion) { 510 assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!"); 511 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, 512 Micro, HadExtra) || HadExtra || 513 Major != 10 || Minor >= 100 || Micro >= 100) 514 getDriver().Diag(diag::err_drv_invalid_version_number) 515 << OSXVersion->getAsString(Args); 516 } else { 517 const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion; 518 assert(Version && "Unknown target platform!"); 519 if (!Driver::GetReleaseVersion(Version->getValue(), Major, Minor, 520 Micro, HadExtra) || HadExtra || 521 Major >= 10 || Minor >= 100 || Micro >= 100) 522 getDriver().Diag(diag::err_drv_invalid_version_number) 523 << Version->getAsString(Args); 524 } 525 526 bool IsIOSSim = bool(iOSSimVersion); 527 528 // In GCC, the simulator historically was treated as being OS X in some 529 // contexts, like determining the link logic, despite generally being called 530 // with an iOS deployment target. For compatibility, we detect the 531 // simulator as iOS + x86, and treat it differently in a few contexts. 532 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 || 533 getTriple().getArch() == llvm::Triple::x86_64)) 534 IsIOSSim = true; 535 536 setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim); 537 } 538 539 void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args, 540 ArgStringList &CmdArgs) const { 541 CXXStdlibType Type = GetCXXStdlibType(Args); 542 543 switch (Type) { 544 case ToolChain::CST_Libcxx: 545 CmdArgs.push_back("-lc++"); 546 break; 547 548 case ToolChain::CST_Libstdcxx: { 549 // Unfortunately, -lstdc++ doesn't always exist in the standard search path; 550 // it was previously found in the gcc lib dir. However, for all the Darwin 551 // platforms we care about it was -lstdc++.6, so we search for that 552 // explicitly if we can't see an obvious -lstdc++ candidate. 553 554 // Check in the sysroot first. 555 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 556 SmallString<128> P(A->getValue()); 557 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib"); 558 559 if (!llvm::sys::fs::exists(P.str())) { 560 llvm::sys::path::remove_filename(P); 561 llvm::sys::path::append(P, "libstdc++.6.dylib"); 562 if (llvm::sys::fs::exists(P.str())) { 563 CmdArgs.push_back(Args.MakeArgString(P.str())); 564 return; 565 } 566 } 567 } 568 569 // Otherwise, look in the root. 570 // FIXME: This should be removed someday when we don't have to care about 571 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist. 572 if (!llvm::sys::fs::exists("/usr/lib/libstdc++.dylib") && 573 llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib")) { 574 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib"); 575 return; 576 } 577 578 // Otherwise, let the linker search. 579 CmdArgs.push_back("-lstdc++"); 580 break; 581 } 582 } 583 } 584 585 void DarwinClang::AddCCKextLibArgs(const ArgList &Args, 586 ArgStringList &CmdArgs) const { 587 588 // For Darwin platforms, use the compiler-rt-based support library 589 // instead of the gcc-provided one (which is also incidentally 590 // only present in the gcc lib dir, which makes it hard to find). 591 592 SmallString<128> P(getDriver().ResourceDir); 593 llvm::sys::path::append(P, "lib", "darwin"); 594 595 // Use the newer cc_kext for iOS ARM after 6.0. 596 if (!isTargetIPhoneOS() || isTargetIOSSimulator() || 597 !isIPhoneOSVersionLT(6, 0)) { 598 llvm::sys::path::append(P, "libclang_rt.cc_kext.a"); 599 } else { 600 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios5.a"); 601 } 602 603 // For now, allow missing resource libraries to support developers who may 604 // not have compiler-rt checked out or integrated into their build. 605 if (llvm::sys::fs::exists(P.str())) 606 CmdArgs.push_back(Args.MakeArgString(P.str())); 607 } 608 609 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, 610 const char *BoundArch) const { 611 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 612 const OptTable &Opts = getDriver().getOpts(); 613 614 // FIXME: We really want to get out of the tool chain level argument 615 // translation business, as it makes the driver functionality much 616 // more opaque. For now, we follow gcc closely solely for the 617 // purpose of easily achieving feature parity & testability. Once we 618 // have something that works, we should reevaluate each translation 619 // and try to push it down into tool specific logic. 620 621 for (ArgList::const_iterator it = Args.begin(), 622 ie = Args.end(); it != ie; ++it) { 623 Arg *A = *it; 624 625 if (A->getOption().matches(options::OPT_Xarch__)) { 626 // Skip this argument unless the architecture matches either the toolchain 627 // triple arch, or the arch being bound. 628 llvm::Triple::ArchType XarchArch = 629 tools::darwin::getArchTypeForDarwinArchName(A->getValue(0)); 630 if (!(XarchArch == getArch() || 631 (BoundArch && XarchArch == 632 tools::darwin::getArchTypeForDarwinArchName(BoundArch)))) 633 continue; 634 635 Arg *OriginalArg = A; 636 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1)); 637 unsigned Prev = Index; 638 Arg *XarchArg = Opts.ParseOneArg(Args, Index); 639 640 // If the argument parsing failed or more than one argument was 641 // consumed, the -Xarch_ argument's parameter tried to consume 642 // extra arguments. Emit an error and ignore. 643 // 644 // We also want to disallow any options which would alter the 645 // driver behavior; that isn't going to work in our model. We 646 // use isDriverOption() as an approximation, although things 647 // like -O4 are going to slip through. 648 if (!XarchArg || Index > Prev + 1) { 649 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args) 650 << A->getAsString(Args); 651 continue; 652 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) { 653 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver) 654 << A->getAsString(Args); 655 continue; 656 } 657 658 XarchArg->setBaseArg(A); 659 A = XarchArg; 660 661 DAL->AddSynthesizedArg(A); 662 663 // Linker input arguments require custom handling. The problem is that we 664 // have already constructed the phase actions, so we can not treat them as 665 // "input arguments". 666 if (A->getOption().hasFlag(options::LinkerInput)) { 667 // Convert the argument into individual Zlinker_input_args. 668 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { 669 DAL->AddSeparateArg(OriginalArg, 670 Opts.getOption(options::OPT_Zlinker_input), 671 A->getValue(i)); 672 673 } 674 continue; 675 } 676 } 677 678 // Sob. These is strictly gcc compatible for the time being. Apple 679 // gcc translates options twice, which means that self-expanding 680 // options add duplicates. 681 switch ((options::ID) A->getOption().getID()) { 682 default: 683 DAL->append(A); 684 break; 685 686 case options::OPT_mkernel: 687 case options::OPT_fapple_kext: 688 DAL->append(A); 689 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 690 break; 691 692 case options::OPT_dependency_file: 693 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), 694 A->getValue()); 695 break; 696 697 case options::OPT_gfull: 698 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 699 DAL->AddFlagArg(A, 700 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 701 break; 702 703 case options::OPT_gused: 704 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 705 DAL->AddFlagArg(A, 706 Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 707 break; 708 709 case options::OPT_shared: 710 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 711 break; 712 713 case options::OPT_fconstant_cfstrings: 714 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 715 break; 716 717 case options::OPT_fno_constant_cfstrings: 718 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 719 break; 720 721 case options::OPT_Wnonportable_cfstrings: 722 DAL->AddFlagArg(A, 723 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 724 break; 725 726 case options::OPT_Wno_nonportable_cfstrings: 727 DAL->AddFlagArg(A, 728 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 729 break; 730 731 case options::OPT_fpascal_strings: 732 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 733 break; 734 735 case options::OPT_fno_pascal_strings: 736 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 737 break; 738 } 739 } 740 741 if (getTriple().getArch() == llvm::Triple::x86 || 742 getTriple().getArch() == llvm::Triple::x86_64) 743 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 744 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2"); 745 746 // Add the arch options based on the particular spelling of -arch, to match 747 // how the driver driver works. 748 if (BoundArch) { 749 StringRef Name = BoundArch; 750 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ); 751 const Option MArch = Opts.getOption(options::OPT_march_EQ); 752 753 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 754 // which defines the list of which architectures we accept. 755 if (Name == "ppc") 756 ; 757 else if (Name == "ppc601") 758 DAL->AddJoinedArg(0, MCpu, "601"); 759 else if (Name == "ppc603") 760 DAL->AddJoinedArg(0, MCpu, "603"); 761 else if (Name == "ppc604") 762 DAL->AddJoinedArg(0, MCpu, "604"); 763 else if (Name == "ppc604e") 764 DAL->AddJoinedArg(0, MCpu, "604e"); 765 else if (Name == "ppc750") 766 DAL->AddJoinedArg(0, MCpu, "750"); 767 else if (Name == "ppc7400") 768 DAL->AddJoinedArg(0, MCpu, "7400"); 769 else if (Name == "ppc7450") 770 DAL->AddJoinedArg(0, MCpu, "7450"); 771 else if (Name == "ppc970") 772 DAL->AddJoinedArg(0, MCpu, "970"); 773 774 else if (Name == "ppc64" || Name == "ppc64le") 775 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 776 777 else if (Name == "i386") 778 ; 779 else if (Name == "i486") 780 DAL->AddJoinedArg(0, MArch, "i486"); 781 else if (Name == "i586") 782 DAL->AddJoinedArg(0, MArch, "i586"); 783 else if (Name == "i686") 784 DAL->AddJoinedArg(0, MArch, "i686"); 785 else if (Name == "pentium") 786 DAL->AddJoinedArg(0, MArch, "pentium"); 787 else if (Name == "pentium2") 788 DAL->AddJoinedArg(0, MArch, "pentium2"); 789 else if (Name == "pentpro") 790 DAL->AddJoinedArg(0, MArch, "pentiumpro"); 791 else if (Name == "pentIIm3") 792 DAL->AddJoinedArg(0, MArch, "pentium2"); 793 794 else if (Name == "x86_64") 795 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 796 else if (Name == "x86_64h") { 797 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 798 DAL->AddJoinedArg(0, MArch, "x86_64h"); 799 } 800 801 else if (Name == "arm") 802 DAL->AddJoinedArg(0, MArch, "armv4t"); 803 else if (Name == "armv4t") 804 DAL->AddJoinedArg(0, MArch, "armv4t"); 805 else if (Name == "armv5") 806 DAL->AddJoinedArg(0, MArch, "armv5tej"); 807 else if (Name == "xscale") 808 DAL->AddJoinedArg(0, MArch, "xscale"); 809 else if (Name == "armv6") 810 DAL->AddJoinedArg(0, MArch, "armv6k"); 811 else if (Name == "armv6m") 812 DAL->AddJoinedArg(0, MArch, "armv6m"); 813 else if (Name == "armv7") 814 DAL->AddJoinedArg(0, MArch, "armv7a"); 815 else if (Name == "armv7em") 816 DAL->AddJoinedArg(0, MArch, "armv7em"); 817 else if (Name == "armv7f") 818 DAL->AddJoinedArg(0, MArch, "armv7f"); 819 else if (Name == "armv7k") 820 DAL->AddJoinedArg(0, MArch, "armv7k"); 821 else if (Name == "armv7m") 822 DAL->AddJoinedArg(0, MArch, "armv7m"); 823 else if (Name == "armv7s") 824 DAL->AddJoinedArg(0, MArch, "armv7s"); 825 826 else 827 llvm_unreachable("invalid Darwin arch"); 828 } 829 830 // Add an explicit version min argument for the deployment target. We do this 831 // after argument translation because -Xarch_ arguments may add a version min 832 // argument. 833 if (BoundArch) 834 AddDeploymentTarget(*DAL); 835 836 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext. 837 // FIXME: It would be far better to avoid inserting those -static arguments, 838 // but we can't check the deployment target in the translation code until 839 // it is set here. 840 if (isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) { 841 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) { 842 Arg *A = *it; 843 ++it; 844 if (A->getOption().getID() != options::OPT_mkernel && 845 A->getOption().getID() != options::OPT_fapple_kext) 846 continue; 847 assert(it != ie && "unexpected argument translation"); 848 A = *it; 849 assert(A->getOption().getID() == options::OPT_static && 850 "missing expected -static argument"); 851 it = DAL->getArgs().erase(it); 852 } 853 } 854 855 // Default to use libc++ on OS X 10.9+ and iOS 7+. 856 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) || 857 (isTargetIPhoneOS() && !isIPhoneOSVersionLT(7, 0))) && 858 !Args.getLastArg(options::OPT_stdlib_EQ)) 859 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_stdlib_EQ), "libc++"); 860 861 // Validate the C++ standard library choice. 862 CXXStdlibType Type = GetCXXStdlibType(*DAL); 863 if (Type == ToolChain::CST_Libcxx) { 864 // Check whether the target provides libc++. 865 StringRef where; 866 867 // Complain about targetting iOS < 5.0 in any way. 868 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(5, 0)) 869 where = "iOS 5.0"; 870 871 if (where != StringRef()) { 872 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) 873 << where; 874 } 875 } 876 877 return DAL; 878 } 879 880 bool Darwin::IsUnwindTablesDefault() const { 881 return getArch() == llvm::Triple::x86_64; 882 } 883 884 bool Darwin::UseDwarfDebugFlags() const { 885 if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 886 return S[0] != '\0'; 887 return false; 888 } 889 890 bool Darwin::UseSjLjExceptions() const { 891 // Darwin uses SjLj exceptions on ARM. 892 return (getTriple().getArch() == llvm::Triple::arm || 893 getTriple().getArch() == llvm::Triple::thumb); 894 } 895 896 bool Darwin::isPICDefault() const { 897 return true; 898 } 899 900 bool Darwin::isPIEDefault() const { 901 return false; 902 } 903 904 bool Darwin::isPICDefaultForced() const { 905 return getArch() == llvm::Triple::x86_64; 906 } 907 908 bool Darwin::SupportsProfiling() const { 909 // Profiling instrumentation is only supported on x86. 910 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64; 911 } 912 913 bool Darwin::SupportsObjCGC() const { 914 // Garbage collection is supported everywhere except on iPhone OS. 915 return !isTargetIPhoneOS(); 916 } 917 918 void Darwin::CheckObjCARC() const { 919 if (isTargetIPhoneOS() || !isMacosxVersionLT(10, 6)) 920 return; 921 getDriver().Diag(diag::err_arc_unsupported_on_toolchain); 922 } 923 924 std::string 925 Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args, 926 types::ID InputType) const { 927 return ComputeLLVMTriple(Args, InputType); 928 } 929 930 /// Generic_GCC - A tool chain using the 'gcc' command to perform 931 /// all subcommands; this relies on gcc translating the majority of 932 /// command line options. 933 934 /// \brief Parse a GCCVersion object out of a string of text. 935 /// 936 /// This is the primary means of forming GCCVersion objects. 937 /*static*/ 938 Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) { 939 const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "", "", "" }; 940 std::pair<StringRef, StringRef> First = VersionText.split('.'); 941 std::pair<StringRef, StringRef> Second = First.second.split('.'); 942 943 GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "", "", "" }; 944 if (First.first.getAsInteger(10, GoodVersion.Major) || 945 GoodVersion.Major < 0) 946 return BadVersion; 947 GoodVersion.MajorStr = First.first.str(); 948 if (Second.first.getAsInteger(10, GoodVersion.Minor) || 949 GoodVersion.Minor < 0) 950 return BadVersion; 951 GoodVersion.MinorStr = Second.first.str(); 952 953 // First look for a number prefix and parse that if present. Otherwise just 954 // stash the entire patch string in the suffix, and leave the number 955 // unspecified. This covers versions strings such as: 956 // 4.4 957 // 4.4.0 958 // 4.4.x 959 // 4.4.2-rc4 960 // 4.4.x-patched 961 // And retains any patch number it finds. 962 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str(); 963 if (!PatchText.empty()) { 964 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) { 965 // Try to parse the number and any suffix. 966 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) || 967 GoodVersion.Patch < 0) 968 return BadVersion; 969 GoodVersion.PatchSuffix = PatchText.substr(EndNumber); 970 } 971 } 972 973 return GoodVersion; 974 } 975 976 /// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering. 977 bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor, 978 int RHSPatch, 979 StringRef RHSPatchSuffix) const { 980 if (Major != RHSMajor) 981 return Major < RHSMajor; 982 if (Minor != RHSMinor) 983 return Minor < RHSMinor; 984 if (Patch != RHSPatch) { 985 // Note that versions without a specified patch sort higher than those with 986 // a patch. 987 if (RHSPatch == -1) 988 return true; 989 if (Patch == -1) 990 return false; 991 992 // Otherwise just sort on the patch itself. 993 return Patch < RHSPatch; 994 } 995 if (PatchSuffix != RHSPatchSuffix) { 996 // Sort empty suffixes higher. 997 if (RHSPatchSuffix.empty()) 998 return true; 999 if (PatchSuffix.empty()) 1000 return false; 1001 1002 // Provide a lexicographic sort to make this a total ordering. 1003 return PatchSuffix < RHSPatchSuffix; 1004 } 1005 1006 // The versions are equal. 1007 return false; 1008 } 1009 1010 static StringRef getGCCToolchainDir(const ArgList &Args) { 1011 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain); 1012 if (A) 1013 return A->getValue(); 1014 return GCC_INSTALL_PREFIX; 1015 } 1016 1017 /// \brief Construct a GCCInstallationDetector from the driver. 1018 /// 1019 /// This performs all of the autodetection and sets up the various paths. 1020 /// Once constructed, a GCCInstallationDetector is essentially immutable. 1021 /// 1022 /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and 1023 /// should instead pull the target out of the driver. This is currently 1024 /// necessary because the driver doesn't store the final version of the target 1025 /// triple. 1026 Generic_GCC::GCCInstallationDetector::GCCInstallationDetector( 1027 const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args) 1028 : IsValid(false), D(D) { 1029 llvm::Triple BiarchVariantTriple = 1030 TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant() 1031 : TargetTriple.get32BitArchVariant(); 1032 llvm::Triple::ArchType TargetArch = TargetTriple.getArch(); 1033 // The library directories which may contain GCC installations. 1034 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs; 1035 // The compatible GCC triples for this particular architecture. 1036 SmallVector<StringRef, 10> CandidateTripleAliases; 1037 SmallVector<StringRef, 10> CandidateBiarchTripleAliases; 1038 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs, 1039 CandidateTripleAliases, CandidateBiarchLibDirs, 1040 CandidateBiarchTripleAliases); 1041 1042 // Compute the set of prefixes for our search. 1043 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(), 1044 D.PrefixDirs.end()); 1045 1046 StringRef GCCToolchainDir = getGCCToolchainDir(Args); 1047 if (GCCToolchainDir != "") { 1048 if (GCCToolchainDir.back() == '/') 1049 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the / 1050 1051 Prefixes.push_back(GCCToolchainDir); 1052 } else { 1053 // If we have a SysRoot, try that first. 1054 if (!D.SysRoot.empty()) { 1055 Prefixes.push_back(D.SysRoot); 1056 Prefixes.push_back(D.SysRoot + "/usr"); 1057 } 1058 1059 // Then look for gcc installed alongside clang. 1060 Prefixes.push_back(D.InstalledDir + "/.."); 1061 1062 // And finally in /usr. 1063 if (D.SysRoot.empty()) 1064 Prefixes.push_back("/usr"); 1065 } 1066 1067 // Loop over the various components which exist and select the best GCC 1068 // installation available. GCC installs are ranked by version number. 1069 Version = GCCVersion::Parse("0.0.0"); 1070 for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) { 1071 if (!llvm::sys::fs::exists(Prefixes[i])) 1072 continue; 1073 for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) { 1074 const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str(); 1075 if (!llvm::sys::fs::exists(LibDir)) 1076 continue; 1077 for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k) 1078 ScanLibDirForGCCTriple(TargetArch, Args, LibDir, 1079 CandidateTripleAliases[k]); 1080 } 1081 for (unsigned j = 0, je = CandidateBiarchLibDirs.size(); j < je; ++j) { 1082 const std::string LibDir = Prefixes[i] + CandidateBiarchLibDirs[j].str(); 1083 if (!llvm::sys::fs::exists(LibDir)) 1084 continue; 1085 for (unsigned k = 0, ke = CandidateBiarchTripleAliases.size(); k < ke; 1086 ++k) 1087 ScanLibDirForGCCTriple(TargetArch, Args, LibDir, 1088 CandidateBiarchTripleAliases[k], 1089 /*NeedsBiarchSuffix=*/ true); 1090 } 1091 } 1092 } 1093 1094 void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const { 1095 for (std::set<std::string>::const_iterator 1096 I = CandidateGCCInstallPaths.begin(), 1097 E = CandidateGCCInstallPaths.end(); 1098 I != E; ++I) 1099 OS << "Found candidate GCC installation: " << *I << "\n"; 1100 1101 OS << "Selected GCC installation: " << GCCInstallPath << "\n"; 1102 } 1103 1104 /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples( 1105 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple, 1106 SmallVectorImpl<StringRef> &LibDirs, 1107 SmallVectorImpl<StringRef> &TripleAliases, 1108 SmallVectorImpl<StringRef> &BiarchLibDirs, 1109 SmallVectorImpl<StringRef> &BiarchTripleAliases) { 1110 // Declare a bunch of static data sets that we'll select between below. These 1111 // are specifically designed to always refer to string literals to avoid any 1112 // lifetime or initialization issues. 1113 static const char *const AArch64LibDirs[] = { "/lib" }; 1114 static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu", 1115 "aarch64-linux-gnu" }; 1116 1117 static const char *const ARMLibDirs[] = { "/lib" }; 1118 static const char *const ARMTriples[] = { "arm-linux-gnueabi", 1119 "arm-linux-androideabi" }; 1120 static const char *const ARMHFTriples[] = { "arm-linux-gnueabihf", 1121 "armv7hl-redhat-linux-gnueabi" }; 1122 1123 static const char *const X86_64LibDirs[] = { "/lib64", "/lib" }; 1124 static const char *const X86_64Triples[] = { 1125 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", "x86_64-pc-linux-gnu", 1126 "x86_64-redhat-linux6E", "x86_64-redhat-linux", "x86_64-suse-linux", 1127 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux" 1128 }; 1129 static const char *const X86LibDirs[] = { "/lib32", "/lib" }; 1130 static const char *const X86Triples[] = { 1131 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", "i386-linux-gnu", 1132 "i386-redhat-linux6E", "i686-redhat-linux", "i586-redhat-linux", 1133 "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux", 1134 "i686-montavista-linux" 1135 }; 1136 1137 static const char *const MIPSLibDirs[] = { "/lib" }; 1138 static const char *const MIPSTriples[] = { "mips-linux-gnu", 1139 "mips-mti-linux-gnu" }; 1140 static const char *const MIPSELLibDirs[] = { "/lib" }; 1141 static const char *const MIPSELTriples[] = { "mipsel-linux-gnu", 1142 "mipsel-linux-android" }; 1143 1144 static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" }; 1145 static const char *const MIPS64Triples[] = { "mips64-linux-gnu", 1146 "mips-mti-linux-gnu" }; 1147 static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" }; 1148 static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu", 1149 "mips-mti-linux-gnu" }; 1150 1151 static const char *const PPCLibDirs[] = { "/lib32", "/lib" }; 1152 static const char *const PPCTriples[] = { 1153 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe", 1154 "powerpc-suse-linux", "powerpc-montavista-linuxspe" 1155 }; 1156 static const char *const PPC64LibDirs[] = { "/lib64", "/lib" }; 1157 static const char *const PPC64Triples[] = { "powerpc64-linux-gnu", 1158 "powerpc64-unknown-linux-gnu", 1159 "powerpc64-suse-linux", 1160 "ppc64-redhat-linux" }; 1161 static const char *const PPC64LELibDirs[] = { "/lib64", "/lib" }; 1162 static const char *const PPC64LETriples[] = { "powerpc64le-linux-gnu", 1163 "powerpc64le-unknown-linux-gnu", 1164 "powerpc64le-suse-linux", 1165 "ppc64le-redhat-linux" }; 1166 1167 static const char *const SystemZLibDirs[] = { "/lib64", "/lib" }; 1168 static const char *const SystemZTriples[] = { 1169 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu", 1170 "s390x-suse-linux", "s390x-redhat-linux" 1171 }; 1172 1173 switch (TargetTriple.getArch()) { 1174 case llvm::Triple::aarch64: 1175 LibDirs.append(AArch64LibDirs, 1176 AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs)); 1177 TripleAliases.append(AArch64Triples, 1178 AArch64Triples + llvm::array_lengthof(AArch64Triples)); 1179 BiarchLibDirs.append(AArch64LibDirs, 1180 AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs)); 1181 BiarchTripleAliases.append( 1182 AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples)); 1183 break; 1184 case llvm::Triple::arm: 1185 case llvm::Triple::thumb: 1186 LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs)); 1187 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { 1188 TripleAliases.append(ARMHFTriples, 1189 ARMHFTriples + llvm::array_lengthof(ARMHFTriples)); 1190 } else { 1191 TripleAliases.append(ARMTriples, 1192 ARMTriples + llvm::array_lengthof(ARMTriples)); 1193 } 1194 break; 1195 case llvm::Triple::x86_64: 1196 LibDirs.append(X86_64LibDirs, 1197 X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs)); 1198 TripleAliases.append(X86_64Triples, 1199 X86_64Triples + llvm::array_lengthof(X86_64Triples)); 1200 BiarchLibDirs.append(X86LibDirs, 1201 X86LibDirs + llvm::array_lengthof(X86LibDirs)); 1202 BiarchTripleAliases.append(X86Triples, 1203 X86Triples + llvm::array_lengthof(X86Triples)); 1204 break; 1205 case llvm::Triple::x86: 1206 LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs)); 1207 TripleAliases.append(X86Triples, 1208 X86Triples + llvm::array_lengthof(X86Triples)); 1209 BiarchLibDirs.append(X86_64LibDirs, 1210 X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs)); 1211 BiarchTripleAliases.append( 1212 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples)); 1213 break; 1214 case llvm::Triple::mips: 1215 LibDirs.append(MIPSLibDirs, 1216 MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs)); 1217 TripleAliases.append(MIPSTriples, 1218 MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1219 BiarchLibDirs.append(MIPS64LibDirs, 1220 MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs)); 1221 BiarchTripleAliases.append( 1222 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples)); 1223 break; 1224 case llvm::Triple::mipsel: 1225 LibDirs.append(MIPSELLibDirs, 1226 MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs)); 1227 TripleAliases.append(MIPSELTriples, 1228 MIPSELTriples + llvm::array_lengthof(MIPSELTriples)); 1229 TripleAliases.append(MIPSTriples, 1230 MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1231 BiarchLibDirs.append( 1232 MIPS64ELLibDirs, 1233 MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs)); 1234 BiarchTripleAliases.append( 1235 MIPS64ELTriples, 1236 MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples)); 1237 break; 1238 case llvm::Triple::mips64: 1239 LibDirs.append(MIPS64LibDirs, 1240 MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs)); 1241 TripleAliases.append(MIPS64Triples, 1242 MIPS64Triples + llvm::array_lengthof(MIPS64Triples)); 1243 BiarchLibDirs.append(MIPSLibDirs, 1244 MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs)); 1245 BiarchTripleAliases.append(MIPSTriples, 1246 MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1247 break; 1248 case llvm::Triple::mips64el: 1249 LibDirs.append(MIPS64ELLibDirs, 1250 MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs)); 1251 TripleAliases.append( 1252 MIPS64ELTriples, 1253 MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples)); 1254 BiarchLibDirs.append(MIPSELLibDirs, 1255 MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs)); 1256 BiarchTripleAliases.append( 1257 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples)); 1258 BiarchTripleAliases.append( 1259 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1260 break; 1261 case llvm::Triple::ppc: 1262 LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs)); 1263 TripleAliases.append(PPCTriples, 1264 PPCTriples + llvm::array_lengthof(PPCTriples)); 1265 BiarchLibDirs.append(PPC64LibDirs, 1266 PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs)); 1267 BiarchTripleAliases.append( 1268 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples)); 1269 break; 1270 case llvm::Triple::ppc64: 1271 LibDirs.append(PPC64LibDirs, 1272 PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs)); 1273 TripleAliases.append(PPC64Triples, 1274 PPC64Triples + llvm::array_lengthof(PPC64Triples)); 1275 BiarchLibDirs.append(PPCLibDirs, 1276 PPCLibDirs + llvm::array_lengthof(PPCLibDirs)); 1277 BiarchTripleAliases.append(PPCTriples, 1278 PPCTriples + llvm::array_lengthof(PPCTriples)); 1279 break; 1280 case llvm::Triple::ppc64le: 1281 LibDirs.append(PPC64LELibDirs, 1282 PPC64LELibDirs + llvm::array_lengthof(PPC64LELibDirs)); 1283 TripleAliases.append(PPC64LETriples, 1284 PPC64LETriples + llvm::array_lengthof(PPC64LETriples)); 1285 break; 1286 case llvm::Triple::systemz: 1287 LibDirs.append(SystemZLibDirs, 1288 SystemZLibDirs + llvm::array_lengthof(SystemZLibDirs)); 1289 TripleAliases.append(SystemZTriples, 1290 SystemZTriples + llvm::array_lengthof(SystemZTriples)); 1291 break; 1292 1293 default: 1294 // By default, just rely on the standard lib directories and the original 1295 // triple. 1296 break; 1297 } 1298 1299 // Always append the drivers target triple to the end, in case it doesn't 1300 // match any of our aliases. 1301 TripleAliases.push_back(TargetTriple.str()); 1302 1303 // Also include the multiarch variant if it's different. 1304 if (TargetTriple.str() != BiarchTriple.str()) 1305 BiarchTripleAliases.push_back(BiarchTriple.str()); 1306 } 1307 1308 static bool isSoftFloatABI(const ArgList &Args) { 1309 Arg *A = Args.getLastArg(options::OPT_msoft_float, 1310 options::OPT_mhard_float, 1311 options::OPT_mfloat_abi_EQ); 1312 if (!A) return false; 1313 1314 return A->getOption().matches(options::OPT_msoft_float) || 1315 (A->getOption().matches(options::OPT_mfloat_abi_EQ) && 1316 A->getValue() == StringRef("soft")); 1317 } 1318 1319 static bool isMipsArch(llvm::Triple::ArchType Arch) { 1320 return Arch == llvm::Triple::mips || 1321 Arch == llvm::Triple::mipsel || 1322 Arch == llvm::Triple::mips64 || 1323 Arch == llvm::Triple::mips64el; 1324 } 1325 1326 static bool isMips16(const ArgList &Args) { 1327 Arg *A = Args.getLastArg(options::OPT_mips16, 1328 options::OPT_mno_mips16); 1329 return A && A->getOption().matches(options::OPT_mips16); 1330 } 1331 1332 static bool isMips32r2(const ArgList &Args) { 1333 Arg *A = Args.getLastArg(options::OPT_march_EQ, 1334 options::OPT_mcpu_EQ); 1335 1336 return A && A->getValue() == StringRef("mips32r2"); 1337 } 1338 1339 static bool isMips64r2(const ArgList &Args) { 1340 Arg *A = Args.getLastArg(options::OPT_march_EQ, 1341 options::OPT_mcpu_EQ); 1342 1343 return A && A->getValue() == StringRef("mips64r2"); 1344 } 1345 1346 static bool isMicroMips(const ArgList &Args) { 1347 Arg *A = Args.getLastArg(options::OPT_mmicromips, 1348 options::OPT_mno_micromips); 1349 return A && A->getOption().matches(options::OPT_mmicromips); 1350 } 1351 1352 static bool isMipsNan2008(const ArgList &Args) { 1353 Arg *A = Args.getLastArg(options::OPT_mnan_EQ); 1354 return A && A->getValue() == StringRef("2008"); 1355 } 1356 1357 // FIXME: There is the same routine in the Tools.cpp. 1358 static bool hasMipsN32ABIArg(const ArgList &Args) { 1359 Arg *A = Args.getLastArg(options::OPT_mabi_EQ); 1360 return A && (A->getValue() == StringRef("n32")); 1361 } 1362 1363 static bool hasCrtBeginObj(Twine Path) { 1364 return llvm::sys::fs::exists(Path + "/crtbegin.o"); 1365 } 1366 1367 static bool findTargetBiarchSuffix(std::string &Suffix, StringRef Path, 1368 llvm::Triple::ArchType TargetArch, 1369 const ArgList &Args) { 1370 // FIXME: This routine was only intended to model bi-arch toolchains which 1371 // use -m32 and -m64 to swap between variants of a target. It shouldn't be 1372 // doing ABI-based builtin location for MIPS. 1373 if (hasMipsN32ABIArg(Args)) 1374 Suffix = "/n32"; 1375 else if (TargetArch == llvm::Triple::x86_64 || 1376 TargetArch == llvm::Triple::ppc64 || 1377 TargetArch == llvm::Triple::systemz || 1378 TargetArch == llvm::Triple::mips64 || 1379 TargetArch == llvm::Triple::mips64el) 1380 Suffix = "/64"; 1381 else 1382 Suffix = "/32"; 1383 1384 return hasCrtBeginObj(Path + Suffix); 1385 } 1386 1387 void Generic_GCC::GCCInstallationDetector::findMIPSABIDirSuffix( 1388 std::string &Suffix, llvm::Triple::ArchType TargetArch, StringRef Path, 1389 const llvm::opt::ArgList &Args) { 1390 if (!isMipsArch(TargetArch)) 1391 return; 1392 1393 // Some MIPS toolchains put libraries and object files compiled 1394 // using different options in to the sub-directoris which names 1395 // reflects the flags used for compilation. For example sysroot 1396 // directory might looks like the following examples: 1397 // 1398 // /usr 1399 // /lib <= crt*.o files compiled with '-mips32' 1400 // /mips16 1401 // /usr 1402 // /lib <= crt*.o files compiled with '-mips16' 1403 // /el 1404 // /usr 1405 // /lib <= crt*.o files compiled with '-mips16 -EL' 1406 // 1407 // or 1408 // 1409 // /usr 1410 // /lib <= crt*.o files compiled with '-mips32r2' 1411 // /mips16 1412 // /usr 1413 // /lib <= crt*.o files compiled with '-mips32r2 -mips16' 1414 // /mips32 1415 // /usr 1416 // /lib <= crt*.o files compiled with '-mips32' 1417 // 1418 // Unfortunately different toolchains use different and partially 1419 // overlapped naming schemes. So we have to make a trick for detection 1420 // of using toolchain. We lookup a path which unique for each toolchains. 1421 1422 bool IsMentorToolChain = hasCrtBeginObj(Path + "/mips16/soft-float"); 1423 bool IsFSFToolChain = hasCrtBeginObj(Path + "/mips32/mips16/sof"); 1424 1425 if (IsMentorToolChain && IsFSFToolChain) 1426 D.Diag(diag::err_drv_unknown_toolchain); 1427 1428 if (IsMentorToolChain) { 1429 if (isMips16(Args)) 1430 Suffix += "/mips16"; 1431 else if (isMicroMips(Args)) 1432 Suffix += "/micromips"; 1433 1434 if (isSoftFloatABI(Args)) 1435 Suffix += "/soft-float"; 1436 1437 if (TargetArch == llvm::Triple::mipsel || 1438 TargetArch == llvm::Triple::mips64el) 1439 Suffix += "/el"; 1440 } else if (IsFSFToolChain) { 1441 if (TargetArch == llvm::Triple::mips || 1442 TargetArch == llvm::Triple::mipsel) { 1443 if (isMicroMips(Args)) 1444 Suffix += "/micromips"; 1445 else if (isMips32r2(Args)) 1446 Suffix += ""; 1447 else 1448 Suffix += "/mips32"; 1449 1450 if (isMips16(Args)) 1451 Suffix += "/mips16"; 1452 } else { 1453 if (isMips64r2(Args)) 1454 Suffix += hasMipsN32ABIArg(Args) ? "/mips64r2" : "/mips64r2/64"; 1455 else 1456 Suffix += hasMipsN32ABIArg(Args) ? "/mips64" : "/mips64/64"; 1457 } 1458 1459 if (TargetArch == llvm::Triple::mipsel || 1460 TargetArch == llvm::Triple::mips64el) 1461 Suffix += "/el"; 1462 1463 if (isSoftFloatABI(Args)) 1464 Suffix += "/sof"; 1465 else if (isMipsNan2008(Args)) 1466 Suffix += "/nan2008"; 1467 } 1468 1469 if (!hasCrtBeginObj(Path + Suffix)) 1470 Suffix.clear(); 1471 } 1472 1473 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( 1474 llvm::Triple::ArchType TargetArch, const ArgList &Args, 1475 const std::string &LibDir, StringRef CandidateTriple, 1476 bool NeedsBiarchSuffix) { 1477 // There are various different suffixes involving the triple we 1478 // check for. We also record what is necessary to walk from each back 1479 // up to the lib directory. 1480 const std::string LibSuffixes[] = { 1481 "/gcc/" + CandidateTriple.str(), 1482 // Debian puts cross-compilers in gcc-cross 1483 "/gcc-cross/" + CandidateTriple.str(), 1484 "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(), 1485 1486 // The Freescale PPC SDK has the gcc libraries in 1487 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. 1488 "/" + CandidateTriple.str(), 1489 1490 // Ubuntu has a strange mis-matched pair of triples that this happens to 1491 // match. 1492 // FIXME: It may be worthwhile to generalize this and look for a second 1493 // triple. 1494 "/i386-linux-gnu/gcc/" + CandidateTriple.str() 1495 }; 1496 const std::string InstallSuffixes[] = { 1497 "/../../..", // gcc/ 1498 "/../../..", // gcc-cross/ 1499 "/../../../..", // <triple>/gcc/ 1500 "/../..", // <triple>/ 1501 "/../../../.." // i386-linux-gnu/gcc/<triple>/ 1502 }; 1503 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu. 1504 const unsigned NumLibSuffixes = 1505 (llvm::array_lengthof(LibSuffixes) - (TargetArch != llvm::Triple::x86)); 1506 for (unsigned i = 0; i < NumLibSuffixes; ++i) { 1507 StringRef LibSuffix = LibSuffixes[i]; 1508 llvm::error_code EC; 1509 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE; 1510 !EC && LI != LE; LI = LI.increment(EC)) { 1511 StringRef VersionText = llvm::sys::path::filename(LI->path()); 1512 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText); 1513 if (CandidateVersion.Major != -1) // Filter obviously bad entries. 1514 if (!CandidateGCCInstallPaths.insert(LI->path()).second) 1515 continue; // Saw this path before; no need to look at it again. 1516 if (CandidateVersion.isOlderThan(4, 1, 1)) 1517 continue; 1518 if (CandidateVersion <= Version) 1519 continue; 1520 1521 std::string MIPSABIDirSuffix; 1522 findMIPSABIDirSuffix(MIPSABIDirSuffix, TargetArch, LI->path(), Args); 1523 1524 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs 1525 // in what would normally be GCCInstallPath and put the 64-bit 1526 // libs in a subdirectory named 64. The simple logic we follow is that 1527 // *if* there is a subdirectory of the right name with crtbegin.o in it, 1528 // we use that. If not, and if not a biarch triple alias, we look for 1529 // crtbegin.o without the subdirectory. 1530 1531 std::string BiarchSuffix; 1532 if (findTargetBiarchSuffix(BiarchSuffix, 1533 LI->path() + MIPSABIDirSuffix, 1534 TargetArch, Args)) { 1535 GCCBiarchSuffix = BiarchSuffix; 1536 } else if (NeedsBiarchSuffix || 1537 !hasCrtBeginObj(LI->path() + MIPSABIDirSuffix)) { 1538 continue; 1539 } else { 1540 GCCBiarchSuffix.clear(); 1541 } 1542 1543 Version = CandidateVersion; 1544 GCCTriple.setTriple(CandidateTriple); 1545 // FIXME: We hack together the directory name here instead of 1546 // using LI to ensure stable path separators across Windows and 1547 // Linux. 1548 GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str(); 1549 GCCParentLibPath = GCCInstallPath + InstallSuffixes[i]; 1550 GCCMIPSABIDirSuffix = MIPSABIDirSuffix; 1551 IsValid = true; 1552 } 1553 } 1554 } 1555 1556 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple, 1557 const ArgList &Args) 1558 : ToolChain(D, Triple, Args), GCCInstallation(getDriver(), Triple, Args) { 1559 getProgramPaths().push_back(getDriver().getInstalledDir()); 1560 if (getDriver().getInstalledDir() != getDriver().Dir) 1561 getProgramPaths().push_back(getDriver().Dir); 1562 } 1563 1564 Generic_GCC::~Generic_GCC() { 1565 } 1566 1567 Tool *Generic_GCC::getTool(Action::ActionClass AC) const { 1568 switch (AC) { 1569 case Action::PreprocessJobClass: 1570 if (!Preprocess) 1571 Preprocess.reset(new tools::gcc::Preprocess(*this)); 1572 return Preprocess.get(); 1573 case Action::PrecompileJobClass: 1574 if (!Precompile) 1575 Precompile.reset(new tools::gcc::Precompile(*this)); 1576 return Precompile.get(); 1577 case Action::CompileJobClass: 1578 if (!Compile) 1579 Compile.reset(new tools::gcc::Compile(*this)); 1580 return Compile.get(); 1581 default: 1582 return ToolChain::getTool(AC); 1583 } 1584 } 1585 1586 Tool *Generic_GCC::buildAssembler() const { 1587 return new tools::gcc::Assemble(*this); 1588 } 1589 1590 Tool *Generic_GCC::buildLinker() const { 1591 return new tools::gcc::Link(*this); 1592 } 1593 1594 void Generic_GCC::printVerboseInfo(raw_ostream &OS) const { 1595 // Print the information about how we detected the GCC installation. 1596 GCCInstallation.print(OS); 1597 } 1598 1599 bool Generic_GCC::IsUnwindTablesDefault() const { 1600 return getArch() == llvm::Triple::x86_64; 1601 } 1602 1603 bool Generic_GCC::isPICDefault() const { 1604 return false; 1605 } 1606 1607 bool Generic_GCC::isPIEDefault() const { 1608 return false; 1609 } 1610 1611 bool Generic_GCC::isPICDefaultForced() const { 1612 return false; 1613 } 1614 1615 /// Hexagon Toolchain 1616 1617 std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) { 1618 1619 // Locate the rest of the toolchain ... 1620 if (strlen(GCC_INSTALL_PREFIX)) 1621 return std::string(GCC_INSTALL_PREFIX); 1622 1623 std::string InstallRelDir = InstalledDir + "/../../gnu"; 1624 if (llvm::sys::fs::exists(InstallRelDir)) 1625 return InstallRelDir; 1626 1627 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu"; 1628 if (llvm::sys::fs::exists(PrefixRelDir)) 1629 return PrefixRelDir; 1630 1631 return InstallRelDir; 1632 } 1633 1634 static void GetHexagonLibraryPaths( 1635 const ArgList &Args, 1636 const std::string Ver, 1637 const std::string MarchString, 1638 const std::string &InstalledDir, 1639 ToolChain::path_list *LibPaths) 1640 { 1641 bool buildingLib = Args.hasArg(options::OPT_shared); 1642 1643 //---------------------------------------------------------------------------- 1644 // -L Args 1645 //---------------------------------------------------------------------------- 1646 for (arg_iterator 1647 it = Args.filtered_begin(options::OPT_L), 1648 ie = Args.filtered_end(); 1649 it != ie; 1650 ++it) { 1651 for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i) 1652 LibPaths->push_back((*it)->getValue(i)); 1653 } 1654 1655 //---------------------------------------------------------------------------- 1656 // Other standard paths 1657 //---------------------------------------------------------------------------- 1658 const std::string MarchSuffix = "/" + MarchString; 1659 const std::string G0Suffix = "/G0"; 1660 const std::string MarchG0Suffix = MarchSuffix + G0Suffix; 1661 const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/"; 1662 1663 // lib/gcc/hexagon/... 1664 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/"; 1665 if (buildingLib) { 1666 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix); 1667 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix); 1668 } 1669 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix); 1670 LibPaths->push_back(LibGCCHexagonDir + Ver); 1671 1672 // lib/gcc/... 1673 LibPaths->push_back(RootDir + "lib/gcc"); 1674 1675 // hexagon/lib/... 1676 std::string HexagonLibDir = RootDir + "hexagon/lib"; 1677 if (buildingLib) { 1678 LibPaths->push_back(HexagonLibDir + MarchG0Suffix); 1679 LibPaths->push_back(HexagonLibDir + G0Suffix); 1680 } 1681 LibPaths->push_back(HexagonLibDir + MarchSuffix); 1682 LibPaths->push_back(HexagonLibDir); 1683 } 1684 1685 Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple, 1686 const ArgList &Args) 1687 : Linux(D, Triple, Args) { 1688 const std::string InstalledDir(getDriver().getInstalledDir()); 1689 const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir); 1690 1691 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to 1692 // program paths 1693 const std::string BinDir(GnuDir + "/bin"); 1694 if (llvm::sys::fs::exists(BinDir)) 1695 getProgramPaths().push_back(BinDir); 1696 1697 // Determine version of GCC libraries and headers to use. 1698 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon"); 1699 llvm::error_code ec; 1700 GCCVersion MaxVersion= GCCVersion::Parse("0.0.0"); 1701 for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de; 1702 !ec && di != de; di = di.increment(ec)) { 1703 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path())); 1704 if (MaxVersion < cv) 1705 MaxVersion = cv; 1706 } 1707 GCCLibAndIncVersion = MaxVersion; 1708 1709 ToolChain::path_list *LibPaths= &getFilePaths(); 1710 1711 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets 1712 // 'elf' OS type, so the Linux paths are not appropriate. When we actually 1713 // support 'linux' we'll need to fix this up 1714 LibPaths->clear(); 1715 1716 GetHexagonLibraryPaths( 1717 Args, 1718 GetGCCLibAndIncVersion(), 1719 GetTargetCPU(Args), 1720 InstalledDir, 1721 LibPaths); 1722 } 1723 1724 Hexagon_TC::~Hexagon_TC() { 1725 } 1726 1727 Tool *Hexagon_TC::buildAssembler() const { 1728 return new tools::hexagon::Assemble(*this); 1729 } 1730 1731 Tool *Hexagon_TC::buildLinker() const { 1732 return new tools::hexagon::Link(*this); 1733 } 1734 1735 void Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 1736 ArgStringList &CC1Args) const { 1737 const Driver &D = getDriver(); 1738 1739 if (DriverArgs.hasArg(options::OPT_nostdinc) || 1740 DriverArgs.hasArg(options::OPT_nostdlibinc)) 1741 return; 1742 1743 std::string Ver(GetGCCLibAndIncVersion()); 1744 std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir); 1745 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver); 1746 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include"); 1747 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed"); 1748 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include"); 1749 } 1750 1751 void Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 1752 ArgStringList &CC1Args) const { 1753 1754 if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 1755 DriverArgs.hasArg(options::OPT_nostdincxx)) 1756 return; 1757 1758 const Driver &D = getDriver(); 1759 std::string Ver(GetGCCLibAndIncVersion()); 1760 SmallString<128> IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir)); 1761 1762 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/"); 1763 llvm::sys::path::append(IncludeDir, Ver); 1764 addSystemInclude(DriverArgs, CC1Args, IncludeDir.str()); 1765 } 1766 1767 ToolChain::CXXStdlibType 1768 Hexagon_TC::GetCXXStdlibType(const ArgList &Args) const { 1769 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ); 1770 if (!A) 1771 return ToolChain::CST_Libstdcxx; 1772 1773 StringRef Value = A->getValue(); 1774 if (Value != "libstdc++") { 1775 getDriver().Diag(diag::err_drv_invalid_stdlib_name) 1776 << A->getAsString(Args); 1777 } 1778 1779 return ToolChain::CST_Libstdcxx; 1780 } 1781 1782 static int getHexagonVersion(const ArgList &Args) { 1783 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ); 1784 // Select the default CPU (v4) if none was given. 1785 if (!A) 1786 return 4; 1787 1788 // FIXME: produce errors if we cannot parse the version. 1789 StringRef WhichHexagon = A->getValue(); 1790 if (WhichHexagon.startswith("hexagonv")) { 1791 int Val; 1792 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val)) 1793 return Val; 1794 } 1795 if (WhichHexagon.startswith("v")) { 1796 int Val; 1797 if (!WhichHexagon.substr(1).getAsInteger(10, Val)) 1798 return Val; 1799 } 1800 1801 // FIXME: should probably be an error. 1802 return 4; 1803 } 1804 1805 StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args) 1806 { 1807 int V = getHexagonVersion(Args); 1808 // FIXME: We don't support versions < 4. We should error on them. 1809 switch (V) { 1810 default: 1811 llvm_unreachable("Unexpected version"); 1812 case 5: 1813 return "v5"; 1814 case 4: 1815 return "v4"; 1816 case 3: 1817 return "v3"; 1818 case 2: 1819 return "v2"; 1820 case 1: 1821 return "v1"; 1822 } 1823 } 1824 // End Hexagon 1825 1826 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform 1827 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 1828 /// Currently does not support anything else but compilation. 1829 1830 TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple, 1831 const ArgList &Args) 1832 : ToolChain(D, Triple, Args) { 1833 // Path mangling to find libexec 1834 std::string Path(getDriver().Dir); 1835 1836 Path += "/../libexec"; 1837 getProgramPaths().push_back(Path); 1838 } 1839 1840 TCEToolChain::~TCEToolChain() { 1841 } 1842 1843 bool TCEToolChain::IsMathErrnoDefault() const { 1844 return true; 1845 } 1846 1847 bool TCEToolChain::isPICDefault() const { 1848 return false; 1849 } 1850 1851 bool TCEToolChain::isPIEDefault() const { 1852 return false; 1853 } 1854 1855 bool TCEToolChain::isPICDefaultForced() const { 1856 return false; 1857 } 1858 1859 /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 1860 1861 OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 1862 : Generic_ELF(D, Triple, Args) { 1863 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1864 getFilePaths().push_back("/usr/lib"); 1865 } 1866 1867 Tool *OpenBSD::buildAssembler() const { 1868 return new tools::openbsd::Assemble(*this); 1869 } 1870 1871 Tool *OpenBSD::buildLinker() const { 1872 return new tools::openbsd::Link(*this); 1873 } 1874 1875 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly. 1876 1877 Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 1878 : Generic_ELF(D, Triple, Args) { 1879 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1880 getFilePaths().push_back("/usr/lib"); 1881 } 1882 1883 Tool *Bitrig::buildAssembler() const { 1884 return new tools::bitrig::Assemble(*this); 1885 } 1886 1887 Tool *Bitrig::buildLinker() const { 1888 return new tools::bitrig::Link(*this); 1889 } 1890 1891 void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 1892 ArgStringList &CC1Args) const { 1893 if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 1894 DriverArgs.hasArg(options::OPT_nostdincxx)) 1895 return; 1896 1897 switch (GetCXXStdlibType(DriverArgs)) { 1898 case ToolChain::CST_Libcxx: 1899 addSystemInclude(DriverArgs, CC1Args, 1900 getDriver().SysRoot + "/usr/include/c++/"); 1901 break; 1902 case ToolChain::CST_Libstdcxx: 1903 addSystemInclude(DriverArgs, CC1Args, 1904 getDriver().SysRoot + "/usr/include/c++/stdc++"); 1905 addSystemInclude(DriverArgs, CC1Args, 1906 getDriver().SysRoot + "/usr/include/c++/stdc++/backward"); 1907 1908 StringRef Triple = getTriple().str(); 1909 if (Triple.startswith("amd64")) 1910 addSystemInclude(DriverArgs, CC1Args, 1911 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" + 1912 Triple.substr(5)); 1913 else 1914 addSystemInclude(DriverArgs, CC1Args, 1915 getDriver().SysRoot + "/usr/include/c++/stdc++/" + 1916 Triple); 1917 break; 1918 } 1919 } 1920 1921 void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args, 1922 ArgStringList &CmdArgs) const { 1923 switch (GetCXXStdlibType(Args)) { 1924 case ToolChain::CST_Libcxx: 1925 CmdArgs.push_back("-lc++"); 1926 CmdArgs.push_back("-lcxxrt"); 1927 // Include supc++ to provide Unwind until provided by libcxx. 1928 CmdArgs.push_back("-lgcc"); 1929 break; 1930 case ToolChain::CST_Libstdcxx: 1931 CmdArgs.push_back("-lstdc++"); 1932 break; 1933 } 1934 } 1935 1936 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 1937 1938 FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 1939 : Generic_ELF(D, Triple, Args) { 1940 1941 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall 1942 // back to '/usr/lib' if it doesn't exist. 1943 if ((Triple.getArch() == llvm::Triple::x86 || 1944 Triple.getArch() == llvm::Triple::ppc) && 1945 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o")) 1946 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32"); 1947 else 1948 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); 1949 } 1950 1951 ToolChain::CXXStdlibType 1952 FreeBSD::GetCXXStdlibType(const ArgList &Args) const { 1953 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { 1954 StringRef Value = A->getValue(); 1955 if (Value == "libstdc++") 1956 return ToolChain::CST_Libstdcxx; 1957 if (Value == "libc++") 1958 return ToolChain::CST_Libcxx; 1959 1960 getDriver().Diag(diag::err_drv_invalid_stdlib_name) 1961 << A->getAsString(Args); 1962 } 1963 if (getTriple().getOSMajorVersion() >= 10) 1964 return ToolChain::CST_Libcxx; 1965 return ToolChain::CST_Libstdcxx; 1966 } 1967 1968 void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 1969 ArgStringList &CC1Args) const { 1970 if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 1971 DriverArgs.hasArg(options::OPT_nostdincxx)) 1972 return; 1973 1974 switch (GetCXXStdlibType(DriverArgs)) { 1975 case ToolChain::CST_Libcxx: 1976 addSystemInclude(DriverArgs, CC1Args, 1977 getDriver().SysRoot + "/usr/include/c++/v1"); 1978 break; 1979 case ToolChain::CST_Libstdcxx: 1980 addSystemInclude(DriverArgs, CC1Args, 1981 getDriver().SysRoot + "/usr/include/c++/4.2"); 1982 addSystemInclude(DriverArgs, CC1Args, 1983 getDriver().SysRoot + "/usr/include/c++/4.2/backward"); 1984 break; 1985 } 1986 } 1987 1988 Tool *FreeBSD::buildAssembler() const { 1989 return new tools::freebsd::Assemble(*this); 1990 } 1991 1992 Tool *FreeBSD::buildLinker() const { 1993 return new tools::freebsd::Link(*this); 1994 } 1995 1996 bool FreeBSD::UseSjLjExceptions() const { 1997 // FreeBSD uses SjLj exceptions on ARM oabi. 1998 switch (getTriple().getEnvironment()) { 1999 case llvm::Triple::GNUEABI: 2000 case llvm::Triple::EABI: 2001 return false; 2002 2003 default: 2004 return (getTriple().getArch() == llvm::Triple::arm || 2005 getTriple().getArch() == llvm::Triple::thumb); 2006 } 2007 } 2008 2009 /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly. 2010 2011 NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 2012 : Generic_ELF(D, Triple, Args) { 2013 2014 if (getDriver().UseStdLib) { 2015 // When targeting a 32-bit platform, try the special directory used on 2016 // 64-bit hosts, and only fall back to the main library directory if that 2017 // doesn't work. 2018 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure 2019 // what all logic is needed to emulate the '=' prefix here. 2020 if (Triple.getArch() == llvm::Triple::x86) 2021 getFilePaths().push_back("=/usr/lib/i386"); 2022 2023 getFilePaths().push_back("=/usr/lib"); 2024 } 2025 } 2026 2027 Tool *NetBSD::buildAssembler() const { 2028 return new tools::netbsd::Assemble(*this); 2029 } 2030 2031 Tool *NetBSD::buildLinker() const { 2032 return new tools::netbsd::Link(*this); 2033 } 2034 2035 ToolChain::CXXStdlibType 2036 NetBSD::GetCXXStdlibType(const ArgList &Args) const { 2037 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { 2038 StringRef Value = A->getValue(); 2039 if (Value == "libstdc++") 2040 return ToolChain::CST_Libstdcxx; 2041 if (Value == "libc++") 2042 return ToolChain::CST_Libcxx; 2043 2044 getDriver().Diag(diag::err_drv_invalid_stdlib_name) 2045 << A->getAsString(Args); 2046 } 2047 2048 unsigned Major, Minor, Micro; 2049 getTriple().getOSVersion(Major, Minor, Micro); 2050 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) { 2051 if (getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64) 2052 return ToolChain::CST_Libcxx; 2053 } 2054 return ToolChain::CST_Libstdcxx; 2055 } 2056 2057 void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 2058 ArgStringList &CC1Args) const { 2059 if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 2060 DriverArgs.hasArg(options::OPT_nostdincxx)) 2061 return; 2062 2063 switch (GetCXXStdlibType(DriverArgs)) { 2064 case ToolChain::CST_Libcxx: 2065 addSystemInclude(DriverArgs, CC1Args, 2066 getDriver().SysRoot + "/usr/include/c++/"); 2067 break; 2068 case ToolChain::CST_Libstdcxx: 2069 addSystemInclude(DriverArgs, CC1Args, 2070 getDriver().SysRoot + "/usr/include/g++"); 2071 addSystemInclude(DriverArgs, CC1Args, 2072 getDriver().SysRoot + "/usr/include/g++/backward"); 2073 break; 2074 } 2075 } 2076 2077 /// Minix - Minix tool chain which can call as(1) and ld(1) directly. 2078 2079 Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 2080 : Generic_ELF(D, Triple, Args) { 2081 getFilePaths().push_back(getDriver().Dir + "/../lib"); 2082 getFilePaths().push_back("/usr/lib"); 2083 } 2084 2085 Tool *Minix::buildAssembler() const { 2086 return new tools::minix::Assemble(*this); 2087 } 2088 2089 Tool *Minix::buildLinker() const { 2090 return new tools::minix::Link(*this); 2091 } 2092 2093 /// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 2094 2095 AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple, 2096 const ArgList &Args) 2097 : Generic_GCC(D, Triple, Args) { 2098 2099 getProgramPaths().push_back(getDriver().getInstalledDir()); 2100 if (getDriver().getInstalledDir() != getDriver().Dir) 2101 getProgramPaths().push_back(getDriver().Dir); 2102 2103 getFilePaths().push_back(getDriver().Dir + "/../lib"); 2104 getFilePaths().push_back("/usr/lib"); 2105 getFilePaths().push_back("/usr/sfw/lib"); 2106 getFilePaths().push_back("/opt/gcc4/lib"); 2107 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 2108 2109 } 2110 2111 Tool *AuroraUX::buildAssembler() const { 2112 return new tools::auroraux::Assemble(*this); 2113 } 2114 2115 Tool *AuroraUX::buildLinker() const { 2116 return new tools::auroraux::Link(*this); 2117 } 2118 2119 /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly. 2120 2121 Solaris::Solaris(const Driver &D, const llvm::Triple& Triple, 2122 const ArgList &Args) 2123 : Generic_GCC(D, Triple, Args) { 2124 2125 getProgramPaths().push_back(getDriver().getInstalledDir()); 2126 if (getDriver().getInstalledDir() != getDriver().Dir) 2127 getProgramPaths().push_back(getDriver().Dir); 2128 2129 getFilePaths().push_back(getDriver().Dir + "/../lib"); 2130 getFilePaths().push_back("/usr/lib"); 2131 } 2132 2133 Tool *Solaris::buildAssembler() const { 2134 return new tools::solaris::Assemble(*this); 2135 } 2136 2137 Tool *Solaris::buildLinker() const { 2138 return new tools::solaris::Link(*this); 2139 } 2140 2141 /// Distribution (very bare-bones at the moment). 2142 2143 enum Distro { 2144 ArchLinux, 2145 DebianLenny, 2146 DebianSqueeze, 2147 DebianWheezy, 2148 DebianJessie, 2149 Exherbo, 2150 RHEL4, 2151 RHEL5, 2152 RHEL6, 2153 Fedora, 2154 OpenSUSE, 2155 UbuntuHardy, 2156 UbuntuIntrepid, 2157 UbuntuJaunty, 2158 UbuntuKarmic, 2159 UbuntuLucid, 2160 UbuntuMaverick, 2161 UbuntuNatty, 2162 UbuntuOneiric, 2163 UbuntuPrecise, 2164 UbuntuQuantal, 2165 UbuntuRaring, 2166 UbuntuSaucy, 2167 UbuntuTrusty, 2168 UnknownDistro 2169 }; 2170 2171 static bool IsRedhat(enum Distro Distro) { 2172 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL6); 2173 } 2174 2175 static bool IsOpenSUSE(enum Distro Distro) { 2176 return Distro == OpenSUSE; 2177 } 2178 2179 static bool IsDebian(enum Distro Distro) { 2180 return Distro >= DebianLenny && Distro <= DebianJessie; 2181 } 2182 2183 static bool IsUbuntu(enum Distro Distro) { 2184 return Distro >= UbuntuHardy && Distro <= UbuntuTrusty; 2185 } 2186 2187 static Distro DetectDistro(llvm::Triple::ArchType Arch) { 2188 OwningPtr<llvm::MemoryBuffer> File; 2189 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) { 2190 StringRef Data = File.get()->getBuffer(); 2191 SmallVector<StringRef, 8> Lines; 2192 Data.split(Lines, "\n"); 2193 Distro Version = UnknownDistro; 2194 for (unsigned i = 0, s = Lines.size(); i != s; ++i) 2195 if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME=")) 2196 Version = llvm::StringSwitch<Distro>(Lines[i].substr(17)) 2197 .Case("hardy", UbuntuHardy) 2198 .Case("intrepid", UbuntuIntrepid) 2199 .Case("jaunty", UbuntuJaunty) 2200 .Case("karmic", UbuntuKarmic) 2201 .Case("lucid", UbuntuLucid) 2202 .Case("maverick", UbuntuMaverick) 2203 .Case("natty", UbuntuNatty) 2204 .Case("oneiric", UbuntuOneiric) 2205 .Case("precise", UbuntuPrecise) 2206 .Case("quantal", UbuntuQuantal) 2207 .Case("raring", UbuntuRaring) 2208 .Case("saucy", UbuntuSaucy) 2209 .Case("trusty", UbuntuTrusty) 2210 .Default(UnknownDistro); 2211 return Version; 2212 } 2213 2214 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) { 2215 StringRef Data = File.get()->getBuffer(); 2216 if (Data.startswith("Fedora release")) 2217 return Fedora; 2218 else if (Data.startswith("Red Hat Enterprise Linux") && 2219 Data.find("release 6") != StringRef::npos) 2220 return RHEL6; 2221 else if ((Data.startswith("Red Hat Enterprise Linux") || 2222 Data.startswith("CentOS")) && 2223 Data.find("release 5") != StringRef::npos) 2224 return RHEL5; 2225 else if ((Data.startswith("Red Hat Enterprise Linux") || 2226 Data.startswith("CentOS")) && 2227 Data.find("release 4") != StringRef::npos) 2228 return RHEL4; 2229 return UnknownDistro; 2230 } 2231 2232 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) { 2233 StringRef Data = File.get()->getBuffer(); 2234 if (Data[0] == '5') 2235 return DebianLenny; 2236 else if (Data.startswith("squeeze/sid") || Data[0] == '6') 2237 return DebianSqueeze; 2238 else if (Data.startswith("wheezy/sid") || Data[0] == '7') 2239 return DebianWheezy; 2240 else if (Data.startswith("jessie/sid") || Data[0] == '8') 2241 return DebianJessie; 2242 return UnknownDistro; 2243 } 2244 2245 if (llvm::sys::fs::exists("/etc/SuSE-release")) 2246 return OpenSUSE; 2247 2248 if (llvm::sys::fs::exists("/etc/exherbo-release")) 2249 return Exherbo; 2250 2251 if (llvm::sys::fs::exists("/etc/arch-release")) 2252 return ArchLinux; 2253 2254 return UnknownDistro; 2255 } 2256 2257 /// \brief Get our best guess at the multiarch triple for a target. 2258 /// 2259 /// Debian-based systems are starting to use a multiarch setup where they use 2260 /// a target-triple directory in the library and header search paths. 2261 /// Unfortunately, this triple does not align with the vanilla target triple, 2262 /// so we provide a rough mapping here. 2263 static std::string getMultiarchTriple(const llvm::Triple TargetTriple, 2264 StringRef SysRoot) { 2265 // For most architectures, just use whatever we have rather than trying to be 2266 // clever. 2267 switch (TargetTriple.getArch()) { 2268 default: 2269 return TargetTriple.str(); 2270 2271 // We use the existence of '/lib/<triple>' as a directory to detect some 2272 // common linux triples that don't quite match the Clang triple for both 2273 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these 2274 // regardless of what the actual target triple is. 2275 case llvm::Triple::arm: 2276 case llvm::Triple::thumb: 2277 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { 2278 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf")) 2279 return "arm-linux-gnueabihf"; 2280 } else { 2281 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi")) 2282 return "arm-linux-gnueabi"; 2283 } 2284 return TargetTriple.str(); 2285 case llvm::Triple::x86: 2286 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu")) 2287 return "i386-linux-gnu"; 2288 return TargetTriple.str(); 2289 case llvm::Triple::x86_64: 2290 if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu")) 2291 return "x86_64-linux-gnu"; 2292 return TargetTriple.str(); 2293 case llvm::Triple::aarch64: 2294 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu")) 2295 return "aarch64-linux-gnu"; 2296 return TargetTriple.str(); 2297 case llvm::Triple::mips: 2298 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu")) 2299 return "mips-linux-gnu"; 2300 return TargetTriple.str(); 2301 case llvm::Triple::mipsel: 2302 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu")) 2303 return "mipsel-linux-gnu"; 2304 return TargetTriple.str(); 2305 case llvm::Triple::ppc: 2306 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe")) 2307 return "powerpc-linux-gnuspe"; 2308 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu")) 2309 return "powerpc-linux-gnu"; 2310 return TargetTriple.str(); 2311 case llvm::Triple::ppc64: 2312 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu")) 2313 return "powerpc64-linux-gnu"; 2314 case llvm::Triple::ppc64le: 2315 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu")) 2316 return "powerpc64le-linux-gnu"; 2317 return TargetTriple.str(); 2318 } 2319 } 2320 2321 static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) { 2322 if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str()); 2323 } 2324 2325 static StringRef getMultilibDir(const llvm::Triple &Triple, 2326 const ArgList &Args) { 2327 if (isMipsArch(Triple.getArch())) { 2328 // lib32 directory has a special meaning on MIPS targets. 2329 // It contains N32 ABI binaries. Use this folder if produce 2330 // code for N32 ABI only. 2331 if (hasMipsN32ABIArg(Args)) 2332 return "lib32"; 2333 return Triple.isArch32Bit() ? "lib" : "lib64"; 2334 } 2335 2336 // It happens that only x86 and PPC use the 'lib32' variant of multilib, and 2337 // using that variant while targeting other architectures causes problems 2338 // because the libraries are laid out in shared system roots that can't cope 2339 // with a 'lib32' multilib search path being considered. So we only enable 2340 // them when we know we may need it. 2341 // 2342 // FIXME: This is a bit of a hack. We should really unify this code for 2343 // reasoning about multilib spellings with the lib dir spellings in the 2344 // GCCInstallationDetector, but that is a more significant refactoring. 2345 if (Triple.getArch() == llvm::Triple::x86 || 2346 Triple.getArch() == llvm::Triple::ppc) 2347 return "lib32"; 2348 2349 return Triple.isArch32Bit() ? "lib" : "lib64"; 2350 } 2351 2352 Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) 2353 : Generic_ELF(D, Triple, Args) { 2354 llvm::Triple::ArchType Arch = Triple.getArch(); 2355 std::string SysRoot = computeSysRoot(); 2356 2357 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at 2358 // least) put various tools in a triple-prefixed directory off of the parent 2359 // of the GCC installation. We use the GCC triple here to ensure that we end 2360 // up with tools that support the same amount of cross compiling as the 2361 // detected GCC installation. For example, if we find a GCC installation 2362 // targeting x86_64, but it is a bi-arch GCC installation, it can also be 2363 // used to target i386. 2364 // FIXME: This seems unlikely to be Linux-specific. 2365 ToolChain::path_list &PPaths = getProgramPaths(); 2366 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" + 2367 GCCInstallation.getTriple().str() + "/bin").str()); 2368 2369 Linker = GetProgramPath("ld"); 2370 2371 Distro Distro = DetectDistro(Arch); 2372 2373 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) { 2374 ExtraOpts.push_back("-z"); 2375 ExtraOpts.push_back("relro"); 2376 } 2377 2378 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) 2379 ExtraOpts.push_back("-X"); 2380 2381 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android; 2382 const bool IsMips = isMipsArch(Arch); 2383 2384 if (IsMips && !SysRoot.empty()) 2385 ExtraOpts.push_back("--sysroot=" + SysRoot); 2386 2387 // Do not use 'gnu' hash style for Mips targets because .gnu.hash 2388 // and the MIPS ABI require .dynsym to be sorted in different ways. 2389 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS 2390 // ABI requires a mapping between the GOT and the symbol table. 2391 // Android loader does not support .gnu.hash. 2392 if (!IsMips && !IsAndroid) { 2393 if (IsRedhat(Distro) || IsOpenSUSE(Distro) || 2394 (IsUbuntu(Distro) && Distro >= UbuntuMaverick)) 2395 ExtraOpts.push_back("--hash-style=gnu"); 2396 2397 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid || 2398 Distro == UbuntuJaunty || Distro == UbuntuKarmic) 2399 ExtraOpts.push_back("--hash-style=both"); 2400 } 2401 2402 if (IsRedhat(Distro)) 2403 ExtraOpts.push_back("--no-add-needed"); 2404 2405 if (Distro == DebianSqueeze || Distro == DebianWheezy || 2406 Distro == DebianJessie || IsOpenSUSE(Distro) || 2407 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) || 2408 (IsUbuntu(Distro) && Distro >= UbuntuKarmic)) 2409 ExtraOpts.push_back("--build-id"); 2410 2411 if (IsOpenSUSE(Distro)) 2412 ExtraOpts.push_back("--enable-new-dtags"); 2413 2414 // The selection of paths to try here is designed to match the patterns which 2415 // the GCC driver itself uses, as this is part of the GCC-compatible driver. 2416 // This was determined by running GCC in a fake filesystem, creating all 2417 // possible permutations of these directories, and seeing which ones it added 2418 // to the link paths. 2419 path_list &Paths = getFilePaths(); 2420 2421 const std::string Multilib = getMultilibDir(Triple, Args); 2422 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot); 2423 2424 // Add the multilib suffixed paths where they are available. 2425 if (GCCInstallation.isValid()) { 2426 const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); 2427 const std::string &LibPath = GCCInstallation.getParentLibPath(); 2428 2429 // Sourcery CodeBench MIPS toolchain holds some libraries under 2430 // a biarch-like suffix of the GCC installation. 2431 // 2432 // FIXME: It would be cleaner to model this as a variant of bi-arch. IE, 2433 // instead of a '64' biarch suffix it would be 'el' or something. 2434 if (IsAndroid && IsMips && isMips32r2(Args)) { 2435 assert(GCCInstallation.getBiarchSuffix().empty() && 2436 "Unexpected bi-arch suffix"); 2437 addPathIfExists(GCCInstallation.getInstallPath() + "/mips-r2", Paths); 2438 } else { 2439 addPathIfExists((GCCInstallation.getInstallPath() + 2440 GCCInstallation.getMIPSABIDirSuffix() + 2441 GCCInstallation.getBiarchSuffix()), 2442 Paths); 2443 } 2444 2445 // GCC cross compiling toolchains will install target libraries which ship 2446 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as 2447 // any part of the GCC installation in 2448 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat 2449 // debatable, but is the reality today. We need to search this tree even 2450 // when we have a sysroot somewhere else. It is the responsibility of 2451 // whomever is doing the cross build targetting a sysroot using a GCC 2452 // installation that is *not* within the system root to ensure two things: 2453 // 2454 // 1) Any DSOs that are linked in from this tree or from the install path 2455 // above must be preasant on the system root and found via an 2456 // appropriate rpath. 2457 // 2) There must not be libraries installed into 2458 // <prefix>/<triple>/<libdir> unless they should be preferred over 2459 // those within the system root. 2460 // 2461 // Note that this matches the GCC behavior. See the below comment for where 2462 // Clang diverges from GCC's behavior. 2463 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib + 2464 GCCInstallation.getMIPSABIDirSuffix(), 2465 Paths); 2466 2467 // If the GCC installation we found is inside of the sysroot, we want to 2468 // prefer libraries installed in the parent prefix of the GCC installation. 2469 // It is important to *not* use these paths when the GCC installation is 2470 // outside of the system root as that can pick up unintended libraries. 2471 // This usually happens when there is an external cross compiler on the 2472 // host system, and a more minimal sysroot available that is the target of 2473 // the cross. Note that GCC does include some of these directories in some 2474 // configurations but this seems somewhere between questionable and simply 2475 // a bug. 2476 if (StringRef(LibPath).startswith(SysRoot)) { 2477 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths); 2478 addPathIfExists(LibPath + "/../" + Multilib, Paths); 2479 } 2480 } 2481 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths); 2482 addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths); 2483 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths); 2484 addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths); 2485 2486 // Try walking via the GCC triple path in case of biarch or multiarch GCC 2487 // installations with strange symlinks. 2488 if (GCCInstallation.isValid()) { 2489 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() + 2490 "/../../" + Multilib, Paths); 2491 2492 // Add the non-multilib suffixed paths (if potentially different). 2493 const std::string &LibPath = GCCInstallation.getParentLibPath(); 2494 const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); 2495 if (!GCCInstallation.getBiarchSuffix().empty()) 2496 addPathIfExists(GCCInstallation.getInstallPath() + 2497 GCCInstallation.getMIPSABIDirSuffix(), Paths); 2498 2499 // See comments above on the multilib variant for details of why this is 2500 // included even from outside the sysroot. 2501 addPathIfExists(LibPath + "/../" + GCCTriple.str() + 2502 "/lib" + GCCInstallation.getMIPSABIDirSuffix(), Paths); 2503 2504 // See comments above on the multilib variant for details of why this is 2505 // only included from within the sysroot. 2506 if (StringRef(LibPath).startswith(SysRoot)) 2507 addPathIfExists(LibPath, Paths); 2508 } 2509 addPathIfExists(SysRoot + "/lib", Paths); 2510 addPathIfExists(SysRoot + "/usr/lib", Paths); 2511 } 2512 2513 bool FreeBSD::HasNativeLLVMSupport() const { 2514 return true; 2515 } 2516 2517 bool Linux::HasNativeLLVMSupport() const { 2518 return true; 2519 } 2520 2521 Tool *Linux::buildLinker() const { 2522 return new tools::gnutools::Link(*this); 2523 } 2524 2525 Tool *Linux::buildAssembler() const { 2526 return new tools::gnutools::Assemble(*this); 2527 } 2528 2529 void Linux::addClangTargetOptions(const ArgList &DriverArgs, 2530 ArgStringList &CC1Args) const { 2531 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion(); 2532 bool UseInitArrayDefault = 2533 !V.isOlderThan(4, 7, 0) || 2534 getTriple().getArch() == llvm::Triple::aarch64 || 2535 getTriple().getEnvironment() == llvm::Triple::Android; 2536 if (DriverArgs.hasFlag(options::OPT_fuse_init_array, 2537 options::OPT_fno_use_init_array, 2538 UseInitArrayDefault)) 2539 CC1Args.push_back("-fuse-init-array"); 2540 } 2541 2542 std::string Linux::computeSysRoot() const { 2543 if (!getDriver().SysRoot.empty()) 2544 return getDriver().SysRoot; 2545 2546 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch())) 2547 return std::string(); 2548 2549 // Standalone MIPS toolchains use different names for sysroot folder 2550 // and put it into different places. Here we try to check some known 2551 // variants. 2552 2553 const StringRef InstallDir = GCCInstallation.getInstallPath(); 2554 const StringRef TripleStr = GCCInstallation.getTriple().str(); 2555 const StringRef MIPSABIDirSuffix = GCCInstallation.getMIPSABIDirSuffix(); 2556 2557 std::string Path = (InstallDir + "/../../../../" + TripleStr + "/libc" + 2558 MIPSABIDirSuffix).str(); 2559 2560 if (llvm::sys::fs::exists(Path)) 2561 return Path; 2562 2563 Path = (InstallDir + "/../../../../sysroot" + MIPSABIDirSuffix).str(); 2564 2565 if (llvm::sys::fs::exists(Path)) 2566 return Path; 2567 2568 return std::string(); 2569 } 2570 2571 void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 2572 ArgStringList &CC1Args) const { 2573 const Driver &D = getDriver(); 2574 std::string SysRoot = computeSysRoot(); 2575 2576 if (DriverArgs.hasArg(options::OPT_nostdinc)) 2577 return; 2578 2579 if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) 2580 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include"); 2581 2582 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { 2583 SmallString<128> P(D.ResourceDir); 2584 llvm::sys::path::append(P, "include"); 2585 addSystemInclude(DriverArgs, CC1Args, P.str()); 2586 } 2587 2588 if (DriverArgs.hasArg(options::OPT_nostdlibinc)) 2589 return; 2590 2591 // Check for configure-time C include directories. 2592 StringRef CIncludeDirs(C_INCLUDE_DIRS); 2593 if (CIncludeDirs != "") { 2594 SmallVector<StringRef, 5> dirs; 2595 CIncludeDirs.split(dirs, ":"); 2596 for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end(); 2597 I != E; ++I) { 2598 StringRef Prefix = llvm::sys::path::is_absolute(*I) ? SysRoot : ""; 2599 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I); 2600 } 2601 return; 2602 } 2603 2604 // Lacking those, try to detect the correct set of system includes for the 2605 // target triple. 2606 2607 // Sourcery CodeBench and modern FSF Mips toolchains put extern C 2608 // system includes under three additional directories. 2609 if (GCCInstallation.isValid() && isMipsArch(getTriple().getArch())) { 2610 addExternCSystemIncludeIfExists( 2611 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + "/include"); 2612 2613 addExternCSystemIncludeIfExists( 2614 DriverArgs, CC1Args, 2615 GCCInstallation.getInstallPath() + "/../../../../" + 2616 GCCInstallation.getTriple().str() + "/libc/usr/include"); 2617 2618 addExternCSystemIncludeIfExists( 2619 DriverArgs, CC1Args, 2620 GCCInstallation.getInstallPath() + "/../../../../sysroot/usr/include"); 2621 } 2622 2623 // Implement generic Debian multiarch support. 2624 const StringRef X86_64MultiarchIncludeDirs[] = { 2625 "/usr/include/x86_64-linux-gnu", 2626 2627 // FIXME: These are older forms of multiarch. It's not clear that they're 2628 // in use in any released version of Debian, so we should consider 2629 // removing them. 2630 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64" 2631 }; 2632 const StringRef X86MultiarchIncludeDirs[] = { 2633 "/usr/include/i386-linux-gnu", 2634 2635 // FIXME: These are older forms of multiarch. It's not clear that they're 2636 // in use in any released version of Debian, so we should consider 2637 // removing them. 2638 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu", 2639 "/usr/include/i486-linux-gnu" 2640 }; 2641 const StringRef AArch64MultiarchIncludeDirs[] = { 2642 "/usr/include/aarch64-linux-gnu" 2643 }; 2644 const StringRef ARMMultiarchIncludeDirs[] = { 2645 "/usr/include/arm-linux-gnueabi" 2646 }; 2647 const StringRef ARMHFMultiarchIncludeDirs[] = { 2648 "/usr/include/arm-linux-gnueabihf" 2649 }; 2650 const StringRef MIPSMultiarchIncludeDirs[] = { 2651 "/usr/include/mips-linux-gnu" 2652 }; 2653 const StringRef MIPSELMultiarchIncludeDirs[] = { 2654 "/usr/include/mipsel-linux-gnu" 2655 }; 2656 const StringRef PPCMultiarchIncludeDirs[] = { 2657 "/usr/include/powerpc-linux-gnu" 2658 }; 2659 const StringRef PPC64MultiarchIncludeDirs[] = { 2660 "/usr/include/powerpc64-linux-gnu" 2661 }; 2662 ArrayRef<StringRef> MultiarchIncludeDirs; 2663 if (getTriple().getArch() == llvm::Triple::x86_64) { 2664 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs; 2665 } else if (getTriple().getArch() == llvm::Triple::x86) { 2666 MultiarchIncludeDirs = X86MultiarchIncludeDirs; 2667 } else if (getTriple().getArch() == llvm::Triple::aarch64) { 2668 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs; 2669 } else if (getTriple().getArch() == llvm::Triple::arm) { 2670 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF) 2671 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs; 2672 else 2673 MultiarchIncludeDirs = ARMMultiarchIncludeDirs; 2674 } else if (getTriple().getArch() == llvm::Triple::mips) { 2675 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs; 2676 } else if (getTriple().getArch() == llvm::Triple::mipsel) { 2677 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs; 2678 } else if (getTriple().getArch() == llvm::Triple::ppc) { 2679 MultiarchIncludeDirs = PPCMultiarchIncludeDirs; 2680 } else if (getTriple().getArch() == llvm::Triple::ppc64) { 2681 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs; 2682 } 2683 for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(), 2684 E = MultiarchIncludeDirs.end(); 2685 I != E; ++I) { 2686 if (llvm::sys::fs::exists(SysRoot + *I)) { 2687 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + *I); 2688 break; 2689 } 2690 } 2691 2692 if (getTriple().getOS() == llvm::Triple::RTEMS) 2693 return; 2694 2695 // Add an include of '/include' directly. This isn't provided by default by 2696 // system GCCs, but is often used with cross-compiling GCCs, and harmless to 2697 // add even when Clang is acting as-if it were a system compiler. 2698 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include"); 2699 2700 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include"); 2701 } 2702 2703 /// \brief Helper to add the three variant paths for a libstdc++ installation. 2704 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, 2705 const ArgList &DriverArgs, 2706 ArgStringList &CC1Args) { 2707 if (!llvm::sys::fs::exists(Base)) 2708 return false; 2709 addSystemInclude(DriverArgs, CC1Args, Base); 2710 addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir); 2711 addSystemInclude(DriverArgs, CC1Args, Base + "/backward"); 2712 return true; 2713 } 2714 2715 /// \brief Helper to add an extra variant path for an (Ubuntu) multilib 2716 /// libstdc++ installation. 2717 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix, 2718 Twine TargetArchDir, 2719 Twine BiarchSuffix, 2720 Twine MIPSABIDirSuffix, 2721 const ArgList &DriverArgs, 2722 ArgStringList &CC1Args) { 2723 if (!addLibStdCXXIncludePaths(Base + Suffix, 2724 TargetArchDir + MIPSABIDirSuffix + BiarchSuffix, 2725 DriverArgs, CC1Args)) 2726 return false; 2727 2728 addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir + Suffix 2729 + MIPSABIDirSuffix + BiarchSuffix); 2730 return true; 2731 } 2732 2733 void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 2734 ArgStringList &CC1Args) const { 2735 if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 2736 DriverArgs.hasArg(options::OPT_nostdincxx)) 2737 return; 2738 2739 // Check if libc++ has been enabled and provide its include paths if so. 2740 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) { 2741 // libc++ is always installed at a fixed path on Linux currently. 2742 addSystemInclude(DriverArgs, CC1Args, 2743 getDriver().SysRoot + "/usr/include/c++/v1"); 2744 return; 2745 } 2746 2747 // We need a detected GCC installation on Linux to provide libstdc++'s 2748 // headers. We handled the libc++ case above. 2749 if (!GCCInstallation.isValid()) 2750 return; 2751 2752 // By default, look for the C++ headers in an include directory adjacent to 2753 // the lib directory of the GCC installation. Note that this is expect to be 2754 // equivalent to '/usr/include/c++/X.Y' in almost all cases. 2755 StringRef LibDir = GCCInstallation.getParentLibPath(); 2756 StringRef InstallDir = GCCInstallation.getInstallPath(); 2757 StringRef TripleStr = GCCInstallation.getTriple().str(); 2758 StringRef MIPSABIDirSuffix = GCCInstallation.getMIPSABIDirSuffix(); 2759 StringRef BiarchSuffix = GCCInstallation.getBiarchSuffix(); 2760 const GCCVersion &Version = GCCInstallation.getVersion(); 2761 2762 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include", 2763 "/c++/" + Version.Text, TripleStr, BiarchSuffix, 2764 MIPSABIDirSuffix, DriverArgs, CC1Args)) 2765 return; 2766 2767 const std::string IncludePathCandidates[] = { 2768 // Gentoo is weird and places its headers inside the GCC install, so if the 2769 // first attempt to find the headers fails, try these patterns. 2770 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." + 2771 Version.MinorStr, 2772 InstallDir.str() + "/include/g++-v" + Version.MajorStr, 2773 // Android standalone toolchain has C++ headers in yet another place. 2774 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text, 2775 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++, 2776 // without a subdirectory corresponding to the gcc version. 2777 LibDir.str() + "/../include/c++", 2778 }; 2779 2780 for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) { 2781 if (addLibStdCXXIncludePaths(IncludePathCandidates[i], 2782 TripleStr + MIPSABIDirSuffix + BiarchSuffix, 2783 DriverArgs, CC1Args)) 2784 break; 2785 } 2786 } 2787 2788 bool Linux::isPIEDefault() const { 2789 return getSanitizerArgs().hasZeroBaseShadow(); 2790 } 2791 2792 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 2793 2794 DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 2795 : Generic_ELF(D, Triple, Args) { 2796 2797 // Path mangling to find libexec 2798 getProgramPaths().push_back(getDriver().getInstalledDir()); 2799 if (getDriver().getInstalledDir() != getDriver().Dir) 2800 getProgramPaths().push_back(getDriver().Dir); 2801 2802 getFilePaths().push_back(getDriver().Dir + "/../lib"); 2803 getFilePaths().push_back("/usr/lib"); 2804 if (llvm::sys::fs::exists("/usr/lib/gcc47")) 2805 getFilePaths().push_back("/usr/lib/gcc47"); 2806 else 2807 getFilePaths().push_back("/usr/lib/gcc44"); 2808 } 2809 2810 Tool *DragonFly::buildAssembler() const { 2811 return new tools::dragonfly::Assemble(*this); 2812 } 2813 2814 Tool *DragonFly::buildLinker() const { 2815 return new tools::dragonfly::Link(*this); 2816 } 2817 2818 2819 /// XCore tool chain 2820 XCore::XCore(const Driver &D, const llvm::Triple &Triple, 2821 const ArgList &Args) : ToolChain(D, Triple, Args) { 2822 // ProgramPaths are found via 'PATH' environment variable. 2823 } 2824 2825 Tool *XCore::buildAssembler() const { 2826 return new tools::XCore::Assemble(*this); 2827 } 2828 2829 Tool *XCore::buildLinker() const { 2830 return new tools::XCore::Link(*this); 2831 } 2832 2833 bool XCore::isPICDefault() const { 2834 return false; 2835 } 2836 2837 bool XCore::isPIEDefault() const { 2838 return false; 2839 } 2840 2841 bool XCore::isPICDefaultForced() const { 2842 return false; 2843 } 2844 2845 bool XCore::SupportsProfiling() const { 2846 return false; 2847 } 2848 2849 bool XCore::hasBlocksRuntime() const { 2850 return false; 2851 } 2852 2853 2854 void XCore::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 2855 ArgStringList &CC1Args) const { 2856 if (DriverArgs.hasArg(options::OPT_nostdinc) || 2857 DriverArgs.hasArg(options::OPT_nostdlibinc)) 2858 return; 2859 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) { 2860 SmallVector<StringRef, 4> Dirs; 2861 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'}; 2862 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr)); 2863 ArrayRef<StringRef> DirVec(Dirs); 2864 addSystemIncludes(DriverArgs, CC1Args, DirVec); 2865 } 2866 } 2867 2868 void XCore::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 2869 llvm::opt::ArgStringList &CC1Args) const { 2870 CC1Args.push_back("-nostdsysteminc"); 2871 } 2872 2873 void XCore::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 2874 ArgStringList &CC1Args) const { 2875 if (DriverArgs.hasArg(options::OPT_nostdinc) || 2876 DriverArgs.hasArg(options::OPT_nostdlibinc)) 2877 return; 2878 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) { 2879 SmallVector<StringRef, 4> Dirs; 2880 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'}; 2881 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr)); 2882 ArrayRef<StringRef> DirVec(Dirs); 2883 addSystemIncludes(DriverArgs, CC1Args, DirVec); 2884 } 2885 } 2886 2887 void XCore::AddCXXStdlibLibArgs(const ArgList &Args, 2888 ArgStringList &CmdArgs) const { 2889 // We don't output any lib args. This is handled by xcc. 2890 } 2891