ToolChains.cpp revision 9d0863b22faef1678eb191bbab7268809be60a96
13917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//===--- ToolChains.cpp - ToolChain Implementations ---------------------*-===// 23917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// 33917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// The LLVM Compiler Infrastructure 43917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// 53917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// This file is distributed under the University of Illinois Open Source 63917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// License. See LICENSE.TXT for details. 73917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// 83917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//===----------------------------------------------------------------------===// 93917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar#include "ToolChains.h" 113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 12f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/Arg.h" 13f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/ArgList.h" 140f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar#include "clang/Driver/Compilation.h" 15c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h" 164e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 17c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/HostInfo.h" 1827e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h" 194e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h" 20265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h" 21c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 22c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h" 2384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 24ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h" 25c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h" 26c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 27f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv 28f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar 293917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver; 303917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains; 313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 32f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64. 338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 34f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple, 35cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&_DarwinVersion)[3]) 36cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar : ToolChain(Host, Triple), TargetInitialized(false) 371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 3802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::raw_string_ostream(MacosxVersionMin) 395435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar << "10." << std::max(0, (int)_DarwinVersion[0] - 4) << '.' 405435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar << _DarwinVersion[1]; 411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 421d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 43eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this? 44eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) { 45eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv6k") 46eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv6"; 47eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 48eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv5tej") 49eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv5"; 50eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 51eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "xscale") 52eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "xscale"; 53eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 54eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv4t") 55eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv4t"; 56eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 57eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 58eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 59eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "armv7m") 60eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv7"; 61eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 62eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return 0; 63eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 64eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 65eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this? 66eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) { 67eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 68eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm946e-s" || Value == "arm966e-s" || 69eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm968e-s" || Value == "arm10e" || 70eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 71eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1026ej-s") 72eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv5"; 73eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 74eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "xscale") 75eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "xscale"; 76eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 77eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 78eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1176jz-s" || Value == "arm1176jzf-s") 79eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv6"; 80eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 81eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 82eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv7"; 83eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 84eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return 0; 85eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 86eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 87eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarllvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const { 88eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar switch (getTriple().getArch()) { 89eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar default: 90eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return getArchName(); 91eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 92eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar case llvm::Triple::arm: { 93eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 94eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) 95eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return Arch; 96eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 97eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 98eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) 99eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return Arch; 100eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 101eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "arm"; 102eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar } 103eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar } 104eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 105eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 1061d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple, 1071d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar const unsigned (&DarwinVersion)[3], 108cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&_GCCVersion)[3]) 109cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar : Darwin(Host, Triple, DarwinVersion) 1101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 1111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[0] = _GCCVersion[0]; 1121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[1] = _GCCVersion[1]; 1131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[2] = _GCCVersion[2]; 1141d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 1151d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Set up the tool chain paths to match gcc. 116c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir = "i686-apple-darwin"; 11755bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek ToolChainDir += llvm::utostr(DarwinVersion[0]); 118c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += "/"; 119c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[0]); 120c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 121c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[1]); 122c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 123c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[2]); 124c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 12574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // Try the next major version if that tool chain dir is invalid. 126080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar std::string Tmp = "/usr/lib/gcc/" + ToolChainDir; 127080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar if (!llvm::sys::Path(Tmp).exists()) { 12874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar std::string Next = "i686-apple-darwin"; 12974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(DarwinVersion[0] + 1); 13074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += "/"; 13174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[0]); 13274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += '.'; 13374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[1]); 13474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += '.'; 13574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[2]); 13674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar 13774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // Use that if it exists, otherwise hope the user isn't linking. 13874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // 13974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // FIXME: Drop dependency on gcc's tool chain. 140080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar Tmp = "/usr/lib/gcc/" + Next; 141080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar if (llvm::sys::Path(Tmp).exists()) 14274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar ToolChainDir = Next; 14374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar } 14474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar 145c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar std::string Path; 146c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar if (getArchName() == "x86_64") { 147ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 148c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 1496b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 150c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 151c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 152c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 153c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 1546b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 155c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 156c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 157c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar } 1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 159ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 160c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 1616b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 162c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 163c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 164c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 1656b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 166c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 167c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 168ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 169c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../libexec/gcc/"; 1706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 171c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 172c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 173c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/libexec/gcc/"; 1746b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 175c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 176c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 177ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 178c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 179c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 180f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() { 1818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // Free tool implementations. 1828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 1838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 1848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar delete it->second; 1858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 1868eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 187f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const { 1888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Action::ActionClass Key; 189ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = Action::AnalyzeJobClass; 1918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar else 1928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = JA.getKind(); 1938eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1940f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar // FIXME: This doesn't belong here, but ideally we will support static soon 1950f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar // anyway. 1960f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) || 1970f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar C.getArgs().hasArg(options::OPT_static) || 1980f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar C.getArgs().hasArg(options::OPT_fapple_kext)); 1990f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic; 2000f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 2010f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar options::OPT_no_integrated_as, 2020f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar IsIADefault); 2030f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar 2048eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Tool *&T = Tools[Key]; 2058eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (!T) { 2068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar switch (Key) { 2078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 2088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 2098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar assert(0 && "Invalid tool kind."); 2108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::PreprocessJobClass: 2119120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Preprocess(*this); break; 2128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::AnalyzeJobClass: 2138eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::Clang(*this); break; 2149120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar case Action::PrecompileJobClass: 2158eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::CompileJobClass: 2169120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Compile(*this); break; 2170f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar case Action::AssembleJobClass: { 2180f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar if (UseIntegratedAs) 2190f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar T = new tools::ClangAs(*this); 2200f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar else 2210f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar T = new tools::darwin::Assemble(*this); 2220f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar break; 2230f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar } 2248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LinkJobClass: 2258f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar T = new tools::darwin::Link(*this); break; 2268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 2278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 2286e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar case Action::DsymutilJobClass: 2296e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar T = new tools::darwin::Dsymutil(*this); break; 2308eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 2318eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 2328eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return *T; 2348eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 2358eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args, 2371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 238e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar std::string Tmp; 239e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar 2406b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // FIXME: Derive these correctly. 2416b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar if (getArchName() == "x86_64") { 2426b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 2436b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/x86_64")); 2446b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 2456b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 2466b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/x86_64")); 2476b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar } 2488bc9c550128c0662a04234dc262628c54c76b1eaDaniel Dunbar 2496b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir)); 250e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar 251e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir; 252e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 253e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 254e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/gcc"; 255e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 256e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 2576b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 2586b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 2596b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 260e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/" + ToolChainDir; 261e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 262e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 263e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib"; 264e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 265e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 2666b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 2676b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/../../../" + ToolChainDir)); 2686b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 2696b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/../../..")); 2706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar} 2716b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 2721d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args, 2731d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 274ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar // Note that this routine is only used for targetting OS X. 2756cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 2766cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Derived from libgcc and lib specs but refactored. 2776cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 2786cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_static"); 2796cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 2806cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (Args.hasArg(options::OPT_static_libgcc)) { 2816cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2826cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 2836cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Derived from darwin_iphoneos_libgcc spec. 284251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (isTargetIPhoneOS()) { 2856cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 2866cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 2876cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2886cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2896cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else if (Args.hasArg(options::OPT_shared_libgcc) || 2908a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar Args.hasFlag(options::OPT_fexceptions, 2918a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar options::OPT_fno_exceptions) || 2926cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar Args.hasArg(options::OPT_fgnu_runtime)) { 2936cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // FIXME: This is probably broken on 10.3? 294ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 2956cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 296ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 2976cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2986cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 299ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 3, 9)) 3006cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar ; // Do nothing. 301ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 5)) 3026cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 303ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 3046cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 3056cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 3066cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 307ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) { 3086cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc"); 3096cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lSystem"); 3106cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 3116cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lSystem"); 3126cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc"); 3136cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 3146cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 3156cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar} 3166cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 3171d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple, 318cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&DarwinVersion)[3]) 319cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar : Darwin(Host, Triple, DarwinVersion) 3201d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 3211d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // We expect 'as', 'ld', etc. to be adjacent to our install dir. 322ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 3231d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 3241d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args, 3261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 3271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // The Clang toolchain uses explicit paths for internal libraries. 3281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 3291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 3311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 332eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Darwin doesn't support real static executables, don't link any runtime 333eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // libraries with -static. 334eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (Args.hasArg(options::OPT_static)) 3351d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 3361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Reject -static-libgcc for now, we can deal with this when and if someone 3381d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // cares. This is useful in situations where someone wants to statically link 3391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // something like libstdc++, and needs its runtime support routines. 3401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 341ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_unsupported_opt) 3421d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar << A->getAsString(Args); 3431d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 3441d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar } 3451d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 346eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Otherwise link libSystem, then the dynamic runtime library, and finally any 347eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // target specific static runtime library. 3481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar CmdArgs.push_back("-lSystem"); 349eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 350eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Select the dynamic runtime library and the target specific static library. 351eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar const char *DarwinStaticLib = 0; 352251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (isTargetIPhoneOS()) { 353eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 354eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 355eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // We may need some static functions for armv6/thumb which are required to 356eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // be in the same linkage unit as their caller. 357eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (getDarwinArchName(Args) == "armv6") 358eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar DarwinStaticLib = "libclang_rt.armv6.a"; 359eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } else { 360eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // The dynamic runtime library was merged with libSystem for 10.6 and 361eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // beyond; only 10.4 and 10.5 need an additional runtime library. 362ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 363eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 364ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 365eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 366eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 367eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // For OS X, we only need a static runtime library when targetting 10.4, to 368eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // provide versions of the static functions which were omitted from 369eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // 10.4.dylib. 370ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 371eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar DarwinStaticLib = "libclang_rt.10.4.a"; 372eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } 373eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 374eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar /// Add the target specific static library, if needed. 375eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (DarwinStaticLib) { 376eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar llvm::sys::Path P(getDriver().ResourceDir); 377eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent("lib"); 378eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent("darwin"); 379eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent(DarwinStaticLib); 380eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 381eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // For now, allow missing resource libraries to support developers who may 382eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // not have compiler-rt checked out or integrated into their build. 383eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (!P.exists()) 384eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar getDriver().Diag(clang::diag::warn_drv_missing_resource_library) 385eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar << P.str(); 386eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar else 387eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 388eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } 3891d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 3901d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 391279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel DunbarDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, 3920dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar const char *BoundArch) const { 393279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 394ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const OptTable &Opts = getDriver().getOpts(); 395ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 396ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // FIXME: We really want to get out of the tool chain level argument 397ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // translation business, as it makes the driver functionality much 398ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // more opaque. For now, we follow gcc closely solely for the 399ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // purpose of easily achieving feature parity & testability. Once we 400ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // have something that works, we should reevaluate each translation 4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // and try to push it down into tool specific logic. 402ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 4032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 4042603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 405ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar if (OSXVersion && iPhoneVersion) { 406ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with) 407ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar << OSXVersion->getAsString(Args) 4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << iPhoneVersion->getAsString(Args); 4092603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar iPhoneVersion = 0; 410ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar } else if (!OSXVersion && !iPhoneVersion) { 411816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // If neither OS X nor iPhoneOS targets were specified, check for 412816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // environment defines. 413816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET"); 414816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"); 415816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar 416816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // Ignore empty strings. 417816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar if (OSXTarget && OSXTarget[0] == '\0') 418816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar OSXTarget = 0; 419816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0') 420816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar iPhoneOSTarget = 0; 421816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar 42239053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // Diagnose conflicting deployment targets, and choose default platform 42339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // based on the tool chain. 42439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // 42539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // FIXME: Don't hardcode default here. 42639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (OSXTarget && iPhoneOSTarget) { 42739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // FIXME: We should see if we can get away with warning or erroring on 42839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // this. Perhaps put under -pedantic? 42939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (getTriple().getArch() == llvm::Triple::arm || 43039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar getTriple().getArch() == llvm::Triple::thumb) 43184d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar OSXTarget = 0; 43239053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar else 43384d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar iPhoneOSTarget = 0; 43439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar } 4351a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar 43639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (OSXTarget) { 43730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 4382603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar OSXVersion = DAL->MakeJoinedArg(0, O, OSXTarget); 4392603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar DAL->append(OSXVersion); 440816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } else if (iPhoneOSTarget) { 44130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 4422603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar iPhoneVersion = DAL->MakeJoinedArg(0, O, iPhoneOSTarget); 4432603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar DAL->append(iPhoneVersion); 444816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } else { 445cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar // Otherwise, choose a default platform based on the tool chain. 446cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar // 447cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar // FIXME: Don't hardcode default here. 448cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar if (getTriple().getArch() == llvm::Triple::arm || 449cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar getTriple().getArch() == llvm::Triple::thumb) { 450816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 451cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar iPhoneVersion = DAL->MakeJoinedArg(0, O, "3.0"); 4522603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar DAL->append(iPhoneVersion); 453816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } else { 454816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 4552603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar OSXVersion = DAL->MakeJoinedArg(0, O, MacosxVersionMin); 4562603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar DAL->append(OSXVersion); 457816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } 45830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } 459ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4612603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // Set the tool chain target information. 4622603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar unsigned Major, Minor, Micro; 4632603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar bool HadExtra; 4642603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (OSXVersion) { 4652603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(!iPhoneVersion && "Unknown target platform!"); 4662603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor, 4672603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Micro, HadExtra) || HadExtra || 4682603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Major != 10 || Minor >= 10 || Micro >= 10) 4692603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_version_number) 4702603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar << OSXVersion->getAsString(Args); 4712603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } else { 4722603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(iPhoneVersion && "Unknown target platform!"); 4732603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor, 4742603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Micro, HadExtra) || HadExtra || 4752603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Major >= 10 || Minor >= 100 || Micro >= 100) 4762603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_version_number) 4772603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar << iPhoneVersion->getAsString(Args); 4782603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 4792603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar setTarget(iPhoneVersion, Major, Minor, Micro); 4802603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 481279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), 482279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar ie = Args.end(); it != ie; ++it) { 4834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar Arg *A = *it; 4844e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 4854e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (A->getOption().matches(options::OPT_Xarch__)) { 4864e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: Canonicalize name. 4874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (getArchName() != A->getValue(Args, 0)) 4884e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 4894e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 4904e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: The arg is leaked here, and we should have a nicer 4914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // interface for this. 4924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar unsigned Prev, Index = Prev = A->getIndex() + 1; 493ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Arg *XarchArg = Opts.ParseOneArg(Args, Index); 4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4954e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // If the argument parsing failed or more than one argument was 4964e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // consumed, the -Xarch_ argument's parameter tried to consume 4974e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // extra arguments. Emit an error and ignore. 4984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // 4994e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // We also want to disallow any options which would alter the 5004e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // driver behavior; that isn't going to work in our model. We 5014e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // use isDriverOption() as an approximation, although things 5024e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // like -O4 are going to slip through. 5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!XarchArg || Index > Prev + 1 || 5044e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar XarchArg->getOption().isDriverOption()) { 505ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument) 5064e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar << A->getAsString(Args); 5074e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 5084e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 5094e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 510478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar XarchArg->setBaseArg(A); 5114e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar A = XarchArg; 5121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 5134e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 514ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // Sob. These is strictly gcc compatible for the time being. Apple 515ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // gcc translates options twice, which means that self-expanding 516ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // options add duplicates. 5179e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar switch ((options::ID) A->getOption().getID()) { 518ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar default: 519ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 520ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 521ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 522ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_mkernel: 523ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fapple_kext: 524ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 5259d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 5269d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 527ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 529ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_dependency_file: 5309d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), 5319d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar A->getValue(Args)); 532ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 533ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 534ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gfull: 5359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 5369d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 5379d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 538ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 539ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 540ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gused: 5419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 5429d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 5439d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 544ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 545ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 546ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fterminated_vtables: 547ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_findirect_virtual_calls: 5489d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext)); 5499d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 550ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 551ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 552ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_shared: 5539d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 554ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 555ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 556ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fconstant_cfstrings: 5579d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 558ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 559ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 560ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_constant_cfstrings: 5619d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 562ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 563ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 564ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wnonportable_cfstrings: 5659d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 5669d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 567ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 568ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 569ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wno_nonportable_cfstrings: 5709d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 5719d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 572ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 573ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 574ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fpascal_strings: 5759d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 576ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 577ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 578ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_pascal_strings: 5799d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 580ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 581ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 5824e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 5834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 58484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (getTriple().getArch() == llvm::Triple::x86 || 58584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar getTriple().getArch() == llvm::Triple::x86_64) 586e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 5879d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2"); 58884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 58984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // Add the arch options based on the particular spelling of -arch, to match 59084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // how the driver driver works. 59184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (BoundArch) { 59284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar llvm::StringRef Name = BoundArch; 59384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); 59484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar const Option *MArch = Opts.getOption(options::OPT_march_EQ); 59584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 59684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 59784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // which defines the list of which architectures we accept. 59884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (Name == "ppc") 59984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 60084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc601") 6019d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "601"); 60284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc603") 6039d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "603"); 60484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604") 6059d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "604"); 60684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604e") 6079d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "604e"); 60884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc750") 6099d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "750"); 61084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7400") 6119d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "7400"); 61284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7450") 6139d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "7450"); 61484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc970") 6159d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "970"); 61684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 61784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc64") 6189d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 61984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 62084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i386") 62184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 62284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i486") 6239d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "i486"); 62484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i586") 6259d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "i586"); 62684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i686") 6279d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "i686"); 62884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium") 6299d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "pentium"); 63084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium2") 6319d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "pentium2"); 63284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentpro") 6339d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "pentiumpro"); 63484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentIIm3") 6359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "pentium2"); 63684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 63784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "x86_64") 6389d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 639ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 64084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "arm") 6419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv4t"); 64284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv4t") 6439d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv4t"); 64484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv5") 6459d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv5tej"); 64684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "xscale") 6479d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "xscale"); 64884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv6") 6499d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv6k"); 65084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv7") 6519d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv7a"); 65284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 65384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else 6549f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("invalid Darwin arch"); 65584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar } 656ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 6574e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar return DAL; 6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 6598eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 660f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const { 6618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 6628eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 6638eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return getArchName() == "x86_64"; 6648eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 6658eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 666f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const { 667f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 668f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar return S[0] != '\0'; 669f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar return false; 670f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar} 671f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 672b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const { 673b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar // Darwin uses SjLj exceptions on ARM. 674b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar return (getTriple().getArch() == llvm::Triple::arm || 675b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar getTriple().getArch() == llvm::Triple::thumb); 676b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar} 677b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 678f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const { 6798eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 6808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 6818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 682f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const { 6838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (getArchName() == "x86_64") 6848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 6858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return 0; 6868eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 6878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 68843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const { 68943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar // Garbage collection is supported everywhere except on iPhone OS. 69043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar return !isTargetIPhoneOS(); 69143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar} 69243a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar 6933917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 6943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of 6953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options. 6963917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 697cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple) 6981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : ToolChain(Host, Triple) { 699ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 700c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 701c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 7023917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() { 7033917608370583fa30c466b6c3893448229aea9adDaniel Dunbar // Free tool implementations. 7043917608370583fa30c466b6c3893448229aea9adDaniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 7053917608370583fa30c466b6c3893448229aea9adDaniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 7063917608370583fa30c466b6c3893448229aea9adDaniel Dunbar delete it->second; 7073917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 7083917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C, 7103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar const JobAction &JA) const { 7113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Action::ActionClass Key; 712ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 7133917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = Action::AnalyzeJobClass; 7143917608370583fa30c466b6c3893448229aea9adDaniel Dunbar else 7153917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = JA.getKind(); 7163917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7173917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Tool *&T = Tools[Key]; 7183917608370583fa30c466b6c3893448229aea9adDaniel Dunbar if (!T) { 7193917608370583fa30c466b6c3893448229aea9adDaniel Dunbar switch (Key) { 7208eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 7218eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 7223917608370583fa30c466b6c3893448229aea9adDaniel Dunbar assert(0 && "Invalid tool kind."); 7233917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PreprocessJobClass: 7243917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Preprocess(*this); break; 7253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PrecompileJobClass: 7263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Precompile(*this); break; 7273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AnalyzeJobClass: 7283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::Clang(*this); break; 7293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::CompileJobClass: 7303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Compile(*this); break; 7313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AssembleJobClass: 7323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Assemble(*this); break; 7333917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::LinkJobClass: 7343917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Link(*this); break; 7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7368eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // This is a bit ungeneric, but the only platform using a driver 7378eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // driver is Darwin. 7388eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 7398eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 7406e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar case Action::DsymutilJobClass: 7416e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar T = new tools::darwin::Dsymutil(*this); break; 7423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 7433917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 7443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7453917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return *T; 7463917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 7473917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7483917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const { 7498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 7508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 7513917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return getArchName() == "x86_64"; 7523917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 7533917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7543917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const { 7553917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return "static"; 7563917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 7573917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7583917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const { 7593917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return 0; 7603917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 761f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar 7623a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 7633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 7643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation. 7653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7663a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple) 7673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner : ToolChain(Host, Triple) { 7683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner // Path mangling to find libexec 7693a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner std::string Path(getDriver().Dir); 7703a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7713a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Path += "/../libexec"; 7723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner getProgramPaths().push_back(Path); 7733a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7743a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7753a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() { 7763a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner for (llvm::DenseMap<unsigned, Tool*>::iterator 7773a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 7783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner delete it->second; 7793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7803a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7813a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsMathErrnoDefault() const { 7823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return true; 7833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7853a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsUnwindTablesDefault() const { 7863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return false; 7873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7893a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetDefaultRelocationModel() const { 7903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return "static"; 7913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetForcedPicModel() const { 7943a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return 0; 7953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7963a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTool &TCEToolChain::SelectTool(const Compilation &C, 7983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const JobAction &JA) const { 7993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Action::ActionClass Key; 8003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Key = Action::AnalyzeJobClass; 8013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 8023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Tool *&T = Tools[Key]; 8033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner if (!T) { 8043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner switch (Key) { 8053a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner case Action::PreprocessJobClass: 8063a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner T = new tools::gcc::Preprocess(*this); break; 8073a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner case Action::AnalyzeJobClass: 8083a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner T = new tools::Clang(*this); break; 8093a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner default: 8103a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner assert(false && "Unsupported action for TCE target."); 8113a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner } 8123a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner } 8133a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return *T; 8143a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 8153a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 816f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 817f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 818f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple) 819f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar : Generic_GCC(Host, Triple) { 820ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 821f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar getFilePaths().push_back("/usr/lib"); 822f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 823f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 824f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 825f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Action::ActionClass Key; 826ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 827f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Key = Action::AnalyzeJobClass; 828f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 829f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Key = JA.getKind(); 830f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 831f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Tool *&T = Tools[Key]; 832f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!T) { 833f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar switch (Key) { 834f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar case Action::AssembleJobClass: 835f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = new tools::openbsd::Assemble(*this); break; 836f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar case Action::LinkJobClass: 837f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = new tools::openbsd::Link(*this); break; 838f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar default: 839f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 840f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 841f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 842f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 843f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar return *T; 844f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 845f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 84675358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 84775358d267256022475371416654b056ad8531cb3Daniel Dunbar 848cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32) 849cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar : Generic_GCC(Host, Triple) { 850bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar if (Lib32) { 851ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib32"); 852bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib32"); 853bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } else { 854ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 855bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib"); 856bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } 85775358d267256022475371416654b056ad8531cb3Daniel Dunbar} 85875358d267256022475371416654b056ad8531cb3Daniel Dunbar 85975358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 86075358d267256022475371416654b056ad8531cb3Daniel Dunbar Action::ActionClass Key; 861ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 86275358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = Action::AnalyzeJobClass; 86375358d267256022475371416654b056ad8531cb3Daniel Dunbar else 86475358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = JA.getKind(); 86575358d267256022475371416654b056ad8531cb3Daniel Dunbar 86675358d267256022475371416654b056ad8531cb3Daniel Dunbar Tool *&T = Tools[Key]; 86775358d267256022475371416654b056ad8531cb3Daniel Dunbar if (!T) { 86875358d267256022475371416654b056ad8531cb3Daniel Dunbar switch (Key) { 86968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar case Action::AssembleJobClass: 87068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar T = new tools::freebsd::Assemble(*this); break; 871008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar case Action::LinkJobClass: 872008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar T = new tools::freebsd::Link(*this); break; 87375358d267256022475371416654b056ad8531cb3Daniel Dunbar default: 87475358d267256022475371416654b056ad8531cb3Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 87575358d267256022475371416654b056ad8531cb3Daniel Dunbar } 87675358d267256022475371416654b056ad8531cb3Daniel Dunbar } 87775358d267256022475371416654b056ad8531cb3Daniel Dunbar 87875358d267256022475371416654b056ad8531cb3Daniel Dunbar return *T; 87975358d267256022475371416654b056ad8531cb3Daniel Dunbar} 88011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 881e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 882e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 883e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple) 884e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan : Generic_GCC(Host, Triple) { 885e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 886ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 887e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 888ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 889e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/lib"); 890e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/sfw/lib"); 891e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib"); 8927adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 893e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 894e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 895e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 896e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const { 897e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Action::ActionClass Key; 898ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 899e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Key = Action::AnalyzeJobClass; 900e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 901e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Key = JA.getKind(); 902e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 903e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Tool *&T = Tools[Key]; 904e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!T) { 905e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan switch (Key) { 906e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case Action::AssembleJobClass: 907e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = new tools::auroraux::Assemble(*this); break; 908e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case Action::LinkJobClass: 909e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = new tools::auroraux::Link(*this); break; 910e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan default: 911e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = &Generic_GCC::SelectTool(C, JA); 912e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 913e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 914e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 915e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan return *T; 916e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 917e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 918e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 9196b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment). 9206b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 9216b3454a219cee5ef36c4668961f93a5c32deab61Eli FriedmanLinux::Linux(const HostInfo &Host, const llvm::Triple& Triple) 9226b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman : Generic_GCC(Host, Triple) { 923ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib/clang/1.0/"); 9246b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman getFilePaths().push_back("/lib/"); 9256b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman getFilePaths().push_back("/usr/lib/"); 926a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar 927a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // Depending on the Linux distribution, any combination of lib{,32,64} is 928a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // possible. E.g. Debian uses lib and lib32 for mixed i386/x86-64 systems, 929a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // openSUSE uses lib and lib64 for the same purpose. 930a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/lib32/"); 931a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/usr/lib32/"); 932a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/lib64/"); 933a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/usr/lib64/"); 934a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar 9356b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // FIXME: Figure out some way to get gcc's libdir 9366b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // (e.g. /usr/lib/gcc/i486-linux-gnu/4.3/ for Ubuntu 32-bit); we need 9376b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // crtbegin.o/crtend.o/etc., and want static versions of various 9386b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // libraries. If we had our own crtbegin.o/crtend.o/etc, we could probably 9396b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // get away with using shared versions in /usr/lib, though. 9406b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // We could fall back to the approach we used for includes (a massive 9416b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // list), but that's messy at best. 9426b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman} 9436b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 94411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 94511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 946cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple) 947cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar : Generic_GCC(Host, Triple) { 94811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 94911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // Path mangling to find libexec 950ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 95111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 952ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 95311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib"); 95411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib/gcc41"); 95511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 95611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 95711e1b40d759a643086f590f6ffbd9d68360bad46Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const { 95811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Action::ActionClass Key; 959ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 96011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Key = Action::AnalyzeJobClass; 96111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 96211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Key = JA.getKind(); 96311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 96411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Tool *&T = Tools[Key]; 96511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!T) { 96611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar switch (Key) { 96711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar case Action::AssembleJobClass: 96811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = new tools::dragonfly::Assemble(*this); break; 96911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar case Action::LinkJobClass: 97011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = new tools::dragonfly::Link(*this); break; 97111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar default: 97211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 97311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 97411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 97511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 97611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar return *T; 97711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 978