@@ -604,16 +604,172 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
604
604
return ;
605
605
}
606
606
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};
610
764
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
+ }
617
773
618
774
if (getTriple ().getOS () == llvm::Triple::RTEMS)
619
775
return ;
0 commit comments