Skip to content

Commit 21b211a

Browse files
committed
Revert "[Driver] Clean up Debian multiarch /usr/include/<triplet> madness"
This reverts commit 874bdc8 which broke the use of older Debian sysroots.
1 parent 933d146 commit 21b211a

File tree

22 files changed

+175
-17
lines changed

22 files changed

+175
-17
lines changed

clang/lib/Driver/ToolChains/Gnu.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -3013,6 +3013,8 @@ Generic_GCC::addGCCLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
30133013
const Multilib &Multilib = GCCInstallation.getMultilib();
30143014
const std::string Triple = getMultiarchTriple(
30153015
getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
3016+
const std::string TargetMultiarchTriple =
3017+
getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
30163018
const GCCVersion &Version = GCCInstallation.getVersion();
30173019

30183020
// Try /../$triple/include/c++/$version then /../include/c++/$version.

clang/lib/Driver/ToolChains/Linux.cpp

+165-9
Original file line numberDiff line numberDiff line change
@@ -604,16 +604,172 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
604604
return;
605605
}
606606

607-
// On Android and Debian, add /usr/include/$triple if exists. On Debian, we
608-
// can assume a GCC installation is available.
609-
std::string MultiarchIncludeDir;
607+
// Implement generic Debian multiarch support.
608+
const StringRef X86_64MultiarchIncludeDirs[] = {
609+
"/usr/include/x86_64-linux-gnu",
610+
611+
// FIXME: These are older forms of multiarch. It's not clear that they're
612+
// in use in any released version of Debian, so we should consider
613+
// removing them.
614+
"/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
615+
const StringRef X86MultiarchIncludeDirs[] = {
616+
"/usr/include/i386-linux-gnu",
617+
618+
// FIXME: These are older forms of multiarch. It's not clear that they're
619+
// in use in any released version of Debian, so we should consider
620+
// removing them.
621+
"/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
622+
"/usr/include/i486-linux-gnu"};
623+
const StringRef AArch64MultiarchIncludeDirs[] = {
624+
"/usr/include/aarch64-linux-gnu"};
625+
const StringRef ARMMultiarchIncludeDirs[] = {
626+
"/usr/include/arm-linux-gnueabi"};
627+
const StringRef ARMHFMultiarchIncludeDirs[] = {
628+
"/usr/include/arm-linux-gnueabihf"};
629+
const StringRef ARMEBMultiarchIncludeDirs[] = {
630+
"/usr/include/armeb-linux-gnueabi"};
631+
const StringRef ARMEBHFMultiarchIncludeDirs[] = {
632+
"/usr/include/armeb-linux-gnueabihf"};
633+
const StringRef M68kMultiarchIncludeDirs[] = {"/usr/include/m68k-linux-gnu"};
634+
const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
635+
const StringRef MIPSELMultiarchIncludeDirs[] = {
636+
"/usr/include/mipsel-linux-gnu"};
637+
const StringRef MIPS64MultiarchIncludeDirs[] = {
638+
"/usr/include/mips64-linux-gnuabi64"};
639+
const StringRef MIPS64ELMultiarchIncludeDirs[] = {
640+
"/usr/include/mips64el-linux-gnuabi64"};
641+
const StringRef MIPSN32MultiarchIncludeDirs[] = {
642+
"/usr/include/mips64-linux-gnuabin32"};
643+
const StringRef MIPSN32ELMultiarchIncludeDirs[] = {
644+
"/usr/include/mips64el-linux-gnuabin32"};
645+
const StringRef MIPSR6MultiarchIncludeDirs[] = {
646+
"/usr/include/mipsisa32-linux-gnu"};
647+
const StringRef MIPSR6ELMultiarchIncludeDirs[] = {
648+
"/usr/include/mipsisa32r6el-linux-gnu"};
649+
const StringRef MIPS64R6MultiarchIncludeDirs[] = {
650+
"/usr/include/mipsisa64r6-linux-gnuabi64"};
651+
const StringRef MIPS64R6ELMultiarchIncludeDirs[] = {
652+
"/usr/include/mipsisa64r6el-linux-gnuabi64"};
653+
const StringRef MIPSN32R6MultiarchIncludeDirs[] = {
654+
"/usr/include/mipsisa64r6-linux-gnuabin32"};
655+
const StringRef MIPSN32R6ELMultiarchIncludeDirs[] = {
656+
"/usr/include/mipsisa64r6el-linux-gnuabin32"};
657+
const StringRef PPCMultiarchIncludeDirs[] = {
658+
"/usr/include/powerpc-linux-gnu",
659+
"/usr/include/powerpc-linux-gnuspe"};
660+
const StringRef PPCLEMultiarchIncludeDirs[] = {
661+
"/usr/include/powerpcle-linux-gnu"};
662+
const StringRef PPC64MultiarchIncludeDirs[] = {
663+
"/usr/include/powerpc64-linux-gnu"};
664+
const StringRef PPC64LEMultiarchIncludeDirs[] = {
665+
"/usr/include/powerpc64le-linux-gnu"};
666+
const StringRef SparcMultiarchIncludeDirs[] = {
667+
"/usr/include/sparc-linux-gnu"};
668+
const StringRef Sparc64MultiarchIncludeDirs[] = {
669+
"/usr/include/sparc64-linux-gnu"};
670+
const StringRef SYSTEMZMultiarchIncludeDirs[] = {
671+
"/usr/include/s390x-linux-gnu"};
672+
ArrayRef<StringRef> MultiarchIncludeDirs;
673+
switch (getTriple().getArch()) {
674+
case llvm::Triple::x86_64:
675+
MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
676+
break;
677+
case llvm::Triple::x86:
678+
MultiarchIncludeDirs = X86MultiarchIncludeDirs;
679+
break;
680+
case llvm::Triple::aarch64:
681+
case llvm::Triple::aarch64_be:
682+
MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
683+
break;
684+
case llvm::Triple::arm:
685+
case llvm::Triple::thumb:
686+
if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
687+
MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
688+
else
689+
MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
690+
break;
691+
case llvm::Triple::armeb:
692+
case llvm::Triple::thumbeb:
693+
if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
694+
MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
695+
else
696+
MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
697+
break;
698+
case llvm::Triple::m68k:
699+
MultiarchIncludeDirs = M68kMultiarchIncludeDirs;
700+
break;
701+
case llvm::Triple::mips:
702+
if (getTriple().getSubArch() == llvm::Triple::MipsSubArch_r6)
703+
MultiarchIncludeDirs = MIPSR6MultiarchIncludeDirs;
704+
else
705+
MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
706+
break;
707+
case llvm::Triple::mipsel:
708+
if (getTriple().getSubArch() == llvm::Triple::MipsSubArch_r6)
709+
MultiarchIncludeDirs = MIPSR6ELMultiarchIncludeDirs;
710+
else
711+
MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
712+
break;
713+
case llvm::Triple::mips64:
714+
if (getTriple().getSubArch() == llvm::Triple::MipsSubArch_r6)
715+
if (getTriple().getEnvironment() == llvm::Triple::GNUABIN32)
716+
MultiarchIncludeDirs = MIPSN32R6MultiarchIncludeDirs;
717+
else
718+
MultiarchIncludeDirs = MIPS64R6MultiarchIncludeDirs;
719+
else if (getTriple().getEnvironment() == llvm::Triple::GNUABIN32)
720+
MultiarchIncludeDirs = MIPSN32MultiarchIncludeDirs;
721+
else
722+
MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
723+
break;
724+
case llvm::Triple::mips64el:
725+
if (getTriple().getSubArch() == llvm::Triple::MipsSubArch_r6)
726+
if (getTriple().getEnvironment() == llvm::Triple::GNUABIN32)
727+
MultiarchIncludeDirs = MIPSN32R6ELMultiarchIncludeDirs;
728+
else
729+
MultiarchIncludeDirs = MIPS64R6ELMultiarchIncludeDirs;
730+
else if (getTriple().getEnvironment() == llvm::Triple::GNUABIN32)
731+
MultiarchIncludeDirs = MIPSN32ELMultiarchIncludeDirs;
732+
else
733+
MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
734+
break;
735+
case llvm::Triple::ppc:
736+
MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
737+
break;
738+
case llvm::Triple::ppcle:
739+
MultiarchIncludeDirs = PPCLEMultiarchIncludeDirs;
740+
break;
741+
case llvm::Triple::ppc64:
742+
MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
743+
break;
744+
case llvm::Triple::ppc64le:
745+
MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
746+
break;
747+
case llvm::Triple::sparc:
748+
MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
749+
break;
750+
case llvm::Triple::sparcv9:
751+
MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
752+
break;
753+
case llvm::Triple::systemz:
754+
MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
755+
break;
756+
default:
757+
break;
758+
}
759+
760+
const std::string AndroidMultiarchIncludeDir =
761+
std::string("/usr/include/") +
762+
getMultiarchTriple(D, getTriple(), SysRoot);
763+
const StringRef AndroidMultiarchIncludeDirs[] = {AndroidMultiarchIncludeDir};
610764
if (getTriple().isAndroid())
611-
MultiarchIncludeDir = getMultiarchTriple(D, getTriple(), SysRoot);
612-
else if (GCCInstallation.isValid())
613-
MultiarchIncludeDir = GCCInstallation.getTriple().str();
614-
if (!MultiarchIncludeDir.empty() &&
615-
D.getVFS().exists(SysRoot + "/usr/include/" + MultiarchIncludeDir))
616-
addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/" + MultiarchIncludeDir);
765+
MultiarchIncludeDirs = AndroidMultiarchIncludeDirs;
766+
767+
for (StringRef Dir : MultiarchIncludeDirs) {
768+
if (D.getVFS().exists(SysRoot + Dir)) {
769+
addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
770+
break;
771+
}
772+
}
617773

618774
if (getTriple().getOS() == llvm::Triple::RTEMS)
619775
return;

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/arm-linux-gnueabi/crt1.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/arm-linux-gnueabi/crti.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/arm-linux-gnueabi/crtn.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/arm-linux-gnueabihf/crt1.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/arm-linux-gnueabihf/crti.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/arm-linux-gnueabihf/crtn.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/armeb-linux-gnueabi/crt1.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/armeb-linux-gnueabi/crti.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/armeb-linux-gnueabi/crtn.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/armeb-linux-gnueabihf/crt1.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/armeb-linux-gnueabihf/crti.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/armeb-linux-gnueabihf/crtn.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/gcc/arm-linux-gnueabi/10/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/gcc/arm-linux-gnueabihf/10/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/gcc/armeb-linux-gnueabi/10/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_arm_linux_tree/lib/gcc/armeb-linux-gnueabihf/10/crtbegin.o

Whitespace-only changes.

clang/test/Driver/arm-multilibs.c

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
// RUN: %clang --target=armv7-linux-gnueabi --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARM %s
2-
// RUN: %clang --target=thumbv7-linux-gnueabi --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARM %s
1+
// RUN: %clang -target armv7-linux-gnueabi --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARM %s
2+
// RUN: %clang -target thumbv7-linux-gnueabi --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARM %s
33

4-
// RUN: %clang --target=armv7-linux-gnueabihf --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARMHF %s
5-
// RUN: %clang --target=thumbv7-linux-gnueabihf --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARMHF %s
4+
// RUN: %clang -target armv7-linux-gnueabihf --sysroot=%S/Inputs/multilib_armhf_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARMHF %s
5+
// RUN: %clang -target thumbv7-linux-gnueabihf --sysroot=%S/Inputs/multilib_armhf_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARMHF %s
66

7-
// RUN: %clang --target=armv7eb-linux-gnueabi --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARMEB %s
8-
// RUN: %clang --target=thumbv7eb-linux-gnueabi --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARMEB %s
7+
// RUN: %clang -target armv7eb-linux-gnueabi --sysroot=%S/Inputs/multilib_armeb_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARMEB %s
8+
// RUN: %clang -target thumbv7eb-linux-gnueabi --sysroot=%S/Inputs/multilib_armeb_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARMEB %s
99

10-
// RUN: %clang --target=armv7eb-linux-gnueabihf --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARMEBHF %s
11-
// RUN: %clang --target=thumbv7eb-linux-gnueabihf --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARMEBHF %s
10+
// RUN: %clang -target armv7eb-linux-gnueabihf --sysroot=%S/Inputs/multilib_armebhf_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARMEBHF %s
11+
// RUN: %clang -target thumbv7eb-linux-gnueabihf --sysroot=%S/Inputs/multilib_armebhf_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARMEBHF %s
1212

1313
// CHECK-ARM: "-internal-externc-isystem" "{{.*}}/usr/include/arm-linux-gnueabi"
1414
// CHECK-ARMHF: "-internal-externc-isystem" "{{.*}}/usr/include/arm-linux-gnueabihf"

0 commit comments

Comments
 (0)