<div dir="ltr">I got an email about the win failure, but didn't see the LIBDIR_SUFFIX thing; thanks for the heads-up, will fix.<br></div><br><div class="gmail_quote">On Tue, Mar 31, 2015 at 5:10 AM Rafael Espíndola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This is failing on some bots:<br>
<br>
<a href="http://lab.llvm.org:8011/builders/clang-x86-win2008-selfhost/builds/189" target="_blank">http://lab.llvm.org:8011/<u></u>builders/clang-x86-win2008-<u></u>selfhost/builds/189</a><br>
<br>
On 30 March 2015 at 16:31, Derek Schuff <<a href="mailto:dschuff@google.com" target="_blank">dschuff@google.com</a>> wrote:<br>
> Author: dschuff<br>
> Date: Mon Mar 30 15:31:33 2015<br>
> New Revision: 233594<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=233594&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=233594&view=rev</a><br>
> Log:<br>
> Add driver support for Native Client SDK<br>
><br>
> Add Tool and ToolChain support for clang to target the NaCl OS using the NaCl<br>
> SDK for x86-32, x86-64 and ARM.<br>
><br>
> Includes nacltools::Assemble and Link which are derived from gnutools. They<br>
> are similar to Linux but different enought that they warrant their own class.<br>
> Also includes a NaCl_TC in ToolChains derived from Generic_ELF with library<br>
> and include paths suitable for an SDK and independent of the system tools.<br>
><br>
> Differential Revision: <a href="http://reviews.llvm.org/D8590" target="_blank">http://reviews.llvm.org/D8590</a><br>
><br>
> Added:<br>
>     cfe/trunk/test/Driver/nacl-<u></u>direct.c<br>
> Modified:<br>
>     cfe/trunk/lib/Basic/Targets.<u></u>cpp<br>
>     cfe/trunk/lib/Driver/Driver.<u></u>cpp<br>
>     cfe/trunk/lib/Driver/<u></u>ToolChains.cpp<br>
>     cfe/trunk/lib/Driver/<u></u>ToolChains.h<br>
>     cfe/trunk/lib/Driver/Tools.cpp<br>
>     cfe/trunk/lib/Driver/Tools.h<br>
>     cfe/trunk/lib/Frontend/<u></u>InitHeaderSearch.cpp<br>
>     cfe/trunk/test/CodeGen/target-<u></u>data.c<br>
><br>
> Modified: cfe/trunk/lib/Basic/Targets.<u></u>cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=233594&r1=233593&r2=233594&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Basic/<u></u>Targets.cpp?rev=233594&r1=<u></u>233593&r2=233594&view=diff</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/lib/Basic/Targets.<u></u>cpp (original)<br>
> +++ cfe/trunk/lib/Basic/Targets.<u></u>cpp Mon Mar 30 15:31:33 2015<br>
> @@ -713,8 +713,7 @@ public:<br>
>      // RegParmMax is inherited from the underlying architecture<br>
>      this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;<br>
>      if (Triple.getArch() == llvm::Triple::arm) {<br>
> -      this->DescriptionString =<br>
> -          "e-m:e-p:32:32-i64:64-v128:64:<u></u>128-a:0:32-n32-S128";<br>
> +      // Handled in ARM's setABI().<br>
>      } else if (Triple.getArch() == llvm::Triple::x86) {<br>
>        this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:<u></u>32-S128";<br>
>      } else if (Triple.getArch() == llvm::Triple::x86_64) {<br>
> @@ -3897,6 +3896,9 @@ class ARMTargetInfo : public TargetInfo<br>
>                            "-a:0:32"<br>
>                            "-n32"<br>
>                            "-S64";<br>
> +    } else if (T.isOSNaCl()) {<br>
> +      assert(!BigEndian && "NaCl on ARM does not support big endian");<br>
> +      DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:<u></u>128-a:0:32-n32-S128";<br>
>      } else {<br>
>        DescriptionString =<br>
>            BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:<u></u>128-a:0:32-n32-S64"<br>
><br>
> Modified: cfe/trunk/lib/Driver/Driver.<u></u>cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=233594&r1=233593&r2=233594&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Driver/<u></u>Driver.cpp?rev=233594&r1=<u></u>233593&r2=233594&view=diff</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/lib/Driver/Driver.<u></u>cpp (original)<br>
> +++ cfe/trunk/lib/Driver/Driver.<u></u>cpp Mon Mar 30 15:31:33 2015<br>
> @@ -2062,6 +2062,9 @@ const ToolChain &Driver::getToolChain(co<br>
>        else<br>
>          TC = new toolchains::Linux(*this, Target, Args);<br>
>        break;<br>
> +    case llvm::Triple::NaCl:<br>
> +      TC = new toolchains::NaCl_TC(*this, Target, Args);<br>
> +      break;<br>
>      case llvm::Triple::Solaris:<br>
>        TC = new toolchains::Solaris(*this, Target, Args);<br>
>        break;<br>
><br>
> Modified: cfe/trunk/lib/Driver/<u></u>ToolChains.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=233594&r1=233593&r2=233594&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Driver/<u></u>ToolChains.cpp?rev=233594&r1=<u></u>233593&r2=233594&view=diff</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/lib/Driver/<u></u>ToolChains.cpp (original)<br>
> +++ cfe/trunk/lib/Driver/<u></u>ToolChains.cpp Mon Mar 30 15:31:33 2015<br>
> @@ -2084,7 +2084,8 @@ void Generic_ELF::<u></u>addClangTargetOptions(<br>
>        getTriple().getArch() == llvm::Triple::aarch64_be ||<br>
>        (getTriple().getOS() == llvm::Triple::Linux &&<br>
>         (!V.isOlderThan(4, 7, 0) ||<br>
> -        getTriple().getEnvironment() == llvm::Triple::Android));<br>
> +        getTriple().getEnvironment() == llvm::Triple::Android)) ||<br>
> +      getTriple().getOS() == llvm::Triple::NaCl;<br>
><br>
>    if (DriverArgs.hasFlag(options::<u></u>OPT_fuse_init_array,<br>
>                           options::OPT_fno_use_init_<u></u>array,<br>
> @@ -2307,6 +2308,159 @@ StringRef Hexagon_TC::GetTargetCPU(const<br>
>  }<br>
>  // End Hexagon<br>
><br>
> +/// NaCl Toolchain<br>
> +NaCl_TC::NaCl_TC(const Driver &D, const llvm::Triple &Triple,<br>
> +                 const ArgList &Args)<br>
> +  : Generic_ELF(D, Triple, Args) {<br>
> +<br>
> +  // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the<br>
> +  // default paths, and must instead only use the paths provided<br>
> +  // with this toolchain based on architecture.<br>
> +  path_list& file_paths = getFilePaths();<br>
> +  path_list& prog_paths = getProgramPaths();<br>
> +<br>
> +  file_paths.clear();<br>
> +  prog_paths.clear();<br>
> +<br>
> +  // Path for library files (libc.a, ...)<br>
> +  std::string FilePath(getDriver().Dir + "/../");<br>
> +<br>
> +  // Path for tools (clang, ld, etc..)<br>
> +  std::string ProgPath(getDriver().Dir + "/../");<br>
> +<br>
> +  // Path for toolchain libraries (libgcc.a, ...)<br>
> +  std::string ToolPath(getDriver().<u></u>ResourceDir + "/lib/");<br>
> +<br>
> +  switch(Triple.getArch()) {<br>
> +    case llvm::Triple::x86: {<br>
> +      file_paths.push_back(FilePath + "x86_64-nacl/lib32");<br>
> +      file_paths.push_back(FilePath + "x86_64-nacl/usr/lib32");<br>
> +      prog_paths.push_back(ProgPath + "x86_64-nacl/bin");<br>
> +      file_paths.push_back(ToolPath + "i686-nacl");<br>
> +      break;<br>
> +    }<br>
> +    case llvm::Triple::x86_64: {<br>
> +      file_paths.push_back(FilePath + "x86_64-nacl/lib");<br>
> +      file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");<br>
> +      prog_paths.push_back(ProgPath + "x86_64-nacl/bin");<br>
> +      file_paths.push_back(ToolPath + "x86_64-nacl");<br>
> +      break;<br>
> +    }<br>
> +    case llvm::Triple::arm: {<br>
> +      file_paths.push_back(FilePath + "arm-nacl/lib");<br>
> +      file_paths.push_back(FilePath + "arm-nacl/usr/lib");<br>
> +      prog_paths.push_back(ProgPath + "arm-nacl/bin");<br>
> +      file_paths.push_back(ToolPath + "arm-nacl");<br>
> +      break;<br>
> +    }<br>
> +    default:<br>
> +      break;<br>
> +  }<br>
> +<br>
> +  // Use provided linker, not system linker<br>
> +  Linker = GetProgramPath("ld");<br>
> +  NaClArmMacrosPath = GetFilePath("nacl-arm-macros.<u></u>s");<br>
> +}<br>
> +<br>
> +void NaCl_TC::<u></u>AddClangSystemIncludeArgs(<u></u>const ArgList &DriverArgs,<br>
> +                                        ArgStringList &CC1Args) const {<br>
> +  const Driver &D = getDriver();<br>
> +  if (DriverArgs.hasArg(options::<u></u>OPT_nostdinc))<br>
> +    return;<br>
> +<br>
> +  if (!DriverArgs.hasArg(options::<u></u>OPT_nobuiltininc)) {<br>
> +    SmallString<128> P(D.ResourceDir);<br>
> +    llvm::sys::path::append(P, "include");<br>
> +    addSystemInclude(DriverArgs, CC1Args, P.str());<br>
> +  }<br>
> +<br>
> +  if (DriverArgs.hasArg(options::<u></u>OPT_nostdlibinc))<br>
> +    return;<br>
> +<br>
> +  SmallString<128> P(D.Dir + "/../");<br>
> +  if (getTriple().getArch() == llvm::Triple::arm) {<br>
> +    llvm::sys::path::append(P, "arm-nacl/usr/include");<br>
> +  } else if (getTriple().getArch() == llvm::Triple::x86) {<br>
> +    llvm::sys::path::append(P, "x86_64-nacl/usr/include");<br>
> +  } else if (getTriple().getArch() == llvm::Triple::x86_64) {<br>
> +    llvm::sys::path::append(P, "x86_64-nacl/usr/include");<br>
> +  } else {<br>
> +    return;<br>
> +  }<br>
> +<br>
> +  addSystemInclude(DriverArgs, CC1Args, P.str());<br>
> +  llvm::sys::path::remove_<u></u>filename(P);<br>
> +  llvm::sys::path::remove_<u></u>filename(P);<br>
> +  llvm::sys::path::append(P, "include");<br>
> +  addSystemInclude(DriverArgs, CC1Args, P.str());<br>
> +}<br>
> +<br>
> +void NaCl_TC::AddCXXStdlibLibArgs(<u></u>const ArgList &Args,<br>
> +                                  ArgStringList &CmdArgs) const {<br>
> +  // Check for -stdlib= flags. We only support libc++ but this consumes the arg<br>
> +  // if the value is libc++, and emits an error for other values.<br>
> +  GetCXXStdlibType(Args);<br>
> +  CmdArgs.push_back("-lc++");<br>
> +}<br>
> +<br>
> +void NaCl_TC::<u></u>AddClangCXXStdlibIncludeArgs(<u></u>const ArgList &DriverArgs,<br>
> +                                           ArgStringList &CC1Args) const {<br>
> +  const Driver &D = getDriver();<br>
> +  if (DriverArgs.hasArg(options::<u></u>OPT_nostdlibinc) ||<br>
> +      DriverArgs.hasArg(options::<u></u>OPT_nostdincxx))<br>
> +    return;<br>
> +<br>
> +  // Check for -stdlib= flags. We only support libc++ but this consumes the arg<br>
> +  // if the value is libc++, and emits an error for other values.<br>
> +  GetCXXStdlibType(DriverArgs);<br>
> +<br>
> +  if (getTriple().getArch() == llvm::Triple::arm) {<br>
> +    SmallString<128> P(D.Dir + "/../");<br>
> +    llvm::sys::path::append(P, "arm-nacl/include/c++/v1");<br>
> +    addSystemInclude(DriverArgs, CC1Args, P.str());<br>
> +  } else if (getTriple().getArch() == llvm::Triple::x86) {<br>
> +    SmallString<128> P(D.Dir + "/../");<br>
> +    llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");<br>
> +    addSystemInclude(DriverArgs, CC1Args, P.str());<br>
> +  } else if (getTriple().getArch() == llvm::Triple::x86_64) {<br>
> +    SmallString<128> P(D.Dir + "/../");<br>
> +    llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");<br>
> +    addSystemInclude(DriverArgs, CC1Args, P.str());<br>
> +  }<br>
> +}<br>
> +<br>
> +ToolChain::CXXStdlibType NaCl_TC::GetCXXStdlibType(<u></u>const ArgList &Args) const {<br>
> +  if (Arg *A = Args.getLastArg(options::OPT_<u></u>stdlib_EQ)) {<br>
> +    StringRef Value = A->getValue();<br>
> +    if (Value == "libc++")<br>
> +      return ToolChain::CST_Libcxx;<br>
> +    getDriver().Diag(diag::err_<u></u>drv_invalid_stdlib_name)<br>
> +      << A->getAsString(Args);<br>
> +  }<br>
> +<br>
> +  return ToolChain::CST_Libcxx;<br>
> +}<br>
> +<br>
> +std::string NaCl_TC::<u></u>ComputeEffectiveClangTriple(<br>
> +    const ArgList &Args, types::ID InputType) const {<br>
> +  llvm::Triple TheTriple(ComputeLLVMTriple(<u></u>Args, InputType));<br>
> +  if (TheTriple.getArch() == llvm::Triple::arm &&<br>
> +      TheTriple.getEnvironment() == llvm::Triple::<u></u>UnknownEnvironment)<br>
> +    TheTriple.setEnvironment(llvm:<u></u>:Triple::GNUEABIHF);<br>
> +  return TheTriple.getTriple();<br>
> +}<br>
> +<br>
> +Tool *NaCl_TC::buildLinker() const {<br>
> +  return new tools::nacltools::Link(*this);<br>
> +}<br>
> +<br>
> +Tool *NaCl_TC::buildAssembler() const {<br>
> +  if (getTriple().getArch() == llvm::Triple::arm)<br>
> +    return new tools::nacltools::AssembleARM(<u></u>*this);<br>
> +  return new tools::gnutools::Assemble(*<u></u>this);<br>
> +}<br>
> +// End NaCl<br>
> +<br>
>  /// TCEToolChain - A tool chain using the llvm bitcode tools to perform<br>
>  /// all subcommands. See <a href="http://tce.cs.tut.fi" target="_blank">http://tce.cs.tut.fi</a> for our peculiar target.<br>
>  /// Currently does not support anything else but compilation.<br>
><br>
> Modified: cfe/trunk/lib/Driver/<u></u>ToolChains.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=233594&r1=233593&r2=233594&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Driver/<u></u>ToolChains.h?rev=233594&r1=<u></u>233593&r2=233594&view=diff</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/lib/Driver/<u></u>ToolChains.h (original)<br>
> +++ cfe/trunk/lib/Driver/<u></u>ToolChains.h Mon Mar 30 15:31:33 2015<br>
> @@ -717,6 +717,45 @@ public:<br>
>    static StringRef GetTargetCPU(const llvm::opt::ArgList &Args);<br>
>  };<br>
><br>
> +class LLVM_LIBRARY_VISIBILITY NaCl_TC : public Generic_ELF {<br>
> +public:<br>
> +  NaCl_TC(const Driver &D, const llvm::Triple &Triple,<br>
> +          const llvm::opt::ArgList &Args);<br>
> +<br>
> +  void<br>
> +  AddClangSystemIncludeArgs(<u></u>const llvm::opt::ArgList &DriverArgs,<br>
> +                            llvm::opt::ArgStringList &CC1Args) const override;<br>
> +  void<br>
> +  AddClangCXXStdlibIncludeArgs(<u></u>const llvm::opt::ArgList &DriverArgs,<br>
> +                               llvm::opt::ArgStringList &CC1Args) const override;<br>
> +<br>
> +  CXXStdlibType<br>
> +  GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;<br>
> +<br>
> +  void<br>
> +  AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,<br>
> +                      llvm::opt::ArgStringList &CmdArgs) const override;<br>
> +<br>
> +  bool<br>
> +  IsIntegratedAssemblerDefault() const override { return false; }<br>
> +<br>
> +  // Get the path to the file containing NaCl's ARM macros. It lives in NaCl_TC<br>
> +  // because the AssembleARM tool needs a const char * that it can pass around<br>
> +  // and the toolchain outlives all the jobs.<br>
> +  const char *GetNaClArmMacrosPath() const { return NaClArmMacrosPath.c_str(); }<br>
> +<br>
> +  std::string ComputeEffectiveClangTriple(<u></u>const llvm::opt::ArgList &Args,<br>
> +                                          types::ID InputType) const override;<br>
> +  std::string Linker;<br>
> +<br>
> +protected:<br>
> +  Tool *buildLinker() const override;<br>
> +  Tool *buildAssembler() const override;<br>
> +<br>
> +private:<br>
> +  std::string NaClArmMacrosPath;<br>
> +};<br>
> +<br>
>  /// TCEToolChain - A tool chain using the llvm bitcode tools to perform<br>
>  /// all subcommands. See <a href="http://tce.cs.tut.fi" target="_blank">http://tce.cs.tut.fi</a> for our peculiar target.<br>
>  class LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain {<br>
><br>
> Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=233594&r1=233593&r2=233594&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Driver/<u></u>Tools.cpp?rev=233594&r1=<u></u>233593&r2=233594&view=diff</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
> +++ cfe/trunk/lib/Driver/Tools.cpp Mon Mar 30 15:31:33 2015<br>
> @@ -7911,6 +7911,172 @@ void gnutools::Link::ConstructJob(<u></u>Compil<br>
>        llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));<br>
>  }<br>
><br>
> +<br>
> +// NaCl ARM assembly (inline or standalone) can be written with a set of macros<br>
> +// for the various SFI requirements like register masking. The assembly tool<br>
> +// inserts the file containing the macros as an input into all the assembly<br>
> +// jobs.<br>
> +void nacltools::AssembleARM::<u></u>ConstructJob(Compilation &C, const JobAction &JA,<br>
> +                                          const InputInfo &Output,<br>
> +                                          const InputInfoList &Inputs,<br>
> +                                          const ArgList &Args,<br>
> +                                          const char *LinkingOutput) const {<br>
> +  const toolchains::NaCl_TC& ToolChain =<br>
> +    static_cast<const toolchains::NaCl_TC&>(<u></u>getToolChain());<br>
> +  InputInfo NaClMacros(ToolChain.<u></u>GetNaClArmMacrosPath(), types::TY_PP_Asm,<br>
> +                       "nacl-arm-macros.s");<br>
> +  InputInfoList NewInputs;<br>
> +  NewInputs.push_back(<u></u>NaClMacros);<br>
> +  NewInputs.append(Inputs.begin(<u></u>), Inputs.end());<br>
> +  gnutools::Assemble::<u></u>ConstructJob(C, JA, Output, NewInputs, Args,<br>
> +                                   LinkingOutput);<br>
> +}<br>
> +<br>
> +<br>
> +// This is quite similar to gnutools::link::ConstructJob with changes that<br>
> +// we use static by default, do not yet support sanitizers or LTO, and a few<br>
> +// others. Eventually we can support more of that and hopefully migrate back<br>
> +// to gnutools::link.<br>
> +void nacltools::Link::ConstructJob(<u></u>Compilation &C, const JobAction &JA,<br>
> +                                  const InputInfo &Output,<br>
> +                                  const InputInfoList &Inputs,<br>
> +                                  const ArgList &Args,<br>
> +                                  const char *LinkingOutput) const {<br>
> +<br>
> +  const toolchains::NaCl_TC& ToolChain =<br>
> +    static_cast<const toolchains::NaCl_TC&>(<u></u>getToolChain());<br>
> +  const Driver &D = ToolChain.getDriver();<br>
> +  const bool IsStatic =<br>
> +    !Args.hasArg(options::OPT_<u></u>dynamic) &&<br>
> +    !Args.hasArg(options::OPT_<u></u>shared);<br>
> +<br>
> +  ArgStringList CmdArgs;<br>
> +<br>
> +  // Silence warning for "clang -g foo.o -o foo"<br>
> +  Args.ClaimAllArgs(options::<u></u>OPT_g_Group);<br>
> +  // and "clang -emit-llvm foo.o -o foo"<br>
> +  Args.ClaimAllArgs(options::<u></u>OPT_emit_llvm);<br>
> +  // and for "clang -w foo.o -o foo". Other warning options are already<br>
> +  // handled somewhere else.<br>
> +  Args.ClaimAllArgs(options::<u></u>OPT_w);<br>
> +<br>
> +  if (!D.SysRoot.empty())<br>
> +    CmdArgs.push_back(Args.<u></u>MakeArgString("--sysroot=" + D.SysRoot));<br>
> +<br>
> +  if (Args.hasArg(options::OPT_<u></u>rdynamic))<br>
> +    CmdArgs.push_back("-export-<u></u>dynamic");<br>
> +<br>
> +  if (Args.hasArg(options::OPT_s))<br>
> +    CmdArgs.push_back("-s");<br>
> +<br>
> +  // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from<br>
> +  // there is --build-id, which we do want.<br>
> +  CmdArgs.push_back("--build-id"<u></u>);<br>
> +<br>
> +  if (!IsStatic)<br>
> +    CmdArgs.push_back("--eh-frame-<u></u>hdr");<br>
> +<br>
> +  CmdArgs.push_back("-m");<br>
> +  if (ToolChain.getArch() == llvm::Triple::x86)<br>
> +    CmdArgs.push_back("elf_i386_<u></u>nacl");<br>
> +  else if (ToolChain.getArch() == llvm::Triple::arm)<br>
> +    CmdArgs.push_back("armelf_<u></u>nacl");<br>
> +  else if (ToolChain.getArch() == llvm::Triple::x86_64)<br>
> +    CmdArgs.push_back("elf_x86_64_<u></u>nacl");<br>
> +  else<br>
> +    D.Diag(diag::err_target_<u></u>unsupported_arch) << ToolChain.getArchName() <<<br>
> +        "Native Client";<br>
> +<br>
> +<br>
> +  if (IsStatic)<br>
> +    CmdArgs.push_back("-static");<br>
> +  else if (Args.hasArg(options::OPT_<u></u>shared))<br>
> +    CmdArgs.push_back("-shared");<br>
> +<br>
> +  CmdArgs.push_back("-o");<br>
> +  CmdArgs.push_back(Output.<u></u>getFilename());<br>
> +  if (!Args.hasArg(options::OPT_<u></u>nostdlib) &&<br>
> +      !Args.hasArg(options::OPT_<u></u>nostartfiles)) {<br>
> +    if (!Args.hasArg(options::OPT_<u></u>shared))<br>
> +      CmdArgs.push_back(Args.<u></u>MakeArgString(ToolChain.<u></u>GetFilePath("crt1.o")));<br>
> +    CmdArgs.push_back(Args.<u></u>MakeArgString(ToolChain.<u></u>GetFilePath("crti.o")));<br>
> +<br>
> +    const char *crtbegin;<br>
> +    if (IsStatic)<br>
> +      crtbegin = "crtbeginT.o";<br>
> +    else if (Args.hasArg(options::OPT_<u></u>shared))<br>
> +      crtbegin = "crtbeginS.o";<br>
> +    else<br>
> +      crtbegin = "crtbegin.o";<br>
> +    CmdArgs.push_back(Args.<u></u>MakeArgString(ToolChain.<u></u>GetFilePath(crtbegin)));<br>
> +  }<br>
> +<br>
> +  Args.AddAllArgs(CmdArgs, options::OPT_L);<br>
> +  Args.AddAllArgs(CmdArgs, options::OPT_u);<br>
> +<br>
> +  const ToolChain::path_list &Paths = ToolChain.getFilePaths();<br>
> +<br>
> +  for (const auto &Path : Paths)<br>
> +    CmdArgs.push_back(Args.<u></u>MakeArgString(StringRef("-L") + Path));<br>
> +<br>
> +  if (Args.hasArg(options::OPT_Z_<u></u>Xlinker__no_demangle))<br>
> +    CmdArgs.push_back("--no-<u></u>demangle");<br>
> +<br>
> +  AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);<br>
> +<br>
> +  if (D.CCCIsCXX() &&<br>
> +      !Args.hasArg(options::OPT_<u></u>nostdlib) &&<br>
> +      !Args.hasArg(options::OPT_<u></u>nodefaultlibs)) {<br>
> +    bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_<u></u>static_libstdcxx) &&<br>
> +      !IsStatic;<br>
> +    if (OnlyLibstdcxxStatic)<br>
> +      CmdArgs.push_back("-Bstatic");<br>
> +    ToolChain.AddCXXStdlibLibArgs(<u></u>Args, CmdArgs);<br>
> +    if (OnlyLibstdcxxStatic)<br>
> +      CmdArgs.push_back("-Bdynamic")<u></u>;<br>
> +    CmdArgs.push_back("-lm");<br>
> +  }<br>
> +<br>
> +  if (!Args.hasArg(options::OPT_<u></u>nostdlib)) {<br>
> +    if (!Args.hasArg(options::OPT_<u></u>nodefaultlibs)) {<br>
> +      // Always use groups, since it has no effect on dynamic libraries.<br>
> +      CmdArgs.push_back("--start-<u></u>group");<br>
> +      CmdArgs.push_back("-lc");<br>
> +      // NaCl's libc++ currently requires libpthread, so just always include it<br>
> +      // in the group for C++.<br>
> +      if (Args.hasArg(options::OPT_<u></u>pthread) ||<br>
> +          Args.hasArg(options::OPT_<u></u>pthreads) ||<br>
> +          D.CCCIsCXX()) {<br>
> +        CmdArgs.push_back("-lpthread")<u></u>;<br>
> +      }<br>
> +<br>
> +      CmdArgs.push_back("-lgcc");<br>
> +      CmdArgs.push_back("--as-<u></u>needed");<br>
> +      if (IsStatic)<br>
> +        CmdArgs.push_back("-lgcc_eh");<br>
> +      else<br>
> +        CmdArgs.push_back("-lgcc_s");<br>
> +      CmdArgs.push_back("--no-as-<u></u>needed");<br>
> +      CmdArgs.push_back("--end-<u></u>group");<br>
> +    }<br>
> +<br>
> +    if (!Args.hasArg(options::OPT_<u></u>nostartfiles)) {<br>
> +      const char *crtend;<br>
> +      if (Args.hasArg(options::OPT_<u></u>shared))<br>
> +        crtend = "crtendS.o";<br>
> +      else<br>
> +        crtend = "crtend.o";<br>
> +<br>
> +      CmdArgs.push_back(Args.<u></u>MakeArgString(ToolChain.<u></u>GetFilePath(crtend)));<br>
> +      CmdArgs.push_back(Args.<u></u>MakeArgString(ToolChain.<u></u>GetFilePath("crtn.o")));<br>
> +    }<br>
> +  }<br>
> +<br>
> +  C.addCommand(llvm::make_<u></u>unique<Command>(JA, *this,<br>
> +                                          ToolChain.Linker.c_str(), CmdArgs));<br>
> +}<br>
> +<br>
> +<br>
>  void minix::Assemble::ConstructJob(<u></u>Compilation &C, const JobAction &JA,<br>
>                                     const InputInfo &Output,<br>
>                                     const InputInfoList &Inputs,<br>
><br>
> Modified: cfe/trunk/lib/Driver/Tools.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=233594&r1=233593&r2=233594&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Driver/<u></u>Tools.h?rev=233594&r1=233593&<u></u>r2=233594&view=diff</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/lib/Driver/Tools.h (original)<br>
> +++ cfe/trunk/lib/Driver/Tools.h Mon Mar 30 15:31:33 2015<br>
> @@ -507,6 +507,33 @@ namespace gnutools {<br>
>                        const char *LinkingOutput) const override;<br>
>    };<br>
>  }<br>
> +<br>
> +namespace nacltools {<br>
> +  class LLVM_LIBRARY_VISIBILITY AssembleARM : public gnutools::Assemble  {<br>
> +  public:<br>
> +    AssembleARM(const ToolChain &TC) : gnutools::Assemble(TC) {}<br>
> +<br>
> +    void ConstructJob(Compilation &C, const JobAction &JA,<br>
> +                      const InputInfo &Output,<br>
> +                      const InputInfoList &Inputs,<br>
> +                      const llvm::opt::ArgList &TCArgs,<br>
> +                      const char *LinkingOutput) const override;<br>
> +  };<br>
> +  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {<br>
> +  public:<br>
> +    Link(const ToolChain &TC) : Tool("NaCl::Link", "linker", TC) {}<br>
> +<br>
> +    bool hasIntegratedCPP() const override { return false; }<br>
> +    bool isLinkJob() const override { return true; }<br>
> +<br>
> +    void ConstructJob(Compilation &C, const JobAction &JA,<br>
> +                              const InputInfo &Output,<br>
> +                              const InputInfoList &Inputs,<br>
> +                              const llvm::opt::ArgList &TCArgs,<br>
> +                              const char *LinkingOutput) const override;<br>
> +  };<br>
> +}<br>
> +<br>
>    /// minix -- Directly call GNU Binutils assembler and linker<br>
>  namespace minix {<br>
>    class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool  {<br>
><br>
> Modified: cfe/trunk/lib/Frontend/<u></u>InitHeaderSearch.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=233594&r1=233593&r2=233594&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/<u></u>Frontend/InitHeaderSearch.cpp?<u></u>rev=233594&r1=233593&r2=<u></u>233594&view=diff</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/lib/Frontend/<u></u>InitHeaderSearch.cpp (original)<br>
> +++ cfe/trunk/lib/Frontend/<u></u>InitHeaderSearch.cpp Mon Mar 30 15:31:33 2015<br>
> @@ -232,6 +232,7 @@ void InitHeaderSearch::<u></u>AddDefaultCInclud<br>
>      case llvm::Triple::NetBSD:<br>
>      case llvm::Triple::OpenBSD:<br>
>      case llvm::Triple::Bitrig:<br>
> +    case llvm::Triple::NaCl:<br>
>        break;<br>
>      default:<br>
>        // FIXME: temporary hack: hard-coded paths.<br>
> @@ -352,6 +353,7 @@ void InitHeaderSearch::<u></u>AddDefaultCInclud<br>
>    switch (os) {<br>
>    case llvm::Triple::CloudABI:<br>
>    case llvm::Triple::RTEMS:<br>
> +  case llvm::Triple::NaCl:<br>
>      break;<br>
>    default:<br>
>      AddPath("/usr/include", ExternCSystem, false);<br>
><br>
> Modified: cfe/trunk/test/CodeGen/target-<u></u>data.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/target-data.c?rev=233594&r1=233593&r2=233594&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/test/<u></u>CodeGen/target-data.c?rev=<u></u>233594&r1=233593&r2=233594&<u></u>view=diff</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/test/CodeGen/target-<u></u>data.c (original)<br>
> +++ cfe/trunk/test/CodeGen/target-<u></u>data.c Mon Mar 30 15:31:33 2015<br>
> @@ -66,7 +66,7 @@<br>
>  // RUN: FileCheck %s -check-prefix=X86_64-NACL<br>
>  // X86_64-NACL: target datalayout = "e-m:e-p:32:32-i64:64-n8:16:<u></u>32:64-S128"<br>
><br>
> -// RUN: %clang_cc1 -triple arm-nacl-gnueabi -o - -emit-llvm %s | \<br>
> +// RUN: %clang_cc1 -triple arm-nacl -o - -emit-llvm %s | \<br>
>  // RUN: FileCheck %s -check-prefix=ARM-NACL<br>
>  // ARM-NACL: target datalayout = "e-m:e-p:32:32-i64:64-v128:64:<u></u>128-a:0:32-n32-S128"<br>
><br>
><br>
> Added: cfe/trunk/test/Driver/nacl-<u></u>direct.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/nacl-direct.c?rev=233594&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/test/Driver/<u></u>nacl-direct.c?rev=233594&view=<u></u>auto</a><br>
> ==============================<u></u>==============================<u></u>==================<br>
> --- cfe/trunk/test/Driver/nacl-<u></u>direct.c (added)<br>
> +++ cfe/trunk/test/Driver/nacl-<u></u>direct.c Mon Mar 30 15:31:33 2015<br>
> @@ -0,0 +1,108 @@<br>
> +// Test clang changes for NaCl Support including:<br>
> +//    include paths, library paths, emulation, default static<br>
> +//<br>
> +// RUN: %clang -### -o %t.o %s 2>&1 \<br>
> +// RUN:     -target i686-unknown-nacl \<br>
> +// RUN:   | FileCheck --check-prefix=CHECK-I686 %s<br>
> +// CHECK-I686: {{.*}}clang{{.*}}" "-cc1"<br>
> +// CHECK-I686: "-fuse-init-array"<br>
> +// CHECK-I686: "-target-cpu" "pentium4"<br>
> +// CHECK-I686: "-resource-dir" "{{.*}}/lib/clang/[[VER:[0-9.]<u></u>+]]"<br>
> +// CHECK-I686: "-internal-isystem" "{{.*}}/../lib/clang/[[VER]]/<u></u>include"<br>
> +// CHECK-I686: "-internal-isystem" "{{.*}}/../x86_64-nacl/usr/<u></u>include"<br>
> +// CHECK-I686: "-internal-isystem" "{{.*}}/../x86_64-nacl/<u></u>include"<br>
> +// CHECK-I686: /as" "--32"<br>
> +// CHECK-I686: /ld"<br>
> +// CHECK-I686: "--build-id"<br>
> +// CHECK-I686: "-m" "elf_i386_nacl"<br>
> +// CHECK-I686: "-static"<br>
> +// CHECK-I686: "-L{{.*}}/../x86_64-nacl/<u></u>lib32"<br>
> +// CHECK-I686: "-L{{.*}}/../x86_64-nacl/usr/<u></u>lib32"<br>
> +// CHECK-I686: "-L{{.*}}/../lib/clang/[[VER]]<u></u>/lib/i686-nacl"<br>
> +// CHECK-I686-NOT: -lpthread<br>
> +//<br>
> +// RUN: %clang -### -o %t.o %s 2>&1 \<br>
> +// RUN:     -target x86_64-unknown-nacl \<br>
> +// RUN:   | FileCheck --check-prefix=CHECK-x86_64 %s<br>
> +// CHECK-x86_64: {{.*}}clang{{.*}}" "-cc1"<br>
> +// CHECK-x86_64: "-fuse-init-array"<br>
> +// CHECK-x86_64: "-target-cpu" "x86-64"<br>
> +// CHECK-x86_64: "-resource-dir" "{{.*}}/lib/clang/[[VER:[0-9.]<u></u>+]]"<br>
> +// CHECK-x86_64: "-internal-isystem" "{{.*}}/../lib/clang/[[VER]]/<u></u>include"<br>
> +// CHECK-x86_64: "-internal-isystem" "{{.*}}/../x86_64-nacl/usr/<u></u>include"<br>
> +// CHECK-x86_64: "-internal-isystem" "{{.*}}/../x86_64-nacl/<u></u>include"<br>
> +// CHECK-x86_64: /as" "--64"<br>
> +// CHECK-x86_64: /ld"<br>
> +// CHECK-x86_64: "--build-id"<br>
> +// CHECK-x86_64: "-m" "elf_x86_64_nacl"<br>
> +// CHECK-x86_64: "-static"<br>
> +// CHECK-x86_64: "-L{{.*}}/../x86_64-nacl/lib"<br>
> +// CHECK-x86_64: "-L{{.*}}/../x86_64-nacl/usr/<u></u>lib"<br>
> +// CHECK-x86_64: "-L{{.*}}/../lib/clang/[[VER]]<u></u>/lib/x86_64-nacl"<br>
> +// CHECK-X86_64-NOT: -lpthread<br>
> +//<br>
> +// RUN: %clang -### -o %t.o %s 2>&1 \<br>
> +// RUN:     -target armv7a-unknown-nacl-gnueabihf \<br>
> +// RUN:   | FileCheck --check-prefix=CHECK-ARM %s<br>
> +// CHECK-ARM: {{.*}}clang{{.*}}" "-cc1"<br>
> +// CHECK-ARM: "-fuse-init-array"<br>
> +// CHECK-ARM: "-target-cpu" "cortex-a8"<br>
> +// CHECK-ARM: "-target-abi" "aapcs-linux"<br>
> +// CHECK-ARM: "-mfloat-abi" "hard"<br>
> +// CHECK-ARM: "-resource-dir" "{{.*}}/lib/clang/[[VER:[0-9.]<u></u>+]]"<br>
> +// CHECK-ARM: "-internal-isystem" "{{.*}}/../lib/clang/[[VER]]/<u></u>include"<br>
> +// CHECK-ARM: "-internal-isystem" "{{.*}}/../arm-nacl/usr/<u></u>include"<br>
> +// CHECK-ARM: "-internal-isystem" "{{.*}}/../arm-nacl/include"<br>
> +// CHECK-ARM: /as"<br>
> +// CHECK-ARM: /ld"<br>
> +// CHECK-ARM: "--build-id"<br>
> +// CHECK-ARM: "-m" "armelf_nacl"<br>
> +// CHECK-ARM: "-static"<br>
> +// CHECK-ARM: "-L{{.*}}/../arm-nacl/lib"<br>
> +// CHECK-ARM: "-L{{.*}}/../arm-nacl/usr/lib"<br>
> +// CHECK-ARM: "-L{{.*}}/../lib/clang/[[VER]]<u></u>/lib/arm-nacl"<br>
> +// CHECK-ARM-NOT: -lpthread<br>
> +<br>
> +// Check that even when the target arch is just "arm" (as will be the case when<br>
> +// it is inferred from the binary name) that we get the right ABI flags<br>
> +// RUN: %clang -### -o %t.o %s 2>&1 \<br>
> +// RUN:     -target arm-nacl \<br>
> +// RUN:   | FileCheck --check-prefix=CHECK-ARM-NOV7 %s<br>
> +// CHECK-ARM-NOV7: "-triple" "armv7--nacl-gnueabihf"<br>
> +// CHECK-ARM-NOV7: "-target-abi" "aapcs-linux"<br>
> +// CHECK-ARM-NOV7: "-mfloat-abi" "hard"<br>
> +<br>
> +// Test clang c++ include dirs and link line when using clang++<br>
> +<br>
> +// RUN: %clangxx -### -o %t.o %s 2>&1 \<br>
> +// RUN:     -target armv7a-unknown-nacl-gnueabihf \<br>
> +// RUN:   | FileCheck --check-prefix=CHECK-ARM-CXX %s<br>
> +// CHECK-ARM-CXX: {{.*}}clang{{.*}}" "-cc1"<br>
> +// CHECK-ARM-CXX: "-resource-dir" "{{.*}}/lib/clang/[[VER:[0-9.]<u></u>+]]"<br>
> +// CHECK-ARM-CXX: "-internal-isystem" "{{.*}}/../arm-nacl/include/c+<u></u>+/v1"<br>
> +// CHECK-ARM-CXX: "-internal-isystem" "{{.*}}/../lib/clang/[[VER]]/<u></u>include"<br>
> +// CHECK-ARM-CXX: "-internal-isystem" "{{.*}}/../arm-nacl/usr/<u></u>include"<br>
> +// CHECK-ARM-CXX: "-internal-isystem" "{{.*}}/../arm-nacl/include"<br>
> +// CHECK-ARM-CXX: "-lpthread"<br>
> +<br>
> +// RUN: %clangxx -### -o %t.o %s 2>&1 \<br>
> +// RUN:     -target i686-unknown-nacl \<br>
> +// RUN:   | FileCheck --check-prefix=CHECK-I686-CXX %s<br>
> +// CHECK-I686-CXX: {{.*}}clang{{.*}}" "-cc1"<br>
> +// CHECK-I686-CXX: "-resource-dir" "{{.*}}/lib/clang/[[VER:[0-9.]<u></u>+]]"<br>
> +// CHECK-I686-CXX: "-internal-isystem" "{{.*}}/../x86_64-nacl/<u></u>include/c++/v1"<br>
> +// CHECK-I686-CXX: "-internal-isystem" "{{.*}}/../lib/clang/[[VER]]/<u></u>include"<br>
> +// CHECK-I686-CXX: "-internal-isystem" "{{.*}}/../x86_64-nacl/usr/<u></u>include"<br>
> +// CHECK-I686-CXX: "-internal-isystem" "{{.*}}/../x86_64-nacl/<u></u>include"<br>
> +// CHECK-I686-CXX: "-lpthread"<br>
> +<br>
> +// RUN: %clangxx -### -o %t.o %s 2>&1 \<br>
> +// RUN:     -target x86_64-unknown-nacl \<br>
> +// RUN:   | FileCheck --check-prefix=CHECK-x86_64-<u></u>CXX %s<br>
> +// CHECK-x86_64-CXX: {{.*}}clang{{.*}}" "-cc1"<br>
> +// CHECK-x86_64-CXX: "-resource-dir" "{{.*}}/lib/clang/[[VER:[0-9.]<u></u>+]]"<br>
> +// CHECK-x86_64-CXX: "-internal-isystem" "{{.*}}/../x86_64-nacl/<u></u>include/c++/v1"<br>
> +// CHECK-x86_64-CXX: "-internal-isystem" "{{.*}}/../lib/clang/[[VER]]/<u></u>include"<br>
> +// CHECK-x86_64-CXX: "-internal-isystem" "{{.*}}/../x86_64-nacl/usr/<u></u>include"<br>
> +// CHECK-x86_64-CXX: "-internal-isystem" "{{.*}}/../x86_64-nacl/<u></u>include"<br>
> +// CHECK-x86_64-CXX: "-lpthread"<br>
><br>
><br>
> ______________________________<u></u>_________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-commits</a><br>
</blockquote></div>