Skip to content

Commit

Permalink
Fix the -print-multi-directory flag to print the selected multilib.
Browse files Browse the repository at this point in the history
Summary: Fix -print-multi-directory to print the selected multilib

Reviewers: jroelofs

Reviewed By: jroelofs

Subscribers: srhines, cfe-commits

Differential Revision: https://reviews.llvm.org/D51354

llvm-svn: 341373
  • Loading branch information
Christian Bruel committed Sep 4, 2018
1 parent bb51d39 commit ed1d6db
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 13 deletions.
3 changes: 3 additions & 0 deletions clang/include/clang/Driver/ToolChain.h
Expand Up @@ -149,6 +149,7 @@ class ToolChain {

protected:
MultilibSet Multilibs;
Multilib SelectedMultilib;

ToolChain(const Driver &D, const llvm::Triple &T,
const llvm::opt::ArgList &Args);
Expand Down Expand Up @@ -227,6 +228,8 @@ class ToolChain {

const MultilibSet &getMultilibs() const { return Multilibs; }

const Multilib &getMultilib() const { return SelectedMultilib; }

const SanitizerArgs& getSanitizerArgs() const;

const XRayArgs& getXRayArgs() const;
Expand Down
15 changes: 7 additions & 8 deletions clang/lib/Driver/Driver.cpp
Expand Up @@ -1661,14 +1661,13 @@ bool Driver::HandleImmediateArgs(const Compilation &C) {
}

if (C.getArgs().hasArg(options::OPT_print_multi_directory)) {
for (const Multilib &Multilib : TC.getMultilibs()) {
if (Multilib.gccSuffix().empty())
llvm::outs() << ".\n";
else {
StringRef Suffix(Multilib.gccSuffix());
assert(Suffix.front() == '/');
llvm::outs() << Suffix.substr(1) << "\n";
}
const Multilib &Multilib = TC.getMultilib();
if (Multilib.gccSuffix().empty())
llvm::outs() << ".\n";
else {
StringRef Suffix(Multilib.gccSuffix());
assert(Suffix.front() == '/');
llvm::outs() << Suffix.substr(1) << "\n";
}
return false;
}
Expand Down
9 changes: 4 additions & 5 deletions clang/lib/Driver/ToolChains/Linux.cpp
Expand Up @@ -210,6 +210,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
: Generic_ELF(D, Triple, Args) {
GCCInstallation.init(Triple, Args);
Multilibs = GCCInstallation.getMultilibs();
SelectedMultilib = GCCInstallation.getMultilib();
llvm::Triple::ArchType Arch = Triple.getArch();
std::string SysRoot = computeSysRoot();

Expand Down Expand Up @@ -299,16 +300,14 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
if (GCCInstallation.isValid()) {
const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
const std::string &LibPath = GCCInstallation.getParentLibPath();
const Multilib &Multilib = GCCInstallation.getMultilib();
const MultilibSet &Multilibs = GCCInstallation.getMultilibs();

// Add toolchain / multilib specific file paths.
addMultilibsFilePaths(D, Multilibs, Multilib,
addMultilibsFilePaths(D, Multilibs, SelectedMultilib,
GCCInstallation.getInstallPath(), Paths);

// Sourcery CodeBench MIPS toolchain holds some libraries under
// a biarch-like suffix of the GCC installation.
addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
addPathIfExists(D, GCCInstallation.getInstallPath() + SelectedMultilib.gccSuffix(),
Paths);

// GCC cross compiling toolchains will install target libraries which ship
Expand All @@ -330,7 +329,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
// Note that this matches the GCC behavior. See the below comment for where
// Clang diverges from GCC's behavior.
addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
OSLibDir + Multilib.osSuffix(),
OSLibDir + SelectedMultilib.osSuffix(),
Paths);

// If the GCC installation we found is inside of the sysroot, we want to
Expand Down
28 changes: 28 additions & 0 deletions clang/test/Driver/print-multi-directory.c
@@ -0,0 +1,28 @@
// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
// RUN: -target i386-none-linux \
// RUN: -print-multi-directory \
// RUN: | FileCheck --check-prefix=CHECK-X86-MULTILIBS %s

// CHECK-X86-MULTILIBS: 32
// CHECK-X86-MULTILIBS-NOT: x32
// CHECK-X86-MULTILIBS-NOT: .

// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
// RUN: -target i386-none-linux -m64 \
// RUN: -print-multi-directory \
// RUN: | FileCheck --check-prefix=CHECK-X86_64-MULTILIBS %s

// CHECK-X86_64-MULTILIBS: .
// CHECK-X86_64-MULTILIBS-NOT: x32
// CHECK-X86_64-MULTILIBS-NOT: 32

// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
// RUN: -target arm-linux-androideabi21 -stdlib=libstdc++ \
// RUN: -mthumb \
// RUN: -B%S/Inputs/basic_android_ndk_tree \
// RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \
// RUN: -print-multi-directory \
// RUN: | FileCheck --check-prefix=CHECK-ARM-MULTILIBS %s

// CHECK-ARM-MULTILIBS: thumb
// CHECK-ARM-MULTILIBS-NOT: .

0 comments on commit ed1d6db

Please sign in to comment.