ToolChains.h revision 71a6cbc5a101899f54e0a76aece82c01b48ad089
183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//===--- ToolChains.h - ToolChain Implementations ---------------*- C++ -*-===// 283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// 383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// The LLVM Compiler Infrastructure 483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// 583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// This file is distributed under the University of Illinois Open Source 683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// License. See LICENSE.TXT for details. 783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// 883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//===----------------------------------------------------------------------===// 983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 1083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#ifndef CLANG_LIB_DRIVER_TOOLCHAINS_H_ 1183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#define CLANG_LIB_DRIVER_TOOLCHAINS_H_ 1283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 13670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "clang/Driver/Action.h" 1483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "clang/Driver/ToolChain.h" 1583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 16670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "llvm/ADT/DenseMap.h" 1783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "llvm/Support/Compiler.h" 1883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 19670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "Tools.h" 20670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 2183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace clang { 2283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace driver { 23985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace toolchains { 2483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// all subcommands; this relies on gcc translating the majority of 271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// command line options. 2892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 2975358d267256022475371416654b056ad8531cb3Daniel Dunbarprotected: 30670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar mutable llvm::DenseMap<unsigned, Tool*> Tools; 31670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 3283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarpublic: 33cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple); 343917608370583fa30c466b6c3893448229aea9adDaniel Dunbar ~Generic_GCC(); 3583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 363917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; 37670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 383917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual bool IsUnwindTablesDefault() const; 393917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual const char *GetDefaultRelocationModel() const; 403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual const char *GetForcedPicModel() const; 4183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar}; 4283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 431d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin - The base Darwin tool chain. 4492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain { 458eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar mutable llvm::DenseMap<unsigned, Tool*> Tools; 468eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 472603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar /// Whether the information on the target has been initialized. 482603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // 492603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: This should be eliminated. What we want to do is make this part of 502603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // the "default target for arguments" selection process, once we get out of 512603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // the argument translation business. 522603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable bool TargetInitialized; 532603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 542603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar /// Whether we are targetting iPhoneOS target. 552603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable bool TargetIsIPhoneOS; 56eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar 572603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar /// The OS version we are targetting. 582603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable unsigned TargetVersion[3]; 592603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 6002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar /// The default macosx-version-min of this tool chain; empty until 6102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar /// initialized. 62816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar std::string MacosxVersionMin; 6302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 648eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic: 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Darwin(const HostInfo &Host, const llvm::Triple& Triple, 66cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&DarwinVersion)[3]); 67f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar ~Darwin(); 688eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 696b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// @name Darwin Specific Toolchain API 706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// { 716b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 722603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: Eliminate these ...Target functions and derive separate tool chains 732603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // for these targets and put version in constructor. 742603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar void setTarget(bool isIPhoneOS, unsigned Major, unsigned Minor, 752603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar unsigned Micro) const { 762603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: For now, allow reinitialization as long as values don't 772603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // change. This will go away when we move away from argument translation. 782603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (TargetInitialized && TargetIsIPhoneOS == isIPhoneOS && 792603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[0] == Major && TargetVersion[1] == Minor && 802603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[2] == Micro) 812603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar return; 822603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 832603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(!TargetInitialized && "Target already initialized!"); 842603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetInitialized = true; 852603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetIsIPhoneOS = isIPhoneOS; 862603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[0] = Major; 872603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[1] = Minor; 882603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[2] = Micro; 892603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 902603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 912603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar bool isTargetIPhoneOS() const { 922603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 932603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar return TargetIsIPhoneOS; 942603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 952603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 9603d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar bool isTargetInitialized() const { return TargetInitialized; } 9703d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar 982603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar void getTargetVersion(unsigned (&Res)[3]) const { 992603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 1002603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Res[0] = TargetVersion[0]; 1012603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Res[1] = TargetVersion[1]; 1022603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Res[2] = TargetVersion[2]; 1032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 1042603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 105eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler 106eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// invocation. For example, Darwin treats different ARM variations as 107eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// distinct architectures. 108eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar llvm::StringRef getDarwinArchName(const ArgList &Args) const; 109eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 110ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar static bool isVersionLT(unsigned (&A)[3], unsigned (&B)[3]) { 111608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar for (unsigned i=0; i < 3; ++i) { 112608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar if (A[i] > B[i]) return false; 113608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar if (A[i] < B[i]) return true; 114608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } 115608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar return false; 116608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } 117608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 118ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 119ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar assert(isTargetIPhoneOS() && "Unexpected call for OS X target!"); 120608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar unsigned B[3] = { V0, V1, V2 }; 121ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar return isVersionLT(TargetVersion, B); 122608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } 123608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 124ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 125ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar assert(!isTargetIPhoneOS() && "Unexpected call for iPhoneOS target!"); 126cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar unsigned B[3] = { V0, V1, V2 }; 127ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar return isVersionLT(TargetVersion, B); 128cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 129cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar 1306b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// AddLinkSearchPathArgs - Add the linker search paths to \arg CmdArgs. 1316b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// 1326b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// \param Args - The input argument list. 1336b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// \param CmdArgs [out] - The command argument list to append the paths 1346b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// (prefixed by -L) to. 1351d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkSearchPathArgs(const ArgList &Args, 1361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const = 0; 13702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1386cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler 1396cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar /// runtime library. 1401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkRuntimeLibArgs(const ArgList &Args, 1411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const = 0; 1426cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 1436b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// } 1446b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// @name ToolChain Implementation 1456b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// { 1466b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 147279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args, 1480dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar const char *BoundArch) const; 1498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; 1518eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1529e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar virtual bool IsBlocksDefault() const { 1535435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar // Blocks default to on for OS X 10.6 and iPhoneOS 3.0 and beyond. 1545435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar if (isTargetIPhoneOS()) 1555435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar return !isIPhoneOSVersionLT(3); 1565435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar else 1575435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar return !isMacosxVersionLT(10, 6); 1589e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 159eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar virtual bool IsIntegratedAssemblerDefault() const { 16071a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#ifdef DISABLE_DEFAULT_INTEGRATED_ASSEMBLER 16171a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar return false; 16271a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#else 163eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar // Default integrated assembler to on for x86. 164eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar return (getTriple().getArch() == llvm::Triple::x86 || 165eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar getTriple().getArch() == llvm::Triple::x86_64); 16671a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#endif 167eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar } 1689e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar virtual bool IsObjCNonFragileABIDefault() const { 169f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Non-fragile ABI is default for everything but i386. 170f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return getTriple().getArch() != llvm::Triple::x86; 1719e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 172609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar virtual bool IsObjCLegacyDispatchDefault() const { 173609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar // This is only used with the non-fragile ABI. 174f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar 175f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Legacy dispatch is used everywhere except on x86_64. 176f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return getTriple().getArch() != llvm::Triple::x86_64; 177609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar } 178f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar virtual bool UseObjCMixedDispatch() const { 179f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // This is only used with the non-fragile ABI and non-legacy dispatch. 180f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar 181f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Mixed dispatch is used everywhere except OS X before 10.6. 182f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return !(!isTargetIPhoneOS() && isMacosxVersionLT(10, 6)); 183f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar } 1848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual bool IsUnwindTablesDefault() const; 1859e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar virtual unsigned GetDefaultStackProtectorLevel() const { 1865435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar // Stack protectors default to on for 10.6 and beyond. 1875435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar return !isTargetIPhoneOS() && !isMacosxVersionLT(10, 6); 1889e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 1898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetDefaultRelocationModel() const; 1908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetForcedPicModel() const; 1916b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 19243a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar virtual bool SupportsObjCGC() const; 19343a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar 194f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar virtual bool UseDwarfDebugFlags() const; 195f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 196b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar virtual bool UseSjLjExceptions() const; 197b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 1986b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// } 1998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}; 2008eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2011d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinClang - The Darwin toolchain used by Clang. 20292dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin { 2031d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic: 2041d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar DarwinClang(const HostInfo &Host, const llvm::Triple& Triple, 205cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&DarwinVersion)[3]); 2061d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2071d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// @name Darwin ToolChain Implementation 2081d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// { 2091d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkSearchPathArgs(const ArgList &Args, 2111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const; 2121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkRuntimeLibArgs(const ArgList &Args, 2141d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const; 2151d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2161d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// } 2171d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}; 2181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2191d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinGCC - The Darwin toolchain used by GCC. 22092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY DarwinGCC : public Darwin { 2211d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// GCC version to use. 22255bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek unsigned GCCVersion[3]; 2231d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2241d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// The directory suffix for this tool chain. 2251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar std::string ToolChainDir; 2261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic: 2281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple, 229cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&DarwinVersion)[3], 230cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&GCCVersion)[3]); 2311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// @name Darwin ToolChain Implementation 2331d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// { 2341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2351d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkSearchPathArgs(const ArgList &Args, 2361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const; 2371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2381d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkRuntimeLibArgs(const ArgList &Args, 2391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const; 2401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// } 2421d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}; 2431d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2441d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc. 24592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC { 2468eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic: 2471d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar Darwin_Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple) 248cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar : Generic_GCC(Host, Triple) {} 2498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetDefaultRelocationModel() const { return "pic"; } 2518eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}; 2528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 25392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC { 254e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanpublic: 255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan AuroraUX(const HostInfo &Host, const llvm::Triple& Triple); 256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 257e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; 258e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}; 259e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 26092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_GCC { 261f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarpublic: 262f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar OpenBSD(const HostInfo &Host, const llvm::Triple& Triple); 263f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 264f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; 265f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}; 266f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 26792dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_GCC { 26875358d267256022475371416654b056ad8531cb3Daniel Dunbarpublic: 269cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32); 27075358d267256022475371416654b056ad8531cb3Daniel Dunbar 27175358d267256022475371416654b056ad8531cb3Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; 27275358d267256022475371416654b056ad8531cb3Daniel Dunbar}; 27375358d267256022475371416654b056ad8531cb3Daniel Dunbar 27492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_GCC { 27511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarpublic: 276cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar DragonFly(const HostInfo &Host, const llvm::Triple& Triple); 27711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 27811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; 27911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}; 28011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 28192dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_GCC { 2826b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanpublic: 2836b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman Linux(const HostInfo &Host, const llvm::Triple& Triple); 2846b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}; 2856b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 2866b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 2873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 2883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 28992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain { 2903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerpublic: 2913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple); 2923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner ~TCEToolChain(); 2933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 2943a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; 2953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner bool IsMathErrnoDefault() const; 2963a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner bool IsUnwindTablesDefault() const; 2973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const char* GetDefaultRelocationModel() const; 2983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const char* GetForcedPicModel() const; 2993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 3003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerprivate: 3013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner mutable llvm::DenseMap<unsigned, Tool*> Tools; 3023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 3033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}; 3043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 30583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains 30683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver 30783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang 30883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 30983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif 310