forked from OSchip/llvm-project
Do not use "lib32" directory to create a library/object files
paths when target is MIPS 32-bit. The patch reviewed by Chandler Carruth. llvm-svn: 163898
This commit is contained in:
parent
054a40a4ff
commit
d44138808f
|
@ -2037,6 +2037,28 @@ static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
|
|||
if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
|
||||
}
|
||||
|
||||
static bool isMipsArch(llvm::Triple::ArchType Arch) {
|
||||
return Arch == llvm::Triple::mips ||
|
||||
Arch == llvm::Triple::mipsel ||
|
||||
Arch == llvm::Triple::mips64 ||
|
||||
Arch == llvm::Triple::mips64el;
|
||||
}
|
||||
|
||||
static StringRef getMultilibDir(const llvm::Triple &Triple,
|
||||
const ArgList &Args) {
|
||||
if (!isMipsArch(Triple.getArch()))
|
||||
return Triple.isArch32Bit() ? "lib32" : "lib64";
|
||||
|
||||
// lib32 directory has a special meaning on MIPS targets.
|
||||
// It contains N32 ABI binaries. Use this folder if produce
|
||||
// code for N32 ABI only.
|
||||
Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
|
||||
if (A && (A->getValue(Args) == StringRef("n32")))
|
||||
return "lib32";
|
||||
|
||||
return Triple.isArch32Bit() ? "lib" : "lib64";
|
||||
}
|
||||
|
||||
Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
|
||||
: Generic_ELF(D, Triple, Args) {
|
||||
llvm::Triple::ArchType Arch = Triple.getArch();
|
||||
|
@ -2060,11 +2082,6 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
|
|||
if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
|
||||
ExtraOpts.push_back("-X");
|
||||
|
||||
const bool IsMips = Arch == llvm::Triple::mips ||
|
||||
Arch == llvm::Triple::mipsel ||
|
||||
Arch == llvm::Triple::mips64 ||
|
||||
Arch == llvm::Triple::mips64el;
|
||||
|
||||
const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
|
||||
|
||||
// Do not use 'gnu' hash style for Mips targets because .gnu.hash
|
||||
|
@ -2072,7 +2089,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
|
|||
// .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
|
||||
// ABI requires a mapping between the GOT and the symbol table.
|
||||
// Android loader does not support .gnu.hash.
|
||||
if (!IsMips && !IsAndroid) {
|
||||
if (!isMipsArch(Arch) && !IsAndroid) {
|
||||
if (IsRedhat(Distro) || IsOpenSuse(Distro) ||
|
||||
(IsUbuntu(Distro) && Distro >= UbuntuMaverick))
|
||||
ExtraOpts.push_back("--hash-style=gnu");
|
||||
|
@ -2101,7 +2118,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
|
|||
// to the link paths.
|
||||
path_list &Paths = getFilePaths();
|
||||
|
||||
const std::string Multilib = Triple.isArch32Bit() ? "lib32" : "lib64";
|
||||
const std::string Multilib = getMultilibDir(Triple, Args);
|
||||
const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
|
||||
|
||||
// Add the multilib suffixed paths where they are available.
|
||||
|
|
|
@ -429,3 +429,36 @@
|
|||
// CHECK-ANDROID-PIE: "-lgcc"
|
||||
// CHECK-ANDROID-PIE-NOT: "gcc_s"
|
||||
// CHECK-ANDROID-PIE: "{{.*}}/crtend_android.o"
|
||||
//
|
||||
// Check linker invocation on Debian 6 MIPS 32/64-bit.
|
||||
// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
|
||||
// RUN: -target mipsel-linux-gnu \
|
||||
// RUN: --sysroot=%S/Inputs/debian_6_mips_tree \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-DEBIAN-ML-MIPSEL %s
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "{{.*}}/usr/lib/gcc/mipsel-linux-gnu/4.4/../../../../lib/crt1.o"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "{{.*}}/usr/lib/gcc/mipsel-linux-gnu/4.4/../../../../lib/crti.o"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "{{.*}}/usr/lib/gcc/mipsel-linux-gnu/4.4/crtbegin.o"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "-L[[SYSROOT]]/usr/lib/gcc/mipsel-linux-gnu/4.4"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "-L[[SYSROOT]]/usr/lib/gcc/mipsel-linux-gnu/4.4/../../../../lib"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "-L[[SYSROOT]]/lib/../lib"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "-L[[SYSROOT]]/usr/lib/../lib"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "-L[[SYSROOT]]/usr/lib/gcc/mipsel-linux-gnu/4.4/../../.."
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "-L[[SYSROOT]]/lib"
|
||||
// CHECK-DEBIAN-ML-MIPSEL: "-L[[SYSROOT]]/usr/lib"
|
||||
//
|
||||
// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
|
||||
// RUN: -target mips64el-linux-gnu \
|
||||
// RUN: --sysroot=%S/Inputs/debian_6_mips_tree \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-DEBIAN-ML-MIPS64EL %s
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "{{.*}}/usr/lib/gcc/mipsel-linux-gnu/4.4/../../../../lib64/crt1.o"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "{{.*}}/usr/lib/gcc/mipsel-linux-gnu/4.4/../../../../lib64/crti.o"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "{{.*}}/usr/lib/gcc/mipsel-linux-gnu/4.4/64/crtbegin.o"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "-L[[SYSROOT]]/usr/lib/gcc/mipsel-linux-gnu/4.4/64"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "-L[[SYSROOT]]/usr/lib/gcc/mipsel-linux-gnu/4.4/../../../../lib64"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "-L[[SYSROOT]]/lib/../lib64"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "-L[[SYSROOT]]/usr/lib/../lib64"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "-L[[SYSROOT]]/usr/lib/gcc/mipsel-linux-gnu/4.4/../../.."
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "-L[[SYSROOT]]/lib"
|
||||
// CHECK-DEBIAN-ML-MIPS64EL: "-L[[SYSROOT]]/usr/lib"
|
||||
|
|
Loading…
Reference in New Issue