ToolChains.cpp revision e4539ef4633fa5c0867e247b5bc88e0f753a2336
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#include "clang/Driver/Arg.h" 13#include "clang/Driver/ArgList.h" 14#include "clang/Driver/Compilation.h" 15#include "clang/Driver/Driver.h" 16#include "clang/Driver/DriverDiagnostic.h" 17#include "clang/Driver/HostInfo.h" 18#include "clang/Driver/OptTable.h" 19#include "clang/Driver/Option.h" 20#include "clang/Driver/Options.h" 21#include "clang/Basic/Version.h" 22 23#include "llvm/ADT/SmallString.h" 24#include "llvm/ADT/StringExtras.h" 25#include "llvm/Support/ErrorHandling.h" 26#include "llvm/Support/MemoryBuffer.h" 27#include "llvm/Support/raw_ostream.h" 28#include "llvm/System/Path.h" 29 30#include <cstdlib> // ::getenv 31 32using namespace clang::driver; 33using namespace clang::driver::toolchains; 34 35/// Darwin - Darwin tool chain for i386 and x86_64. 36 37Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple) 38 : ToolChain(Host, Triple), TargetInitialized(false) 39{ 40 // Compute the initial Darwin version based on the host. 41 bool HadExtra; 42 std::string OSName = Triple.getOSName(); 43 if (!Driver::GetReleaseVersion(&OSName[6], 44 DarwinVersion[0], DarwinVersion[1], 45 DarwinVersion[2], HadExtra)) 46 getDriver().Diag(clang::diag::err_drv_invalid_darwin_version) << OSName; 47 48 llvm::raw_string_ostream(MacosxVersionMin) 49 << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.' 50 << DarwinVersion[1]; 51} 52 53types::ID Darwin::LookupTypeForExtension(const char *Ext) const { 54 types::ID Ty = types::lookupTypeForExtension(Ext); 55 56 // Darwin always preprocesses assembly files (unless -x is used explicitly). 57 if (Ty == types::TY_PP_Asm) 58 return types::TY_Asm; 59 60 return Ty; 61} 62 63bool Darwin::HasNativeLLVMSupport() const { 64 return true; 65} 66 67// FIXME: Can we tablegen this? 68static const char *GetArmArchForMArch(llvm::StringRef Value) { 69 if (Value == "armv6k") 70 return "armv6"; 71 72 if (Value == "armv5tej") 73 return "armv5"; 74 75 if (Value == "xscale") 76 return "xscale"; 77 78 if (Value == "armv4t") 79 return "armv4t"; 80 81 if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 82 Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 83 Value == "armv7m") 84 return "armv7"; 85 86 return 0; 87} 88 89// FIXME: Can we tablegen this? 90static const char *GetArmArchForMCpu(llvm::StringRef Value) { 91 if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 92 Value == "arm946e-s" || Value == "arm966e-s" || 93 Value == "arm968e-s" || Value == "arm10e" || 94 Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 95 Value == "arm1026ej-s") 96 return "armv5"; 97 98 if (Value == "xscale") 99 return "xscale"; 100 101 if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 102 Value == "arm1176jz-s" || Value == "arm1176jzf-s") 103 return "armv6"; 104 105 if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 106 return "armv7"; 107 108 return 0; 109} 110 111llvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const { 112 switch (getTriple().getArch()) { 113 default: 114 return getArchName(); 115 116 case llvm::Triple::arm: { 117 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 118 if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) 119 return Arch; 120 121 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 122 if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) 123 return Arch; 124 125 return "arm"; 126 } 127 } 128} 129 130DarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple) 131 : Darwin(Host, Triple) 132{ 133 // We can only work with 4.2.1 currently. 134 GCCVersion[0] = 4; 135 GCCVersion[1] = 2; 136 GCCVersion[2] = 1; 137 138 // Set up the tool chain paths to match gcc. 139 ToolChainDir = "i686-apple-darwin"; 140 ToolChainDir += llvm::utostr(DarwinVersion[0]); 141 ToolChainDir += "/"; 142 ToolChainDir += llvm::utostr(GCCVersion[0]); 143 ToolChainDir += '.'; 144 ToolChainDir += llvm::utostr(GCCVersion[1]); 145 ToolChainDir += '.'; 146 ToolChainDir += llvm::utostr(GCCVersion[2]); 147 148 // Try the next major version if that tool chain dir is invalid. 149 std::string Tmp = "/usr/lib/gcc/" + ToolChainDir; 150 if (!llvm::sys::Path(Tmp).exists()) { 151 std::string Next = "i686-apple-darwin"; 152 Next += llvm::utostr(DarwinVersion[0] + 1); 153 Next += "/"; 154 Next += llvm::utostr(GCCVersion[0]); 155 Next += '.'; 156 Next += llvm::utostr(GCCVersion[1]); 157 Next += '.'; 158 Next += llvm::utostr(GCCVersion[2]); 159 160 // Use that if it exists, otherwise hope the user isn't linking. 161 // 162 // FIXME: Drop dependency on gcc's tool chain. 163 Tmp = "/usr/lib/gcc/" + Next; 164 if (llvm::sys::Path(Tmp).exists()) 165 ToolChainDir = Next; 166 } 167 168 std::string Path; 169 if (getArchName() == "x86_64") { 170 Path = getDriver().Dir; 171 Path += "/../lib/gcc/"; 172 Path += ToolChainDir; 173 Path += "/x86_64"; 174 getFilePaths().push_back(Path); 175 176 Path = "/usr/lib/gcc/"; 177 Path += ToolChainDir; 178 Path += "/x86_64"; 179 getFilePaths().push_back(Path); 180 } 181 182 Path = getDriver().Dir; 183 Path += "/../lib/gcc/"; 184 Path += ToolChainDir; 185 getFilePaths().push_back(Path); 186 187 Path = "/usr/lib/gcc/"; 188 Path += ToolChainDir; 189 getFilePaths().push_back(Path); 190 191 Path = getDriver().Dir; 192 Path += "/../libexec/gcc/"; 193 Path += ToolChainDir; 194 getProgramPaths().push_back(Path); 195 196 Path = "/usr/libexec/gcc/"; 197 Path += ToolChainDir; 198 getProgramPaths().push_back(Path); 199 200 getProgramPaths().push_back(getDriver().getInstalledDir()); 201 if (getDriver().getInstalledDir() != getDriver().Dir) 202 getProgramPaths().push_back(getDriver().Dir); 203} 204 205Darwin::~Darwin() { 206 // Free tool implementations. 207 for (llvm::DenseMap<unsigned, Tool*>::iterator 208 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 209 delete it->second; 210} 211 212std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args) const { 213 llvm::Triple Triple(ComputeLLVMTriple(Args)); 214 215 // If the target isn't initialized (e.g., an unknown Darwin platform, return 216 // the default triple). 217 if (!isTargetInitialized()) 218 return Triple.getTriple(); 219 220 unsigned Version[3]; 221 getTargetVersion(Version); 222 223 // Mangle the target version into the OS triple component. For historical 224 // reasons that make little sense, the version passed here is the "darwin" 225 // version, which drops the 10 and offsets by 4. See inverse code when 226 // setting the OS version preprocessor define. 227 if (!isTargetIPhoneOS()) { 228 Version[0] = Version[1] + 4; 229 Version[1] = Version[2]; 230 Version[2] = 0; 231 } else { 232 // Use the environment to communicate that we are targetting iPhoneOS. 233 Triple.setEnvironmentName("iphoneos"); 234 } 235 236 llvm::SmallString<16> Str; 237 llvm::raw_svector_ostream(Str) << "darwin" << Version[0] 238 << "." << Version[1] << "." << Version[2]; 239 Triple.setOSName(Str.str()); 240 241 return Triple.getTriple(); 242} 243 244Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const { 245 Action::ActionClass Key; 246 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 247 Key = Action::AnalyzeJobClass; 248 else 249 Key = JA.getKind(); 250 251 // FIXME: This doesn't belong here, but ideally we will support static soon 252 // anyway. 253 bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) || 254 C.getArgs().hasArg(options::OPT_static) || 255 C.getArgs().hasArg(options::OPT_fapple_kext)); 256 bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic; 257 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 258 options::OPT_no_integrated_as, 259 IsIADefault); 260 261 Tool *&T = Tools[Key]; 262 if (!T) { 263 switch (Key) { 264 case Action::InputClass: 265 case Action::BindArchClass: 266 assert(0 && "Invalid tool kind."); 267 case Action::PreprocessJobClass: 268 T = new tools::darwin::Preprocess(*this); break; 269 case Action::AnalyzeJobClass: 270 T = new tools::Clang(*this); break; 271 case Action::PrecompileJobClass: 272 case Action::CompileJobClass: 273 T = new tools::darwin::Compile(*this); break; 274 case Action::AssembleJobClass: { 275 if (UseIntegratedAs) 276 T = new tools::ClangAs(*this); 277 else 278 T = new tools::darwin::Assemble(*this); 279 break; 280 } 281 case Action::LinkJobClass: 282 T = new tools::darwin::Link(*this); break; 283 case Action::LipoJobClass: 284 T = new tools::darwin::Lipo(*this); break; 285 case Action::DsymutilJobClass: 286 T = new tools::darwin::Dsymutil(*this); break; 287 } 288 } 289 290 return *T; 291} 292 293void DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args, 294 ArgStringList &CmdArgs) const { 295 std::string Tmp; 296 297 // FIXME: Derive these correctly. 298 if (getArchName() == "x86_64") { 299 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 300 "/x86_64")); 301 // Intentionally duplicated for (temporary) gcc bug compatibility. 302 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 303 "/x86_64")); 304 } 305 306 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir)); 307 308 Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir; 309 if (llvm::sys::Path(Tmp).exists()) 310 CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 311 Tmp = getDriver().Dir + "/../lib/gcc"; 312 if (llvm::sys::Path(Tmp).exists()) 313 CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 314 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 315 // Intentionally duplicated for (temporary) gcc bug compatibility. 316 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 317 Tmp = getDriver().Dir + "/../lib/" + ToolChainDir; 318 if (llvm::sys::Path(Tmp).exists()) 319 CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 320 Tmp = getDriver().Dir + "/../lib"; 321 if (llvm::sys::Path(Tmp).exists()) 322 CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 323 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 324 "/../../../" + ToolChainDir)); 325 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 326 "/../../..")); 327} 328 329void DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args, 330 ArgStringList &CmdArgs) const { 331 // Note that this routine is only used for targetting OS X. 332 333 // Derived from libgcc and lib specs but refactored. 334 if (Args.hasArg(options::OPT_static)) { 335 CmdArgs.push_back("-lgcc_static"); 336 } else { 337 if (Args.hasArg(options::OPT_static_libgcc)) { 338 CmdArgs.push_back("-lgcc_eh"); 339 } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 340 // Derived from darwin_iphoneos_libgcc spec. 341 if (isTargetIPhoneOS()) { 342 CmdArgs.push_back("-lgcc_s.1"); 343 } else { 344 CmdArgs.push_back("-lgcc_s.10.5"); 345 } 346 } else if (Args.hasArg(options::OPT_shared_libgcc) || 347 Args.hasFlag(options::OPT_fexceptions, 348 options::OPT_fno_exceptions) || 349 Args.hasArg(options::OPT_fgnu_runtime)) { 350 // FIXME: This is probably broken on 10.3? 351 if (isMacosxVersionLT(10, 5)) 352 CmdArgs.push_back("-lgcc_s.10.4"); 353 else if (isMacosxVersionLT(10, 6)) 354 CmdArgs.push_back("-lgcc_s.10.5"); 355 } else { 356 if (isMacosxVersionLT(10, 3, 9)) 357 ; // Do nothing. 358 else if (isMacosxVersionLT(10, 5)) 359 CmdArgs.push_back("-lgcc_s.10.4"); 360 else if (isMacosxVersionLT(10, 6)) 361 CmdArgs.push_back("-lgcc_s.10.5"); 362 } 363 364 if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) { 365 CmdArgs.push_back("-lgcc"); 366 CmdArgs.push_back("-lSystem"); 367 } else { 368 CmdArgs.push_back("-lSystem"); 369 CmdArgs.push_back("-lgcc"); 370 } 371 } 372} 373 374DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple) 375 : Darwin(Host, Triple) 376{ 377 getProgramPaths().push_back(getDriver().getInstalledDir()); 378 if (getDriver().getInstalledDir() != getDriver().Dir) 379 getProgramPaths().push_back(getDriver().Dir); 380 381 // We expect 'as', 'ld', etc. to be adjacent to our install dir. 382 getProgramPaths().push_back(getDriver().getInstalledDir()); 383 if (getDriver().getInstalledDir() != getDriver().Dir) 384 getProgramPaths().push_back(getDriver().Dir); 385 386 // For fallback, we need to know how to find the GCC cc1 executables, so we 387 // also add the GCC libexec paths. This is legiy code that can be removed once 388 // fallback is no longer useful. 389 std::string ToolChainDir = "i686-apple-darwin"; 390 ToolChainDir += llvm::utostr(DarwinVersion[0]); 391 ToolChainDir += "/4.2.1"; 392 393 std::string Path = getDriver().Dir; 394 Path += "/../libexec/gcc/"; 395 Path += ToolChainDir; 396 getProgramPaths().push_back(Path); 397 398 Path = "/usr/libexec/gcc/"; 399 Path += ToolChainDir; 400 getProgramPaths().push_back(Path); 401} 402 403void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args, 404 ArgStringList &CmdArgs) const { 405 // The Clang toolchain uses explicit paths for internal libraries. 406 407 // Unfortunately, we still might depend on a few of the libraries that are 408 // only available in the gcc library directory (in particular 409 // libstdc++.dylib). For now, hardcode the path to the known install location. 410 llvm::sys::Path P(getDriver().Dir); 411 P.eraseComponent(); // .../usr/bin -> ../usr 412 P.appendComponent("lib"); 413 P.appendComponent("gcc"); 414 switch (getTriple().getArch()) { 415 default: 416 assert(0 && "Invalid Darwin arch!"); 417 case llvm::Triple::x86: 418 case llvm::Triple::x86_64: 419 P.appendComponent("i686-apple-darwin10"); 420 break; 421 case llvm::Triple::arm: 422 case llvm::Triple::thumb: 423 P.appendComponent("arm-apple-darwin10"); 424 break; 425 case llvm::Triple::ppc: 426 case llvm::Triple::ppc64: 427 P.appendComponent("powerpc-apple-darwin10"); 428 break; 429 } 430 P.appendComponent("4.2.1"); 431 432 // Determine the arch specific GCC subdirectory. 433 const char *ArchSpecificDir = 0; 434 switch (getTriple().getArch()) { 435 default: 436 break; 437 case llvm::Triple::arm: 438 case llvm::Triple::thumb: { 439 std::string Triple = ComputeLLVMTriple(Args); 440 llvm::StringRef TripleStr = Triple; 441 if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5")) 442 ArchSpecificDir = "v5"; 443 else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6")) 444 ArchSpecificDir = "v6"; 445 else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7")) 446 ArchSpecificDir = "v7"; 447 break; 448 } 449 case llvm::Triple::ppc64: 450 ArchSpecificDir = "ppc64"; 451 break; 452 case llvm::Triple::x86_64: 453 ArchSpecificDir = "x86_64"; 454 break; 455 } 456 457 if (ArchSpecificDir) { 458 P.appendComponent(ArchSpecificDir); 459 if (P.exists()) 460 CmdArgs.push_back(Args.MakeArgString("-L" + P.str())); 461 P.eraseComponent(); 462 } 463 464 if (P.exists()) 465 CmdArgs.push_back(Args.MakeArgString("-L" + P.str())); 466} 467 468void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 469 ArgStringList &CmdArgs) const { 470 // Darwin doesn't support real static executables, don't link any runtime 471 // libraries with -static. 472 if (Args.hasArg(options::OPT_static)) 473 return; 474 475 // Reject -static-libgcc for now, we can deal with this when and if someone 476 // cares. This is useful in situations where someone wants to statically link 477 // something like libstdc++, and needs its runtime support routines. 478 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 479 getDriver().Diag(clang::diag::err_drv_unsupported_opt) 480 << A->getAsString(Args); 481 return; 482 } 483 484 // Otherwise link libSystem, then the dynamic runtime library, and finally any 485 // target specific static runtime library. 486 CmdArgs.push_back("-lSystem"); 487 488 // Select the dynamic runtime library and the target specific static library. 489 const char *DarwinStaticLib = 0; 490 if (isTargetIPhoneOS()) { 491 CmdArgs.push_back("-lgcc_s.1"); 492 493 // We may need some static functions for armv6/thumb which are required to 494 // be in the same linkage unit as their caller. 495 if (getDarwinArchName(Args) == "armv6") 496 DarwinStaticLib = "libclang_rt.armv6.a"; 497 } else { 498 // The dynamic runtime library was merged with libSystem for 10.6 and 499 // beyond; only 10.4 and 10.5 need an additional runtime library. 500 if (isMacosxVersionLT(10, 5)) 501 CmdArgs.push_back("-lgcc_s.10.4"); 502 else if (isMacosxVersionLT(10, 6)) 503 CmdArgs.push_back("-lgcc_s.10.5"); 504 505 // For OS X, we thought we would only need a static runtime library when 506 // targetting 10.4, to provide versions of the static functions which were 507 // omitted from 10.4.dylib. 508 // 509 // Unfortunately, that turned out to not be true, because Darwin system 510 // headers can still use eprintf on i386, and it is not exported from 511 // libSystem. Therefore, we still must provide a runtime library just for 512 // the tiny tiny handful of projects that *might* use that symbol. 513 if (isMacosxVersionLT(10, 5)) { 514 DarwinStaticLib = "libclang_rt.10.4.a"; 515 } else { 516 if (getTriple().getArch() == llvm::Triple::x86) 517 DarwinStaticLib = "libclang_rt.eprintf.a"; 518 } 519 } 520 521 /// Add the target specific static library, if needed. 522 if (DarwinStaticLib) { 523 llvm::sys::Path P(getDriver().ResourceDir); 524 P.appendComponent("lib"); 525 P.appendComponent("darwin"); 526 P.appendComponent(DarwinStaticLib); 527 528 // For now, allow missing resource libraries to support developers who may 529 // not have compiler-rt checked out or integrated into their build. 530 if (P.exists()) 531 CmdArgs.push_back(Args.MakeArgString(P.str())); 532 } 533} 534 535void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 536 const OptTable &Opts = getDriver().getOpts(); 537 538 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 539 Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 540 if (OSXVersion && iPhoneVersion) { 541 getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with) 542 << OSXVersion->getAsString(Args) 543 << iPhoneVersion->getAsString(Args); 544 iPhoneVersion = 0; 545 } else if (!OSXVersion && !iPhoneVersion) { 546 // If neither OS X nor iPhoneOS targets were specified, check for 547 // environment defines. 548 const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET"); 549 const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"); 550 551 // Ignore empty strings. 552 if (OSXTarget && OSXTarget[0] == '\0') 553 OSXTarget = 0; 554 if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0') 555 iPhoneOSTarget = 0; 556 557 // Diagnose conflicting deployment targets, and choose default platform 558 // based on the tool chain. 559 // 560 // FIXME: Don't hardcode default here. 561 if (OSXTarget && iPhoneOSTarget) { 562 // FIXME: We should see if we can get away with warning or erroring on 563 // this. Perhaps put under -pedantic? 564 if (getTriple().getArch() == llvm::Triple::arm || 565 getTriple().getArch() == llvm::Triple::thumb) 566 OSXTarget = 0; 567 else 568 iPhoneOSTarget = 0; 569 } 570 571 if (OSXTarget) { 572 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 573 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget); 574 Args.append(OSXVersion); 575 } else if (iPhoneOSTarget) { 576 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 577 iPhoneVersion = Args.MakeJoinedArg(0, O, iPhoneOSTarget); 578 Args.append(iPhoneVersion); 579 } else { 580 // Otherwise, assume we are targeting OS X. 581 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 582 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin); 583 Args.append(OSXVersion); 584 } 585 } 586 587 // Set the tool chain target information. 588 unsigned Major, Minor, Micro; 589 bool HadExtra; 590 if (OSXVersion) { 591 assert(!iPhoneVersion && "Unknown target platform!"); 592 if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor, 593 Micro, HadExtra) || HadExtra || 594 Major != 10 || Minor >= 10 || Micro >= 10) 595 getDriver().Diag(clang::diag::err_drv_invalid_version_number) 596 << OSXVersion->getAsString(Args); 597 } else { 598 assert(iPhoneVersion && "Unknown target platform!"); 599 if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor, 600 Micro, HadExtra) || HadExtra || 601 Major >= 10 || Minor >= 100 || Micro >= 100) 602 getDriver().Diag(clang::diag::err_drv_invalid_version_number) 603 << iPhoneVersion->getAsString(Args); 604 } 605 setTarget(iPhoneVersion, Major, Minor, Micro); 606} 607 608void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args, 609 ArgStringList &CmdArgs) const { 610 CXXStdlibType Type = GetCXXStdlibType(Args); 611 612 switch (Type) { 613 case ToolChain::CST_Libcxx: 614 CmdArgs.push_back("-lc++"); 615 break; 616 617 case ToolChain::CST_Libstdcxx: { 618 // Unfortunately, -lstdc++ doesn't always exist in the standard search path; 619 // it was previously found in the gcc lib dir. However, for all the Darwin 620 // platforms we care about it was -lstdc++.6, so we search for that 621 // explicitly if we can't see an obvious -lstdc++ candidate. 622 623 // Check in the sysroot first. 624 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 625 llvm::sys::Path P(A->getValue(Args)); 626 P.appendComponent("usr"); 627 P.appendComponent("lib"); 628 P.appendComponent("libstdc++.dylib"); 629 630 if (!P.exists()) { 631 P.eraseComponent(); 632 P.appendComponent("libstdc++.6.dylib"); 633 if (P.exists()) { 634 CmdArgs.push_back(Args.MakeArgString(P.str())); 635 return; 636 } 637 } 638 } 639 640 // Otherwise, look in the root. 641 if (!llvm::sys::Path("/usr/lib/libstdc++.dylib").exists() && 642 llvm::sys::Path("/usr/lib/libstdc++.6.dylib").exists()) { 643 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib"); 644 return; 645 } 646 647 // Otherwise, let the linker search. 648 CmdArgs.push_back("-lstdc++"); 649 break; 650 } 651 } 652} 653 654void DarwinClang::AddCCKextLibArgs(const ArgList &Args, 655 ArgStringList &CmdArgs) const { 656 657 // For Darwin platforms, use the compiler-rt-based support library 658 // instead of the gcc-provided one (which is also incidentally 659 // only present in the gcc lib dir, which makes it hard to find). 660 661 llvm::sys::Path P(getDriver().ResourceDir); 662 P.appendComponent("lib"); 663 P.appendComponent("darwin"); 664 P.appendComponent("libclang_rt.cc_kext.a"); 665 666 // For now, allow missing resource libraries to support developers who may 667 // not have compiler-rt checked out or integrated into their build. 668 if (P.exists()) 669 CmdArgs.push_back(Args.MakeArgString(P.str())); 670} 671 672DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, 673 const char *BoundArch) const { 674 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 675 const OptTable &Opts = getDriver().getOpts(); 676 677 // FIXME: We really want to get out of the tool chain level argument 678 // translation business, as it makes the driver functionality much 679 // more opaque. For now, we follow gcc closely solely for the 680 // purpose of easily achieving feature parity & testability. Once we 681 // have something that works, we should reevaluate each translation 682 // and try to push it down into tool specific logic. 683 684 for (ArgList::const_iterator it = Args.begin(), 685 ie = Args.end(); it != ie; ++it) { 686 Arg *A = *it; 687 688 if (A->getOption().matches(options::OPT_Xarch__)) { 689 // FIXME: Canonicalize name. 690 if (getArchName() != A->getValue(Args, 0)) 691 continue; 692 693 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1)); 694 unsigned Prev = Index; 695 Arg *XarchArg = Opts.ParseOneArg(Args, Index); 696 697 // If the argument parsing failed or more than one argument was 698 // consumed, the -Xarch_ argument's parameter tried to consume 699 // extra arguments. Emit an error and ignore. 700 // 701 // We also want to disallow any options which would alter the 702 // driver behavior; that isn't going to work in our model. We 703 // use isDriverOption() as an approximation, although things 704 // like -O4 are going to slip through. 705 if (!XarchArg || Index > Prev + 1 || 706 XarchArg->getOption().isDriverOption()) { 707 getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument) 708 << A->getAsString(Args); 709 continue; 710 } 711 712 XarchArg->setBaseArg(A); 713 A = XarchArg; 714 715 DAL->AddSynthesizedArg(A); 716 } 717 718 // Sob. These is strictly gcc compatible for the time being. Apple 719 // gcc translates options twice, which means that self-expanding 720 // options add duplicates. 721 switch ((options::ID) A->getOption().getID()) { 722 default: 723 DAL->append(A); 724 break; 725 726 case options::OPT_mkernel: 727 case options::OPT_fapple_kext: 728 DAL->append(A); 729 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 730 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 731 break; 732 733 case options::OPT_dependency_file: 734 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), 735 A->getValue(Args)); 736 break; 737 738 case options::OPT_gfull: 739 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 740 DAL->AddFlagArg(A, 741 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 742 break; 743 744 case options::OPT_gused: 745 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 746 DAL->AddFlagArg(A, 747 Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 748 break; 749 750 case options::OPT_fterminated_vtables: 751 case options::OPT_findirect_virtual_calls: 752 DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext)); 753 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 754 break; 755 756 case options::OPT_shared: 757 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 758 break; 759 760 case options::OPT_fconstant_cfstrings: 761 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 762 break; 763 764 case options::OPT_fno_constant_cfstrings: 765 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 766 break; 767 768 case options::OPT_Wnonportable_cfstrings: 769 DAL->AddFlagArg(A, 770 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 771 break; 772 773 case options::OPT_Wno_nonportable_cfstrings: 774 DAL->AddFlagArg(A, 775 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 776 break; 777 778 case options::OPT_fpascal_strings: 779 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 780 break; 781 782 case options::OPT_fno_pascal_strings: 783 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 784 break; 785 } 786 } 787 788 if (getTriple().getArch() == llvm::Triple::x86 || 789 getTriple().getArch() == llvm::Triple::x86_64) 790 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 791 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2"); 792 793 // Add the arch options based on the particular spelling of -arch, to match 794 // how the driver driver works. 795 if (BoundArch) { 796 llvm::StringRef Name = BoundArch; 797 const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); 798 const Option *MArch = Opts.getOption(options::OPT_march_EQ); 799 800 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 801 // which defines the list of which architectures we accept. 802 if (Name == "ppc") 803 ; 804 else if (Name == "ppc601") 805 DAL->AddJoinedArg(0, MCpu, "601"); 806 else if (Name == "ppc603") 807 DAL->AddJoinedArg(0, MCpu, "603"); 808 else if (Name == "ppc604") 809 DAL->AddJoinedArg(0, MCpu, "604"); 810 else if (Name == "ppc604e") 811 DAL->AddJoinedArg(0, MCpu, "604e"); 812 else if (Name == "ppc750") 813 DAL->AddJoinedArg(0, MCpu, "750"); 814 else if (Name == "ppc7400") 815 DAL->AddJoinedArg(0, MCpu, "7400"); 816 else if (Name == "ppc7450") 817 DAL->AddJoinedArg(0, MCpu, "7450"); 818 else if (Name == "ppc970") 819 DAL->AddJoinedArg(0, MCpu, "970"); 820 821 else if (Name == "ppc64") 822 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 823 824 else if (Name == "i386") 825 ; 826 else if (Name == "i486") 827 DAL->AddJoinedArg(0, MArch, "i486"); 828 else if (Name == "i586") 829 DAL->AddJoinedArg(0, MArch, "i586"); 830 else if (Name == "i686") 831 DAL->AddJoinedArg(0, MArch, "i686"); 832 else if (Name == "pentium") 833 DAL->AddJoinedArg(0, MArch, "pentium"); 834 else if (Name == "pentium2") 835 DAL->AddJoinedArg(0, MArch, "pentium2"); 836 else if (Name == "pentpro") 837 DAL->AddJoinedArg(0, MArch, "pentiumpro"); 838 else if (Name == "pentIIm3") 839 DAL->AddJoinedArg(0, MArch, "pentium2"); 840 841 else if (Name == "x86_64") 842 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 843 844 else if (Name == "arm") 845 DAL->AddJoinedArg(0, MArch, "armv4t"); 846 else if (Name == "armv4t") 847 DAL->AddJoinedArg(0, MArch, "armv4t"); 848 else if (Name == "armv5") 849 DAL->AddJoinedArg(0, MArch, "armv5tej"); 850 else if (Name == "xscale") 851 DAL->AddJoinedArg(0, MArch, "xscale"); 852 else if (Name == "armv6") 853 DAL->AddJoinedArg(0, MArch, "armv6k"); 854 else if (Name == "armv7") 855 DAL->AddJoinedArg(0, MArch, "armv7a"); 856 857 else 858 llvm_unreachable("invalid Darwin arch"); 859 } 860 861 // Add an explicit version min argument for the deployment target. We do this 862 // after argument translation because -Xarch_ arguments may add a version min 863 // argument. 864 AddDeploymentTarget(*DAL); 865 866 return DAL; 867} 868 869bool Darwin::IsUnwindTablesDefault() const { 870 // FIXME: Gross; we should probably have some separate target 871 // definition, possibly even reusing the one in clang. 872 return getArchName() == "x86_64"; 873} 874 875bool Darwin::UseDwarfDebugFlags() const { 876 if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 877 return S[0] != '\0'; 878 return false; 879} 880 881bool Darwin::UseSjLjExceptions() const { 882 // Darwin uses SjLj exceptions on ARM. 883 return (getTriple().getArch() == llvm::Triple::arm || 884 getTriple().getArch() == llvm::Triple::thumb); 885} 886 887const char *Darwin::GetDefaultRelocationModel() const { 888 return "pic"; 889} 890 891const char *Darwin::GetForcedPicModel() const { 892 if (getArchName() == "x86_64") 893 return "pic"; 894 return 0; 895} 896 897bool Darwin::SupportsObjCGC() const { 898 // Garbage collection is supported everywhere except on iPhone OS. 899 return !isTargetIPhoneOS(); 900} 901 902std::string 903Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args) const { 904 return ComputeLLVMTriple(Args); 905} 906 907/// Generic_GCC - A tool chain using the 'gcc' command to perform 908/// all subcommands; this relies on gcc translating the majority of 909/// command line options. 910 911Generic_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple) 912 : ToolChain(Host, Triple) { 913 getProgramPaths().push_back(getDriver().getInstalledDir()); 914 if (getDriver().getInstalledDir() != getDriver().Dir.c_str()) 915 getProgramPaths().push_back(getDriver().Dir); 916} 917 918Generic_GCC::~Generic_GCC() { 919 // Free tool implementations. 920 for (llvm::DenseMap<unsigned, Tool*>::iterator 921 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 922 delete it->second; 923} 924 925Tool &Generic_GCC::SelectTool(const Compilation &C, 926 const JobAction &JA) const { 927 Action::ActionClass Key; 928 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 929 Key = Action::AnalyzeJobClass; 930 else 931 Key = JA.getKind(); 932 933 Tool *&T = Tools[Key]; 934 if (!T) { 935 switch (Key) { 936 case Action::InputClass: 937 case Action::BindArchClass: 938 assert(0 && "Invalid tool kind."); 939 case Action::PreprocessJobClass: 940 T = new tools::gcc::Preprocess(*this); break; 941 case Action::PrecompileJobClass: 942 T = new tools::gcc::Precompile(*this); break; 943 case Action::AnalyzeJobClass: 944 T = new tools::Clang(*this); break; 945 case Action::CompileJobClass: 946 T = new tools::gcc::Compile(*this); break; 947 case Action::AssembleJobClass: 948 T = new tools::gcc::Assemble(*this); break; 949 case Action::LinkJobClass: 950 T = new tools::gcc::Link(*this); break; 951 952 // This is a bit ungeneric, but the only platform using a driver 953 // driver is Darwin. 954 case Action::LipoJobClass: 955 T = new tools::darwin::Lipo(*this); break; 956 case Action::DsymutilJobClass: 957 T = new tools::darwin::Dsymutil(*this); break; 958 } 959 } 960 961 return *T; 962} 963 964bool Generic_GCC::IsUnwindTablesDefault() const { 965 // FIXME: Gross; we should probably have some separate target 966 // definition, possibly even reusing the one in clang. 967 return getArchName() == "x86_64"; 968} 969 970const char *Generic_GCC::GetDefaultRelocationModel() const { 971 return "static"; 972} 973 974const char *Generic_GCC::GetForcedPicModel() const { 975 return 0; 976} 977 978/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 979/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 980/// Currently does not support anything else but compilation. 981 982TCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple) 983 : ToolChain(Host, Triple) { 984 // Path mangling to find libexec 985 std::string Path(getDriver().Dir); 986 987 Path += "/../libexec"; 988 getProgramPaths().push_back(Path); 989} 990 991TCEToolChain::~TCEToolChain() { 992 for (llvm::DenseMap<unsigned, Tool*>::iterator 993 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 994 delete it->second; 995} 996 997bool TCEToolChain::IsMathErrnoDefault() const { 998 return true; 999} 1000 1001bool TCEToolChain::IsUnwindTablesDefault() const { 1002 return false; 1003} 1004 1005const char *TCEToolChain::GetDefaultRelocationModel() const { 1006 return "static"; 1007} 1008 1009const char *TCEToolChain::GetForcedPicModel() const { 1010 return 0; 1011} 1012 1013Tool &TCEToolChain::SelectTool(const Compilation &C, 1014 const JobAction &JA) const { 1015 Action::ActionClass Key; 1016 Key = Action::AnalyzeJobClass; 1017 1018 Tool *&T = Tools[Key]; 1019 if (!T) { 1020 switch (Key) { 1021 case Action::PreprocessJobClass: 1022 T = new tools::gcc::Preprocess(*this); break; 1023 case Action::AnalyzeJobClass: 1024 T = new tools::Clang(*this); break; 1025 default: 1026 assert(false && "Unsupported action for TCE target."); 1027 } 1028 } 1029 return *T; 1030} 1031 1032/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 1033 1034OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple) 1035 : Generic_ELF(Host, Triple) { 1036 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1037 getFilePaths().push_back("/usr/lib"); 1038} 1039 1040Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 1041 Action::ActionClass Key; 1042 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1043 Key = Action::AnalyzeJobClass; 1044 else 1045 Key = JA.getKind(); 1046 1047 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1048 options::OPT_no_integrated_as, 1049 IsIntegratedAssemblerDefault()); 1050 1051 Tool *&T = Tools[Key]; 1052 if (!T) { 1053 switch (Key) { 1054 case Action::AssembleJobClass: { 1055 if (UseIntegratedAs) 1056 T = new tools::ClangAs(*this); 1057 else 1058 T = new tools::openbsd::Assemble(*this); 1059 break; 1060 } 1061 case Action::LinkJobClass: 1062 T = new tools::openbsd::Link(*this); break; 1063 default: 1064 T = &Generic_GCC::SelectTool(C, JA); 1065 } 1066 } 1067 1068 return *T; 1069} 1070 1071/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 1072 1073FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple) 1074 : Generic_ELF(Host, Triple) { 1075 1076 // Determine if we are compiling 32-bit code on an x86_64 platform. 1077 bool Lib32 = false; 1078 if (Triple.getArch() == llvm::Triple::x86 && 1079 llvm::Triple(getDriver().DefaultHostTriple).getArch() == 1080 llvm::Triple::x86_64) 1081 Lib32 = true; 1082 1083 getProgramPaths().push_back(getDriver().Dir + "/../libexec"); 1084 getProgramPaths().push_back("/usr/libexec"); 1085 if (Lib32) { 1086 getFilePaths().push_back(getDriver().Dir + "/../lib32"); 1087 getFilePaths().push_back("/usr/lib32"); 1088 } else { 1089 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1090 getFilePaths().push_back("/usr/lib"); 1091 } 1092} 1093 1094Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 1095 Action::ActionClass Key; 1096 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1097 Key = Action::AnalyzeJobClass; 1098 else 1099 Key = JA.getKind(); 1100 1101 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1102 options::OPT_no_integrated_as, 1103 IsIntegratedAssemblerDefault()); 1104 1105 Tool *&T = Tools[Key]; 1106 if (!T) { 1107 switch (Key) { 1108 case Action::AssembleJobClass: 1109 if (UseIntegratedAs) 1110 T = new tools::ClangAs(*this); 1111 else 1112 T = new tools::freebsd::Assemble(*this); 1113 break; 1114 case Action::LinkJobClass: 1115 T = new tools::freebsd::Link(*this); break; 1116 default: 1117 T = &Generic_GCC::SelectTool(C, JA); 1118 } 1119 } 1120 1121 return *T; 1122} 1123 1124/// Minix - Minix tool chain which can call as(1) and ld(1) directly. 1125 1126Minix::Minix(const HostInfo &Host, const llvm::Triple& Triple) 1127 : Generic_GCC(Host, Triple) { 1128 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1129 getFilePaths().push_back("/usr/lib"); 1130 getFilePaths().push_back("/usr/gnu/lib"); 1131 getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3"); 1132} 1133 1134Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA) const { 1135 Action::ActionClass Key; 1136 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1137 Key = Action::AnalyzeJobClass; 1138 else 1139 Key = JA.getKind(); 1140 1141 Tool *&T = Tools[Key]; 1142 if (!T) { 1143 switch (Key) { 1144 case Action::AssembleJobClass: 1145 T = new tools::minix::Assemble(*this); break; 1146 case Action::LinkJobClass: 1147 T = new tools::minix::Link(*this); break; 1148 default: 1149 T = &Generic_GCC::SelectTool(C, JA); 1150 } 1151 } 1152 1153 return *T; 1154} 1155 1156/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 1157 1158AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple) 1159 : Generic_GCC(Host, Triple) { 1160 1161 getProgramPaths().push_back(getDriver().getInstalledDir()); 1162 if (getDriver().getInstalledDir() != getDriver().Dir.c_str()) 1163 getProgramPaths().push_back(getDriver().Dir); 1164 1165 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1166 getFilePaths().push_back("/usr/lib"); 1167 getFilePaths().push_back("/usr/sfw/lib"); 1168 getFilePaths().push_back("/opt/gcc4/lib"); 1169 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 1170 1171} 1172 1173Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const { 1174 Action::ActionClass Key; 1175 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1176 Key = Action::AnalyzeJobClass; 1177 else 1178 Key = JA.getKind(); 1179 1180 Tool *&T = Tools[Key]; 1181 if (!T) { 1182 switch (Key) { 1183 case Action::AssembleJobClass: 1184 T = new tools::auroraux::Assemble(*this); break; 1185 case Action::LinkJobClass: 1186 T = new tools::auroraux::Link(*this); break; 1187 default: 1188 T = &Generic_GCC::SelectTool(C, JA); 1189 } 1190 } 1191 1192 return *T; 1193} 1194 1195 1196/// Linux toolchain (very bare-bones at the moment). 1197 1198enum LinuxDistro { 1199 DebianLenny, 1200 DebianSqueeze, 1201 Exherbo, 1202 Fedora13, 1203 Fedora14, 1204 OpenSuse11_3, 1205 UbuntuJaunty, 1206 UbuntuKarmic, 1207 UbuntuLucid, 1208 UbuntuMaverick, 1209 UnknownDistro 1210}; 1211 1212static bool IsFedora(enum LinuxDistro Distro) { 1213 return Distro == Fedora13 || Distro == Fedora14; 1214} 1215 1216static bool IsOpenSuse(enum LinuxDistro Distro) { 1217 return Distro == OpenSuse11_3; 1218} 1219 1220static bool IsDebian(enum LinuxDistro Distro) { 1221 return Distro == DebianLenny || Distro == DebianSqueeze; 1222} 1223 1224static bool IsUbuntu(enum LinuxDistro Distro) { 1225 return Distro == UbuntuLucid || Distro == UbuntuMaverick || 1226 Distro == UbuntuJaunty || Distro == UbuntuKarmic; 1227} 1228 1229static bool IsDebianBased(enum LinuxDistro Distro) { 1230 return IsDebian(Distro) || IsUbuntu(Distro); 1231} 1232 1233static bool HasMultilib(llvm::Triple::ArchType Arch, enum LinuxDistro Distro) { 1234 if (Arch == llvm::Triple::x86_64) { 1235 if (Distro == Exherbo && !llvm::sys::Path("/usr/lib32/libc.so").exists()) 1236 return false; 1237 1238 return true; 1239 } 1240 if (Arch == llvm::Triple::x86 && IsDebianBased(Distro)) 1241 return true; 1242 return false; 1243} 1244 1245static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) { 1246 llvm::OwningPtr<const llvm::MemoryBuffer> 1247 LsbRelease(llvm::MemoryBuffer::getFile("/etc/lsb-release")); 1248 if (LsbRelease) { 1249 llvm::StringRef Data = LsbRelease.get()->getBuffer(); 1250 llvm::SmallVector<llvm::StringRef, 8> Lines; 1251 Data.split(Lines, "\n"); 1252 for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) { 1253 if (Lines[i] == "DISTRIB_CODENAME=maverick") 1254 return UbuntuMaverick; 1255 else if (Lines[i] == "DISTRIB_CODENAME=lucid") 1256 return UbuntuLucid; 1257 else if (Lines[i] == "DISTRIB_CODENAME=jaunty") 1258 return UbuntuJaunty; 1259 else if (Lines[i] == "DISTRIB_CODENAME=karmic") 1260 return UbuntuKarmic; 1261 } 1262 return UnknownDistro; 1263 } 1264 1265 llvm::OwningPtr<const llvm::MemoryBuffer> 1266 RHRelease(llvm::MemoryBuffer::getFile("/etc/redhat-release")); 1267 if (RHRelease) { 1268 llvm::StringRef Data = RHRelease.get()->getBuffer(); 1269 if (Data.startswith("Fedora release 14 (Laughlin)")) 1270 return Fedora14; 1271 else if (Data.startswith("Fedora release 13 (Goddard)")) 1272 return Fedora13; 1273 return UnknownDistro; 1274 } 1275 1276 llvm::OwningPtr<const llvm::MemoryBuffer> 1277 DebianVersion(llvm::MemoryBuffer::getFile("/etc/debian_version")); 1278 if (DebianVersion) { 1279 llvm::StringRef Data = DebianVersion.get()->getBuffer(); 1280 if (Data[0] == '5') 1281 return DebianLenny; 1282 else if (Data.startswith("squeeze/sid")) 1283 return DebianSqueeze; 1284 return UnknownDistro; 1285 } 1286 1287 llvm::OwningPtr<const llvm::MemoryBuffer> 1288 SuseRelease(llvm::MemoryBuffer::getFile("/etc/SuSE-release")); 1289 if (SuseRelease) { 1290 llvm::StringRef Data = SuseRelease.get()->getBuffer(); 1291 if (Data.startswith("openSUSE 11.3")) 1292 return OpenSuse11_3; 1293 return UnknownDistro; 1294 } 1295 1296 if (llvm::sys::Path("/etc/exherbo-release").exists()) 1297 return Exherbo; 1298 1299 return UnknownDistro; 1300} 1301 1302Linux::Linux(const HostInfo &Host, const llvm::Triple& Triple) 1303 : Generic_ELF(Host, Triple) { 1304 llvm::Triple::ArchType Arch = 1305 llvm::Triple(getDriver().DefaultHostTriple).getArch(); 1306 1307 std::string Suffix32 = ""; 1308 if (Arch == llvm::Triple::x86_64) 1309 Suffix32 = "/32"; 1310 1311 std::string Suffix64 = ""; 1312 if (Arch == llvm::Triple::x86) 1313 Suffix64 = "/64"; 1314 1315 std::string Lib32 = "lib"; 1316 1317 if ( llvm::sys::Path("/lib32").exists()) 1318 Lib32 = "lib32"; 1319 1320 std::string Lib64 = "lib"; 1321 llvm::sys::Path Lib64Path("/lib64"); 1322 if (Lib64Path.exists() && !Lib64Path.isSymLink()) 1323 Lib64 = "lib64"; 1324 1325 std::string GccTriple = ""; 1326 if (Arch == llvm::Triple::arm) { 1327 if (llvm::sys::Path("/usr/lib/gcc/arm-linux-gnueabi").exists()) 1328 GccTriple = "arm-linux-gnueabi"; 1329 } else if (Arch == llvm::Triple::x86_64) { 1330 if (llvm::sys::Path("/usr/lib/gcc/x86_64-linux-gnu").exists()) 1331 GccTriple = "x86_64-linux-gnu"; 1332 else if (llvm::sys::Path("/usr/lib/gcc/x86_64-unknown-linux-gnu").exists()) 1333 GccTriple = "x86_64-unknown-linux-gnu"; 1334 else if (llvm::sys::Path("/usr/lib/gcc/x86_64-pc-linux-gnu").exists()) 1335 GccTriple = "x86_64-pc-linux-gnu"; 1336 else if (llvm::sys::Path("/usr/lib/gcc/x86_64-redhat-linux").exists()) 1337 GccTriple = "x86_64-redhat-linux"; 1338 else if (llvm::sys::Path("/usr/lib64/gcc/x86_64-suse-linux").exists()) 1339 GccTriple = "x86_64-suse-linux"; 1340 } else if (Arch == llvm::Triple::x86) { 1341 if (llvm::sys::Path("/usr/lib/gcc/i686-linux-gnu").exists()) 1342 GccTriple = "i686-linux-gnu"; 1343 if (llvm::sys::Path("/usr/lib/gcc/i686-pc-linux-gnu").exists()) 1344 GccTriple = "i686-pc-linux-gnu"; 1345 else if (llvm::sys::Path("/usr/lib/gcc/i486-linux-gnu").exists()) 1346 GccTriple = "i486-linux-gnu"; 1347 else if (llvm::sys::Path("/usr/lib/gcc/i686-redhat-linux").exists()) 1348 GccTriple = "i686-redhat-linux"; 1349 else if (llvm::sys::Path("/usr/lib/gcc/i586-suse-linux").exists()) 1350 GccTriple = "i586-suse-linux"; 1351 } 1352 1353 const char* GccVersions[] = {"4.5.1", "4.5", "4.4.5", "4.4.4", "4.4.3", "4.4", 1354 "4.3.4", "4.3.3", "4.3.2"}; 1355 std::string Base = ""; 1356 for (unsigned i = 0; i < sizeof(GccVersions)/sizeof(char*); ++i) { 1357 std::string Suffix = GccTriple + "/" + GccVersions[i]; 1358 std::string t1 = "/usr/lib/gcc/" + Suffix; 1359 if (llvm::sys::Path(t1 + "/crtbegin.o").exists()) { 1360 Base = t1; 1361 break; 1362 } 1363 std::string t2 = "/usr/lib64/gcc/" + Suffix; 1364 if (llvm::sys::Path(t2 + "/crtbegin.o").exists()) { 1365 Base = t2; 1366 break; 1367 } 1368 } 1369 1370 path_list &Paths = getFilePaths(); 1371 bool Is32Bits = getArch() == llvm::Triple::x86; 1372 1373 std::string Suffix; 1374 std::string Lib; 1375 1376 if (Is32Bits) { 1377 Suffix = Suffix32; 1378 Lib = Lib32; 1379 } else { 1380 Suffix = Suffix64; 1381 Lib = Lib64; 1382 } 1383 1384 llvm::sys::Path LinkerPath(Base + "/../../../../" + GccTriple + "/bin/ld"); 1385 if (LinkerPath.exists()) 1386 Linker = LinkerPath.str(); 1387 else 1388 Linker = GetProgramPath("ld"); 1389 1390 LinuxDistro Distro = DetectLinuxDistro(Arch); 1391 1392 if (IsUbuntu(Distro)) { 1393 ExtraOpts.push_back("-z"); 1394 ExtraOpts.push_back("relro"); 1395 } 1396 1397 if (Arch == llvm::Triple::arm) 1398 ExtraOpts.push_back("-X"); 1399 1400 if (IsFedora(Distro) || Distro == UbuntuMaverick) 1401 ExtraOpts.push_back("--hash-style=gnu"); 1402 1403 if (IsDebian(Distro) || Distro == UbuntuLucid || Distro == UbuntuJaunty || 1404 Distro == UbuntuKarmic) 1405 ExtraOpts.push_back("--hash-style=both"); 1406 1407 if (IsFedora(Distro)) 1408 ExtraOpts.push_back("--no-add-needed"); 1409 1410 if (Distro == DebianSqueeze || IsOpenSuse(Distro) || 1411 IsFedora(Distro) || Distro == UbuntuLucid || Distro == UbuntuMaverick || 1412 Distro == UbuntuKarmic) 1413 ExtraOpts.push_back("--build-id"); 1414 1415 Paths.push_back(Base + Suffix); 1416 if (HasMultilib(Arch, Distro)) { 1417 if (IsOpenSuse(Distro) && Is32Bits) 1418 Paths.push_back(Base + "/../../../../" + GccTriple + "/lib/../lib"); 1419 Paths.push_back(Base + "/../../../../" + Lib); 1420 Paths.push_back("/lib/../" + Lib); 1421 Paths.push_back("/usr/lib/../" + Lib); 1422 } 1423 if (!Suffix.empty()) 1424 Paths.push_back(Base); 1425 if (IsOpenSuse(Distro)) 1426 Paths.push_back(Base + "/../../../../" + GccTriple + "/lib"); 1427 Paths.push_back(Base + "/../../.."); 1428 if (Arch == getArch() && IsUbuntu(Distro)) 1429 Paths.push_back("/usr/lib/" + GccTriple); 1430} 1431 1432bool Linux::HasNativeLLVMSupport() const { 1433 return true; 1434} 1435 1436Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA) const { 1437 Action::ActionClass Key; 1438 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1439 Key = Action::AnalyzeJobClass; 1440 else 1441 Key = JA.getKind(); 1442 1443 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1444 options::OPT_no_integrated_as, 1445 IsIntegratedAssemblerDefault()); 1446 1447 Tool *&T = Tools[Key]; 1448 if (!T) { 1449 switch (Key) { 1450 case Action::AssembleJobClass: 1451 if (UseIntegratedAs) 1452 T = new tools::ClangAs(*this); 1453 else 1454 T = new tools::linuxtools::Assemble(*this); 1455 break; 1456 case Action::LinkJobClass: 1457 T = new tools::linuxtools::Link(*this); break; 1458 default: 1459 T = &Generic_GCC::SelectTool(C, JA); 1460 } 1461 } 1462 1463 return *T; 1464} 1465 1466/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 1467 1468DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple) 1469 : Generic_ELF(Host, Triple) { 1470 1471 // Path mangling to find libexec 1472 getProgramPaths().push_back(getDriver().getInstalledDir()); 1473 if (getDriver().getInstalledDir() != getDriver().Dir.c_str()) 1474 getProgramPaths().push_back(getDriver().Dir); 1475 1476 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1477 getFilePaths().push_back("/usr/lib"); 1478 getFilePaths().push_back("/usr/lib/gcc41"); 1479} 1480 1481Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const { 1482 Action::ActionClass Key; 1483 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1484 Key = Action::AnalyzeJobClass; 1485 else 1486 Key = JA.getKind(); 1487 1488 Tool *&T = Tools[Key]; 1489 if (!T) { 1490 switch (Key) { 1491 case Action::AssembleJobClass: 1492 T = new tools::dragonfly::Assemble(*this); break; 1493 case Action::LinkJobClass: 1494 T = new tools::dragonfly::Link(*this); break; 1495 default: 1496 T = &Generic_GCC::SelectTool(C, JA); 1497 } 1498 } 1499 1500 return *T; 1501} 1502 1503Windows::Windows(const HostInfo &Host, const llvm::Triple& Triple) 1504 : ToolChain(Host, Triple) { 1505} 1506 1507Tool &Windows::SelectTool(const Compilation &C, const JobAction &JA) const { 1508 Action::ActionClass Key; 1509 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1510 Key = Action::AnalyzeJobClass; 1511 else 1512 Key = JA.getKind(); 1513 1514 Tool *&T = Tools[Key]; 1515 if (!T) { 1516 switch (Key) { 1517 case Action::InputClass: 1518 case Action::BindArchClass: 1519 case Action::LipoJobClass: 1520 case Action::DsymutilJobClass: 1521 assert(0 && "Invalid tool kind."); 1522 case Action::PreprocessJobClass: 1523 case Action::PrecompileJobClass: 1524 case Action::AnalyzeJobClass: 1525 case Action::CompileJobClass: 1526 T = new tools::Clang(*this); break; 1527 case Action::AssembleJobClass: 1528 T = new tools::ClangAs(*this); break; 1529 case Action::LinkJobClass: 1530 T = new tools::visualstudio::Link(*this); break; 1531 } 1532 } 1533 1534 return *T; 1535} 1536 1537bool Windows::IsIntegratedAssemblerDefault() const { 1538 return true; 1539} 1540 1541bool Windows::IsUnwindTablesDefault() const { 1542 // FIXME: Gross; we should probably have some separate target 1543 // definition, possibly even reusing the one in clang. 1544 return getArchName() == "x86_64"; 1545} 1546 1547const char *Windows::GetDefaultRelocationModel() const { 1548 return "static"; 1549} 1550 1551const char *Windows::GetForcedPicModel() const { 1552 if (getArchName() == "x86_64") 1553 return "pic"; 1554 return 0; 1555} 1556