13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- ToolChain.cpp - Collections of tools for one platform ------------===// 22ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// 32ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// The LLVM Compiler Infrastructure 42ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// 52ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// This file is distributed under the University of Illinois Open Source 62ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// License. See LICENSE.TXT for details. 72ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// 82ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar//===----------------------------------------------------------------------===// 92ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 105b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola#include "Tools.h" 112ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/ToolChain.h" 1255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/ObjCRuntime.h" 132ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/Action.h" 1400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/Arg.h" 1500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/ArgList.h" 162ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/Driver.h" 1700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 18e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer#include "clang/Driver/Option.h" 1900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/Options.h" 2057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson#include "llvm/ADT/StringSwitch.h" 219f084a3166b684573ba49df28fc5792bc37d92e1John McCall#include "llvm/Support/ErrorHandling.h" 222ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbarusing namespace clang::driver; 235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang; 242ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 25af370e6e051e505016637e23418354db625dc796Rafael EspindolaToolChain::ToolChain(const Driver &D, const llvm::Triple &T, 26af370e6e051e505016637e23418354db625dc796Rafael Espindola const ArgList &A) 27af370e6e051e505016637e23418354db625dc796Rafael Espindola : D(D), Triple(T), Args(A) { 282ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar} 292ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 302ba38ba9a18b8ec88e2509fad622eeec01562769Daniel DunbarToolChain::~ToolChain() { 315b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola // Free tool implementations. 325b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola for (llvm::DenseMap<unsigned, Tool*>::iterator 335b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 345b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola delete it->second; 352ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar} 362ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 37ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbarconst Driver &ToolChain::getDriver() const { 384d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth return D; 39ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar} 40ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar 41af370e6e051e505016637e23418354db625dc796Rafael Espindolabool ToolChain::useIntegratedAs() const { 425470cd27e47aea163daaa76dde36010753400663Rafael Espindola return Args.hasFlag(options::OPT_integrated_as, 435470cd27e47aea163daaa76dde36010753400663Rafael Espindola options::OPT_no_integrated_as, 445470cd27e47aea163daaa76dde36010753400663Rafael Espindola IsIntegratedAssemblerDefault()); 455470cd27e47aea163daaa76dde36010753400663Rafael Espindola} 465470cd27e47aea163daaa76dde36010753400663Rafael Espindola 47d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbarstd::string ToolChain::getDefaultUniversalArchName() const { 48d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar // In universal driver terms, the arch name accepted by -arch isn't exactly 49d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar // the same as the ones that appear in the triple. Roughly speaking, this is 50d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar // an inverse of the darwin::getArchTypeForDarwinArchName() function, but the 51d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar // only interesting special case is powerpc. 52d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar switch (Triple.getArch()) { 53d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar case llvm::Triple::ppc: 54d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar return "ppc"; 55d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar case llvm::Triple::ppc64: 56d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar return "ppc64"; 57d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar default: 58d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar return Triple.getArchName(); 59d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar } 60d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar} 61d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar 6203a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindolabool ToolChain::IsUnwindTablesDefault() const { 6303a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola return false; 6403a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola} 6503a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola 665b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool &ToolChain::SelectTool(const JobAction &JA) const { 675b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola Action::ActionClass Key; 685b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola if (getDriver().ShouldUseClangCompiler(JA)) 695b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola Key = Action::AnalyzeJobClass; 705b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola else 715b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola Key = JA.getKind(); 725b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola 735b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola Tool *&T = Tools[Key]; 745b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola if (T) 755b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola return *T; 765b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola 775b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola if (getDriver().ShouldUseClangCompiler(JA)) 785b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola T = new tools::Clang(*this); 795b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola else 805b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola T = constructTool(Key); 815b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola 825b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola return *T; 835b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola} 845b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola 854a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbarstd::string ToolChain::GetFilePath(const char *Name) const { 864d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth return D.GetFilePath(Name, *this); 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 882ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar} 892ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 90fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyanstd::string ToolChain::GetProgramPath(const char *Name) const { 91fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyan return D.GetProgramPath(Name, *this); 922ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar} 934180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 944180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID ToolChain::LookupTypeForExtension(const char *Ext) const { 954180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar return types::lookupTypeForExtension(Ext); 964180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar} 9700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 98b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool ToolChain::HasNativeLLVMSupport() const { 99b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar return false; 100b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar} 101b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar 102260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime ToolChain::getDefaultObjCRuntime(bool isNonFragile) const { 10311d3f4cc27e6b923fc32481dc1bb5ec46c7d1f4bDavid Chisnall return ObjCRuntime(isNonFragile ? ObjCRuntime::GNUstep : ObjCRuntime::GCC, 104260611a32535c851237926bfcf78869b13c07d5bJohn McCall VersionTuple()); 1059f084a3166b684573ba49df28fc5792bc37d92e1John McCall} 1069f084a3166b684573ba49df28fc5792bc37d92e1John McCall 107fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting. 10800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// 10900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: tblgen this. 11000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstatic const char *getARMTargetCPU(const ArgList &Args, 11100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar const llvm::Triple &Triple) { 112677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // For Darwin targets, the -arch option (which is translated to a 113677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // corresponding -march option) should determine the architecture 114677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // (and the Mach-O slice) regardless of any -mcpu options. 115677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson if (!Triple.isOSDarwin()) { 116677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // FIXME: Warn on inconsistent use of -mcpu and -march. 117677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // If we have -mcpu=, use that. 118677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 1191d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith return A->getValue(); 120677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson } 12100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 1225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef MArch; 12300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 12400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // Otherwise, if we have -march= choose the base CPU for that arch. 1251d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith MArch = A->getValue(); 12600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } else { 12700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // Otherwise, use the Arch from the triple. 12800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar MArch = Triple.getArchName(); 12900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } 13000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 13157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson return llvm::StringSwitch<const char *>(MArch) 13257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv2", "armv2a","arm2") 13357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv3", "arm6") 13457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv3m", "arm7m") 13557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv4", "armv4t", "arm7tdmi") 13657f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv5", "armv5t", "arm10tdmi") 13757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv5e", "armv5te", "arm1026ejs") 13857f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv5tej", "arm926ej-s") 13957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv6", "armv6k", "arm1136jf-s") 14057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv6j", "arm1136j-s") 14157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv6z", "armv6zk", "arm1176jzf-s") 14257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv6t2", "arm1156t2-s") 1432503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv6m", "armv6-m", "cortex-m0") 14457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv7", "armv7a", "armv7-a", "cortex-a8") 14540a94e299eadc5b80bd1dabf948d25d7c8cc4aa5Renato Golin .Cases("armv7l", "armv7-l", "cortex-a8") 146336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Cases("armv7f", "armv7-f", "cortex-a9-mp") 147336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Cases("armv7s", "armv7-s", "swift") 148532f5a9d64212ae9dbaa19f25b223ecb4ed680baBob Wilson .Cases("armv7r", "armv7-r", "cortex-r4") 14957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv7m", "armv7-m", "cortex-m3") 1502503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv7em", "armv7e-m", "cortex-m4") 15157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("ep9312", "ep9312") 15257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("iwmmxt", "iwmmxt") 15357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("xscale", "xscale") 15457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson // If all else failed, return the most base CPU LLVM supports. 15557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Default("arm7tdmi"); 15600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 15700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 15800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 15900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar/// CPU. 16000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// 16100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this. 16200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: tblgen this, or kill it! 1635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *getLLVMArchSuffixForARM(StringRef CPU) { 16457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson return llvm::StringSwitch<const char *>(CPU) 16557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t") 16657f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm720t", "arm9", "arm9tdmi", "v4t") 16757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm920", "arm920t", "arm922t", "v4t") 16857f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm940t", "ep9312","v4t") 16957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm10tdmi", "arm1020t", "v5") 17057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e") 17157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e") 17257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e") 17357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6") 17457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6") 17557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2") 176fc55345144f636f7687fd37649f0302914981fffBob Wilson .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7") 177fc55345144f636f7687fd37649f0302914981fffBob Wilson .Cases("cortex-a9", "cortex-a15", "v7") 178fc55345144f636f7687fd37649f0302914981fffBob Wilson .Case("cortex-r5", "v7r") 17957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("cortex-m0", "v6m") 1802503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m3", "v7m") 1812503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m4", "v7em") 182336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Case("cortex-a9-mp", "v7f") 183336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Case("swift", "v7s") 18457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Default(""); 18500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 18600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 18761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string ToolChain::ComputeLLVMTriple(const ArgList &Args, 18861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const { 18900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar switch (getTriple().getArch()) { 19000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar default: 19100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return getTripleString(); 19200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 19300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar case llvm::Triple::arm: 19400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar case llvm::Triple::thumb: { 19500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // FIXME: Factor into subclasses. 19600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar llvm::Triple Triple = getTriple(); 19700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 19800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // Thumb2 is the default for V7 on Darwin. 19900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // 20000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // FIXME: Thumb should just be another -target-feaure, not in the triple. 2015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Suffix = 20200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple)); 2032503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson bool ThumbDefault = Suffix.startswith("v6m") || 2042503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson (Suffix.startswith("v7") && getTriple().isOSDarwin()); 20500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar std::string ArchName = "arm"; 20661ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier 20761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier // Assembly files should start in ARM mode. 20861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier if (InputType != types::TY_PP_Asm && 20961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault)) 21000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar ArchName = "thumb"; 21100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar Triple.setArchName(ArchName + Suffix.str()); 21200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 21300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return Triple.getTriple(); 21400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } 21500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } 21600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 21700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 21861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args, 21961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const { 2209d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar // Diagnose use of Darwin OS deployment target arguments on non-Darwin. 22100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ, 2229d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar options::OPT_miphoneos_version_min_EQ, 2239d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar options::OPT_mios_simulator_version_min_EQ)) 2245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_clang_unsupported) 22500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar << A->getAsString(Args); 22600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 22761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier return ComputeLLVMTriple(Args, InputType); 22800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 22900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 23088491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruthvoid ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 23188491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth ArgStringList &CC1Args) const { 23288491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth // Each toolchain should provide the appropriate include flags. 23388491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth} 23488491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth 235a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruthvoid ToolChain::addClangTargetOptions(const ArgList &DriverArgs, 236a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth ArgStringList &CC1Args) const { 2378af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola} 2388af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola 239c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel DunbarToolChain::RuntimeLibType ToolChain::GetRuntimeLibType( 240c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar const ArgList &Args) const 241c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar{ 242c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) { 2431d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Value = A->getValue(); 244c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar if (Value == "compiler-rt") 245c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return ToolChain::RLT_CompilerRT; 246c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar if (Value == "libgcc") 247c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return ToolChain::RLT_Libgcc; 248c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar getDriver().Diag(diag::err_drv_invalid_rtlib_name) 249c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar << A->getAsString(Args); 250c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar } 251c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar 252c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return GetDefaultRuntimeLibType(); 253c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar} 254c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar 255641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel DunbarToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{ 2563f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { 2571d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Value = A->getValue(); 2583f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar if (Value == "libc++") 2593f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar return ToolChain::CST_Libcxx; 2603f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar if (Value == "libstdc++") 2613f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar return ToolChain::CST_Libstdcxx; 2625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_invalid_stdlib_name) 2633f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar << A->getAsString(Args); 2643f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar } 2653f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar 266641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar return ToolChain::CST_Libstdcxx; 267641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar} 268641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar 26979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory to CC1 arguments. 27079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemInclude(const ArgList &DriverArgs, 27179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args, 27279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth const Twine &Path) { 27379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back("-internal-isystem"); 27479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back(DriverArgs.MakeArgString(Path)); 27579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth} 27679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 27779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory with extern "C" 27879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// semantics to CC1 arguments. 27979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// 28079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// Note that this should be used rarely, and only for directories that 28179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// historically and for legacy reasons are treated as having implicit extern 28279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// "C" semantics. These semantics are *ignored* by and large today, but its 28379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// important to preserve the preprocessor changes resulting from the 28479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// classification. 28579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addExternCSystemInclude(const ArgList &DriverArgs, 28679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args, 28779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth const Twine &Path) { 28879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back("-internal-externc-isystem"); 28979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back(DriverArgs.MakeArgString(Path)); 29079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth} 29179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 29279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a list of system include directories to CC1. 29379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemIncludes(const ArgList &DriverArgs, 29479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args, 29579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArrayRef<StringRef> Paths) { 29679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth for (ArrayRef<StringRef>::iterator I = Paths.begin(), E = Paths.end(); 29779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth I != E; ++I) { 29879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back("-internal-isystem"); 29979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back(DriverArgs.MakeArgString(*I)); 30079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth } 30179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth} 30279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 303ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruthvoid ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 304ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth ArgStringList &CC1Args) const { 305a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // Header search paths should be handled by each of the subclasses. 306a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // Historically, they have not been, and instead have been handled inside of 307a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // the CC1-layer frontend. As the logic is hoisted out, this generic function 308a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // will slowly stop being called. 309a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // 310a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // While it is being called, replicate a bit of a hack to propagate the 311a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // '-stdlib=' flag down to CC1 so that it can in turn customize the C++ 312a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // header search paths with it. Once all systems are overriding this 313a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // function, the CC1 flag and this line can be removed. 314ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ); 315641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar} 316641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar 317132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid ToolChain::AddCXXStdlibLibArgs(const ArgList &Args, 318132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar ArgStringList &CmdArgs) const { 319641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar CXXStdlibType Type = GetCXXStdlibType(Args); 320641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar 321641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar switch (Type) { 3223f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar case ToolChain::CST_Libcxx: 3233f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar CmdArgs.push_back("-lc++"); 3243f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar break; 3253f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar 326641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar case ToolChain::CST_Libstdcxx: 327641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar CmdArgs.push_back("-lstdc++"); 328641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar break; 329641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar } 330641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar} 3317433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 3327433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid ToolChain::AddCCKextLibArgs(const ArgList &Args, 3337433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen ArgStringList &CmdArgs) const { 3347433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen CmdArgs.push_back("-lcc_kext"); 3357433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen} 336e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 337e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramerbool ToolChain::AddFastMathRuntimeIfAvailable(const ArgList &Args, 338e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer ArgStringList &CmdArgs) const { 339e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer // Check if -ffast-math or -funsafe-math is enabled. 340e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer Arg *A = Args.getLastArg(options::OPT_ffast_math, 341e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer options::OPT_fno_fast_math, 342e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer options::OPT_funsafe_math_optimizations, 343e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer options::OPT_fno_unsafe_math_optimizations); 344e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 345e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer if (!A || A->getOption().getID() == options::OPT_fno_fast_math || 346e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations) 347e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer return false; 348e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 349e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer // If crtfastmath.o exists add it to the arguments. 350e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer std::string Path = GetFilePath("crtfastmath.o"); 351e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer if (Path == "crtfastmath.o") // Not found. 352e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer return false; 353e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 354e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(Path)); 355e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer return true; 356e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer} 357