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/ -Matt _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
