diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -2983,9 +2983,13 @@ TripleStr, Multilib.includeSuffix(), DriverArgs, CC1Args)) return true; // Detect Debian g++-multiarch-incdir.diff. + StringRef DebianMultiarch = + GCCInstallation.getTriple().getArch() == llvm::Triple::x86 + ? "i386-linux-gnu" + : TripleStr; if (addLibStdCXXIncludePaths(LibDir.str() + "/../include/c++/" + Version.Text, - TripleStr, Multilib.includeSuffix(), DriverArgs, - CC1Args, /*Debian=*/true)) + DebianMultiarch, Multilib.includeSuffix(), + DriverArgs, CC1Args, /*Debian=*/true)) return true; // Otherwise, fall back on a bunch of options which don't use multiarch diff --git a/clang/test/Driver/Inputs/debian_i386_tree/lib/i386-linux-gnu/.keep b/clang/test/Driver/Inputs/debian_i386_tree/lib/i386-linux-gnu/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/lib/x86_64-linux-gnu/.keep b/clang/test/Driver/Inputs/debian_i386_tree/lib/x86_64-linux-gnu/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/lib64/.keep b/clang/test/Driver/Inputs/debian_i386_tree/lib64/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/include/c++/10/backward/.keep b/clang/test/Driver/Inputs/debian_i386_tree/usr/include/c++/10/backward/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/include/i386-linux-gnu/c++/10/.keep b/clang/test/Driver/Inputs/debian_i386_tree/usr/include/i386-linux-gnu/c++/10/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/include/i386-linux-gnu/c++/10/64/.keep b/clang/test/Driver/Inputs/debian_i386_tree/usr/include/i386-linux-gnu/c++/10/64/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/include/x86_64-linux-gnu/.keep b/clang/test/Driver/Inputs/debian_i386_tree/usr/include/x86_64-linux-gnu/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/64/crtbegin.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/64/crtbegin.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/crtbegin.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/crtbegin.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/crtend.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/gcc/i686-linux-gnu/10/crtend.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crt1.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crt1.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crti.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crti.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crtn.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/i386-linux-gnu/crtn.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/x86_64-linux-gnu/.keep b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib/x86_64-linux-gnu/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/.keep b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crt1.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crt1.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crti.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crti.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crtn.o b/clang/test/Driver/Inputs/debian_i386_tree/usr/lib64/crtn.o new file mode 100644 diff --git a/clang/test/Driver/linux-cross.cpp b/clang/test/Driver/linux-cross.cpp --- a/clang/test/Driver/linux-cross.cpp +++ b/clang/test/Driver/linux-cross.cpp @@ -49,6 +49,55 @@ // DEBIAN_X86_64_M32-SAME: {{^}} "-L[[SYSROOT]]/lib" // DEBIAN_X86_64_M32-SAME: {{^}} "-L[[SYSROOT]]/usr/lib" +/// Test native GCC installation on Debian i386. +// RUN: %clang -### %s --target=i686-linux-gnu --sysroot=%S/Inputs/debian_i386_tree \ +// RUN: -resource-dir=%S/Inputs/resource_dir --stdlib=platform --rtlib=platform 2>&1 | FileCheck %s --check-prefix=DEBIAN_I686 +// DEBIAN_I686: "-resource-dir" "[[RESOURCE:[^"]+]]" +// DEBIAN_I686: "-internal-isystem" +// DEBIAN_I686-SAME: {{^}} "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/c++/10" +/// Debian specific - the path component after 'include' is i386-linux-gnu even +/// though the installation is i686-linux-gnu. +// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/i386-linux-gnu/c++/10" +// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/c++/10/backward" +// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]/include" +// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/local/include" +/// This resolves to /usr/i686-linux-gnu/include. Because it does not exist, +/// having it does no harm albeit not ideal. +// DEBIAN_I686-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../i686-linux-gnu/include" +// DEBIAN_I686: "-internal-externc-isystem" +// DEBIAN_I686-SAME: {{^}} "[[SYSROOT]]/usr/include/i386-linux-gnu" +// DEBIAN_I686: "-L +// DEBIAN_I686-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/i686-linux-gnu/10" +// DEBIAN_I686-SAME: {{^}} "-L[[SYSROOT]]/lib/i386-linux-gnu" +// DEBIAN_I686-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/i386-linux-gnu" +// DEBIAN_I686-SAME: {{^}} "-L[[SYSROOT]]/lib" +// DEBIAN_I686-SAME: {{^}} "-L[[SYSROOT]]/usr/lib" + +/// Test -m64 on Debian i386. +// RUN: %clang -### %s --target=i686-linux-gnu --sysroot=%S/Inputs/debian_i386_tree -m64 \ +// RUN: -resource-dir=%S/Inputs/resource_dir --stdlib=platform --rtlib=platform 2>&1 | FileCheck %s --check-prefix=DEBIAN_I686_M64 +// DEBIAN_I686_M64: "-resource-dir" "[[RESOURCE:[^"]+]]" +// DEBIAN_I686_M64: "-internal-isystem" +// DEBIAN_I686_M64-SAME: {{^}} "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/c++/10" +/// Debian specific - the path component after 'include' is i386-linux-gnu even +/// though the installation is i686-linux-gnu. +// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/i386-linux-gnu/c++/10/64" +// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../include/c++/10/backward" +// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]/include" +// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/local/include" +// DEBIAN_I686_M64-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/lib/gcc/i686-linux-gnu/10/../../../../i686-linux-gnu/include" +// DEBIAN_I686_M64: "-internal-externc-isystem" +// DEBIAN_I686_M64-SAME: {{^}} "[[SYSROOT]]/usr/include/x86_64-linux-gnu" +// DEBIAN_I686_M64: "-L +// DEBIAN_I686_M64-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/i686-linux-gnu/10/64" +// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/i686-linux-gnu/10/../../../../lib64" +// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/lib/x86_64-linux-gnu" +// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/lib/../lib64" +// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/x86_64-linux-gnu" +// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/../lib64" +// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/lib" +// DEBIAN_I686_M64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib" + /// Test a cross compiler. // RUN: %clang -### %s --target=aarch64-linux-gnu --sysroot=%S/Inputs/debian_multiarch_tree \ // RUN: -resource-dir=%S/Inputs/resource_dir --stdlib=platform --rtlib=platform 2>&1 | FileCheck %s --check-prefix=DEBIAN_AARCH64