summaryrefslogtreecommitdiffstats
path: root/lib/Driver/ToolChains.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Driver/ToolChains.cpp')
-rw-r--r--lib/Driver/ToolChains.cpp186
1 files changed, 118 insertions, 68 deletions
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index abb55b0..7876339 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)
OpenPOWER on IntegriCloud