On Wed, Feb 15, 2012 at 10:35, Matt Beaumont-Gay <[email protected]> wrote: > On Wed, Feb 15, 2012 at 05:39, David Chisnall <[email protected]> wrote: >> Author: theraven >> Date: Wed Feb 15 07:39:01 2012 >> New Revision: 150580 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=150580&view=rev >> Log: >> First pass at Solaris toolchain support. This version compiles and links >> hello >> world on Solaris 11 for both x86 and x86-64 using the built-in assembler and >> Solaris (not GNU) ld, however it currently relies on a hard-coded GCC >> location >> to find crtbegin.o and crtend.o, as well as libgcc and libgcc_eh. >> >> >> Modified: >> cfe/trunk/lib/Driver/Driver.cpp >> cfe/trunk/lib/Driver/ToolChains.cpp >> cfe/trunk/lib/Driver/ToolChains.h >> cfe/trunk/lib/Driver/Tools.cpp >> cfe/trunk/lib/Driver/Tools.h >> >> Modified: cfe/trunk/lib/Driver/Driver.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=150580&r1=150579&r2=150580&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Driver/Driver.cpp (original) >> +++ cfe/trunk/lib/Driver/Driver.cpp Wed Feb 15 07:39:01 2012 >> @@ -1663,6 +1663,9 @@ >> else >> TC = new toolchains::Linux(*this, Target); >> break; >> + case llvm::Triple::Solaris: >> + TC = new toolchains::Solaris(*this, Target); >> + break; >> case llvm::Triple::Win32: >> TC = new toolchains::Windows(*this, Target); >> break; >> >> Modified: cfe/trunk/lib/Driver/ToolChains.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=150580&r1=150579&r2=150580&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Driver/ToolChains.cpp (original) >> +++ cfe/trunk/lib/Driver/ToolChains.cpp Wed Feb 15 07:39:01 2012 >> @@ -1755,6 +1755,41 @@ >> return *T; >> } >> >> +/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly. >> + >> +Solaris::Solaris(const Driver &D, const llvm::Triple& Triple) >> + : Generic_GCC(D, Triple) { >> + >> + getProgramPaths().push_back(getDriver().getInstalledDir()); >> + if (getDriver().getInstalledDir() != getDriver().Dir) >> + getProgramPaths().push_back(getDriver().Dir); >> + >> + getFilePaths().push_back(getDriver().Dir + "/../lib"); >> + getFilePaths().push_back("/usr/lib"); >> +} >> + >> +Tool &Solaris::SelectTool(const Compilation &C, const JobAction &JA, >> + const ActionList &Inputs) const { >> + Action::ActionClass Key; >> + if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) >> + Key = Action::AnalyzeJobClass; >> + else >> + Key = JA.getKind(); >> + >> + Tool *&T = Tools[Key]; >> + if (!T) { >> + switch (Key) { >> + case Action::AssembleJobClass: >> + T = new tools::solaris::Assemble(*this); break; >> + case Action::LinkJobClass: >> + T = new tools::solaris::Link(*this); break; >> + default: >> + T = &Generic_GCC::SelectTool(C, JA, Inputs); >> + } >> + } >> + >> + return *T; >> +} >> >> /// Linux toolchain (very bare-bones at the moment). >> >> >> Modified: cfe/trunk/lib/Driver/ToolChains.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=150580&r1=150579&r2=150580&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Driver/ToolChains.h (original) >> +++ cfe/trunk/lib/Driver/ToolChains.h Wed Feb 15 07:39:01 2012 >> @@ -449,6 +449,17 @@ >> const ActionList &Inputs) const; >> }; >> >> +class LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { >> +public: >> + Solaris(const Driver &D, const llvm::Triple& Triple); >> + >> + virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, >> + const ActionList &Inputs) const; >> + >> + virtual bool IsIntegratedAssemblerDefault() const { return true; } >> +}; >> + >> + >> class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { >> public: >> OpenBSD(const Driver &D, const llvm::Triple& Triple); >> >> Modified: cfe/trunk/lib/Driver/Tools.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=150580&r1=150579&r2=150580&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Driver/Tools.cpp (original) >> +++ cfe/trunk/lib/Driver/Tools.cpp Wed Feb 15 07:39:01 2012 >> @@ -4170,6 +4170,126 @@ >> C.addCommand(new Command(JA, *this, Exec, CmdArgs)); >> } >> >> +void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA, >> + const InputInfo &Output, >> + const InputInfoList &Inputs, >> + const ArgList &Args, >> + const char *LinkingOutput) const { >> + ArgStringList CmdArgs; >> + >> + Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, >> + options::OPT_Xassembler); >> + >> + CmdArgs.push_back("-o"); >> + CmdArgs.push_back(Output.getFilename()); >> + >> + for (InputInfoList::const_iterator >> + it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { >> + const InputInfo &II = *it; >> + CmdArgs.push_back(II.getFilename()); >> + } >> + >> + const char *Exec = >> + Args.MakeArgString(getToolChain().GetProgramPath("as")); >> + C.addCommand(new Command(JA, *this, Exec, CmdArgs)); >> +} >> + >> + >> +void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA, >> + const InputInfo &Output, >> + const InputInfoList &Inputs, >> + const ArgList &Args, >> + const char *LinkingOutput) const { >> + // FIXME: Find a real GCC, don't hard-code versions here >> + std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/"; >> + const llvm::Triple &T = getToolChain().getTriple(); >> + std::string LibPath = "/usr/lib/"; >> + llvm::Triple::ArchType Arch = T.getArch(); >> + switch (Arch) { >> + case llvm::Triple::x86: >> + GCCLibPath += ("i386-" + T.getVendorName() + "-" + >> + T.getOSName()).str() + "/4.5.2/"; >> + break; >> + case llvm::Triple::x86_64: >> + GCCLibPath += ("i386-" + T.getVendorName() + "-" + >> + T.getOSName()).str(); >> + GCCLibPath += "/4.5.2/amd64/"; >> + LibPath += "amd64/"; >> + break; >> + default: >> + assert(0 && "Unsupported architecture"); >> + } >> + >> + ArgStringList CmdArgs; >> + >> + if ((!Args.hasArg(options::OPT_nostdlib)) && >> + (!Args.hasArg(options::OPT_shared))) { >> + CmdArgs.push_back("-e"); >> + CmdArgs.push_back("_start"); >> + } >> + >> + if (Args.hasArg(options::OPT_static)) { >> + CmdArgs.push_back("-Bstatic"); >> + CmdArgs.push_back("-dn"); >> + } else { >> + CmdArgs.push_back("-Bdynamic"); >> + if (Args.hasArg(options::OPT_shared)) { >> + CmdArgs.push_back("-shared"); >> + } else { >> + CmdArgs.push_back("--dynamic-linker"); >> + CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1")); >> + } >> + } >> + >> + if (Output.isFilename()) { >> + CmdArgs.push_back("-o"); >> + CmdArgs.push_back(Output.getFilename()); >> + } else { >> + assert(Output.isNothing() && "Invalid output."); >> + } >> + >> + if (!Args.hasArg(options::OPT_nostdlib) && >> + !Args.hasArg(options::OPT_nostartfiles)) { >> + if (!Args.hasArg(options::OPT_shared)) { >> + CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o")); >> + CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o")); >> + CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o")); >> + } else { >> + CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o")); >> + } >> + CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o")); >> + } >> + >> + CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath)); >> + >> + Args.AddAllArgs(CmdArgs, options::OPT_L); >> + Args.AddAllArgs(CmdArgs, options::OPT_T_Group); >> + Args.AddAllArgs(CmdArgs, options::OPT_e); >> + >> + AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); >> + >> + if (!Args.hasArg(options::OPT_nostdlib) && >> + !Args.hasArg(options::OPT_nodefaultlibs)) { >> + CmdArgs.push_back("-lgcc"); >> + CmdArgs.push_back("-lgcc_eh"); >> + if (!Args.hasArg(options::OPT_shared)) >> + CmdArgs.push_back("-lc"); >> + >> + } >> + >> + if (!Args.hasArg(options::OPT_nostdlib) && >> + !Args.hasArg(options::OPT_nostartfiles)) { >> + if (!Args.hasArg(options::OPT_shared)) >> + CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o")); >> + } >> + >> + addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); >> + >> + const char *Exec = >> + Args.MakeArgString(getToolChain().GetProgramPath("ld")); >> + C.addCommand(new Command(JA, *this, Exec, CmdArgs)); >> +} >> + >> void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, >> const InputInfo &Output, >> const InputInfoList &Inputs, >> >> Modified: cfe/trunk/lib/Driver/Tools.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=150580&r1=150579&r2=150580&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Driver/Tools.h (original) >> +++ cfe/trunk/lib/Driver/Tools.h Wed Feb 15 07:39:01 2012 >> @@ -483,6 +483,35 @@ >> }; >> } // end namespace minix >> >> + /// solaris -- Directly call Solaris assembler and linker >> +namespace solaris { >> + class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { >> + public: >> + Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler", >> + TC) {} >> + >> + virtual bool hasIntegratedCPP() const { return false; } >> + >> + virtual void ConstructJob(Compilation &C, const JobAction &JA, >> + const InputInfo &Output, >> + const InputInfoList &Inputs, >> + const ArgList &TCArgs, >> + const char *LinkingOutput) const; >> + }; >> + class LLVM_LIBRARY_VISIBILITY Link : public Tool { >> + public: >> + Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {} >> + >> + virtual bool hasIntegratedCPP() const { return false; } >> + >> + virtual void ConstructJob(Compilation &C, const JobAction &JA, >> + const InputInfo &Output, >> + const InputInfoList &Inputs, >> + const ArgList &TCArgs, >> + const char *LinkingOutput) const; >> + }; >> +} // end namespace auroraux > > s/auroraux/solaris/
I see you already got this -- that's what I get for not finishing my commits mail backlog first, sorry. _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
