From 3d3ee3a8558683eef972a0176c124d0a33a76b4a Mon Sep 17 00:00:00 2001 From: James Clarke Date: Mon, 23 Mar 2020 10:59:23 +0000 Subject: [PATCH] Fix missing include and library paths on x32 Forwarded: https://reviews.llvm.org/D43630 Last-Update: 2018-09-15 Gbp-Pq: Name x32-fix-driver-search-paths.diff --- clang/lib/Driver/ToolChains/Gnu.cpp | 13 +++++++++---- clang/lib/Driver/ToolChains/Linux.cpp | 18 +++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index cbce3f11..72b18f73 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -1737,7 +1737,10 @@ bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux", "x86_64-linux-android", "x86_64-unknown-linux"}; - static const char *const X32LibDirs[] = {"/libx32"}; + static const char *const X32LibDirs[] = {"/libx32", "/lib"}; + static const char *const X32Triples[] = { + "x86_64-linux-gnux32", "x86_64-unknown-linux-gnux32", + "x86_64-pc-linux-gnux32"}; static const char *const X86LibDirs[] = {"/lib32", "/lib"}; static const char *const X86Triples[] = { "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", @@ -1842,14 +1845,16 @@ bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { } break; case llvm::Triple::x86_64: - LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); - TripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); // x32 is always available when x86_64 is available, so adding it as // secondary arch with x86_64 triples if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) { - BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs)); + LibDirs.append(begin(X32LibDirs), end(X32LibDirs)); + TripleAliases.append(begin(X32Triples), end(X32Triples)); + BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); } else { + LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); + TripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs)); BiarchTripleAliases.append(begin(X86Triples), end(X86Triples)); } diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 3014f979..d31aff13 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -77,10 +77,13 @@ static std::string getMultiarchTriple(const Driver &D, return "i386-linux-gnu"; break; case llvm::Triple::x86_64: - // We don't want this for x32, otherwise it will match x86_64 libs - if (TargetEnvironment != llvm::Triple::GNUX32 && - D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu")) - return "x86_64-linux-gnu"; + if (TargetEnvironment == llvm::Triple::GNUX32) { + if (D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnux32")) + return "x86_64-linux-gnux32"; + } else { + if (D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu")) + return "x86_64-linux-gnu"; + } break; case llvm::Triple::aarch64: if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu")) @@ -597,6 +600,8 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, // in use in any released version of Debian, so we should consider // removing them. "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"}; + const StringRef X32MultiarchIncludeDirs[] = { + "/usr/include/x86_64-linux-gnux32"}; const StringRef X86MultiarchIncludeDirs[] = { "/usr/include/i386-linux-gnu", @@ -639,7 +644,10 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArrayRef MultiarchIncludeDirs; switch (getTriple().getArch()) { case llvm::Triple::x86_64: - MultiarchIncludeDirs = X86_64MultiarchIncludeDirs; + if (getTriple().getEnvironment() == llvm::Triple::GNUX32) + MultiarchIncludeDirs = X32MultiarchIncludeDirs; + else + MultiarchIncludeDirs = X86_64MultiarchIncludeDirs; break; case llvm::Triple::x86: MultiarchIncludeDirs = X86MultiarchIncludeDirs; -- 2.30.2