From 8eddb3fb6ff3dd20e3920380e1ce56df105b8a98 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 20 Mar 2009 00:57:52 +0000 Subject: [PATCH] Driver: Sketch Darwin tool chains. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67356 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/HostInfo.cpp | 12 +++--- lib/Driver/ToolChains.cpp | 82 ++++++++++++++++++++++++++++++++++++--- lib/Driver/ToolChains.h | 28 +++++++++++++ 3 files changed, 111 insertions(+), 11 deletions(-) diff --git a/lib/Driver/HostInfo.cpp b/lib/Driver/HostInfo.cpp index a1dc1496ac..5f2460f209 100644 --- a/lib/Driver/HostInfo.cpp +++ b/lib/Driver/HostInfo.cpp @@ -106,13 +106,13 @@ ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args, ToolChain *&TC = ToolChains[ArchName]; if (!TC) { if (strcmp(ArchName, "i386") == 0 || strcmp(ArchName, "x86_64") == 0) - TC = new toolchains::Generic_GCC(*this, ArchName, - getPlatformName().c_str(), - getOSName().c_str()); + TC = new toolchains::Darwin_X86(*this, ArchName, + getPlatformName().c_str(), + getOSName().c_str()); else - TC = new toolchains::Generic_GCC(*this, ArchName, - getPlatformName().c_str(), - getOSName().c_str()); + TC = new toolchains::Darwin_GCC(*this, ArchName, + getPlatformName().c_str(), + getOSName().c_str()); } return TC; diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 8e1c7d5562..3941726c2e 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -12,6 +12,74 @@ using namespace clang::driver; using namespace clang::driver::toolchains; +/// Darwin_X86 - Darwin tool chain for i386 and x86_64. + +Darwin_X86::~Darwin_X86() { + // Free tool implementations. + for (llvm::DenseMap::iterator + it = Tools.begin(), ie = Tools.end(); it != ie; ++it) + delete it->second; +} + +Tool &Darwin_X86::SelectTool(const Compilation &C, + const JobAction &JA) const { + Action::ActionClass Key; + if (ShouldUseClangCompiler(C, JA)) + Key = Action::AnalyzeJobClass; + else + Key = JA.getKind(); + + Tool *&T = Tools[Key]; + if (!T) { + switch (Key) { + case Action::InputClass: + case Action::BindArchClass: + assert(0 && "Invalid tool kind."); + case Action::PreprocessJobClass: + T = new tools::gcc::Preprocess(*this); break; + case Action::PrecompileJobClass: + T = new tools::gcc::Precompile(*this); break; + case Action::AnalyzeJobClass: + T = new tools::Clang(*this); break; + case Action::CompileJobClass: + T = new tools::gcc::Compile(*this); break; + case Action::AssembleJobClass: + T = new tools::gcc::Assemble(*this); break; + case Action::LinkJobClass: + T = new tools::gcc::Link(*this); break; + case Action::LipoJobClass: + T = new tools::darwin::Lipo(*this); break; + } + } + + return *T; +} + +ArgList *Darwin_X86::TranslateArgs(ArgList &Args) const { + // FIXME: Implement! + return &Args; +} + +bool Darwin_X86::IsMathErrnoDefault() const { + return false; +} + +bool Darwin_X86::IsUnwindTablesDefault() const { + // FIXME: Gross; we should probably have some separate target + // definition, possibly even reusing the one in clang. + return getArchName() == "x86_64"; +} + +const char *Darwin_X86::GetDefaultRelocationModel() const { + return "pic"; +} + +const char *Darwin_X86::GetForcedPicModel() const { + if (getArchName() == "x86_64") + return "pic"; + return 0; +} + /// Generic_GCC - A tool chain using the 'gcc' command to perform /// all subcommands; this relies on gcc translating the majority of /// command line options. @@ -34,7 +102,8 @@ Tool &Generic_GCC::SelectTool(const Compilation &C, Tool *&T = Tools[Key]; if (!T) { switch (Key) { - default: + case Action::InputClass: + case Action::BindArchClass: assert(0 && "Invalid tool kind."); case Action::PreprocessJobClass: T = new tools::gcc::Preprocess(*this); break; @@ -48,6 +117,11 @@ Tool &Generic_GCC::SelectTool(const Compilation &C, T = new tools::gcc::Assemble(*this); break; case Action::LinkJobClass: T = new tools::gcc::Link(*this); break; + + // This is a bit ungeneric, but the only platform using a driver + // driver is Darwin. + case Action::LipoJobClass: + T = new tools::darwin::Lipo(*this); break; } } @@ -59,8 +133,8 @@ bool Generic_GCC::IsMathErrnoDefault() const { } bool Generic_GCC::IsUnwindTablesDefault() const { - // FIXME: Gross; we should probably have some separate target definition, - // possibly even reusing the one in clang. + // FIXME: Gross; we should probably have some separate target + // definition, possibly even reusing the one in clang. return getArchName() == "x86_64"; } @@ -71,5 +145,3 @@ const char *Generic_GCC::GetDefaultRelocationModel() const { const char *Generic_GCC::GetForcedPicModel() const { return 0; } - - diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index e3347cbd28..9e196e02f2 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -43,6 +43,34 @@ public: virtual const char *GetForcedPicModel() const; }; + /// Darwin_X86 - Darwin tool chain for i386 an x86_64. +class VISIBILITY_HIDDEN Darwin_X86 : public ToolChain { + mutable llvm::DenseMap Tools; + +public: + Darwin_X86(const HostInfo &Host, const char *Arch, const char *Platform, + const char *OS) : ToolChain(Host, Arch, Platform, OS) {} + ~Darwin_X86(); + + virtual ArgList *TranslateArgs(ArgList &Args) const; + + virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; + + virtual bool IsMathErrnoDefault() const; + virtual bool IsUnwindTablesDefault() const; + virtual const char *GetDefaultRelocationModel() const; + virtual const char *GetForcedPicModel() const; +}; + + /// Darwin_GCC - Generic Darwin tool chain using gcc. +class VISIBILITY_HIDDEN Darwin_GCC : public Generic_GCC { +public: + Darwin_GCC(const HostInfo &Host, const char *Arch, const char *Platform, + const char *OS) : Generic_GCC(Host, Arch, Platform, OS) {} + + virtual const char *GetDefaultRelocationModel() const { return "pic"; } +}; + } // end namespace toolchains } // end namespace driver } // end namespace clang -- 2.40.0