Skip to content

Commit e92d2b8

Browse files
committed
[Driver] Detect libstdc++ include paths for native gcc (-m32 and -m64) on Debian i386
Take gcc-8 on Debian i386 as an example. The target-specific libstdc++ search path (`GPLUSPLUS_TOOL_INCLUDE_DIR`) uses the multiarch name `i386-linux-gnu`, instead of the triple of the GCC installation `i686-linux-gnu` (the directory under `usr/lib/gcc/`): ``` /usr/include/c++/8 /usr/include/i386-linux-gnu/c++/8 /usr/include/c++/8/backward ``` Clang currently detects `/usr/lib/gcc/i686-linux-gnu/8/../../../include/i686-linux-gnu/c++/8`. This patch changes the second i686-linux-gnu to i386-linux-gnu so that `/usr/include/i386-linux-gnu/c++/8` can be found. Fix PR49827 - this was somehow regressed by my previous libstdc++ include path cleanups and fixes for gcc-cross, but it seems that the paths were never properly tested before. Differential Revision: https://reviews.llvm.org/D99852
1 parent f619783 commit e92d2b8

File tree

20 files changed

+55
-2
lines changed

20 files changed

+55
-2
lines changed

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2983,9 +2983,13 @@ Generic_GCC::addGCCLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
29832983
TripleStr, Multilib.includeSuffix(), DriverArgs, CC1Args))
29842984
return true;
29852985
// Detect Debian g++-multiarch-incdir.diff.
2986+
StringRef DebianMultiarch =
2987+
GCCInstallation.getTriple().getArch() == llvm::Triple::x86
2988+
? "i386-linux-gnu"
2989+
: TripleStr;
29862990
if (addLibStdCXXIncludePaths(LibDir.str() + "/../include/c++/" + Version.Text,
2987-
TripleStr, Multilib.includeSuffix(), DriverArgs,
2988-
CC1Args, /*Debian=*/true))
2991+
DebianMultiarch, Multilib.includeSuffix(),
2992+
DriverArgs, CC1Args, /*Debian=*/true))
29892993
return true;
29902994

29912995
// Otherwise, fall back on a bunch of options which don't use multiarch

clang/test/Driver/Inputs/debian_i386_tree/lib/i386-linux-gnu/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/lib/x86_64-linux-gnu/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/lib64/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/include/c++/10/backward/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/include/i386-linux-gnu/c++/10/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/include/i386-linux-gnu/c++/10/64/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/include/x86_64-linux-gnu/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/64/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/crtend.o

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crt1.o

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crti.o

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crtn.o

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib/x86_64-linux-gnu/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crt1.o

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crti.o

Whitespace-only changes.

clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crtn.o

Whitespace-only changes.

clang/test/Driver/linux-cross.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,55 @@
4949
// DEBIAN_X86_64_M32-SAME: {{^}} "-L[[SYSROOT]]/lib"
5050
// DEBIAN_X86_64_M32-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
5151

52+
/// Test native GCC installation on Debian i386.
53+
// RUN: %clang -### %s --target=i686-linux-gnu --sysroot=%S/Inputs/debian_i386_tree \
54+
// RUN: -resource-dir=%S/Inputs/resource_dir --stdlib=platform --rtlib=platform 2>&1 | FileCheck %s --check-prefix=DEBIAN_I686
55+
// DEBIAN_I686: "-resource-dir" "[[RESOURCE:[^"]+]]"
56+
// DEBIAN_I686: "-internal-isystem"
57+
// DEBIAN_I686-SAME: {{^}} "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/c++/10"
58+
/// Debian specific - the path component after 'include' is i386-linux-gnu even
59+
/// though the installation is i686-linux-gnu.
60+
// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/i386-linux-gnu/c++/10"
61+
// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/c++/10/backward"
62+
// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]/include"
63+
// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/local/include"
64+
/// This resolves to /usr/i686-linux-gnu/include. Because it does not exist,
65+
/// having it does no harm albeit not ideal.
66+
// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../i686-linux-gnu/include"
67+
// DEBIAN_I686: "-internal-externc-isystem"
68+
// DEBIAN_I686-SAME: {{^}} "[[SYSROOT]]/usr/include/i386-linux-gnu"
69+
// DEBIAN_I686: "-L
70+
// DEBIAN_I686-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/i686-linux-gnu/10"
71+
// DEBIAN_I686-SAME: {{^}} "-L[[SYSROOT]]/lib/i386-linux-gnu"
72+
// DEBIAN_I686-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/i386-linux-gnu"
73+
// DEBIAN_I686-SAME: {{^}} "-L[[SYSROOT]]/lib"
74+
// DEBIAN_I686-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
75+
76+
/// Test -m64 on Debian i386.
77+
// RUN: %clang -### %s --target=i686-linux-gnu --sysroot=%S/Inputs/debian_i386_tree -m64 \
78+
// RUN: -resource-dir=%S/Inputs/resource_dir --stdlib=platform --rtlib=platform 2>&1 | FileCheck %s --check-prefix=DEBIAN_I686_M64
79+
// DEBIAN_I686_M64: "-resource-dir" "[[RESOURCE:[^"]+]]"
80+
// DEBIAN_I686_M64: "-internal-isystem"
81+
// DEBIAN_I686_M64-SAME: {{^}} "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/c++/10"
82+
/// Debian specific - the path component after 'include' is i386-linux-gnu even
83+
/// though the installation is i686-linux-gnu.
84+
// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/i386-linux-gnu/c++/10/64"
85+
// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/c++/10/backward"
86+
// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]/include"
87+
// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/local/include"
88+
// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../i686-linux-gnu/include"
89+
// DEBIAN_I686_M64: "-internal-externc-isystem"
90+
// DEBIAN_I686_M64-SAME: {{^}} "[[SYSROOT]]/usr/include/x86_64-linux-gnu"
91+
// DEBIAN_I686_M64: "-L
92+
// DEBIAN_I686_M64-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/i686-linux-gnu/10/64"
93+
// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/i686-linux-gnu/10/../../../../lib64"
94+
// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/lib/x86_64-linux-gnu"
95+
// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/lib/../lib64"
96+
// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/x86_64-linux-gnu"
97+
// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/../lib64"
98+
// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/lib"
99+
// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
100+
52101
/// Test a cross compiler.
53102
// RUN: %clang -### %s --target=aarch64-linux-gnu --sysroot=%S/Inputs/debian_multiarch_tree \
54103
// RUN: -resource-dir=%S/Inputs/resource_dir --stdlib=platform --rtlib=platform 2>&1 | FileCheck %s --check-prefix=DEBIAN_AARCH64

0 commit comments

Comments
 (0)