r296927 - Add arch-specific directory to search path

Pirama Arumuga Nainar via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 7 09:50:03 PST 2017


https://reviews.llvm.org/D30700 changes the driver to always add -rpath,
irrespective of whether cross compiling or not.


On Mon, Mar 6, 2017 at 10:29 AM, Benjamin Kramer <benny.kra at gmail.com>
wrote:

> On Mon, Mar 6, 2017 at 7:00 PM, Pirama Arumuga Nainar <pirama at google.com>
> wrote:
> > Adding Reid, Michal
> >
> >
> > On Mon, Mar 6, 2017 at 5:01 AM, Benjamin Kramer <benny.kra at gmail.com>
> wrote:
> >>
> >> On Sat, Mar 4, 2017 at 12:20 AM, Pirama Arumuga Nainar via cfe-commits
> >> <cfe-commits at lists.llvm.org> wrote:
> >> > Author: pirama
> >> > Date: Fri Mar  3 17:20:49 2017
> >> > New Revision: 296927
> >> >
> >> > URL: http://llvm.org/viewvc/llvm-project?rev=296927&view=rev
> >> > Log:
> >> > Add arch-specific directory to search path
> >> >
> >> > Summary:
> >> >
> >> > This change adds an arch-specific subdirectory in
> <ResourceDir>/lib/<OS>
> >> > to the linker search path.  This path also gets added as '-rpath' for
> >> > native compilation if a runtime is linked in as a shared object.  This
> >> > allows arch-specific libraries to be installed alongside clang.
> >> >
> >> > Reviewers: danalbert, cbergstrom, javed.absar
> >> >
> >> > Subscribers: srhines
> >> >
> >> > Differential Revision: https://reviews.llvm.org/D30015
> >> >
> >> > Added:
> >> >     cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> >> >     cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/lib/
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/lib/linux/
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/aarch64/
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/aarch64/.keep
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/arm/
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/arm/.keep
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/i386/
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/i386/.keep
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/x86_64/
> >> >
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/x86_64/.keep
> >> >     cfe/trunk/test/Driver/arch-specific-libdir-rpath.c
> >> >     cfe/trunk/test/Driver/arch-specific-libdir.c
> >> > Modified:
> >> >     cfe/trunk/include/clang/Driver/ToolChain.h
> >> >     cfe/trunk/lib/Driver/ToolChain.cpp
> >> >     cfe/trunk/lib/Driver/Tools.cpp
> >> >     cfe/trunk/test/lit.cfg
> >> >
> >> > Modified: cfe/trunk/include/clang/Driver/ToolChain.h
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Driver/ToolChain.h?rev=296927&r1=296926&r2=296927&view=diff
> >> >
> >> > ============================================================
> ==================
> >> > --- cfe/trunk/include/clang/Driver/ToolChain.h (original)
> >> > +++ cfe/trunk/include/clang/Driver/ToolChain.h Fri Mar  3 17:20:49
> 2017
> >> > @@ -299,6 +299,11 @@ public:
> >> >    const char *getCompilerRTArgString(const llvm::opt::ArgList &Args,
> >> >                                       StringRef Component,
> >> >                                       bool Shared = false) const;
> >> > +
> >> > +  // Returns <ResourceDir>/lib/<OSName>/<arch>.  This is used by
> >> > runtimes (such
> >> > +  // as OpenMP) to find arch-specific libraries.
> >> > +  std::string getArchSpecificLibPath() const;
> >> > +
> >> >    /// needsProfileRT - returns true if instrumentation profile is on.
> >> >    static bool needsProfileRT(const llvm::opt::ArgList &Args);
> >> >
> >> >
> >> > Modified: cfe/trunk/lib/Driver/ToolChain.cpp
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/
> ToolChain.cpp?rev=296927&r1=296926&r2=296927&view=diff
> >> >
> >> > ============================================================
> ==================
> >> > --- cfe/trunk/lib/Driver/ToolChain.cpp (original)
> >> > +++ cfe/trunk/lib/Driver/ToolChain.cpp Fri Mar  3 17:20:49 2017
> >> > @@ -10,6 +10,7 @@
> >> >  #include "clang/Driver/ToolChain.h"
> >> >  #include "Tools.h"
> >> >  #include "clang/Basic/ObjCRuntime.h"
> >> > +#include "clang/Basic/VirtualFileSystem.h"
> >> >  #include "clang/Config/config.h"
> >> >  #include "clang/Driver/Action.h"
> >> >  #include "clang/Driver/Driver.h"
> >> > @@ -74,6 +75,10 @@ ToolChain::ToolChain(const Driver &D, co
> >> >      if (!isThreadModelSupported(A->getValue()))
> >> >        D.Diag(diag::err_drv_invalid_thread_model_for_target)
> >> >            << A->getValue() << A->getAsString(Args);
> >> > +
> >> > +  std::string CandidateLibPath = getArchSpecificLibPath();
> >> > +  if (getVFS().exists(CandidateLibPath))
> >> > +    getFilePaths().push_back(CandidateLibPath);
> >> >  }
> >> >
> >> >  ToolChain::~ToolChain() {
> >> > @@ -320,6 +325,14 @@ const char *ToolChain::getCompilerRTArgS
> >> >    return Args.MakeArgString(getCompilerRT(Args, Component, Shared));
> >> >  }
> >> >
> >> > +std::string ToolChain::getArchSpecificLibPath() const {
> >> > +  SmallString<128> Path(getDriver().ResourceDir);
> >> > +  StringRef OSLibName = getTriple().isOSFreeBSD() ? "freebsd" :
> >> > getOS();
> >> > +  llvm::sys::path::append(Path, "lib", OSLibName,
> >> > +                          llvm::Triple::getArchTypeName(getArch()));
> >> > +  return Path.str();
> >> > +}
> >> > +
> >> >  bool ToolChain::needsProfileRT(const ArgList &Args) {
> >> >    if (Args.hasFlag(options::OPT_fprofile_arcs,
> >> > options::OPT_fno_profile_arcs,
> >> >                     false) ||
> >> >
> >> > Modified: cfe/trunk/lib/Driver/Tools.cpp
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/
> Tools.cpp?rev=296927&r1=296926&r2=296927&view=diff
> >> >
> >> > ============================================================
> ==================
> >> > --- cfe/trunk/lib/Driver/Tools.cpp (original)
> >> > +++ cfe/trunk/lib/Driver/Tools.cpp Fri Mar  3 17:20:49 2017
> >> > @@ -14,6 +14,7 @@
> >> >  #include "clang/Basic/LangOptions.h"
> >> >  #include "clang/Basic/ObjCRuntime.h"
> >> >  #include "clang/Basic/Version.h"
> >> > +#include "clang/Basic/VirtualFileSystem.h"
> >> >  #include "clang/Config/config.h"
> >> >  #include "clang/Driver/Action.h"
> >> >  #include "clang/Driver/Compilation.h"
> >> > @@ -238,8 +239,9 @@ static void AddLinkerInputs(const ToolCh
> >> >
> >> >    // LIBRARY_PATH - included following the user specified library
> >> > paths.
> >> >    //                and only supported on native toolchains.
> >> > -  if (!TC.isCrossCompiling())
> >> > +  if (!TC.isCrossCompiling()) {
> >> >      addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
> >> > +  }
> >> >  }
> >> >
> >> >  /// Add OpenMP linker script arguments at the end of the argument
> list
> >> > so that
> >> > @@ -2000,6 +2002,19 @@ static void CollectArgsForIntegratedAsse
> >> >    }
> >> >  }
> >> >
> >> > +static void addArchSpecificRPath(const ToolChain &TC, const ArgList
> >> > &Args,
> >> > +                                 ArgStringList &CmdArgs) {
> >> > +  // In the cross-compilation case, arch-specific library path is
> >> > likely
> >> > +  // unavailable at runtime.
> >> > +  if (TC.isCrossCompiling()) return;
> >>
> >> Why? This is fundamentally against the design of the clang driver. It
> >> should be always possible to use clang as a cross compiler and the
> >> existence of isCrossCompiling() is an accident of history. What's
> >> breaking without this check? Please either make this compatible with
> >> cross compilation or revert this patch.
> >
> >
> > This is just a heuristic to prevent an rpath that is most likely
> unavailable
> > at runtime from being embedded into an object.   Michal suggested I add
> the
> > rpath during review.
> >
> > I'm happy to add the rpath in all cases, if that'd make the Driver behave
> > consistently.
>
> Always adding the rpath sounds good to me.
>
> >>
> >> > +
> >> > +  std::string CandidateRPath = TC.getArchSpecificLibPath();
> >> > +  if (TC.getVFS().exists(CandidateRPath)) {
> >> > +    CmdArgs.push_back("-rpath");
> >> > +    CmdArgs.push_back(Args.MakeArgString(CandidateRPath.c_str()));
> >> > +  }
> >> > +}
> >> > +
> >> >  static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain
> >> > &TC,
> >> >                                const ArgList &Args) {
> >> >    if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
> >> > @@ -2020,6 +2035,8 @@ static void addOpenMPRuntime(ArgStringLi
> >> >      // Already diagnosed.
> >> >      break;
> >> >    }
> >> > +
> >> > +  addArchSpecificRPath(TC, Args, CmdArgs);
> >> >  }
> >> >
> >> >  static void addSanitizerRuntime(const ToolChain &TC, const ArgList
> >> > &Args,
> >> > @@ -2030,6 +2047,10 @@ static void addSanitizerRuntime(const To
> >> >    if (IsWhole) CmdArgs.push_back("-whole-archive");
> >> >    CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer,
> >> > IsShared));
> >> >    if (IsWhole) CmdArgs.push_back("-no-whole-archive");
> >> > +
> >> > +  if (IsShared) {
> >> > +    addArchSpecificRPath(TC, Args, CmdArgs);
> >> > +  }
> >> >  }
> >> >
> >> >  // Tries to use a file with the list of dynamic symbols that need to
> be
> >> > exported
> >> > @@ -9002,6 +9023,8 @@ void gnutools::Linker::ConstructJob(Comp
> >> >          }
> >> >          if (JA.isHostOffloading(Action::OFK_OpenMP))
> >> >            CmdArgs.push_back("-lomptarget");
> >> > +
> >> > +        addArchSpecificRPath(ToolChain, Args, CmdArgs);
> >> >        }
> >> >
> >> >        AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
> >> >
> >> > Added:
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/aarch64/.keep
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
> Inputs/resource_dir_with_arch_subdir/lib/linux/aarch64/.
> keep?rev=296927&view=auto
> >> >
> >> > ============================================================
> ==================
> >> >     (empty)
> >> >
> >> > Added:
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/arm/.keep
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
> Inputs/resource_dir_with_arch_subdir/lib/linux/arm/.keep?
> rev=296927&view=auto
> >> >
> >> > ============================================================
> ==================
> >> >     (empty)
> >> >
> >> > Added:
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/i386/.keep
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
> Inputs/resource_dir_with_arch_subdir/lib/linux/i386/.keep?
> rev=296927&view=auto
> >> >
> >> > ============================================================
> ==================
> >> >     (empty)
> >> >
> >> > Added:
> >> > cfe/trunk/test/Driver/Inputs/resource_dir_with_arch_subdir/
> lib/linux/x86_64/.keep
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
> Inputs/resource_dir_with_arch_subdir/lib/linux/x86_64/.keep?
> rev=296927&view=auto
> >> >
> >> > ============================================================
> ==================
> >> >     (empty)
> >> >
> >> > Added: cfe/trunk/test/Driver/arch-specific-libdir-rpath.c
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
> arch-specific-libdir-rpath.c?rev=296927&view=auto
> >> >
> >> > ============================================================
> ==================
> >> > --- cfe/trunk/test/Driver/arch-specific-libdir-rpath.c (added)
> >> > +++ cfe/trunk/test/Driver/arch-specific-libdir-rpath.c Fri Mar  3
> >> > 17:20:49 2017
> >> > @@ -0,0 +1,50 @@
> >> > +// Test that the driver adds an arch-specific subdirectory in
> >> > +// {RESOURCE_DIR}/lib/linux to the linker search path and to '-rpath'
> >> > for native
> >> > +// compilations.
> >> > +//
> >> > +// -rpath only gets added during native compilation.  To keep the
> test
> >> > simple,
> >> > +// just test for x86_64-linux native compilation.
> >> > +// REQUIRES: x86_64-linux
> >> > +//
> >> > +// Add LIBPATH but no RPATH for -fsanitizer=address w/o
> -shared-libasan
> >> > +// RUN: %clang %s -### 2>&1 -fsanitize=undefined \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,LIBPATH,NO-RPATH %s
> >> > +//
> >> > +// Add LIBPATH, RPATH for -fsanitize=address -shared-libasan
> >> > +// RUN: %clang %s -### 2>&1 -target x86_64-linux \
> >> > +// RUN:     -fsanitize=address -shared-libasan \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,LIBPATH,RPATH %s
> >> > +//
> >> > +// Add LIBPATH, RPATH with -fsanitize=address for Android
> >> > +// RUN: %clang %s -### 2>&1 -target x86_64-linux-android
> >> > -fsanitize=address \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,LIBPATH,RPATH %s
> >> > +//
> >> > +// Add LIBPATH, RPATH for OpenMP
> >> > +// RUN: %clang %s -### 2>&1 -fopenmp \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,LIBPATH,RPATH %s
> >> > +//
> >> > +// Add LIBPATH but no RPATH for ubsan (or any other sanitizer)
> >> > +// RUN: %clang %s -### 2>&1 -fsanitize=undefined \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,LIBPATH,NO-RPATH %s
> >> > +//
> >> > +// Add LIBPATH but no RPATH if no sanitizer or runtime is specified
> >> > +// RUN: %clang %s -### 2>&1 \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,LIBPATH,NO-RPATH %s
> >> > +//
> >> > +// Do not add LIBPATH or RPATH if arch-specific subdir doesn't exist
> >> > +// RUN: %clang %s -### 2>&1 \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,NO-LIBPATH,NO-RPATH
> %s
> >> > +//
> >> > +//
> >> > +// FILEPATH: "-x" "c" "[[FILE_PATH:.*]]/{{.*}}.c"
> >> > +// LIBPATH:
> >> > -L[[FILE_PATH]]/Inputs/resource_dir_with_arch_subdir/lib/linux/x86_64
> >> > +// RPATH: "-rpath"
> >> > "[[FILE_PATH]]/Inputs/resource_dir_with_arch_subdir/lib/linux/x86_64"
> >> > +// NO-LIBPATH-NOT: -L{{.*}}Inputs/resource_dir
> >> > +// NO-RPATH-NOT: "-rpath" {{.*}}/Inputs/resource_dir
> >> >
> >> > Added: cfe/trunk/test/Driver/arch-specific-libdir.c
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
> arch-specific-libdir.c?rev=296927&view=auto
> >> >
> >> > ============================================================
> ==================
> >> > --- cfe/trunk/test/Driver/arch-specific-libdir.c (added)
> >> > +++ cfe/trunk/test/Driver/arch-specific-libdir.c Fri Mar  3 17:20:49
> >> > 2017
> >> > @@ -0,0 +1,53 @@
> >> > +// Test that the driver adds an arch-specific subdirectory in
> >> > +// {RESOURCE_DIR}/lib/linux to the search path.
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target i386-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,ARCHDIR-i386 %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target i386-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,NO-ARCHDIR %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target i686-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,ARCHDIR-i386 %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target i686-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,NO-ARCHDIR %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target x86_64-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,ARCHDIR-x86_64 %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target x86_64-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,NO-ARCHDIR %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target arm-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,ARCHDIR-arm %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target arm-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,NO-ARCHDIR %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target aarch64-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,ARCHDIR-aarch64 %s
> >> > +//
> >> > +// RUN: %clang %s -### 2>&1 -target aarch64-unknown-linux \
> >> > +// RUN:     -resource-dir=%S/Inputs/resource_dir \
> >> > +// RUN:   | FileCheck --check-prefixes=FILEPATH,NO-ARCHDIR %s
> >> > +//
> >> > +//
> >> > +// FILEPATH: "-x" "c" "[[FILE_PATH:.*]]/{{.*}}.c"
> >> > +// ARCHDIR-i386:
> >> > -L[[FILE_PATH]]/Inputs/resource_dir_with_arch_subdir/lib/linux/i386
> >> > +// ARCHDIR-x86_64:
> >> > -L[[FILE_PATH]]/Inputs/resource_dir_with_arch_subdir/lib/linux/x86_64
> >> > +// ARCHDIR-arm:
> >> > -L[[FILE_PATH]]/Inputs/resource_dir_with_arch_subdir/lib/linux/arm
> >> > +// ARCHDIR-aarch64:
> >> > -L[[FILE_PATH]]/Inputs/resource_dir_with_arch_subdir/
> lib/linux/aarch64
> >> > +//
> >> > +// Have a stricter check for no-archdir - that the driver doesn't add
> >> > any
> >> > +// subdirectory from the provided resource directory.
> >> > +// NO-ARCHDIR-NOT: -L[[FILE_PATH]]/Inputs/resource_dir
> >> >
> >> > Modified: cfe/trunk/test/lit.cfg
> >> > URL:
> >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/lit.
> cfg?rev=296927&r1=296926&r2=296927&view=diff
> >> >
> >> > ============================================================
> ==================
> >> > --- cfe/trunk/test/lit.cfg (original)
> >> > +++ cfe/trunk/test/lit.cfg Fri Mar  3 17:20:49 2017
> >> > @@ -397,6 +397,10 @@ if platform.system() not in ['Darwin', '
> >> >  if config.host_triple == config.target_triple:
> >> >      config.available_features.add("native")
> >> >
> >> > +# Test Driver/arch-specific-libdir-rpath.c is restricted to
> >> > x86_64-linux
> >> > +if re.match(r'^x86_64.*-linux', config.target_triple):
> >> > +    config.available_features.add("x86_64-linux")
> >> > +
> >> >  # Case-insensitive file system
> >> >  def is_filesystem_case_insensitive():
> >> >      handle, path = tempfile.mkstemp(prefix='case-test',
> >> > dir=config.test_exec_root)
> >> >
> >> >
> >> > _______________________________________________
> >> > cfe-commits mailing list
> >> > cfe-commits at lists.llvm.org
> >> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170307/1d4fc2b6/attachment-0001.html>


More information about the cfe-commits mailing list