ToolChains.cpp revision 210299
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 22#include "llvm/ADT/StringExtras.h" 23#include "llvm/Support/ErrorHandling.h" 24#include "llvm/Support/raw_ostream.h" 25#include "llvm/System/Path.h" 26 27#include <cstdlib> // ::getenv 28 29using namespace clang::driver; 30using namespace clang::driver::toolchains; 31 32/// Darwin - Darwin tool chain for i386 and x86_64. 33 34Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple, 35 const unsigned (&_DarwinVersion)[3]) 36 : ToolChain(Host, Triple), TargetInitialized(false) 37{ 38 llvm::raw_string_ostream(MacosxVersionMin) 39 << "10." << std::max(0, (int)_DarwinVersion[0] - 4) << '.' 40 << _DarwinVersion[1]; 41} 42 43// FIXME: Can we tablegen this? 44static const char *GetArmArchForMArch(llvm::StringRef Value) { 45 if (Value == "armv6k") 46 return "armv6"; 47 48 if (Value == "armv5tej") 49 return "armv5"; 50 51 if (Value == "xscale") 52 return "xscale"; 53 54 if (Value == "armv4t") 55 return "armv4t"; 56 57 if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 58 Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 59 Value == "armv7m") 60 return "armv7"; 61 62 return 0; 63} 64 65// FIXME: Can we tablegen this? 66static const char *GetArmArchForMCpu(llvm::StringRef Value) { 67 if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 68 Value == "arm946e-s" || Value == "arm966e-s" || 69 Value == "arm968e-s" || Value == "arm10e" || 70 Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 71 Value == "arm1026ej-s") 72 return "armv5"; 73 74 if (Value == "xscale") 75 return "xscale"; 76 77 if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 78 Value == "arm1176jz-s" || Value == "arm1176jzf-s") 79 return "armv6"; 80 81 if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 82 return "armv7"; 83 84 return 0; 85} 86 87llvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const { 88 switch (getTriple().getArch()) { 89 default: 90 return getArchName(); 91 92 case llvm::Triple::arm: { 93 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 94 if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) 95 return Arch; 96 97 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 98 if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) 99 return Arch; 100 101 return "arm"; 102 } 103 } 104} 105 106DarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple, 107 const unsigned (&DarwinVersion)[3], 108 const unsigned (&_GCCVersion)[3]) 109 : Darwin(Host, Triple, DarwinVersion) 110{ 111 GCCVersion[0] = _GCCVersion[0]; 112 GCCVersion[1] = _GCCVersion[1]; 113 GCCVersion[2] = _GCCVersion[2]; 114 115 // Set up the tool chain paths to match gcc. 116 ToolChainDir = "i686-apple-darwin"; 117 ToolChainDir += llvm::utostr(DarwinVersion[0]); 118 ToolChainDir += "/"; 119 ToolChainDir += llvm::utostr(GCCVersion[0]); 120 ToolChainDir += '.'; 121 ToolChainDir += llvm::utostr(GCCVersion[1]); 122 ToolChainDir += '.'; 123 ToolChainDir += llvm::utostr(GCCVersion[2]); 124 125 // Try the next major version if that tool chain dir is invalid. 126 std::string Tmp = "/usr/lib/gcc/" + ToolChainDir; 127 if (!llvm::sys::Path(Tmp).exists()) { 128 std::string Next = "i686-apple-darwin"; 129 Next += llvm::utostr(DarwinVersion[0] + 1); 130 Next += "/"; 131 Next += llvm::utostr(GCCVersion[0]); 132 Next += '.'; 133 Next += llvm::utostr(GCCVersion[1]); 134 Next += '.'; 135 Next += llvm::utostr(GCCVersion[2]); 136 137 // Use that if it exists, otherwise hope the user isn't linking. 138 // 139 // FIXME: Drop dependency on gcc's tool chain. 140 Tmp = "/usr/lib/gcc/" + Next; 141 if (llvm::sys::Path(Tmp).exists()) 142 ToolChainDir = Next; 143 } 144 145 std::string Path; 146 if (getArchName() == "x86_64") { 147 Path = getDriver().Dir; 148 Path += "/../lib/gcc/"; 149 Path += ToolChainDir; 150 Path += "/x86_64"; 151 getFilePaths().push_back(Path); 152 153 Path = "/usr/lib/gcc/"; 154 Path += ToolChainDir; 155 Path += "/x86_64"; 156 getFilePaths().push_back(Path); 157 } 158 159 Path = getDriver().Dir; 160 Path += "/../lib/gcc/"; 161 Path += ToolChainDir; 162 getFilePaths().push_back(Path); 163 164 Path = "/usr/lib/gcc/"; 165 Path += ToolChainDir; 166 getFilePaths().push_back(Path); 167 168 Path = getDriver().Dir; 169 Path += "/../libexec/gcc/"; 170 Path += ToolChainDir; 171 getProgramPaths().push_back(Path); 172 173 Path = "/usr/libexec/gcc/"; 174 Path += ToolChainDir; 175 getProgramPaths().push_back(Path); 176 177 getProgramPaths().push_back(getDriver().Dir); 178} 179 180Darwin::~Darwin() { 181 // Free tool implementations. 182 for (llvm::DenseMap<unsigned, Tool*>::iterator 183 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 184 delete it->second; 185} 186 187Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const { 188 Action::ActionClass Key; 189 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 190 Key = Action::AnalyzeJobClass; 191 else 192 Key = JA.getKind(); 193 194 // FIXME: This doesn't belong here, but ideally we will support static soon 195 // anyway. 196 bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) || 197 C.getArgs().hasArg(options::OPT_static) || 198 C.getArgs().hasArg(options::OPT_fapple_kext)); 199 bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic; 200 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 201 options::OPT_no_integrated_as, 202 IsIADefault); 203 204 Tool *&T = Tools[Key]; 205 if (!T) { 206 switch (Key) { 207 case Action::InputClass: 208 case Action::BindArchClass: 209 assert(0 && "Invalid tool kind."); 210 case Action::PreprocessJobClass: 211 T = new tools::darwin::Preprocess(*this); break; 212 case Action::AnalyzeJobClass: 213 T = new tools::Clang(*this); break; 214 case Action::PrecompileJobClass: 215 case Action::CompileJobClass: 216 T = new tools::darwin::Compile(*this); break; 217 case Action::AssembleJobClass: { 218 if (UseIntegratedAs) 219 T = new tools::ClangAs(*this); 220 else 221 T = new tools::darwin::Assemble(*this); 222 break; 223 } 224 case Action::LinkJobClass: 225 T = new tools::darwin::Link(*this); break; 226 case Action::LipoJobClass: 227 T = new tools::darwin::Lipo(*this); break; 228 case Action::DsymutilJobClass: 229 T = new tools::darwin::Dsymutil(*this); break; 230 } 231 } 232 233 return *T; 234} 235 236void DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args, 237 ArgStringList &CmdArgs) const { 238 std::string Tmp; 239 240 // FIXME: Derive these correctly. 241 if (getArchName() == "x86_64") { 242 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 243 "/x86_64")); 244 // Intentionally duplicated for (temporary) gcc bug compatibility. 245 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 246 "/x86_64")); 247 } 248 249 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir)); 250 251 Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir; 252 if (llvm::sys::Path(Tmp).exists()) 253 CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 254 Tmp = getDriver().Dir + "/../lib/gcc"; 255 if (llvm::sys::Path(Tmp).exists()) 256 CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 257 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 258 // Intentionally duplicated for (temporary) gcc bug compatibility. 259 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 260 Tmp = getDriver().Dir + "/../lib/" + ToolChainDir; 261 if (llvm::sys::Path(Tmp).exists()) 262 CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 263 Tmp = getDriver().Dir + "/../lib"; 264 if (llvm::sys::Path(Tmp).exists()) 265 CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 266 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 267 "/../../../" + ToolChainDir)); 268 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 269 "/../../..")); 270} 271 272void DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args, 273 ArgStringList &CmdArgs) const { 274 // Note that this routine is only used for targetting OS X. 275 276 // Derived from libgcc and lib specs but refactored. 277 if (Args.hasArg(options::OPT_static)) { 278 CmdArgs.push_back("-lgcc_static"); 279 } else { 280 if (Args.hasArg(options::OPT_static_libgcc)) { 281 CmdArgs.push_back("-lgcc_eh"); 282 } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 283 // Derived from darwin_iphoneos_libgcc spec. 284 if (isTargetIPhoneOS()) { 285 CmdArgs.push_back("-lgcc_s.1"); 286 } else { 287 CmdArgs.push_back("-lgcc_s.10.5"); 288 } 289 } else if (Args.hasArg(options::OPT_shared_libgcc) || 290 Args.hasFlag(options::OPT_fexceptions, 291 options::OPT_fno_exceptions) || 292 Args.hasArg(options::OPT_fgnu_runtime)) { 293 // FIXME: This is probably broken on 10.3? 294 if (isMacosxVersionLT(10, 5)) 295 CmdArgs.push_back("-lgcc_s.10.4"); 296 else if (isMacosxVersionLT(10, 6)) 297 CmdArgs.push_back("-lgcc_s.10.5"); 298 } else { 299 if (isMacosxVersionLT(10, 3, 9)) 300 ; // Do nothing. 301 else if (isMacosxVersionLT(10, 5)) 302 CmdArgs.push_back("-lgcc_s.10.4"); 303 else if (isMacosxVersionLT(10, 6)) 304 CmdArgs.push_back("-lgcc_s.10.5"); 305 } 306 307 if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) { 308 CmdArgs.push_back("-lgcc"); 309 CmdArgs.push_back("-lSystem"); 310 } else { 311 CmdArgs.push_back("-lSystem"); 312 CmdArgs.push_back("-lgcc"); 313 } 314 } 315} 316 317DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple, 318 const unsigned (&DarwinVersion)[3]) 319 : Darwin(Host, Triple, DarwinVersion) 320{ 321 // We expect 'as', 'ld', etc. to be adjacent to our install dir. 322 getProgramPaths().push_back(getDriver().Dir); 323} 324 325void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args, 326 ArgStringList &CmdArgs) const { 327 // The Clang toolchain uses explicit paths for internal libraries. 328 329 // Unfortunately, we still might depend on a few of the libraries that are 330 // only available in the gcc library directory (in particular 331 // libstdc++.dylib). For now, hardcode the path to the known install location. 332 llvm::sys::Path P(getDriver().Dir); 333 P.eraseComponent(); // .../usr/bin -> ../usr 334 P.appendComponent("lib"); 335 P.appendComponent("gcc"); 336 switch (getTriple().getArch()) { 337 default: 338 assert(0 && "Invalid Darwin arch!"); 339 case llvm::Triple::x86: 340 case llvm::Triple::x86_64: 341 P.appendComponent("i686-apple-darwin10"); 342 break; 343 case llvm::Triple::arm: 344 case llvm::Triple::thumb: 345 P.appendComponent("arm-apple-darwin10"); 346 break; 347 case llvm::Triple::ppc: 348 case llvm::Triple::ppc64: 349 P.appendComponent("powerpc-apple-darwin10"); 350 break; 351 } 352 P.appendComponent("4.2.1"); 353 if (P.exists()) 354 CmdArgs.push_back(Args.MakeArgString("-L" + P.str())); 355} 356 357void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 358 ArgStringList &CmdArgs) const { 359 // Darwin doesn't support real static executables, don't link any runtime 360 // libraries with -static. 361 if (Args.hasArg(options::OPT_static)) 362 return; 363 364 // Reject -static-libgcc for now, we can deal with this when and if someone 365 // cares. This is useful in situations where someone wants to statically link 366 // something like libstdc++, and needs its runtime support routines. 367 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 368 getDriver().Diag(clang::diag::err_drv_unsupported_opt) 369 << A->getAsString(Args); 370 return; 371 } 372 373 // Otherwise link libSystem, then the dynamic runtime library, and finally any 374 // target specific static runtime library. 375 CmdArgs.push_back("-lSystem"); 376 377 // Select the dynamic runtime library and the target specific static library. 378 const char *DarwinStaticLib = 0; 379 if (isTargetIPhoneOS()) { 380 CmdArgs.push_back("-lgcc_s.1"); 381 382 // We may need some static functions for armv6/thumb which are required to 383 // be in the same linkage unit as their caller. 384 if (getDarwinArchName(Args) == "armv6") 385 DarwinStaticLib = "libclang_rt.armv6.a"; 386 } else { 387 // The dynamic runtime library was merged with libSystem for 10.6 and 388 // beyond; only 10.4 and 10.5 need an additional runtime library. 389 if (isMacosxVersionLT(10, 5)) 390 CmdArgs.push_back("-lgcc_s.10.4"); 391 else if (isMacosxVersionLT(10, 6)) 392 CmdArgs.push_back("-lgcc_s.10.5"); 393 394 // For OS X, we only need a static runtime library when targetting 10.4, to 395 // provide versions of the static functions which were omitted from 396 // 10.4.dylib. 397 if (isMacosxVersionLT(10, 5)) 398 DarwinStaticLib = "libclang_rt.10.4.a"; 399 } 400 401 /// Add the target specific static library, if needed. 402 if (DarwinStaticLib) { 403 llvm::sys::Path P(getDriver().ResourceDir); 404 P.appendComponent("lib"); 405 P.appendComponent("darwin"); 406 P.appendComponent(DarwinStaticLib); 407 408 // For now, allow missing resource libraries to support developers who may 409 // not have compiler-rt checked out or integrated into their build. 410 if (!P.exists()) 411 getDriver().Diag(clang::diag::warn_drv_missing_resource_library) 412 << P.str(); 413 else 414 CmdArgs.push_back(Args.MakeArgString(P.str())); 415 } 416} 417 418DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, 419 const char *BoundArch) const { 420 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 421 const OptTable &Opts = getDriver().getOpts(); 422 423 // FIXME: We really want to get out of the tool chain level argument 424 // translation business, as it makes the driver functionality much 425 // more opaque. For now, we follow gcc closely solely for the 426 // purpose of easily achieving feature parity & testability. Once we 427 // have something that works, we should reevaluate each translation 428 // and try to push it down into tool specific logic. 429 430 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 431 Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 432 if (OSXVersion && iPhoneVersion) { 433 getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with) 434 << OSXVersion->getAsString(Args) 435 << iPhoneVersion->getAsString(Args); 436 iPhoneVersion = 0; 437 } else if (!OSXVersion && !iPhoneVersion) { 438 // If neither OS X nor iPhoneOS targets were specified, check for 439 // environment defines. 440 const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET"); 441 const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"); 442 443 // Ignore empty strings. 444 if (OSXTarget && OSXTarget[0] == '\0') 445 OSXTarget = 0; 446 if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0') 447 iPhoneOSTarget = 0; 448 449 // Diagnose conflicting deployment targets, and choose default platform 450 // based on the tool chain. 451 // 452 // FIXME: Don't hardcode default here. 453 if (OSXTarget && iPhoneOSTarget) { 454 // FIXME: We should see if we can get away with warning or erroring on 455 // this. Perhaps put under -pedantic? 456 if (getTriple().getArch() == llvm::Triple::arm || 457 getTriple().getArch() == llvm::Triple::thumb) 458 OSXTarget = 0; 459 else 460 iPhoneOSTarget = 0; 461 } 462 463 if (OSXTarget) { 464 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 465 OSXVersion = DAL->MakeJoinedArg(0, O, OSXTarget); 466 DAL->append(OSXVersion); 467 } else if (iPhoneOSTarget) { 468 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 469 iPhoneVersion = DAL->MakeJoinedArg(0, O, iPhoneOSTarget); 470 DAL->append(iPhoneVersion); 471 } else { 472 // Otherwise, assume we are targeting OS X. 473 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 474 OSXVersion = DAL->MakeJoinedArg(0, O, MacosxVersionMin); 475 DAL->append(OSXVersion); 476 } 477 } 478 479 // Set the tool chain target information. 480 unsigned Major, Minor, Micro; 481 bool HadExtra; 482 if (OSXVersion) { 483 assert(!iPhoneVersion && "Unknown target platform!"); 484 if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor, 485 Micro, HadExtra) || HadExtra || 486 Major != 10 || Minor >= 10 || Micro >= 10) 487 getDriver().Diag(clang::diag::err_drv_invalid_version_number) 488 << OSXVersion->getAsString(Args); 489 } else { 490 assert(iPhoneVersion && "Unknown target platform!"); 491 if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor, 492 Micro, HadExtra) || HadExtra || 493 Major >= 10 || Minor >= 100 || Micro >= 100) 494 getDriver().Diag(clang::diag::err_drv_invalid_version_number) 495 << iPhoneVersion->getAsString(Args); 496 } 497 setTarget(iPhoneVersion, Major, Minor, Micro); 498 499 for (ArgList::const_iterator it = Args.begin(), 500 ie = Args.end(); it != ie; ++it) { 501 Arg *A = *it; 502 503 if (A->getOption().matches(options::OPT_Xarch__)) { 504 // FIXME: Canonicalize name. 505 if (getArchName() != A->getValue(Args, 0)) 506 continue; 507 508 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1)); 509 unsigned Prev = Index; 510 Arg *XarchArg = Opts.ParseOneArg(Args, Index); 511 512 // If the argument parsing failed or more than one argument was 513 // consumed, the -Xarch_ argument's parameter tried to consume 514 // extra arguments. Emit an error and ignore. 515 // 516 // We also want to disallow any options which would alter the 517 // driver behavior; that isn't going to work in our model. We 518 // use isDriverOption() as an approximation, although things 519 // like -O4 are going to slip through. 520 if (!XarchArg || Index > Prev + 1 || 521 XarchArg->getOption().isDriverOption()) { 522 getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument) 523 << A->getAsString(Args); 524 continue; 525 } 526 527 XarchArg->setBaseArg(A); 528 A = XarchArg; 529 530 DAL->AddSynthesizedArg(A); 531 } 532 533 // Sob. These is strictly gcc compatible for the time being. Apple 534 // gcc translates options twice, which means that self-expanding 535 // options add duplicates. 536 switch ((options::ID) A->getOption().getID()) { 537 default: 538 DAL->append(A); 539 break; 540 541 case options::OPT_mkernel: 542 case options::OPT_fapple_kext: 543 DAL->append(A); 544 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 545 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 546 break; 547 548 case options::OPT_dependency_file: 549 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), 550 A->getValue(Args)); 551 break; 552 553 case options::OPT_gfull: 554 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 555 DAL->AddFlagArg(A, 556 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 557 break; 558 559 case options::OPT_gused: 560 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 561 DAL->AddFlagArg(A, 562 Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 563 break; 564 565 case options::OPT_fterminated_vtables: 566 case options::OPT_findirect_virtual_calls: 567 DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext)); 568 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 569 break; 570 571 case options::OPT_shared: 572 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 573 break; 574 575 case options::OPT_fconstant_cfstrings: 576 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 577 break; 578 579 case options::OPT_fno_constant_cfstrings: 580 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 581 break; 582 583 case options::OPT_Wnonportable_cfstrings: 584 DAL->AddFlagArg(A, 585 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 586 break; 587 588 case options::OPT_Wno_nonportable_cfstrings: 589 DAL->AddFlagArg(A, 590 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 591 break; 592 593 case options::OPT_fpascal_strings: 594 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 595 break; 596 597 case options::OPT_fno_pascal_strings: 598 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 599 break; 600 } 601 } 602 603 if (getTriple().getArch() == llvm::Triple::x86 || 604 getTriple().getArch() == llvm::Triple::x86_64) 605 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 606 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2"); 607 608 // Add the arch options based on the particular spelling of -arch, to match 609 // how the driver driver works. 610 if (BoundArch) { 611 llvm::StringRef Name = BoundArch; 612 const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); 613 const Option *MArch = Opts.getOption(options::OPT_march_EQ); 614 615 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 616 // which defines the list of which architectures we accept. 617 if (Name == "ppc") 618 ; 619 else if (Name == "ppc601") 620 DAL->AddJoinedArg(0, MCpu, "601"); 621 else if (Name == "ppc603") 622 DAL->AddJoinedArg(0, MCpu, "603"); 623 else if (Name == "ppc604") 624 DAL->AddJoinedArg(0, MCpu, "604"); 625 else if (Name == "ppc604e") 626 DAL->AddJoinedArg(0, MCpu, "604e"); 627 else if (Name == "ppc750") 628 DAL->AddJoinedArg(0, MCpu, "750"); 629 else if (Name == "ppc7400") 630 DAL->AddJoinedArg(0, MCpu, "7400"); 631 else if (Name == "ppc7450") 632 DAL->AddJoinedArg(0, MCpu, "7450"); 633 else if (Name == "ppc970") 634 DAL->AddJoinedArg(0, MCpu, "970"); 635 636 else if (Name == "ppc64") 637 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 638 639 else if (Name == "i386") 640 ; 641 else if (Name == "i486") 642 DAL->AddJoinedArg(0, MArch, "i486"); 643 else if (Name == "i586") 644 DAL->AddJoinedArg(0, MArch, "i586"); 645 else if (Name == "i686") 646 DAL->AddJoinedArg(0, MArch, "i686"); 647 else if (Name == "pentium") 648 DAL->AddJoinedArg(0, MArch, "pentium"); 649 else if (Name == "pentium2") 650 DAL->AddJoinedArg(0, MArch, "pentium2"); 651 else if (Name == "pentpro") 652 DAL->AddJoinedArg(0, MArch, "pentiumpro"); 653 else if (Name == "pentIIm3") 654 DAL->AddJoinedArg(0, MArch, "pentium2"); 655 656 else if (Name == "x86_64") 657 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 658 659 else if (Name == "arm") 660 DAL->AddJoinedArg(0, MArch, "armv4t"); 661 else if (Name == "armv4t") 662 DAL->AddJoinedArg(0, MArch, "armv4t"); 663 else if (Name == "armv5") 664 DAL->AddJoinedArg(0, MArch, "armv5tej"); 665 else if (Name == "xscale") 666 DAL->AddJoinedArg(0, MArch, "xscale"); 667 else if (Name == "armv6") 668 DAL->AddJoinedArg(0, MArch, "armv6k"); 669 else if (Name == "armv7") 670 DAL->AddJoinedArg(0, MArch, "armv7a"); 671 672 else 673 llvm_unreachable("invalid Darwin arch"); 674 } 675 676 return DAL; 677} 678 679bool Darwin::IsUnwindTablesDefault() const { 680 // FIXME: Gross; we should probably have some separate target 681 // definition, possibly even reusing the one in clang. 682 return getArchName() == "x86_64"; 683} 684 685bool Darwin::UseDwarfDebugFlags() const { 686 if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 687 return S[0] != '\0'; 688 return false; 689} 690 691bool Darwin::UseSjLjExceptions() const { 692 // Darwin uses SjLj exceptions on ARM. 693 return (getTriple().getArch() == llvm::Triple::arm || 694 getTriple().getArch() == llvm::Triple::thumb); 695} 696 697const char *Darwin::GetDefaultRelocationModel() const { 698 return "pic"; 699} 700 701const char *Darwin::GetForcedPicModel() const { 702 if (getArchName() == "x86_64") 703 return "pic"; 704 return 0; 705} 706 707bool Darwin::SupportsObjCGC() const { 708 // Garbage collection is supported everywhere except on iPhone OS. 709 return !isTargetIPhoneOS(); 710} 711 712/// Generic_GCC - A tool chain using the 'gcc' command to perform 713/// all subcommands; this relies on gcc translating the majority of 714/// command line options. 715 716Generic_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple) 717 : ToolChain(Host, Triple) { 718 getProgramPaths().push_back(getDriver().Dir); 719} 720 721Generic_GCC::~Generic_GCC() { 722 // Free tool implementations. 723 for (llvm::DenseMap<unsigned, Tool*>::iterator 724 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 725 delete it->second; 726} 727 728Tool &Generic_GCC::SelectTool(const Compilation &C, 729 const JobAction &JA) const { 730 Action::ActionClass Key; 731 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 732 Key = Action::AnalyzeJobClass; 733 else 734 Key = JA.getKind(); 735 736 Tool *&T = Tools[Key]; 737 if (!T) { 738 switch (Key) { 739 case Action::InputClass: 740 case Action::BindArchClass: 741 assert(0 && "Invalid tool kind."); 742 case Action::PreprocessJobClass: 743 T = new tools::gcc::Preprocess(*this); break; 744 case Action::PrecompileJobClass: 745 T = new tools::gcc::Precompile(*this); break; 746 case Action::AnalyzeJobClass: 747 T = new tools::Clang(*this); break; 748 case Action::CompileJobClass: 749 T = new tools::gcc::Compile(*this); break; 750 case Action::AssembleJobClass: 751 T = new tools::gcc::Assemble(*this); break; 752 case Action::LinkJobClass: 753 T = new tools::gcc::Link(*this); break; 754 755 // This is a bit ungeneric, but the only platform using a driver 756 // driver is Darwin. 757 case Action::LipoJobClass: 758 T = new tools::darwin::Lipo(*this); break; 759 case Action::DsymutilJobClass: 760 T = new tools::darwin::Dsymutil(*this); break; 761 } 762 } 763 764 return *T; 765} 766 767bool Generic_GCC::IsUnwindTablesDefault() const { 768 // FIXME: Gross; we should probably have some separate target 769 // definition, possibly even reusing the one in clang. 770 return getArchName() == "x86_64"; 771} 772 773const char *Generic_GCC::GetDefaultRelocationModel() const { 774 return "static"; 775} 776 777const char *Generic_GCC::GetForcedPicModel() const { 778 return 0; 779} 780 781/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 782/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 783/// Currently does not support anything else but compilation. 784 785TCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple) 786 : ToolChain(Host, Triple) { 787 // Path mangling to find libexec 788 std::string Path(getDriver().Dir); 789 790 Path += "/../libexec"; 791 getProgramPaths().push_back(Path); 792} 793 794TCEToolChain::~TCEToolChain() { 795 for (llvm::DenseMap<unsigned, Tool*>::iterator 796 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 797 delete it->second; 798} 799 800bool TCEToolChain::IsMathErrnoDefault() const { 801 return true; 802} 803 804bool TCEToolChain::IsUnwindTablesDefault() const { 805 return false; 806} 807 808const char *TCEToolChain::GetDefaultRelocationModel() const { 809 return "static"; 810} 811 812const char *TCEToolChain::GetForcedPicModel() const { 813 return 0; 814} 815 816Tool &TCEToolChain::SelectTool(const Compilation &C, 817 const JobAction &JA) const { 818 Action::ActionClass Key; 819 Key = Action::AnalyzeJobClass; 820 821 Tool *&T = Tools[Key]; 822 if (!T) { 823 switch (Key) { 824 case Action::PreprocessJobClass: 825 T = new tools::gcc::Preprocess(*this); break; 826 case Action::AnalyzeJobClass: 827 T = new tools::Clang(*this); break; 828 default: 829 assert(false && "Unsupported action for TCE target."); 830 } 831 } 832 return *T; 833} 834 835/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 836 837OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple) 838 : Generic_GCC(Host, Triple) { 839 getFilePaths().push_back(getDriver().Dir + "/../lib"); 840 getFilePaths().push_back("/usr/lib"); 841} 842 843Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 844 Action::ActionClass Key; 845 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 846 Key = Action::AnalyzeJobClass; 847 else 848 Key = JA.getKind(); 849 850 Tool *&T = Tools[Key]; 851 if (!T) { 852 switch (Key) { 853 case Action::AssembleJobClass: 854 T = new tools::openbsd::Assemble(*this); break; 855 case Action::LinkJobClass: 856 T = new tools::openbsd::Link(*this); break; 857 default: 858 T = &Generic_GCC::SelectTool(C, JA); 859 } 860 } 861 862 return *T; 863} 864 865/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 866 867FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32) 868 : Generic_GCC(Host, Triple) { 869 getProgramPaths().push_back(getDriver().Dir + "/../libexec"); 870 getProgramPaths().push_back("/usr/libexec"); 871 if (Lib32) { 872 getFilePaths().push_back(getDriver().Dir + "/../lib32"); 873 getFilePaths().push_back("/usr/lib32"); 874 } else { 875 getFilePaths().push_back(getDriver().Dir + "/../lib"); 876 getFilePaths().push_back("/usr/lib"); 877 } 878} 879 880Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 881 Action::ActionClass Key; 882 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 883 Key = Action::AnalyzeJobClass; 884 else 885 Key = JA.getKind(); 886 887 Tool *&T = Tools[Key]; 888 if (!T) { 889 switch (Key) { 890 case Action::AssembleJobClass: 891 T = new tools::freebsd::Assemble(*this); break; 892 case Action::LinkJobClass: 893 T = new tools::freebsd::Link(*this); break; 894 default: 895 T = &Generic_GCC::SelectTool(C, JA); 896 } 897 } 898 899 return *T; 900} 901 902/// Minix - Minix tool chain which can call as(1) and ld(1) directly. 903 904Minix::Minix(const HostInfo &Host, const llvm::Triple& Triple) 905 : Generic_GCC(Host, Triple) { 906 getFilePaths().push_back(getDriver().Dir + "/../lib"); 907 getFilePaths().push_back("/usr/lib"); 908 getFilePaths().push_back("/usr/gnu/lib"); 909 getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3"); 910} 911 912Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA) const { 913 Action::ActionClass Key; 914 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 915 Key = Action::AnalyzeJobClass; 916 else 917 Key = JA.getKind(); 918 919 Tool *&T = Tools[Key]; 920 if (!T) { 921 switch (Key) { 922 case Action::AssembleJobClass: 923 T = new tools::minix::Assemble(*this); break; 924 case Action::LinkJobClass: 925 T = new tools::minix::Link(*this); break; 926 default: 927 T = &Generic_GCC::SelectTool(C, JA); 928 } 929 } 930 931 return *T; 932} 933 934/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 935 936AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple) 937 : Generic_GCC(Host, Triple) { 938 939 getProgramPaths().push_back(getDriver().Dir); 940 941 getFilePaths().push_back(getDriver().Dir + "/../lib"); 942 getFilePaths().push_back("/usr/lib"); 943 getFilePaths().push_back("/usr/sfw/lib"); 944 getFilePaths().push_back("/opt/gcc4/lib"); 945 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 946 947} 948 949Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const { 950 Action::ActionClass Key; 951 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 952 Key = Action::AnalyzeJobClass; 953 else 954 Key = JA.getKind(); 955 956 Tool *&T = Tools[Key]; 957 if (!T) { 958 switch (Key) { 959 case Action::AssembleJobClass: 960 T = new tools::auroraux::Assemble(*this); break; 961 case Action::LinkJobClass: 962 T = new tools::auroraux::Link(*this); break; 963 default: 964 T = &Generic_GCC::SelectTool(C, JA); 965 } 966 } 967 968 return *T; 969} 970 971 972/// Linux toolchain (very bare-bones at the moment). 973 974Linux::Linux(const HostInfo &Host, const llvm::Triple& Triple) 975 : Generic_GCC(Host, Triple) { 976 getFilePaths().push_back(getDriver().Dir + "/../lib/clang/1.0/"); 977 getFilePaths().push_back("/lib/"); 978 getFilePaths().push_back("/usr/lib/"); 979 980 // Depending on the Linux distribution, any combination of lib{,32,64} is 981 // possible. E.g. Debian uses lib and lib32 for mixed i386/x86-64 systems, 982 // openSUSE uses lib and lib64 for the same purpose. 983 getFilePaths().push_back("/lib32/"); 984 getFilePaths().push_back("/usr/lib32/"); 985 getFilePaths().push_back("/lib64/"); 986 getFilePaths().push_back("/usr/lib64/"); 987 988 // FIXME: Figure out some way to get gcc's libdir 989 // (e.g. /usr/lib/gcc/i486-linux-gnu/4.3/ for Ubuntu 32-bit); we need 990 // crtbegin.o/crtend.o/etc., and want static versions of various 991 // libraries. If we had our own crtbegin.o/crtend.o/etc, we could probably 992 // get away with using shared versions in /usr/lib, though. 993 // We could fall back to the approach we used for includes (a massive 994 // list), but that's messy at best. 995} 996 997/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 998 999DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple) 1000 : Generic_GCC(Host, Triple) { 1001 1002 // Path mangling to find libexec 1003 getProgramPaths().push_back(getDriver().Dir); 1004 1005 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1006 getFilePaths().push_back("/usr/lib"); 1007 getFilePaths().push_back("/usr/lib/gcc41"); 1008} 1009 1010Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const { 1011 Action::ActionClass Key; 1012 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1013 Key = Action::AnalyzeJobClass; 1014 else 1015 Key = JA.getKind(); 1016 1017 Tool *&T = Tools[Key]; 1018 if (!T) { 1019 switch (Key) { 1020 case Action::AssembleJobClass: 1021 T = new tools::dragonfly::Assemble(*this); break; 1022 case Action::LinkJobClass: 1023 T = new tools::dragonfly::Link(*this); break; 1024 default: 1025 T = &Generic_GCC::SelectTool(C, JA); 1026 } 1027 } 1028 1029 return *T; 1030} 1031