[cfe-commits] r150580 - in /cfe/trunk/lib/Driver: Driver.cpp ToolChains.cpp ToolChains.h Tools.cpp Tools.h

Matt Beaumont-Gay matthewbg at google.com
Wed Feb 15 10:50:58 PST 2012


On Wed, Feb 15, 2012 at 10:35, Matt Beaumont-Gay <matthewbg at google.com> wrote:
> On Wed, Feb 15, 2012 at 05:39, David Chisnall <csdavec at swan.ac.uk> 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.




More information about the cfe-commits mailing list