ToolChains.cpp revision 7c627146b3785fed3f27114ec5ab5dd4e0376602
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 12#ifdef HAVE_CLANG_CONFIG_H 13# include "clang/Config/config.h" 14#endif 15 16#include "clang/Driver/Arg.h" 17#include "clang/Driver/ArgList.h" 18#include "clang/Driver/Compilation.h" 19#include "clang/Driver/Driver.h" 20#include "clang/Driver/DriverDiagnostic.h" 21#include "clang/Driver/HostInfo.h" 22#include "clang/Driver/ObjCRuntime.h" 23#include "clang/Driver/OptTable.h" 24#include "clang/Driver/Option.h" 25#include "clang/Driver/Options.h" 26#include "clang/Basic/Version.h" 27 28#include "llvm/ADT/SmallString.h" 29#include "llvm/ADT/StringExtras.h" 30#include "llvm/ADT/STLExtras.h" 31#include "llvm/Support/ErrorHandling.h" 32#include "llvm/Support/FileSystem.h" 33#include "llvm/Support/MemoryBuffer.h" 34#include "llvm/Support/raw_ostream.h" 35#include "llvm/Support/Path.h" 36#include "llvm/Support/system_error.h" 37 38#include <cstdlib> // ::getenv 39 40#include "llvm/Config/config.h" // for CXX_INCLUDE_ROOT 41 42using namespace clang::driver; 43using namespace clang::driver::toolchains; 44using namespace clang; 45 46/// Darwin - Darwin tool chain for i386 and x86_64. 47 48Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple) 49 : ToolChain(Host, Triple), TargetInitialized(false), 50 ARCRuntimeForSimulator(ARCSimulator_None) 51{ 52 // Compute the initial Darwin version based on the host. 53 bool HadExtra; 54 std::string OSName = Triple.getOSName(); 55 if (!Driver::GetReleaseVersion(&OSName.c_str()[6], 56 DarwinVersion[0], DarwinVersion[1], 57 DarwinVersion[2], HadExtra)) 58 getDriver().Diag(diag::err_drv_invalid_darwin_version) << OSName; 59 60 llvm::raw_string_ostream(MacosxVersionMin) 61 << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.' 62 << DarwinVersion[1]; 63} 64 65types::ID Darwin::LookupTypeForExtension(const char *Ext) const { 66 types::ID Ty = types::lookupTypeForExtension(Ext); 67 68 // Darwin always preprocesses assembly files (unless -x is used explicitly). 69 if (Ty == types::TY_PP_Asm) 70 return types::TY_Asm; 71 72 return Ty; 73} 74 75bool Darwin::HasNativeLLVMSupport() const { 76 return true; 77} 78 79bool Darwin::hasARCRuntime() const { 80 // FIXME: Remove this once there is a proper way to detect an ARC runtime 81 // for the simulator. 82 switch (ARCRuntimeForSimulator) { 83 case ARCSimulator_None: 84 break; 85 case ARCSimulator_HasARCRuntime: 86 return true; 87 case ARCSimulator_NoARCRuntime: 88 return false; 89 } 90 91 if (isTargetIPhoneOS()) 92 return !isIPhoneOSVersionLT(5); 93 else 94 return !isMacosxVersionLT(10, 7); 95} 96 97/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0. 98void Darwin::configureObjCRuntime(ObjCRuntime &runtime) const { 99 if (runtime.getKind() != ObjCRuntime::NeXT) 100 return ToolChain::configureObjCRuntime(runtime); 101 102 runtime.HasARC = runtime.HasWeak = hasARCRuntime(); 103 104 // So far, objc_terminate is only available in iOS 5. 105 // FIXME: do the simulator logic properly. 106 if (!ARCRuntimeForSimulator && isTargetIPhoneOS()) 107 runtime.HasTerminate = !isIPhoneOSVersionLT(5); 108 else 109 runtime.HasTerminate = false; 110} 111 112/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2. 113bool Darwin::hasBlocksRuntime() const { 114 if (isTargetIPhoneOS()) 115 return !isIPhoneOSVersionLT(3, 2); 116 else 117 return !isMacosxVersionLT(10, 6); 118} 119 120// FIXME: Can we tablegen this? 121static const char *GetArmArchForMArch(StringRef Value) { 122 if (Value == "armv6k") 123 return "armv6"; 124 125 if (Value == "armv5tej") 126 return "armv5"; 127 128 if (Value == "xscale") 129 return "xscale"; 130 131 if (Value == "armv4t") 132 return "armv4t"; 133 134 if (Value == "armv7" || 135 Value == "armv7a" || Value == "armv7-a" || 136 Value == "armv7r" || Value == "armv7-r" || 137 Value == "armv7m" || Value == "armv7-m") 138 return "armv7"; 139 140 return 0; 141} 142 143// FIXME: Can we tablegen this? 144static const char *GetArmArchForMCpu(StringRef Value) { 145 if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 146 Value == "arm946e-s" || Value == "arm966e-s" || 147 Value == "arm968e-s" || Value == "arm10e" || 148 Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 149 Value == "arm1026ej-s") 150 return "armv5"; 151 152 if (Value == "xscale") 153 return "xscale"; 154 155 if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 156 Value == "arm1176jz-s" || Value == "arm1176jzf-s" || 157 Value == "cortex-m0" ) 158 return "armv6"; 159 160 if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3" || 161 Value == "cortex-a9") 162 return "armv7"; 163 164 return 0; 165} 166 167StringRef Darwin::getDarwinArchName(const ArgList &Args) const { 168 switch (getTriple().getArch()) { 169 default: 170 return getArchName(); 171 172 case llvm::Triple::thumb: 173 case llvm::Triple::arm: { 174 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 175 if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) 176 return Arch; 177 178 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 179 if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) 180 return Arch; 181 182 return "arm"; 183 } 184 } 185} 186 187Darwin::~Darwin() { 188 // Free tool implementations. 189 for (llvm::DenseMap<unsigned, Tool*>::iterator 190 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 191 delete it->second; 192} 193 194std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args, 195 types::ID InputType) const { 196 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); 197 198 // If the target isn't initialized (e.g., an unknown Darwin platform, return 199 // the default triple). 200 if (!isTargetInitialized()) 201 return Triple.getTriple(); 202 203 unsigned Version[3]; 204 getTargetVersion(Version); 205 206 llvm::SmallString<16> Str; 207 llvm::raw_svector_ostream(Str) 208 << (isTargetIPhoneOS() ? "ios" : "macosx") 209 << Version[0] << "." << Version[1] << "." << Version[2]; 210 Triple.setOSName(Str.str()); 211 212 return Triple.getTriple(); 213} 214 215Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA, 216 const ActionList &Inputs) const { 217 Action::ActionClass Key; 218 219 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) { 220 // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI. 221 if (Inputs.size() == 1 && 222 types::isCXX(Inputs[0]->getType()) && 223 getTriple().getOS() == llvm::Triple::Darwin && 224 getTriple().getArch() == llvm::Triple::x86 && 225 (C.getArgs().getLastArg(options::OPT_fapple_kext) || 226 C.getArgs().getLastArg(options::OPT_mkernel))) 227 Key = JA.getKind(); 228 else 229 Key = Action::AnalyzeJobClass; 230 } else 231 Key = JA.getKind(); 232 233 // FIXME: This doesn't belong here, but ideally we will support static soon 234 // anyway. 235 bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) || 236 C.getArgs().hasArg(options::OPT_static) || 237 C.getArgs().hasArg(options::OPT_fapple_kext)); 238 bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic; 239 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 240 options::OPT_no_integrated_as, 241 IsIADefault); 242 243 Tool *&T = Tools[Key]; 244 if (!T) { 245 switch (Key) { 246 case Action::InputClass: 247 case Action::BindArchClass: 248 llvm_unreachable("Invalid tool kind."); 249 case Action::PreprocessJobClass: 250 T = new tools::darwin::Preprocess(*this); break; 251 case Action::AnalyzeJobClass: 252 T = new tools::Clang(*this); break; 253 case Action::PrecompileJobClass: 254 case Action::CompileJobClass: 255 T = new tools::darwin::Compile(*this); break; 256 case Action::AssembleJobClass: { 257 if (UseIntegratedAs) 258 T = new tools::ClangAs(*this); 259 else 260 T = new tools::darwin::Assemble(*this); 261 break; 262 } 263 case Action::LinkJobClass: 264 T = new tools::darwin::Link(*this); break; 265 case Action::LipoJobClass: 266 T = new tools::darwin::Lipo(*this); break; 267 case Action::DsymutilJobClass: 268 T = new tools::darwin::Dsymutil(*this); break; 269 case Action::VerifyJobClass: 270 T = new tools::darwin::VerifyDebug(*this); break; 271 } 272 } 273 274 return *T; 275} 276 277 278DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple) 279 : Darwin(Host, Triple) 280{ 281 getProgramPaths().push_back(getDriver().getInstalledDir()); 282 if (getDriver().getInstalledDir() != getDriver().Dir) 283 getProgramPaths().push_back(getDriver().Dir); 284 285 // We expect 'as', 'ld', etc. to be adjacent to our install dir. 286 getProgramPaths().push_back(getDriver().getInstalledDir()); 287 if (getDriver().getInstalledDir() != getDriver().Dir) 288 getProgramPaths().push_back(getDriver().Dir); 289 290 // For fallback, we need to know how to find the GCC cc1 executables, so we 291 // also add the GCC libexec paths. This is legacy code that can be removed 292 // once fallback is no longer useful. 293 AddGCCLibexecPath(DarwinVersion[0]); 294 AddGCCLibexecPath(DarwinVersion[0] - 2); 295 AddGCCLibexecPath(DarwinVersion[0] - 1); 296 AddGCCLibexecPath(DarwinVersion[0] + 1); 297 AddGCCLibexecPath(DarwinVersion[0] + 2); 298} 299 300void DarwinClang::AddGCCLibexecPath(unsigned darwinVersion) { 301 std::string ToolChainDir = "i686-apple-darwin"; 302 ToolChainDir += llvm::utostr(darwinVersion); 303 ToolChainDir += "/4.2.1"; 304 305 std::string Path = getDriver().Dir; 306 Path += "/../llvm-gcc-4.2/libexec/gcc/"; 307 Path += ToolChainDir; 308 getProgramPaths().push_back(Path); 309 310 Path = "/usr/llvm-gcc-4.2/libexec/gcc/"; 311 Path += ToolChainDir; 312 getProgramPaths().push_back(Path); 313} 314 315void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args, 316 ArgStringList &CmdArgs) const { 317 // The Clang toolchain uses explicit paths for internal libraries. 318 319 // Unfortunately, we still might depend on a few of the libraries that are 320 // only available in the gcc library directory (in particular 321 // libstdc++.dylib). For now, hardcode the path to the known install location. 322 llvm::sys::Path P(getDriver().Dir); 323 P.eraseComponent(); // .../usr/bin -> ../usr 324 P.appendComponent("lib"); 325 P.appendComponent("gcc"); 326 switch (getTriple().getArch()) { 327 default: 328 llvm_unreachable("Invalid Darwin arch!"); 329 case llvm::Triple::x86: 330 case llvm::Triple::x86_64: 331 P.appendComponent("i686-apple-darwin10"); 332 break; 333 case llvm::Triple::arm: 334 case llvm::Triple::thumb: 335 P.appendComponent("arm-apple-darwin10"); 336 break; 337 case llvm::Triple::ppc: 338 case llvm::Triple::ppc64: 339 P.appendComponent("powerpc-apple-darwin10"); 340 break; 341 } 342 P.appendComponent("4.2.1"); 343 344 // Determine the arch specific GCC subdirectory. 345 const char *ArchSpecificDir = 0; 346 switch (getTriple().getArch()) { 347 default: 348 break; 349 case llvm::Triple::arm: 350 case llvm::Triple::thumb: { 351 std::string Triple = ComputeLLVMTriple(Args); 352 StringRef TripleStr = Triple; 353 if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5")) 354 ArchSpecificDir = "v5"; 355 else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6")) 356 ArchSpecificDir = "v6"; 357 else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7")) 358 ArchSpecificDir = "v7"; 359 break; 360 } 361 case llvm::Triple::ppc64: 362 ArchSpecificDir = "ppc64"; 363 break; 364 case llvm::Triple::x86_64: 365 ArchSpecificDir = "x86_64"; 366 break; 367 } 368 369 if (ArchSpecificDir) { 370 P.appendComponent(ArchSpecificDir); 371 bool Exists; 372 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 373 CmdArgs.push_back(Args.MakeArgString("-L" + P.str())); 374 P.eraseComponent(); 375 } 376 377 bool Exists; 378 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 379 CmdArgs.push_back(Args.MakeArgString("-L" + P.str())); 380} 381 382void DarwinClang::AddLinkARCArgs(const ArgList &Args, 383 ArgStringList &CmdArgs) const { 384 385 CmdArgs.push_back("-force_load"); 386 llvm::sys::Path P(getDriver().ClangExecutable); 387 P.eraseComponent(); // 'clang' 388 P.eraseComponent(); // 'bin' 389 P.appendComponent("lib"); 390 P.appendComponent("arc"); 391 P.appendComponent("libarclite_"); 392 std::string s = P.str(); 393 // Mash in the platform. 394 if (isTargetIPhoneOS()) 395 s += "iphoneos"; 396 // FIXME: isTargetIphoneOSSimulator() is not returning true. 397 else if (ARCRuntimeForSimulator != ARCSimulator_None) 398 s += "iphonesimulator"; 399 else 400 s += "macosx"; 401 s += ".a"; 402 403 CmdArgs.push_back(Args.MakeArgString(s)); 404} 405 406void DarwinClang::AddLinkRuntimeLib(const ArgList &Args, 407 ArgStringList &CmdArgs, 408 const char *DarwinStaticLib) const { 409 llvm::sys::Path P(getDriver().ResourceDir); 410 P.appendComponent("lib"); 411 P.appendComponent("darwin"); 412 P.appendComponent(DarwinStaticLib); 413 414 // For now, allow missing resource libraries to support developers who may 415 // not have compiler-rt checked out or integrated into their build. 416 bool Exists; 417 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 418 CmdArgs.push_back(Args.MakeArgString(P.str())); 419} 420 421void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 422 ArgStringList &CmdArgs) const { 423 // Darwin doesn't support real static executables, don't link any runtime 424 // libraries with -static. 425 if (Args.hasArg(options::OPT_static)) 426 return; 427 428 // Reject -static-libgcc for now, we can deal with this when and if someone 429 // cares. This is useful in situations where someone wants to statically link 430 // something like libstdc++, and needs its runtime support routines. 431 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 432 getDriver().Diag(diag::err_drv_unsupported_opt) 433 << A->getAsString(Args); 434 return; 435 } 436 437 // Otherwise link libSystem, then the dynamic runtime library, and finally any 438 // target specific static runtime library. 439 CmdArgs.push_back("-lSystem"); 440 441 // Select the dynamic runtime library and the target specific static library. 442 if (isTargetIPhoneOS()) { 443 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1, 444 // it never went into the SDK. 445 if (!isTargetIOSSimulator()) 446 CmdArgs.push_back("-lgcc_s.1"); 447 448 // We currently always need a static runtime library for iOS. 449 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a"); 450 } else { 451 // The dynamic runtime library was merged with libSystem for 10.6 and 452 // beyond; only 10.4 and 10.5 need an additional runtime library. 453 if (isMacosxVersionLT(10, 5)) 454 CmdArgs.push_back("-lgcc_s.10.4"); 455 else if (isMacosxVersionLT(10, 6)) 456 CmdArgs.push_back("-lgcc_s.10.5"); 457 458 // For OS X, we thought we would only need a static runtime library when 459 // targeting 10.4, to provide versions of the static functions which were 460 // omitted from 10.4.dylib. 461 // 462 // Unfortunately, that turned out to not be true, because Darwin system 463 // headers can still use eprintf on i386, and it is not exported from 464 // libSystem. Therefore, we still must provide a runtime library just for 465 // the tiny tiny handful of projects that *might* use that symbol. 466 if (isMacosxVersionLT(10, 5)) { 467 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a"); 468 } else { 469 if (getTriple().getArch() == llvm::Triple::x86) 470 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a"); 471 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a"); 472 } 473 } 474} 475 476static inline StringRef SimulatorVersionDefineName() { 477 return "__IPHONE_OS_VERSION_MIN_REQUIRED"; 478} 479 480/// \brief Parse the simulator version define: 481/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9]) 482// and return the grouped values as integers, e.g: 483// __IPHONE_OS_VERSION_MIN_REQUIRED=40201 484// will return Major=4, Minor=2, Micro=1. 485static bool GetVersionFromSimulatorDefine(StringRef define, 486 unsigned &Major, unsigned &Minor, 487 unsigned &Micro) { 488 assert(define.startswith(SimulatorVersionDefineName())); 489 StringRef name, version; 490 llvm::tie(name, version) = define.split('='); 491 if (version.empty()) 492 return false; 493 std::string verstr = version.str(); 494 char *end; 495 unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10); 496 if (*end != '\0') 497 return false; 498 Major = num / 10000; 499 num = num % 10000; 500 Minor = num / 100; 501 Micro = num % 100; 502 return true; 503} 504 505void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 506 const OptTable &Opts = getDriver().getOpts(); 507 508 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 509 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 510 Arg *iOSSimVersion = Args.getLastArg( 511 options::OPT_mios_simulator_version_min_EQ); 512 513 // FIXME: HACK! When compiling for the simulator we don't get a 514 // '-miphoneos-version-min' to help us know whether there is an ARC runtime 515 // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED 516 // define passed in command-line. 517 if (!iOSVersion) { 518 for (arg_iterator it = Args.filtered_begin(options::OPT_D), 519 ie = Args.filtered_end(); it != ie; ++it) { 520 StringRef define = (*it)->getValue(Args); 521 if (define.startswith(SimulatorVersionDefineName())) { 522 unsigned Major = 0, Minor = 0, Micro = 0; 523 if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) && 524 Major < 10 && Minor < 100 && Micro < 100) { 525 ARCRuntimeForSimulator = Major < 5 ? ARCSimulator_NoARCRuntime 526 : ARCSimulator_HasARCRuntime; 527 } 528 break; 529 } 530 } 531 } 532 533 if (OSXVersion && (iOSVersion || iOSSimVersion)) { 534 getDriver().Diag(diag::err_drv_argument_not_allowed_with) 535 << OSXVersion->getAsString(Args) 536 << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args); 537 iOSVersion = iOSSimVersion = 0; 538 } else if (iOSVersion && iOSSimVersion) { 539 getDriver().Diag(diag::err_drv_argument_not_allowed_with) 540 << iOSVersion->getAsString(Args) 541 << iOSSimVersion->getAsString(Args); 542 iOSSimVersion = 0; 543 } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) { 544 // If no deployment target was specified on the command line, check for 545 // environment defines. 546 StringRef OSXTarget; 547 StringRef iOSTarget; 548 StringRef iOSSimTarget; 549 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET")) 550 OSXTarget = env; 551 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET")) 552 iOSTarget = env; 553 if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET")) 554 iOSSimTarget = env; 555 556 // If no '-miphoneos-version-min' specified on the command line and 557 // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default 558 // based on isysroot. 559 if (iOSTarget.empty()) { 560 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 561 StringRef first, second; 562 StringRef isysroot = A->getValue(Args); 563 llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS")); 564 if (second != "") 565 iOSTarget = second.substr(0,3); 566 } 567 } 568 569 // If no OSX or iOS target has been specified and we're compiling for armv7, 570 // go ahead as assume we're targeting iOS. 571 if (OSXTarget.empty() && iOSTarget.empty()) 572 if (getDarwinArchName(Args) == "armv7") 573 iOSTarget = "0.0"; 574 575 // Handle conflicting deployment targets 576 // 577 // FIXME: Don't hardcode default here. 578 579 // Do not allow conflicts with the iOS simulator target. 580 if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) { 581 getDriver().Diag(diag::err_drv_conflicting_deployment_targets) 582 << "IOS_SIMULATOR_DEPLOYMENT_TARGET" 583 << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" : 584 "IPHONEOS_DEPLOYMENT_TARGET"); 585 } 586 587 // Allow conflicts among OSX and iOS for historical reasons, but choose the 588 // default platform. 589 if (!OSXTarget.empty() && !iOSTarget.empty()) { 590 if (getTriple().getArch() == llvm::Triple::arm || 591 getTriple().getArch() == llvm::Triple::thumb) 592 OSXTarget = ""; 593 else 594 iOSTarget = ""; 595 } 596 597 if (!OSXTarget.empty()) { 598 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 599 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget); 600 Args.append(OSXVersion); 601 } else if (!iOSTarget.empty()) { 602 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 603 iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget); 604 Args.append(iOSVersion); 605 } else if (!iOSSimTarget.empty()) { 606 const Option *O = Opts.getOption( 607 options::OPT_mios_simulator_version_min_EQ); 608 iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget); 609 Args.append(iOSSimVersion); 610 } else { 611 // Otherwise, assume we are targeting OS X. 612 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 613 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin); 614 Args.append(OSXVersion); 615 } 616 } 617 618 // Reject invalid architecture combinations. 619 if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 && 620 getTriple().getArch() != llvm::Triple::x86_64)) { 621 getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target) 622 << getTriple().getArchName() << iOSSimVersion->getAsString(Args); 623 } 624 625 // Set the tool chain target information. 626 unsigned Major, Minor, Micro; 627 bool HadExtra; 628 if (OSXVersion) { 629 assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!"); 630 if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor, 631 Micro, HadExtra) || HadExtra || 632 Major != 10 || Minor >= 100 || Micro >= 100) 633 getDriver().Diag(diag::err_drv_invalid_version_number) 634 << OSXVersion->getAsString(Args); 635 } else { 636 const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion; 637 assert(Version && "Unknown target platform!"); 638 if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor, 639 Micro, HadExtra) || HadExtra || 640 Major >= 10 || Minor >= 100 || Micro >= 100) 641 getDriver().Diag(diag::err_drv_invalid_version_number) 642 << Version->getAsString(Args); 643 } 644 645 bool IsIOSSim = bool(iOSSimVersion); 646 647 // In GCC, the simulator historically was treated as being OS X in some 648 // contexts, like determining the link logic, despite generally being called 649 // with an iOS deployment target. For compatibility, we detect the 650 // simulator as iOS + x86, and treat it differently in a few contexts. 651 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 || 652 getTriple().getArch() == llvm::Triple::x86_64)) 653 IsIOSSim = true; 654 655 setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim); 656} 657 658void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args, 659 ArgStringList &CmdArgs) const { 660 CXXStdlibType Type = GetCXXStdlibType(Args); 661 662 switch (Type) { 663 case ToolChain::CST_Libcxx: 664 CmdArgs.push_back("-lc++"); 665 break; 666 667 case ToolChain::CST_Libstdcxx: { 668 // Unfortunately, -lstdc++ doesn't always exist in the standard search path; 669 // it was previously found in the gcc lib dir. However, for all the Darwin 670 // platforms we care about it was -lstdc++.6, so we search for that 671 // explicitly if we can't see an obvious -lstdc++ candidate. 672 673 // Check in the sysroot first. 674 bool Exists; 675 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 676 llvm::sys::Path P(A->getValue(Args)); 677 P.appendComponent("usr"); 678 P.appendComponent("lib"); 679 P.appendComponent("libstdc++.dylib"); 680 681 if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) { 682 P.eraseComponent(); 683 P.appendComponent("libstdc++.6.dylib"); 684 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) { 685 CmdArgs.push_back(Args.MakeArgString(P.str())); 686 return; 687 } 688 } 689 } 690 691 // Otherwise, look in the root. 692 if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&& 693 (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){ 694 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib"); 695 return; 696 } 697 698 // Otherwise, let the linker search. 699 CmdArgs.push_back("-lstdc++"); 700 break; 701 } 702 } 703} 704 705void DarwinClang::AddCCKextLibArgs(const ArgList &Args, 706 ArgStringList &CmdArgs) const { 707 708 // For Darwin platforms, use the compiler-rt-based support library 709 // instead of the gcc-provided one (which is also incidentally 710 // only present in the gcc lib dir, which makes it hard to find). 711 712 llvm::sys::Path P(getDriver().ResourceDir); 713 P.appendComponent("lib"); 714 P.appendComponent("darwin"); 715 P.appendComponent("libclang_rt.cc_kext.a"); 716 717 // For now, allow missing resource libraries to support developers who may 718 // not have compiler-rt checked out or integrated into their build. 719 bool Exists; 720 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 721 CmdArgs.push_back(Args.MakeArgString(P.str())); 722} 723 724DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, 725 const char *BoundArch) const { 726 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 727 const OptTable &Opts = getDriver().getOpts(); 728 729 // FIXME: We really want to get out of the tool chain level argument 730 // translation business, as it makes the driver functionality much 731 // more opaque. For now, we follow gcc closely solely for the 732 // purpose of easily achieving feature parity & testability. Once we 733 // have something that works, we should reevaluate each translation 734 // and try to push it down into tool specific logic. 735 736 for (ArgList::const_iterator it = Args.begin(), 737 ie = Args.end(); it != ie; ++it) { 738 Arg *A = *it; 739 740 if (A->getOption().matches(options::OPT_Xarch__)) { 741 // Skip this argument unless the architecture matches either the toolchain 742 // triple arch, or the arch being bound. 743 // 744 // FIXME: Canonicalize name. 745 StringRef XarchArch = A->getValue(Args, 0); 746 if (!(XarchArch == getArchName() || 747 (BoundArch && XarchArch == BoundArch))) 748 continue; 749 750 Arg *OriginalArg = A; 751 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1)); 752 unsigned Prev = Index; 753 Arg *XarchArg = Opts.ParseOneArg(Args, Index); 754 755 // If the argument parsing failed or more than one argument was 756 // consumed, the -Xarch_ argument's parameter tried to consume 757 // extra arguments. Emit an error and ignore. 758 // 759 // We also want to disallow any options which would alter the 760 // driver behavior; that isn't going to work in our model. We 761 // use isDriverOption() as an approximation, although things 762 // like -O4 are going to slip through. 763 if (!XarchArg || Index > Prev + 1) { 764 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args) 765 << A->getAsString(Args); 766 continue; 767 } else if (XarchArg->getOption().isDriverOption()) { 768 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver) 769 << A->getAsString(Args); 770 continue; 771 } 772 773 XarchArg->setBaseArg(A); 774 A = XarchArg; 775 776 DAL->AddSynthesizedArg(A); 777 778 // Linker input arguments require custom handling. The problem is that we 779 // have already constructed the phase actions, so we can not treat them as 780 // "input arguments". 781 if (A->getOption().isLinkerInput()) { 782 // Convert the argument into individual Zlinker_input_args. 783 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { 784 DAL->AddSeparateArg(OriginalArg, 785 Opts.getOption(options::OPT_Zlinker_input), 786 A->getValue(Args, i)); 787 788 } 789 continue; 790 } 791 } 792 793 // Sob. These is strictly gcc compatible for the time being. Apple 794 // gcc translates options twice, which means that self-expanding 795 // options add duplicates. 796 switch ((options::ID) A->getOption().getID()) { 797 default: 798 DAL->append(A); 799 break; 800 801 case options::OPT_mkernel: 802 case options::OPT_fapple_kext: 803 DAL->append(A); 804 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 805 break; 806 807 case options::OPT_dependency_file: 808 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), 809 A->getValue(Args)); 810 break; 811 812 case options::OPT_gfull: 813 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 814 DAL->AddFlagArg(A, 815 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 816 break; 817 818 case options::OPT_gused: 819 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 820 DAL->AddFlagArg(A, 821 Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 822 break; 823 824 case options::OPT_shared: 825 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 826 break; 827 828 case options::OPT_fconstant_cfstrings: 829 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 830 break; 831 832 case options::OPT_fno_constant_cfstrings: 833 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 834 break; 835 836 case options::OPT_Wnonportable_cfstrings: 837 DAL->AddFlagArg(A, 838 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 839 break; 840 841 case options::OPT_Wno_nonportable_cfstrings: 842 DAL->AddFlagArg(A, 843 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 844 break; 845 846 case options::OPT_fpascal_strings: 847 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 848 break; 849 850 case options::OPT_fno_pascal_strings: 851 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 852 break; 853 } 854 } 855 856 if (getTriple().getArch() == llvm::Triple::x86 || 857 getTriple().getArch() == llvm::Triple::x86_64) 858 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 859 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2"); 860 861 // Add the arch options based on the particular spelling of -arch, to match 862 // how the driver driver works. 863 if (BoundArch) { 864 StringRef Name = BoundArch; 865 const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); 866 const Option *MArch = Opts.getOption(options::OPT_march_EQ); 867 868 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 869 // which defines the list of which architectures we accept. 870 if (Name == "ppc") 871 ; 872 else if (Name == "ppc601") 873 DAL->AddJoinedArg(0, MCpu, "601"); 874 else if (Name == "ppc603") 875 DAL->AddJoinedArg(0, MCpu, "603"); 876 else if (Name == "ppc604") 877 DAL->AddJoinedArg(0, MCpu, "604"); 878 else if (Name == "ppc604e") 879 DAL->AddJoinedArg(0, MCpu, "604e"); 880 else if (Name == "ppc750") 881 DAL->AddJoinedArg(0, MCpu, "750"); 882 else if (Name == "ppc7400") 883 DAL->AddJoinedArg(0, MCpu, "7400"); 884 else if (Name == "ppc7450") 885 DAL->AddJoinedArg(0, MCpu, "7450"); 886 else if (Name == "ppc970") 887 DAL->AddJoinedArg(0, MCpu, "970"); 888 889 else if (Name == "ppc64") 890 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 891 892 else if (Name == "i386") 893 ; 894 else if (Name == "i486") 895 DAL->AddJoinedArg(0, MArch, "i486"); 896 else if (Name == "i586") 897 DAL->AddJoinedArg(0, MArch, "i586"); 898 else if (Name == "i686") 899 DAL->AddJoinedArg(0, MArch, "i686"); 900 else if (Name == "pentium") 901 DAL->AddJoinedArg(0, MArch, "pentium"); 902 else if (Name == "pentium2") 903 DAL->AddJoinedArg(0, MArch, "pentium2"); 904 else if (Name == "pentpro") 905 DAL->AddJoinedArg(0, MArch, "pentiumpro"); 906 else if (Name == "pentIIm3") 907 DAL->AddJoinedArg(0, MArch, "pentium2"); 908 909 else if (Name == "x86_64") 910 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 911 912 else if (Name == "arm") 913 DAL->AddJoinedArg(0, MArch, "armv4t"); 914 else if (Name == "armv4t") 915 DAL->AddJoinedArg(0, MArch, "armv4t"); 916 else if (Name == "armv5") 917 DAL->AddJoinedArg(0, MArch, "armv5tej"); 918 else if (Name == "xscale") 919 DAL->AddJoinedArg(0, MArch, "xscale"); 920 else if (Name == "armv6") 921 DAL->AddJoinedArg(0, MArch, "armv6k"); 922 else if (Name == "armv7") 923 DAL->AddJoinedArg(0, MArch, "armv7a"); 924 925 else 926 llvm_unreachable("invalid Darwin arch"); 927 } 928 929 // Add an explicit version min argument for the deployment target. We do this 930 // after argument translation because -Xarch_ arguments may add a version min 931 // argument. 932 AddDeploymentTarget(*DAL); 933 934 return DAL; 935} 936 937bool Darwin::IsUnwindTablesDefault() const { 938 // FIXME: Gross; we should probably have some separate target 939 // definition, possibly even reusing the one in clang. 940 return getArchName() == "x86_64"; 941} 942 943bool Darwin::UseDwarfDebugFlags() const { 944 if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 945 return S[0] != '\0'; 946 return false; 947} 948 949bool Darwin::UseSjLjExceptions() const { 950 // Darwin uses SjLj exceptions on ARM. 951 return (getTriple().getArch() == llvm::Triple::arm || 952 getTriple().getArch() == llvm::Triple::thumb); 953} 954 955const char *Darwin::GetDefaultRelocationModel() const { 956 return "pic"; 957} 958 959const char *Darwin::GetForcedPicModel() const { 960 if (getArchName() == "x86_64") 961 return "pic"; 962 return 0; 963} 964 965bool Darwin::SupportsProfiling() const { 966 // Profiling instrumentation is only supported on x86. 967 return getArchName() == "i386" || getArchName() == "x86_64"; 968} 969 970bool Darwin::SupportsObjCGC() const { 971 // Garbage collection is supported everywhere except on iPhone OS. 972 return !isTargetIPhoneOS(); 973} 974 975std::string 976Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args, 977 types::ID InputType) const { 978 return ComputeLLVMTriple(Args, InputType); 979} 980 981/// Generic_GCC - A tool chain using the 'gcc' command to perform 982/// all subcommands; this relies on gcc translating the majority of 983/// command line options. 984 985Generic_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple) 986 : ToolChain(Host, Triple) { 987 getProgramPaths().push_back(getDriver().getInstalledDir()); 988 if (getDriver().getInstalledDir() != getDriver().Dir) 989 getProgramPaths().push_back(getDriver().Dir); 990} 991 992Generic_GCC::~Generic_GCC() { 993 // Free tool implementations. 994 for (llvm::DenseMap<unsigned, Tool*>::iterator 995 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 996 delete it->second; 997} 998 999Tool &Generic_GCC::SelectTool(const Compilation &C, 1000 const JobAction &JA, 1001 const ActionList &Inputs) const { 1002 Action::ActionClass Key; 1003 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1004 Key = Action::AnalyzeJobClass; 1005 else 1006 Key = JA.getKind(); 1007 1008 Tool *&T = Tools[Key]; 1009 if (!T) { 1010 switch (Key) { 1011 case Action::InputClass: 1012 case Action::BindArchClass: 1013 llvm_unreachable("Invalid tool kind."); 1014 case Action::PreprocessJobClass: 1015 T = new tools::gcc::Preprocess(*this); break; 1016 case Action::PrecompileJobClass: 1017 T = new tools::gcc::Precompile(*this); break; 1018 case Action::AnalyzeJobClass: 1019 T = new tools::Clang(*this); break; 1020 case Action::CompileJobClass: 1021 T = new tools::gcc::Compile(*this); break; 1022 case Action::AssembleJobClass: 1023 T = new tools::gcc::Assemble(*this); break; 1024 case Action::LinkJobClass: 1025 T = new tools::gcc::Link(*this); break; 1026 1027 // This is a bit ungeneric, but the only platform using a driver 1028 // driver is Darwin. 1029 case Action::LipoJobClass: 1030 T = new tools::darwin::Lipo(*this); break; 1031 case Action::DsymutilJobClass: 1032 T = new tools::darwin::Dsymutil(*this); break; 1033 case Action::VerifyJobClass: 1034 T = new tools::darwin::VerifyDebug(*this); break; 1035 } 1036 } 1037 1038 return *T; 1039} 1040 1041bool Generic_GCC::IsUnwindTablesDefault() const { 1042 // FIXME: Gross; we should probably have some separate target 1043 // definition, possibly even reusing the one in clang. 1044 return getArchName() == "x86_64"; 1045} 1046 1047const char *Generic_GCC::GetDefaultRelocationModel() const { 1048 return "static"; 1049} 1050 1051const char *Generic_GCC::GetForcedPicModel() const { 1052 return 0; 1053} 1054 1055/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 1056/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 1057/// Currently does not support anything else but compilation. 1058 1059TCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple) 1060 : ToolChain(Host, Triple) { 1061 // Path mangling to find libexec 1062 std::string Path(getDriver().Dir); 1063 1064 Path += "/../libexec"; 1065 getProgramPaths().push_back(Path); 1066} 1067 1068TCEToolChain::~TCEToolChain() { 1069 for (llvm::DenseMap<unsigned, Tool*>::iterator 1070 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 1071 delete it->second; 1072} 1073 1074bool TCEToolChain::IsMathErrnoDefault() const { 1075 return true; 1076} 1077 1078bool TCEToolChain::IsUnwindTablesDefault() const { 1079 return false; 1080} 1081 1082const char *TCEToolChain::GetDefaultRelocationModel() const { 1083 return "static"; 1084} 1085 1086const char *TCEToolChain::GetForcedPicModel() const { 1087 return 0; 1088} 1089 1090Tool &TCEToolChain::SelectTool(const Compilation &C, 1091 const JobAction &JA, 1092 const ActionList &Inputs) const { 1093 Action::ActionClass Key; 1094 Key = Action::AnalyzeJobClass; 1095 1096 Tool *&T = Tools[Key]; 1097 if (!T) { 1098 switch (Key) { 1099 case Action::PreprocessJobClass: 1100 T = new tools::gcc::Preprocess(*this); break; 1101 case Action::AnalyzeJobClass: 1102 T = new tools::Clang(*this); break; 1103 default: 1104 llvm_unreachable("Unsupported action for TCE target."); 1105 } 1106 } 1107 return *T; 1108} 1109 1110/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 1111 1112OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple) 1113 : Generic_ELF(Host, Triple) { 1114 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1115 getFilePaths().push_back("/usr/lib"); 1116} 1117 1118Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA, 1119 const ActionList &Inputs) const { 1120 Action::ActionClass Key; 1121 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1122 Key = Action::AnalyzeJobClass; 1123 else 1124 Key = JA.getKind(); 1125 1126 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1127 options::OPT_no_integrated_as, 1128 IsIntegratedAssemblerDefault()); 1129 1130 Tool *&T = Tools[Key]; 1131 if (!T) { 1132 switch (Key) { 1133 case Action::AssembleJobClass: { 1134 if (UseIntegratedAs) 1135 T = new tools::ClangAs(*this); 1136 else 1137 T = new tools::openbsd::Assemble(*this); 1138 break; 1139 } 1140 case Action::LinkJobClass: 1141 T = new tools::openbsd::Link(*this); break; 1142 default: 1143 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1144 } 1145 } 1146 1147 return *T; 1148} 1149 1150/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 1151 1152FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple) 1153 : Generic_ELF(Host, Triple) { 1154 1155 // Determine if we are compiling 32-bit code on an x86_64 platform. 1156 bool Lib32 = false; 1157 if (Triple.getArch() == llvm::Triple::x86 && 1158 llvm::Triple(getDriver().DefaultHostTriple).getArch() == 1159 llvm::Triple::x86_64) 1160 Lib32 = true; 1161 1162 if (Triple.getArch() == llvm::Triple::ppc && 1163 llvm::Triple(getDriver().DefaultHostTriple).getArch() == 1164 llvm::Triple::ppc64) 1165 Lib32 = true; 1166 1167 if (Lib32) { 1168 getFilePaths().push_back("/usr/lib32"); 1169 } else { 1170 getFilePaths().push_back("/usr/lib"); 1171 } 1172} 1173 1174Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA, 1175 const ActionList &Inputs) const { 1176 Action::ActionClass Key; 1177 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1178 Key = Action::AnalyzeJobClass; 1179 else 1180 Key = JA.getKind(); 1181 1182 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1183 options::OPT_no_integrated_as, 1184 IsIntegratedAssemblerDefault()); 1185 1186 Tool *&T = Tools[Key]; 1187 if (!T) { 1188 switch (Key) { 1189 case Action::AssembleJobClass: 1190 if (UseIntegratedAs) 1191 T = new tools::ClangAs(*this); 1192 else 1193 T = new tools::freebsd::Assemble(*this); 1194 break; 1195 case Action::LinkJobClass: 1196 T = new tools::freebsd::Link(*this); break; 1197 default: 1198 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1199 } 1200 } 1201 1202 return *T; 1203} 1204 1205/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly. 1206 1207NetBSD::NetBSD(const HostInfo &Host, const llvm::Triple& Triple, 1208 const llvm::Triple& ToolTriple) 1209 : Generic_ELF(Host, Triple), ToolTriple(ToolTriple) { 1210 1211 // Determine if we are compiling 32-bit code on an x86_64 platform. 1212 bool Lib32 = false; 1213 if (ToolTriple.getArch() == llvm::Triple::x86_64 && 1214 Triple.getArch() == llvm::Triple::x86) 1215 Lib32 = true; 1216 1217 if (getDriver().UseStdLib) { 1218 if (Lib32) 1219 getFilePaths().push_back("=/usr/lib/i386"); 1220 else 1221 getFilePaths().push_back("=/usr/lib"); 1222 } 1223} 1224 1225Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA, 1226 const ActionList &Inputs) const { 1227 Action::ActionClass Key; 1228 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1229 Key = Action::AnalyzeJobClass; 1230 else 1231 Key = JA.getKind(); 1232 1233 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1234 options::OPT_no_integrated_as, 1235 IsIntegratedAssemblerDefault()); 1236 1237 Tool *&T = Tools[Key]; 1238 if (!T) { 1239 switch (Key) { 1240 case Action::AssembleJobClass: 1241 if (UseIntegratedAs) 1242 T = new tools::ClangAs(*this); 1243 else 1244 T = new tools::netbsd::Assemble(*this, ToolTriple); 1245 break; 1246 case Action::LinkJobClass: 1247 T = new tools::netbsd::Link(*this, ToolTriple); 1248 break; 1249 default: 1250 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1251 } 1252 } 1253 1254 return *T; 1255} 1256 1257/// Minix - Minix tool chain which can call as(1) and ld(1) directly. 1258 1259Minix::Minix(const HostInfo &Host, const llvm::Triple& Triple) 1260 : Generic_GCC(Host, Triple) { 1261 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1262 getFilePaths().push_back("/usr/lib"); 1263 getFilePaths().push_back("/usr/gnu/lib"); 1264 getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3"); 1265} 1266 1267Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA, 1268 const ActionList &Inputs) const { 1269 Action::ActionClass Key; 1270 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1271 Key = Action::AnalyzeJobClass; 1272 else 1273 Key = JA.getKind(); 1274 1275 Tool *&T = Tools[Key]; 1276 if (!T) { 1277 switch (Key) { 1278 case Action::AssembleJobClass: 1279 T = new tools::minix::Assemble(*this); break; 1280 case Action::LinkJobClass: 1281 T = new tools::minix::Link(*this); break; 1282 default: 1283 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1284 } 1285 } 1286 1287 return *T; 1288} 1289 1290/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 1291 1292AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple) 1293 : Generic_GCC(Host, Triple) { 1294 1295 getProgramPaths().push_back(getDriver().getInstalledDir()); 1296 if (getDriver().getInstalledDir() != getDriver().Dir) 1297 getProgramPaths().push_back(getDriver().Dir); 1298 1299 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1300 getFilePaths().push_back("/usr/lib"); 1301 getFilePaths().push_back("/usr/sfw/lib"); 1302 getFilePaths().push_back("/opt/gcc4/lib"); 1303 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 1304 1305} 1306 1307Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA, 1308 const ActionList &Inputs) const { 1309 Action::ActionClass Key; 1310 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1311 Key = Action::AnalyzeJobClass; 1312 else 1313 Key = JA.getKind(); 1314 1315 Tool *&T = Tools[Key]; 1316 if (!T) { 1317 switch (Key) { 1318 case Action::AssembleJobClass: 1319 T = new tools::auroraux::Assemble(*this); break; 1320 case Action::LinkJobClass: 1321 T = new tools::auroraux::Link(*this); break; 1322 default: 1323 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1324 } 1325 } 1326 1327 return *T; 1328} 1329 1330 1331/// Linux toolchain (very bare-bones at the moment). 1332 1333enum LinuxDistro { 1334 ArchLinux, 1335 DebianLenny, 1336 DebianSqueeze, 1337 DebianWheezy, 1338 Exherbo, 1339 RHEL4, 1340 RHEL5, 1341 RHEL6, 1342 Fedora13, 1343 Fedora14, 1344 Fedora15, 1345 FedoraRawhide, 1346 OpenSuse11_3, 1347 OpenSuse11_4, 1348 OpenSuse12_1, 1349 UbuntuHardy, 1350 UbuntuIntrepid, 1351 UbuntuJaunty, 1352 UbuntuKarmic, 1353 UbuntuLucid, 1354 UbuntuMaverick, 1355 UbuntuNatty, 1356 UbuntuOneiric, 1357 UnknownDistro 1358}; 1359 1360static bool IsRedhat(enum LinuxDistro Distro) { 1361 return Distro == Fedora13 || Distro == Fedora14 || 1362 Distro == Fedora15 || Distro == FedoraRawhide || 1363 Distro == RHEL4 || Distro == RHEL5 || Distro == RHEL6; 1364} 1365 1366static bool IsOpenSuse(enum LinuxDistro Distro) { 1367 return Distro == OpenSuse11_3 || Distro == OpenSuse11_4 || 1368 Distro == OpenSuse12_1; 1369} 1370 1371static bool IsDebian(enum LinuxDistro Distro) { 1372 return Distro == DebianLenny || Distro == DebianSqueeze || 1373 Distro == DebianWheezy; 1374} 1375 1376static bool IsUbuntu(enum LinuxDistro Distro) { 1377 return Distro == UbuntuHardy || Distro == UbuntuIntrepid || 1378 Distro == UbuntuLucid || Distro == UbuntuMaverick || 1379 Distro == UbuntuJaunty || Distro == UbuntuKarmic || 1380 Distro == UbuntuNatty || Distro == UbuntuOneiric; 1381} 1382 1383// FIXME: This should be deleted. We should assume a multilib environment, and 1384// fallback gracefully if any parts of it are absent. 1385static bool HasMultilib(llvm::Triple::ArchType Arch, enum LinuxDistro Distro) { 1386 if (Arch == llvm::Triple::x86_64) { 1387 bool Exists; 1388 if (Distro == Exherbo && 1389 (llvm::sys::fs::exists("/usr/lib32/libc.so", Exists) || !Exists)) 1390 return false; 1391 } 1392 1393 return true; 1394} 1395 1396static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) { 1397 llvm::OwningPtr<llvm::MemoryBuffer> File; 1398 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) { 1399 StringRef Data = File.get()->getBuffer(); 1400 SmallVector<StringRef, 8> Lines; 1401 Data.split(Lines, "\n"); 1402 for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) { 1403 if (Lines[i] == "DISTRIB_CODENAME=hardy") 1404 return UbuntuHardy; 1405 else if (Lines[i] == "DISTRIB_CODENAME=intrepid") 1406 return UbuntuIntrepid; 1407 else if (Lines[i] == "DISTRIB_CODENAME=jaunty") 1408 return UbuntuJaunty; 1409 else if (Lines[i] == "DISTRIB_CODENAME=karmic") 1410 return UbuntuKarmic; 1411 else if (Lines[i] == "DISTRIB_CODENAME=lucid") 1412 return UbuntuLucid; 1413 else if (Lines[i] == "DISTRIB_CODENAME=maverick") 1414 return UbuntuMaverick; 1415 else if (Lines[i] == "DISTRIB_CODENAME=natty") 1416 return UbuntuNatty; 1417 else if (Lines[i] == "DISTRIB_CODENAME=oneiric") 1418 return UbuntuOneiric; 1419 } 1420 return UnknownDistro; 1421 } 1422 1423 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) { 1424 StringRef Data = File.get()->getBuffer(); 1425 if (Data.startswith("Fedora release 15")) 1426 return Fedora15; 1427 else if (Data.startswith("Fedora release 14")) 1428 return Fedora14; 1429 else if (Data.startswith("Fedora release 13")) 1430 return Fedora13; 1431 else if (Data.startswith("Fedora release") && 1432 Data.find("Rawhide") != StringRef::npos) 1433 return FedoraRawhide; 1434 else if (Data.startswith("Red Hat Enterprise Linux") && 1435 Data.find("release 6") != StringRef::npos) 1436 return RHEL6; 1437 else if ((Data.startswith("Red Hat Enterprise Linux") || 1438 Data.startswith("CentOS")) && 1439 Data.find("release 5") != StringRef::npos) 1440 return RHEL5; 1441 else if ((Data.startswith("Red Hat Enterprise Linux") || 1442 Data.startswith("CentOS")) && 1443 Data.find("release 4") != StringRef::npos) 1444 return RHEL4; 1445 return UnknownDistro; 1446 } 1447 1448 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) { 1449 StringRef Data = File.get()->getBuffer(); 1450 if (Data[0] == '5') 1451 return DebianLenny; 1452 else if (Data.startswith("squeeze/sid")) 1453 return DebianSqueeze; 1454 else if (Data.startswith("wheezy/sid")) 1455 return DebianWheezy; 1456 return UnknownDistro; 1457 } 1458 1459 if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File)) { 1460 StringRef Data = File.get()->getBuffer(); 1461 if (Data.startswith("openSUSE 11.3")) 1462 return OpenSuse11_3; 1463 else if (Data.startswith("openSUSE 11.4")) 1464 return OpenSuse11_4; 1465 else if (Data.startswith("openSUSE 12.1")) 1466 return OpenSuse12_1; 1467 return UnknownDistro; 1468 } 1469 1470 bool Exists; 1471 if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists) 1472 return Exherbo; 1473 1474 if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists) 1475 return ArchLinux; 1476 1477 return UnknownDistro; 1478} 1479 1480/// \brief Trivial helper function to simplify code checking path existence. 1481static bool PathExists(StringRef Path) { 1482 bool Exists; 1483 if (!llvm::sys::fs::exists(Path, Exists)) 1484 return Exists; 1485 return false; 1486} 1487 1488namespace { 1489/// \brief This is a class to find a viable GCC installation for Clang to use. 1490/// 1491/// This class tries to find a GCC installation on the system, and report 1492/// information about it. It starts from the host information provided to the 1493/// Driver, and has logic for fuzzing that where appropriate. 1494class GCCInstallationDetector { 1495 /// \brief Struct to store and manipulate GCC versions. 1496 /// 1497 /// We rely on assumptions about the form and structure of GCC version 1498 /// numbers: they consist of at most three '.'-separated components, and each 1499 /// component is a non-negative integer. 1500 struct GCCVersion { 1501 unsigned Major, Minor, Patch; 1502 1503 static GCCVersion Parse(StringRef VersionText) { 1504 const GCCVersion BadVersion = {}; 1505 std::pair<StringRef, StringRef> First = VersionText.split('.'); 1506 std::pair<StringRef, StringRef> Second = First.second.split('.'); 1507 1508 GCCVersion GoodVersion = {}; 1509 if (First.first.getAsInteger(10, GoodVersion.Major)) 1510 return BadVersion; 1511 if (Second.first.getAsInteger(10, GoodVersion.Minor)) 1512 return BadVersion; 1513 // We accept a number, or a string for the patch version, in case there 1514 // is a strang suffix, or other mangling: '4.1.x', '4.1.2-rc3'. When it 1515 // isn't a number, we just use '0' as the number but accept it. 1516 if (Second.first.getAsInteger(10, GoodVersion.Patch)) 1517 GoodVersion.Patch = 0; 1518 return GoodVersion; 1519 } 1520 1521 bool operator<(const GCCVersion &RHS) const { 1522 if (Major < RHS.Major) return true; 1523 if (Major > RHS.Major) return false; 1524 if (Minor < RHS.Minor) return true; 1525 if (Minor > RHS.Minor) return false; 1526 return Patch < RHS.Patch; 1527 } 1528 bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 1529 bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 1530 bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 1531 }; 1532 1533 bool IsValid; 1534 std::string GccTriple; 1535 1536 // FIXME: These might be better as path objects. 1537 std::string GccInstallPath; 1538 std::string GccParentLibPath; 1539 1540 llvm::SmallString<128> CxxIncludeRoot; 1541 1542public: 1543 /// \brief Construct a GCCInstallationDetector from the driver. 1544 /// 1545 /// This performs all of the autodetection and sets up the various paths. 1546 /// Once constructed, a GCCInstallation is esentially immutable. 1547 GCCInstallationDetector(const Driver &D) 1548 : IsValid(false), 1549 GccTriple(D.DefaultHostTriple), 1550 CxxIncludeRoot(CXX_INCLUDE_ROOT) { 1551 // FIXME: Using CXX_INCLUDE_ROOT is here is a bit of a hack, but 1552 // avoids adding yet another option to configure/cmake. 1553 // It would probably be cleaner to break it in two variables 1554 // CXX_GCC_ROOT with just /foo/bar 1555 // CXX_GCC_VER with 4.5.2 1556 // Then we would have 1557 // CXX_INCLUDE_ROOT = CXX_GCC_ROOT/include/c++/CXX_GCC_VER 1558 // and this function would return 1559 // CXX_GCC_ROOT/lib/gcc/CXX_INCLUDE_ARCH/CXX_GCC_VER 1560 if (CxxIncludeRoot != "") { 1561 // This is of the form /foo/bar/include/c++/4.5.2/ 1562 if (CxxIncludeRoot.back() == '/') 1563 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the / 1564 StringRef Version = llvm::sys::path::filename(CxxIncludeRoot); 1565 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the version 1566 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the c++ 1567 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the include 1568 GccInstallPath = CxxIncludeRoot.str(); 1569 GccInstallPath.append("/lib/gcc/"); 1570 GccInstallPath.append(CXX_INCLUDE_ARCH); 1571 GccInstallPath.append("/"); 1572 GccInstallPath.append(Version); 1573 GccParentLibPath = GccInstallPath + "/../../../.."; 1574 IsValid = true; 1575 return; 1576 } 1577 1578 llvm::Triple::ArchType HostArch = llvm::Triple(GccTriple).getArch(); 1579 // The library directories which may contain GCC installations. 1580 SmallVector<StringRef, 4> CandidateLibDirs; 1581 // The compatible GCC triples for this particular architecture. 1582 SmallVector<StringRef, 10> CandidateTriples; 1583 CollectLibDirsAndTriples(HostArch, CandidateLibDirs, CandidateTriples); 1584 1585 // Always include the default host triple as the final fallback if no 1586 // specific triple is detected. 1587 CandidateTriples.push_back(D.DefaultHostTriple); 1588 1589 // Compute the set of prefixes for our search. 1590 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(), 1591 D.PrefixDirs.end()); 1592 Prefixes.push_back(D.SysRoot); 1593 Prefixes.push_back(D.SysRoot + "/usr"); 1594 Prefixes.push_back(D.InstalledDir + "/.."); 1595 1596 // Loop over the various components which exist and select the best GCC 1597 // installation available. GCC installs are ranked by version number. 1598 GCCVersion BestVersion = {}; 1599 for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) { 1600 if (!PathExists(Prefixes[i])) 1601 continue; 1602 for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) { 1603 const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str(); 1604 if (!PathExists(LibDir)) 1605 continue; 1606 for (unsigned k = 0, ke = CandidateTriples.size(); k < ke; ++k) 1607 ScanLibDirForGCCTriple(LibDir, CandidateTriples[k], BestVersion); 1608 } 1609 } 1610 } 1611 1612 /// \brief Check whether we detected a valid GCC install. 1613 bool isValid() const { return IsValid; } 1614 1615 /// \brief Get the GCC triple for the detected install. 1616 const std::string &getTriple() const { return GccTriple; } 1617 1618 /// \brief Get the detected GCC installation path. 1619 const std::string &getInstallPath() const { return GccInstallPath; } 1620 1621 /// \brief Get the detected GCC parent lib path. 1622 const std::string &getParentLibPath() const { return GccParentLibPath; } 1623 1624private: 1625 static void CollectLibDirsAndTriples(llvm::Triple::ArchType HostArch, 1626 SmallVectorImpl<StringRef> &LibDirs, 1627 SmallVectorImpl<StringRef> &Triples) { 1628 if (HostArch == llvm::Triple::arm || HostArch == llvm::Triple::thumb) { 1629 static const char *const ARMLibDirs[] = { "/lib/gcc" }; 1630 static const char *const ARMTriples[] = { "arm-linux-gnueabi" }; 1631 LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs)); 1632 Triples.append(ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples)); 1633 } else if (HostArch == llvm::Triple::x86_64) { 1634 static const char *const X86_64LibDirs[] = { 1635 "/lib64/gcc", "/lib/gcc", "/lib64", "/lib" 1636 }; 1637 static const char *const X86_64Triples[] = { 1638 "x86_64-linux-gnu", 1639 "x86_64-unknown-linux-gnu", 1640 "x86_64-pc-linux-gnu", 1641 "x86_64-redhat-linux6E", 1642 "x86_64-redhat-linux", 1643 "x86_64-suse-linux", 1644 "x86_64-manbo-linux-gnu", 1645 "x86_64-linux-gnu", 1646 "x86_64-slackware-linux" 1647 }; 1648 LibDirs.append(X86_64LibDirs, 1649 X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs)); 1650 Triples.append(X86_64Triples, 1651 X86_64Triples + llvm::array_lengthof(X86_64Triples)); 1652 } else if (HostArch == llvm::Triple::x86) { 1653 static const char *const X86LibDirs[] = { 1654 "/lib32/gcc", "/lib/gcc", "/lib32", "/lib" 1655 }; 1656 static const char *const X86Triples[] = { 1657 "i686-linux-gnu", 1658 "i386-linux-gnu", 1659 "i686-pc-linux-gnu", 1660 "i486-linux-gnu", 1661 "i686-redhat-linux", 1662 "i586-suse-linux", 1663 "i486-slackware-linux" 1664 }; 1665 LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs)); 1666 Triples.append(X86Triples, X86Triples + llvm::array_lengthof(X86Triples)); 1667 } else if (HostArch == llvm::Triple::ppc) { 1668 static const char *const PPCLibDirs[] = { 1669 "/lib32/gcc", "/lib/gcc", "/lib32", "/lib" 1670 }; 1671 static const char *const PPCTriples[] = { 1672 "powerpc-linux-gnu", 1673 "powerpc-unknown-linux-gnu" 1674 }; 1675 LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs)); 1676 Triples.append(PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples)); 1677 } else if (HostArch == llvm::Triple::ppc64) { 1678 static const char *const PPC64LibDirs[] = { 1679 "/lib64/gcc", "/lib/gcc", "/lib64", "/lib" 1680 }; 1681 static const char *const PPC64Triples[] = { 1682 "powerpc64-unknown-linux-gnu" 1683 }; 1684 LibDirs.append(PPC64LibDirs, 1685 PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs)); 1686 Triples.append(PPC64Triples, 1687 PPC64Triples + llvm::array_lengthof(PPC64Triples)); 1688 } 1689 } 1690 1691 void ScanLibDirForGCCTriple(const std::string &LibDir, 1692 StringRef CandidateTriple, 1693 GCCVersion &BestVersion) { 1694 const std::string TripleDir = LibDir + "/" + CandidateTriple.str(); 1695 if (!PathExists(TripleDir)) 1696 return; 1697 1698 // There are various different suffixes on the triple directory we 1699 // check for. We also record what is necessary to walk from each back 1700 // up to the lib directory. 1701 const std::string Suffixes[] = { "", "/gcc/" + CandidateTriple.str(), 1702 "/gcc/i686-linux-gnu" }; 1703 const std::string InstallSuffixes[] = { "/../../..", "/../../../..", 1704 "/../../../.." }; 1705 const unsigned NumSuffixes = (llvm::array_lengthof(Suffixes) - 1706 (CandidateTriple != "i386-linux-gnu")); 1707 for (unsigned i = 0; i < NumSuffixes; ++i) { 1708 StringRef Suffix = Suffixes[i]; 1709 llvm::error_code EC; 1710 for (llvm::sys::fs::directory_iterator LI(TripleDir + Suffix, EC), LE; 1711 !EC && LI != LE; LI = LI.increment(EC)) { 1712 StringRef VersionText = llvm::sys::path::filename(LI->path()); 1713 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText); 1714 static const GCCVersion MinVersion = { 4, 1, 1 }; 1715 if (CandidateVersion < MinVersion) 1716 continue; 1717 if (CandidateVersion <= BestVersion) 1718 continue; 1719 if (!PathExists(LI->path() + "/crtbegin.o")) 1720 continue; 1721 1722 BestVersion = CandidateVersion; 1723 GccTriple = CandidateTriple.str(); 1724 // FIXME: We hack together the directory name here instead of 1725 // using LI to ensure stable path separators across Windows and 1726 // Linux. 1727 GccInstallPath = TripleDir + Suffixes[i] + "/" + VersionText.str(); 1728 GccParentLibPath = GccInstallPath + InstallSuffixes[i]; 1729 IsValid = true; 1730 } 1731 } 1732 } 1733}; 1734} 1735 1736static void addPathIfExists(const std::string &Path, 1737 ToolChain::path_list &Paths) { 1738 if (PathExists(Path)) Paths.push_back(Path); 1739} 1740 1741Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple) 1742 : Generic_ELF(Host, Triple) { 1743 llvm::Triple::ArchType Arch = 1744 llvm::Triple(getDriver().DefaultHostTriple).getArch(); 1745 const std::string &SysRoot = getDriver().SysRoot; 1746 GCCInstallationDetector GCCInstallation(getDriver()); 1747 1748 // OpenSuse stores the linker with the compiler, add that to the search 1749 // path. 1750 ToolChain::path_list &PPaths = getProgramPaths(); 1751 PPaths.push_back(GCCInstallation.getParentLibPath() + "/../" + 1752 GCCInstallation.getTriple() + "/bin"); 1753 1754 Linker = GetProgramPath("ld"); 1755 1756 LinuxDistro Distro = DetectLinuxDistro(Arch); 1757 1758 if (IsOpenSuse(Distro) || IsUbuntu(Distro)) { 1759 ExtraOpts.push_back("-z"); 1760 ExtraOpts.push_back("relro"); 1761 } 1762 1763 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) 1764 ExtraOpts.push_back("-X"); 1765 1766 if (IsRedhat(Distro) || IsOpenSuse(Distro) || Distro == UbuntuMaverick || 1767 Distro == UbuntuNatty || Distro == UbuntuOneiric) 1768 ExtraOpts.push_back("--hash-style=gnu"); 1769 1770 if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid || 1771 Distro == UbuntuJaunty || Distro == UbuntuKarmic) 1772 ExtraOpts.push_back("--hash-style=both"); 1773 1774 if (IsRedhat(Distro)) 1775 ExtraOpts.push_back("--no-add-needed"); 1776 1777 if (Distro == DebianSqueeze || Distro == DebianWheezy || 1778 IsOpenSuse(Distro) || 1779 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) || 1780 Distro == UbuntuLucid || 1781 Distro == UbuntuMaverick || Distro == UbuntuKarmic || 1782 Distro == UbuntuNatty || Distro == UbuntuOneiric) 1783 ExtraOpts.push_back("--build-id"); 1784 1785 if (IsOpenSuse(Distro)) 1786 ExtraOpts.push_back("--enable-new-dtags"); 1787 1788 // The selection of paths to try here is designed to match the patterns which 1789 // the GCC driver itself uses, as this is part of the GCC-compatible driver. 1790 // This was determined by running GCC in a fake filesystem, creating all 1791 // possible permutations of these directories, and seeing which ones it added 1792 // to the link paths. 1793 path_list &Paths = getFilePaths(); 1794 const bool Is32Bits = (getArch() == llvm::Triple::x86 || 1795 getArch() == llvm::Triple::ppc); 1796 1797 const std::string Suffix32 = Arch == llvm::Triple::x86_64 ? "/32" : ""; 1798 const std::string Suffix64 = Arch == llvm::Triple::x86_64 ? "" : "/64"; 1799 const std::string Suffix = Is32Bits ? Suffix32 : Suffix64; 1800 const std::string Multilib = Is32Bits ? "lib32" : "lib64"; 1801 1802 // FIXME: Because we add paths only when they exist on the system, I think we 1803 // should remove the concept of 'HasMultilib'. It's more likely to break the 1804 // behavior than to preserve any useful invariant on the system. 1805 if (HasMultilib(Arch, Distro)) { 1806 // Add the multilib suffixed paths. 1807 if (GCCInstallation.isValid()) { 1808 const std::string &LibPath = GCCInstallation.getParentLibPath(); 1809 const std::string &GccTriple = GCCInstallation.getTriple(); 1810 // FIXME: This OpenSuse-specific path shouldn't be needed any more, but 1811 // I don't want to remove it without finding someone to test. 1812 if (IsOpenSuse(Distro) && Is32Bits) 1813 Paths.push_back(LibPath + "/../" + GccTriple + "/lib/../lib"); 1814 1815 addPathIfExists(GCCInstallation.getInstallPath() + Suffix, Paths); 1816 addPathIfExists(LibPath + "/../" + GccTriple + "/lib/../" + Multilib, 1817 Paths); 1818 addPathIfExists(LibPath + "/../" + Multilib, Paths); 1819 } 1820 addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths); 1821 addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths); 1822 } 1823 1824 // Add the non-multiplib suffixed paths (if potentially different). 1825 if (GCCInstallation.isValid()) { 1826 const std::string &LibPath = GCCInstallation.getParentLibPath(); 1827 const std::string &GccTriple = GCCInstallation.getTriple(); 1828 if (!Suffix.empty() || !HasMultilib(Arch, Distro)) 1829 addPathIfExists(GCCInstallation.getInstallPath(), Paths); 1830 addPathIfExists(LibPath + "/../" + GccTriple + "/lib", Paths); 1831 addPathIfExists(LibPath, Paths); 1832 } 1833 addPathIfExists(SysRoot + "/lib", Paths); 1834 addPathIfExists(SysRoot + "/usr/lib", Paths); 1835 1836 if (GCCInstallation.isValid() && Arch == getArch() && IsUbuntu(Distro)) 1837 Paths.push_back(SysRoot + "/usr/lib/" + GCCInstallation.getTriple()); 1838} 1839 1840bool Linux::HasNativeLLVMSupport() const { 1841 return true; 1842} 1843 1844Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA, 1845 const ActionList &Inputs) const { 1846 Action::ActionClass Key; 1847 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1848 Key = Action::AnalyzeJobClass; 1849 else 1850 Key = JA.getKind(); 1851 1852 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1853 options::OPT_no_integrated_as, 1854 IsIntegratedAssemblerDefault()); 1855 1856 Tool *&T = Tools[Key]; 1857 if (!T) { 1858 switch (Key) { 1859 case Action::AssembleJobClass: 1860 if (UseIntegratedAs) 1861 T = new tools::ClangAs(*this); 1862 else 1863 T = new tools::linuxtools::Assemble(*this); 1864 break; 1865 case Action::LinkJobClass: 1866 T = new tools::linuxtools::Link(*this); break; 1867 default: 1868 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1869 } 1870 } 1871 1872 return *T; 1873} 1874 1875/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 1876 1877DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple) 1878 : Generic_ELF(Host, Triple) { 1879 1880 // Path mangling to find libexec 1881 getProgramPaths().push_back(getDriver().getInstalledDir()); 1882 if (getDriver().getInstalledDir() != getDriver().Dir) 1883 getProgramPaths().push_back(getDriver().Dir); 1884 1885 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1886 getFilePaths().push_back("/usr/lib"); 1887 getFilePaths().push_back("/usr/lib/gcc41"); 1888} 1889 1890Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA, 1891 const ActionList &Inputs) const { 1892 Action::ActionClass Key; 1893 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1894 Key = Action::AnalyzeJobClass; 1895 else 1896 Key = JA.getKind(); 1897 1898 Tool *&T = Tools[Key]; 1899 if (!T) { 1900 switch (Key) { 1901 case Action::AssembleJobClass: 1902 T = new tools::dragonfly::Assemble(*this); break; 1903 case Action::LinkJobClass: 1904 T = new tools::dragonfly::Link(*this); break; 1905 default: 1906 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1907 } 1908 } 1909 1910 return *T; 1911} 1912 1913Windows::Windows(const HostInfo &Host, const llvm::Triple& Triple) 1914 : ToolChain(Host, Triple) { 1915} 1916 1917Tool &Windows::SelectTool(const Compilation &C, const JobAction &JA, 1918 const ActionList &Inputs) const { 1919 Action::ActionClass Key; 1920 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1921 Key = Action::AnalyzeJobClass; 1922 else 1923 Key = JA.getKind(); 1924 1925 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1926 options::OPT_no_integrated_as, 1927 IsIntegratedAssemblerDefault()); 1928 1929 Tool *&T = Tools[Key]; 1930 if (!T) { 1931 switch (Key) { 1932 case Action::InputClass: 1933 case Action::BindArchClass: 1934 case Action::LipoJobClass: 1935 case Action::DsymutilJobClass: 1936 case Action::VerifyJobClass: 1937 llvm_unreachable("Invalid tool kind."); 1938 case Action::PreprocessJobClass: 1939 case Action::PrecompileJobClass: 1940 case Action::AnalyzeJobClass: 1941 case Action::CompileJobClass: 1942 T = new tools::Clang(*this); break; 1943 case Action::AssembleJobClass: 1944 if (!UseIntegratedAs && getTriple().getEnvironment() == llvm::Triple::MachO) 1945 T = new tools::darwin::Assemble(*this); 1946 else 1947 T = new tools::ClangAs(*this); 1948 break; 1949 case Action::LinkJobClass: 1950 T = new tools::visualstudio::Link(*this); break; 1951 } 1952 } 1953 1954 return *T; 1955} 1956 1957bool Windows::IsIntegratedAssemblerDefault() const { 1958 return true; 1959} 1960 1961bool Windows::IsUnwindTablesDefault() const { 1962 // FIXME: Gross; we should probably have some separate target 1963 // definition, possibly even reusing the one in clang. 1964 return getArchName() == "x86_64"; 1965} 1966 1967const char *Windows::GetDefaultRelocationModel() const { 1968 return "static"; 1969} 1970 1971const char *Windows::GetForcedPicModel() const { 1972 if (getArchName() == "x86_64") 1973 return "pic"; 1974 return 0; 1975} 1976