diff options
Diffstat (limited to 'lib/Driver')
-rw-r--r-- | lib/Driver/ArgList.cpp | 19 | ||||
-rw-r--r-- | lib/Driver/Driver.cpp | 5 | ||||
-rw-r--r-- | lib/Driver/ToolChain.cpp | 7 | ||||
-rw-r--r-- | lib/Driver/ToolChains.cpp | 17 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 115 |
5 files changed, 90 insertions, 73 deletions
diff --git a/lib/Driver/ArgList.cpp b/lib/Driver/ArgList.cpp index 95fef89..9101523 100644 --- a/lib/Driver/ArgList.cpp +++ b/lib/Driver/ArgList.cpp @@ -95,6 +95,25 @@ Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1, return Res; } +Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1, + OptSpecifier Id2, OptSpecifier Id3) const { + Arg *Res = 0; + for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it) { + if ((*it)->getOption().matches(Id0) || + (*it)->getOption().matches(Id1) || + (*it)->getOption().matches(Id2) || + (*it)->getOption().matches(Id3)) { + Res = *it; + break; + } + } + + if (Res) + Res->claim(); + + return Res; +} + bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const { if (Arg *A = getLastArg(Pos, Neg)) return A->getOption().matches(Pos); diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 5da7908..2fc0a53 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -75,6 +75,11 @@ Driver::Driver(llvm::StringRef _Name, llvm::StringRef _Dir, P.appendComponent("clang"); P.appendComponent(CLANG_VERSION_STRING); ResourceDir = P.str(); + + // Save the original clang executable path. + P = Dir; + P.appendComponent(Name); + ClangExecutable = P.str(); } Driver::~Driver() { diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index 9b6264a..9fae67d 100644 --- a/lib/Driver/ToolChain.cpp +++ b/lib/Driver/ToolChain.cpp @@ -26,14 +26,11 @@ const Driver &ToolChain::getDriver() const { return Host.getDriver(); } -std::string ToolChain::GetFilePath(const Compilation &C, - const char *Name) const { +std::string ToolChain::GetFilePath(const char *Name) const { return Host.getDriver().GetFilePath(Name, *this); } -std::string ToolChain::GetProgramPath(const Compilation &C, - const char *Name, - bool WantFile) const { +std::string ToolChain::GetProgramPath(const char *Name, bool WantFile) const { return Host.getDriver().GetProgramPath(Name, *this, WantFile); } diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 7876339..a78d153 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -469,19 +469,10 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, iPhoneVersion = DAL->MakeJoinedArg(0, O, iPhoneOSTarget); DAL->append(iPhoneVersion); } else { - // Otherwise, choose a default platform based on the tool chain. - // - // FIXME: Don't hardcode default here. - if (getTriple().getArch() == llvm::Triple::arm || - getTriple().getArch() == llvm::Triple::thumb) { - const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); - iPhoneVersion = DAL->MakeJoinedArg(0, O, "3.0"); - DAL->append(iPhoneVersion); - } else { - const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); - OSXVersion = DAL->MakeJoinedArg(0, O, MacosxVersionMin); - DAL->append(OSXVersion); - } + // Otherwise, assume we are targeting OS X. + const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); + OSXVersion = DAL->MakeJoinedArg(0, O, MacosxVersionMin); + DAL->append(OSXVersion); } } diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 9e03a18..f423d4e 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1489,8 +1489,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.AddAllArgs(CmdArgs, options::OPT_undef); - const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "clang")); + std::string Exec = getToolChain().getDriver().getClangProgramPath(); // Optionally embed the -cc1 level arguments into the debug info, for build // analysis. @@ -1510,7 +1509,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Args.MakeArgString(Flags.str())); } - Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); + Dest.addCommand(new Command(JA, *this, Exec.c_str(), CmdArgs)); // Explicitly warn that these options are unsupported, even though // we are allowing compilation to continue. @@ -1589,9 +1588,8 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Input.getFilename()); } - const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "clang")); - Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); + std::string Exec = getToolChain().getDriver().getClangProgramPath(); + Dest.addCommand(new Command(JA, *this, Exec.c_str(), CmdArgs)); } void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, @@ -1691,7 +1689,7 @@ void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, const char *GCCName = getToolChain().getDriver().CCCGenericGCCName.c_str(); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName)); + Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2098,7 +2096,7 @@ void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, const char *CC1Name = getCC1Name(Inputs[0].getType()); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); + Args.MakeArgString(getToolChain().GetProgramPath(CC1Name)); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2198,7 +2196,7 @@ void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, const char *CC1Name = getCC1Name(Inputs[0].getType()); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); + Args.MakeArgString(getToolChain().GetProgramPath(CC1Name)); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2253,7 +2251,7 @@ void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, // asm_final spec is empty. const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); + Args.MakeArgString(getToolChain().GetProgramPath("as")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2356,8 +2354,15 @@ void darwin::Link::AddLinkArgs(const ArgList &Args, Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); - if (Args.hasArg(options::OPT_fpie)) - CmdArgs.push_back("-pie"); + if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE, + options::OPT_fno_pie, + options::OPT_fno_PIE)) { + if (A->getOption().matches(options::OPT_fpie) || + A->getOption().matches(options::OPT_fPIE)) + CmdArgs.push_back("-pie"); + else + CmdArgs.push_back("-no_pie"); + } Args.AddLastArg(CmdArgs, options::OPT_prebind); Args.AddLastArg(CmdArgs, options::OPT_noprebind); @@ -2505,7 +2510,7 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, Args.hasArg(options::OPT_shared_libgcc) && getDarwinToolChain().isMacosxVersionLT(10, 5)) { const char *Str = - Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o")); + Args.MakeArgString(getToolChain().GetFilePath("crt3.o")); CmdArgs.push_back(Str); } } @@ -2565,7 +2570,7 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, Args.AddAllArgs(CmdArgs, options::OPT_F); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); + Args.MakeArgString(getToolChain().GetProgramPath("ld")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2589,7 +2594,7 @@ void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(II.getFilename()); } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo")); + Args.MakeArgString(getToolChain().GetProgramPath("lipo")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2609,7 +2614,7 @@ void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Output.getFilename()); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil")); + Args.MakeArgString(getToolChain().GetProgramPath("dsymutil")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2639,7 +2644,7 @@ void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "gas")); + Args.MakeArgString(getToolChain().GetProgramPath("gas")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2685,17 +2690,17 @@ void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_nostartfiles)) { if (!Args.hasArg(options::OPT_shared)) { CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crt1.o"))); + getToolChain().GetFilePath("crt1.o"))); CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crti.o"))); + getToolChain().GetFilePath("crti.o"))); CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtbegin.o"))); + getToolChain().GetFilePath("crtbegin.o"))); } else { CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crti.o"))); + getToolChain().GetFilePath("crti.o"))); } CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtn.o"))); + getToolChain().GetFilePath("crtn.o"))); } CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/" @@ -2741,11 +2746,11 @@ void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_nostartfiles)) { if (!Args.hasArg(options::OPT_shared)) CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtend.o"))); + getToolChain().GetFilePath("crtend.o"))); } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); + Args.MakeArgString(getToolChain().GetProgramPath("ld")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2775,7 +2780,7 @@ void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); + Args.MakeArgString(getToolChain().GetProgramPath("as")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2820,12 +2825,12 @@ void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_nostartfiles)) { if (!Args.hasArg(options::OPT_shared)) { CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crt0.o"))); + getToolChain().GetFilePath("crt0.o"))); CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtbegin.o"))); + getToolChain().GetFilePath("crtbegin.o"))); } else { CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtbeginS.o"))); + getToolChain().GetFilePath("crtbeginS.o"))); } } @@ -2874,14 +2879,14 @@ void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_nostartfiles)) { if (!Args.hasArg(options::OPT_shared)) CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtend.o"))); + getToolChain().GetFilePath("crtend.o"))); else CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtendS.o"))); + getToolChain().GetFilePath("crtendS.o"))); } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); + Args.MakeArgString(getToolChain().GetProgramPath("ld")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2923,7 +2928,7 @@ void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); + Args.MakeArgString(getToolChain().GetProgramPath("as")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -2968,16 +2973,16 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_nostartfiles)) { if (!Args.hasArg(options::OPT_shared)) { CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crt1.o"))); + getToolChain().GetFilePath("crt1.o"))); CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crti.o"))); + getToolChain().GetFilePath("crti.o"))); CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtbegin.o"))); + getToolChain().GetFilePath("crtbegin.o"))); } else { CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crti.o"))); + getToolChain().GetFilePath("crti.o"))); CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtbeginS.o"))); + getToolChain().GetFilePath("crtbeginS.o"))); } } @@ -3037,17 +3042,17 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, if (!Args.hasArg(options::OPT_nostdlib) && !Args.hasArg(options::OPT_nostartfiles)) { if (!Args.hasArg(options::OPT_shared)) - CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, + CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( "crtend.o"))); else - CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, + CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( "crtendS.o"))); - CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, + CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( "crtn.o"))); } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); + Args.MakeArgString(getToolChain().GetProgramPath("ld")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -3077,7 +3082,7 @@ void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA, } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "gas")); + Args.MakeArgString(getToolChain().GetProgramPath("gas")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -3101,7 +3106,7 @@ void minix::Link::ConstructJob(Compilation &C, const JobAction &JA, if (!Args.hasArg(options::OPT_nostdlib) && !Args.hasArg(options::OPT_nostartfiles)) - CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, + CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( "/usr/gnu/lib/crtso.o"))); Args.AddAllArgs(CmdArgs, options::OPT_L); @@ -3145,12 +3150,12 @@ void minix::Link::ConstructJob(Compilation &C, const JobAction &JA, if (!Args.hasArg(options::OPT_nostdlib) && !Args.hasArg(options::OPT_nostartfiles)) { - CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, + CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( "/usr/gnu/lib/libend.a"))); } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "/usr/gnu/bin/gld")); + Args.MakeArgString(getToolChain().GetProgramPath("/usr/gnu/bin/gld")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -3189,7 +3194,7 @@ void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); + Args.MakeArgString(getToolChain().GetProgramPath("as")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -3233,16 +3238,16 @@ void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_nostartfiles)) { if (!Args.hasArg(options::OPT_shared)) { CmdArgs.push_back( - Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); + Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); CmdArgs.push_back( - Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); + Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); CmdArgs.push_back( - Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); + Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); } else { CmdArgs.push_back( - Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); + Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); CmdArgs.push_back( - Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); + Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); } } @@ -3313,15 +3318,15 @@ void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_nostartfiles)) { if (!Args.hasArg(options::OPT_shared)) CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtend.o"))); + getToolChain().GetFilePath("crtend.o"))); else CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtendS.o"))); + getToolChain().GetFilePath("crtendS.o"))); CmdArgs.push_back(Args.MakeArgString( - getToolChain().GetFilePath(C, "crtn.o"))); + getToolChain().GetFilePath("crtn.o"))); } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); + Args.MakeArgString(getToolChain().GetProgramPath("ld")); Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } |