diff options
Diffstat (limited to 'lib/Driver/ToolChains.cpp')
| -rw-r--r-- | lib/Driver/ToolChains.cpp | 186 | 
1 files changed, 118 insertions, 68 deletions
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index abb55b07d106..78763397eee6 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -225,6 +225,8 @@ Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const {        T = new tools::darwin::Link(*this); break;      case Action::LipoJobClass:        T = new tools::darwin::Lipo(*this); break; +    case Action::DsymutilJobClass: +      T = new tools::darwin::Dsymutil(*this); break;      }    } @@ -323,6 +325,33 @@ DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple,  void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,                                         ArgStringList &CmdArgs) const {    // The Clang toolchain uses explicit paths for internal libraries. + +  // Unfortunately, we still might depend on a few of the libraries that are +  // only available in the gcc library directory (in particular +  // libstdc++.dylib). For now, hardcode the path to the known install location. +  llvm::sys::Path P(getDriver().Dir); +  P.eraseComponent(); // .../usr/bin -> ../usr +  P.appendComponent("lib"); +  P.appendComponent("gcc"); +  switch (getTriple().getArch()) { +  default: +    assert(0 && "Invalid Darwin arch!"); +  case llvm::Triple::x86: +  case llvm::Triple::x86_64: +    P.appendComponent("i686-apple-darwin10"); +    break; +  case llvm::Triple::arm: +  case llvm::Triple::thumb: +    P.appendComponent("arm-apple-darwin10"); +    break; +  case llvm::Triple::ppc: +  case llvm::Triple::ppc64: +    P.appendComponent("powerpc-apple-darwin10"); +    break; +  } +  P.appendComponent("4.2.1"); +  if (P.exists()) +    CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));  }  void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, @@ -386,9 +415,9 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,    }  } -DerivedArgList *Darwin::TranslateArgs(InputArgList &Args, +DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,                                        const char *BoundArch) const { -  DerivedArgList *DAL = new DerivedArgList(Args, false); +  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());    const OptTable &Opts = getDriver().getOpts();    // FIXME: We really want to get out of the tool chain level argument @@ -476,7 +505,8 @@ DerivedArgList *Darwin::TranslateArgs(InputArgList &Args,    }    setTarget(iPhoneVersion, Major, Minor, Micro); -  for (ArgList::iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { +  for (ArgList::const_iterator it = Args.begin(), +         ie = Args.end(); it != ie; ++it) {      Arg *A = *it;      if (A->getOption().matches(options::OPT_Xarch__)) { @@ -484,9 +514,8 @@ DerivedArgList *Darwin::TranslateArgs(InputArgList &Args,        if (getArchName() != A->getValue(Args, 0))          continue; -      // FIXME: The arg is leaked here, and we should have a nicer -      // interface for this. -      unsigned Prev, Index = Prev = A->getIndex() + 1; +      unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1)); +      unsigned Prev = Index;        Arg *XarchArg = Opts.ParseOneArg(Args, Index);        // If the argument parsing failed or more than one argument was @@ -506,6 +535,8 @@ DerivedArgList *Darwin::TranslateArgs(InputArgList &Args,        XarchArg->setBaseArg(A);        A = XarchArg; + +      DAL->AddSynthesizedArg(A);      }      // Sob. These is strictly gcc compatible for the time being. Apple @@ -519,66 +550,61 @@ DerivedArgList *Darwin::TranslateArgs(InputArgList &Args,      case options::OPT_mkernel:      case options::OPT_fapple_kext:        DAL->append(A); -      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); -      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));        break;      case options::OPT_dependency_file: -      DAL->append(DAL->MakeSeparateArg(A, Opts.getOption(options::OPT_MF), -                                       A->getValue(Args))); +      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), +                          A->getValue(Args));        break;      case options::OPT_gfull: -      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag))); -      DAL->append(DAL->MakeFlagArg(A, -             Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); +      DAL->AddFlagArg(A, +               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));        break;      case options::OPT_gused: -      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag))); -      DAL->append(DAL->MakeFlagArg(A, -             Opts.getOption(options::OPT_feliminate_unused_debug_symbols))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); +      DAL->AddFlagArg(A, +             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));        break;      case options::OPT_fterminated_vtables:      case options::OPT_findirect_virtual_calls: -      DAL->append(DAL->MakeFlagArg(A, -                                   Opts.getOption(options::OPT_fapple_kext))); -      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext)); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));        break;      case options::OPT_shared: -      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_dynamiclib))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));        break;      case options::OPT_fconstant_cfstrings: -      DAL->append(DAL->MakeFlagArg(A, -                             Opts.getOption(options::OPT_mconstant_cfstrings))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));        break;      case options::OPT_fno_constant_cfstrings: -      DAL->append(DAL->MakeFlagArg(A, -                          Opts.getOption(options::OPT_mno_constant_cfstrings))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));        break;      case options::OPT_Wnonportable_cfstrings: -      DAL->append(DAL->MakeFlagArg(A, -                     Opts.getOption(options::OPT_mwarn_nonportable_cfstrings))); +      DAL->AddFlagArg(A, +                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));        break;      case options::OPT_Wno_nonportable_cfstrings: -      DAL->append(DAL->MakeFlagArg(A, -                  Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings))); +      DAL->AddFlagArg(A, +                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));        break;      case options::OPT_fpascal_strings: -      DAL->append(DAL->MakeFlagArg(A, -                                 Opts.getOption(options::OPT_mpascal_strings))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));        break;      case options::OPT_fno_pascal_strings: -      DAL->append(DAL->MakeFlagArg(A, -                              Opts.getOption(options::OPT_mno_pascal_strings))); +      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));        break;      }    } @@ -586,8 +612,7 @@ DerivedArgList *Darwin::TranslateArgs(InputArgList &Args,    if (getTriple().getArch() == llvm::Triple::x86 ||        getTriple().getArch() == llvm::Triple::x86_64)      if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) -      DAL->append(DAL->MakeJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), -                                     "core2")); +      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");    // Add the arch options based on the particular spelling of -arch, to match    // how the driver driver works. @@ -601,57 +626,57 @@ DerivedArgList *Darwin::TranslateArgs(InputArgList &Args,      if (Name == "ppc")        ;      else if (Name == "ppc601") -      DAL->append(DAL->MakeJoinedArg(0, MCpu, "601")); +      DAL->AddJoinedArg(0, MCpu, "601");      else if (Name == "ppc603") -      DAL->append(DAL->MakeJoinedArg(0, MCpu, "603")); +      DAL->AddJoinedArg(0, MCpu, "603");      else if (Name == "ppc604") -      DAL->append(DAL->MakeJoinedArg(0, MCpu, "604")); +      DAL->AddJoinedArg(0, MCpu, "604");      else if (Name == "ppc604e") -      DAL->append(DAL->MakeJoinedArg(0, MCpu, "604e")); +      DAL->AddJoinedArg(0, MCpu, "604e");      else if (Name == "ppc750") -      DAL->append(DAL->MakeJoinedArg(0, MCpu, "750")); +      DAL->AddJoinedArg(0, MCpu, "750");      else if (Name == "ppc7400") -      DAL->append(DAL->MakeJoinedArg(0, MCpu, "7400")); +      DAL->AddJoinedArg(0, MCpu, "7400");      else if (Name == "ppc7450") -      DAL->append(DAL->MakeJoinedArg(0, MCpu, "7450")); +      DAL->AddJoinedArg(0, MCpu, "7450");      else if (Name == "ppc970") -      DAL->append(DAL->MakeJoinedArg(0, MCpu, "970")); +      DAL->AddJoinedArg(0, MCpu, "970");      else if (Name == "ppc64") -      DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64))); +      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));      else if (Name == "i386")        ;      else if (Name == "i486") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "i486")); +      DAL->AddJoinedArg(0, MArch, "i486");      else if (Name == "i586") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "i586")); +      DAL->AddJoinedArg(0, MArch, "i586");      else if (Name == "i686") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "i686")); +      DAL->AddJoinedArg(0, MArch, "i686");      else if (Name == "pentium") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium")); +      DAL->AddJoinedArg(0, MArch, "pentium");      else if (Name == "pentium2") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2")); +      DAL->AddJoinedArg(0, MArch, "pentium2");      else if (Name == "pentpro") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentiumpro")); +      DAL->AddJoinedArg(0, MArch, "pentiumpro");      else if (Name == "pentIIm3") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2")); +      DAL->AddJoinedArg(0, MArch, "pentium2");      else if (Name == "x86_64") -      DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64))); +      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));      else if (Name == "arm") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t")); +      DAL->AddJoinedArg(0, MArch, "armv4t");      else if (Name == "armv4t") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t")); +      DAL->AddJoinedArg(0, MArch, "armv4t");      else if (Name == "armv5") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv5tej")); +      DAL->AddJoinedArg(0, MArch, "armv5tej");      else if (Name == "xscale") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "xscale")); +      DAL->AddJoinedArg(0, MArch, "xscale");      else if (Name == "armv6") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv6k")); +      DAL->AddJoinedArg(0, MArch, "armv6k");      else if (Name == "armv7") -      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv7a")); +      DAL->AddJoinedArg(0, MArch, "armv7a");      else        llvm_unreachable("invalid Darwin arch"); @@ -740,6 +765,8 @@ Tool &Generic_GCC::SelectTool(const Compilation &C,        // driver is Darwin.      case Action::LipoJobClass:        T = new tools::darwin::Lipo(*this); break; +    case Action::DsymutilJobClass: +      T = new tools::darwin::Dsymutil(*this); break;      }    } @@ -760,12 +787,6 @@ const char *Generic_GCC::GetForcedPicModel() const {    return 0;  } -DerivedArgList *Generic_GCC::TranslateArgs(InputArgList &Args, -                                           const char *BoundArch) const { -  return new DerivedArgList(Args, true); -} - -  /// TCEToolChain - A tool chain using the llvm bitcode tools to perform  /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.  /// Currently does not support anything else but compilation. @@ -820,11 +841,6 @@ Tool &TCEToolChain::SelectTool(const Compilation &C,    return *T;  } -DerivedArgList *TCEToolChain::TranslateArgs(InputArgList &Args, -                                            const char *BoundArch) const { -  return new DerivedArgList(Args, true); -} -  /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.  OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple) @@ -859,6 +875,8 @@ Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const {  FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32)    : Generic_GCC(Host, Triple) { +  getProgramPaths().push_back(getDriver().Dir + "/../libexec"); +  getProgramPaths().push_back("/usr/libexec");    if (Lib32) {      getFilePaths().push_back(getDriver().Dir + "/../lib32");      getFilePaths().push_back("/usr/lib32"); @@ -890,6 +908,38 @@ Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const {    return *T;  } +/// Minix - Minix tool chain which can call as(1) and ld(1) directly. + +Minix::Minix(const HostInfo &Host, const llvm::Triple& Triple) +  : Generic_GCC(Host, Triple) { +  getFilePaths().push_back(getDriver().Dir + "/../lib"); +  getFilePaths().push_back("/usr/lib"); +  getFilePaths().push_back("/usr/gnu/lib"); +  getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3"); +} + +Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA) 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::minix::Assemble(*this); break; +    case Action::LinkJobClass: +      T = new tools::minix::Link(*this); break; +    default: +      T = &Generic_GCC::SelectTool(C, JA); +    } +  } + +  return *T; +} +  /// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.  AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)  | 
