Index: lib/Driver/ToolChains.cpp |
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp |
index 99f4c9dfea753125c7db56c83f9107cf199d02c7..d4281d97c17d62fecc0ac0acbd99ce2096b454c2 100644 |
--- a/lib/Driver/ToolChains.cpp |
+++ b/lib/Driver/ToolChains.cpp |
@@ -2080,7 +2080,8 @@ void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs, |
getTriple().getArch() == llvm::Triple::aarch64_be || |
(getTriple().getOS() == llvm::Triple::Linux && |
(!V.isOlderThan(4, 7, 0) || |
- getTriple().getEnvironment() == llvm::Triple::Android)); |
+ getTriple().getEnvironment() == llvm::Triple::Android)) || |
+ getTriple().getOS() == llvm::Triple::NaCl; // @LOCALMOD |
if (DriverArgs.hasFlag(options::OPT_fuse_init_array, |
options::OPT_fno_use_init_array, |
@@ -2303,6 +2304,159 @@ StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args) |
} |
// End Hexagon |
+// @LOCALMOD-START |
+/// NaCl Toolchain |
+NaCl_TC::NaCl_TC(const Driver &D, const llvm::Triple &Triple, |
+ const ArgList &Args) |
+ : Generic_ELF(D, Triple, Args) { |
+ |
+ // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the |
+ // default paths, and must instead only use the paths provided |
+ // with this toolchain based on architecture. |
+ path_list& file_paths = getFilePaths(); |
+ path_list& prog_paths = getProgramPaths(); |
+ |
+ file_paths.clear(); |
+ prog_paths.clear(); |
+ |
+ // Path for library files (libc.a, ...) |
+ std::string FilePath(getDriver().Dir + "/../"); |
+ |
+ // Path for tools (clang, ld, etc..) |
+ std::string ProgPath(getDriver().Dir + "/../"); |
+ |
+ // Path for toolchain libraries (libgcc.a, ...) |
+ std::string ToolPath(getDriver().ResourceDir + "/lib/"); |
+ |
+ switch(Triple.getArch()) { |
+ case llvm::Triple::x86: { |
+ file_paths.push_back(FilePath + "x86_64-nacl/lib32"); |
+ file_paths.push_back(FilePath + "x86_64-nacl/usr/lib32"); |
+ prog_paths.push_back(ProgPath + "x86_64-nacl/bin"); |
+ file_paths.push_back(ToolPath + "i686-nacl"); |
+ break; |
+ } |
+ case llvm::Triple::x86_64: { |
+ file_paths.push_back(FilePath + "x86_64-nacl/lib"); |
+ file_paths.push_back(FilePath + "x86_64-nacl/usr/lib"); |
+ prog_paths.push_back(ProgPath + "x86_64-nacl/bin"); |
+ file_paths.push_back(ToolPath + "x86_64-nacl"); |
+ break; |
+ } |
+ case llvm::Triple::arm: { |
+ file_paths.push_back(FilePath + "arm-nacl/lib"); |
+ file_paths.push_back(FilePath + "arm-nacl/usr/lib"); |
+ prog_paths.push_back(ProgPath + "arm-nacl/bin"); |
+ file_paths.push_back(ToolPath + "arm-nacl"); |
+ break; |
+ } |
+ default: |
+ break; |
+ } |
+ |
+ // Use provided linker, not system linker |
+ Linker = GetProgramPath("ld"); |
+ NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s"); |
+} |
+ |
+void NaCl_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs, |
+ ArgStringList &CC1Args) const { |
+ const Driver &D = getDriver(); |
+ if (DriverArgs.hasArg(options::OPT_nostdinc)) |
+ return; |
+ |
+ if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { |
+ SmallString<128> P(D.ResourceDir); |
+ llvm::sys::path::append(P, "include"); |
+ addSystemInclude(DriverArgs, CC1Args, P.str()); |
+ } |
+ |
+ if (DriverArgs.hasArg(options::OPT_nostdlibinc)) |
+ return; |
+ |
+ SmallString<128> P(D.Dir + "/../"); |
+ if (getTriple().getArch() == llvm::Triple::arm) { |
+ llvm::sys::path::append(P, "arm-nacl/usr/include"); |
+ } else if (getTriple().getArch() == llvm::Triple::x86) { |
+ llvm::sys::path::append(P, "x86_64-nacl/usr/include"); |
+ } else if (getTriple().getArch() == llvm::Triple::x86_64) { |
+ llvm::sys::path::append(P, "x86_64-nacl/usr/include"); |
+ } else { |
+ return; |
+ } |
+ |
+ addSystemInclude(DriverArgs, CC1Args, P.str()); |
+ llvm::sys::path::remove_filename(P); |
+ llvm::sys::path::remove_filename(P); |
+ llvm::sys::path::append(P, "include"); |
+ addSystemInclude(DriverArgs, CC1Args, P.str()); |
+} |
+ |
+void NaCl_TC::AddCXXStdlibLibArgs(const ArgList &Args, |
+ ArgStringList &CmdArgs) const { |
+ // Allow and ignore -stdlib=libc++ without warning, but not libstdc++ |
+ GetCXXStdlibType(Args); |
+ CmdArgs.push_back("-lc++"); |
+} |
+ |
+void NaCl_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, |
+ ArgStringList &CC1Args) const { |
+ const Driver &D = getDriver(); |
+ if (DriverArgs.hasArg(options::OPT_nostdlibinc) || |
+ DriverArgs.hasArg(options::OPT_nostdincxx)) |
+ return; |
+ |
+ // Allow and ignore -stdlib=libc++ without warning, but not libstdc++ |
+ GetCXXStdlibType(DriverArgs); |
+ |
+ if (getTriple().getArch() == llvm::Triple::arm) { |
+ SmallString<128> P(D.Dir + "/../"); |
+ llvm::sys::path::append(P, "arm-nacl/include/c++/v1"); |
+ addSystemInclude(DriverArgs, CC1Args, P.str()); |
+ } else if (getTriple().getArch() == llvm::Triple::x86) { |
+ SmallString<128> P(D.Dir + "/../"); |
+ llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1"); |
+ addSystemInclude(DriverArgs, CC1Args, P.str()); |
+ } else if (getTriple().getArch() == llvm::Triple::x86_64) { |
+ SmallString<128> P(D.Dir + "/../"); |
+ llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1"); |
+ addSystemInclude(DriverArgs, CC1Args, P.str()); |
+ } |
+} |
+ |
+ToolChain::CXXStdlibType NaCl_TC::GetCXXStdlibType(const ArgList &Args) const { |
+ if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { |
+ StringRef Value = A->getValue(); |
+ if (Value == "libc++") |
+ return ToolChain::CST_Libcxx; |
+ getDriver().Diag(diag::err_drv_invalid_stdlib_name) |
+ << A->getAsString(Args); |
+ } |
+ |
+ return ToolChain::CST_Libcxx; |
+} |
+ |
+std::string NaCl_TC::ComputeEffectiveClangTriple( |
+ const ArgList &Args, types::ID InputType) const { |
+ llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType)); |
+ if (TheTriple.getArch() == llvm::Triple::arm && |
+ TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) |
+ TheTriple.setEnvironment(llvm::Triple::GNUEABIHF); |
+ return TheTriple.getTriple(); |
+} |
+ |
+Tool *NaCl_TC::buildLinker() const { |
+ return new tools::nacltools::Link(*this); |
+} |
+ |
+Tool *NaCl_TC::buildAssembler() const { |
+ if (getTriple().getArch() == llvm::Triple::arm) |
+ return new tools::nacltools::AssembleARM(*this); |
+ return new tools::gnutools::Assemble(*this); |
+} |
+// End NaCl |
+// @LOCALMOD-END |
+ |
/// 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. |