Skip to content

Commit 16cd23a

Browse files
committed
ARM: Unconditionally set eabi libcall calling convs in RuntimeLibcalls
This fully consolidates all the calling convention configuration into RuntimeLibcallInfo. I'm assuming that __aeabi functions have a universal calling convention, and on other ABIs just don't use them. This will enable splitting of RuntimeLibcallInfo into the ABI and lowering component.
1 parent 4e8ecb3 commit 16cd23a

File tree

2 files changed

+110
-88
lines changed

2 files changed

+110
-88
lines changed

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,45 @@ static void setARMLibcallNames(RuntimeLibcallsInfo &Info, const Triple &TT,
9898
Info.setLibcallImpl(RTLIB::SDIVREM_I32, RTLIB::__divmodsi4);
9999
Info.setLibcallImpl(RTLIB::UDIVREM_I32, RTLIB::__udivmodsi4);
100100
}
101+
102+
static const RTLIB::LibcallImpl AAPCS_Libcalls[] = {
103+
RTLIB::__aeabi_dadd, RTLIB::__aeabi_ddiv,
104+
RTLIB::__aeabi_dmul, RTLIB::__aeabi_dsub,
105+
RTLIB::__aeabi_dcmpeq__ne, RTLIB::__aeabi_dcmpeq__eq,
106+
RTLIB::__aeabi_dcmplt, RTLIB::__aeabi_dcmple,
107+
RTLIB::__aeabi_dcmpge, RTLIB::__aeabi_dcmpgt,
108+
RTLIB::__aeabi_dcmpun, RTLIB::__aeabi_fadd,
109+
RTLIB::__aeabi_fdiv, RTLIB::__aeabi_fmul,
110+
RTLIB::__aeabi_fsub, RTLIB::__aeabi_fcmpeq__ne,
111+
RTLIB::__aeabi_fcmpeq__eq, RTLIB::__aeabi_fcmplt,
112+
RTLIB::__aeabi_fcmple, RTLIB::__aeabi_fcmpge,
113+
RTLIB::__aeabi_fcmpgt, RTLIB::__aeabi_fcmpun,
114+
RTLIB::__aeabi_d2iz, RTLIB::__aeabi_d2uiz,
115+
RTLIB::__aeabi_d2lz, RTLIB::__aeabi_d2ulz,
116+
RTLIB::__aeabi_f2iz, RTLIB::__aeabi_f2uiz,
117+
RTLIB::__aeabi_f2lz, RTLIB::__aeabi_f2ulz,
118+
RTLIB::__aeabi_d2f, RTLIB::__aeabi_d2h,
119+
RTLIB::__aeabi_f2d, RTLIB::__aeabi_i2d,
120+
RTLIB::__aeabi_ui2d, RTLIB::__aeabi_l2d,
121+
RTLIB::__aeabi_ul2d, RTLIB::__aeabi_i2f,
122+
RTLIB::__aeabi_ui2f, RTLIB::__aeabi_l2f,
123+
RTLIB::__aeabi_ul2f, RTLIB::__aeabi_lmul,
124+
RTLIB::__aeabi_llsl, RTLIB::__aeabi_llsr,
125+
RTLIB::__aeabi_lasr, RTLIB::__aeabi_idiv__i8,
126+
RTLIB::__aeabi_idiv__i16, RTLIB::__aeabi_idiv__i32,
127+
RTLIB::__aeabi_ldivmod, RTLIB::__aeabi_uidiv__i8,
128+
RTLIB::__aeabi_uidiv__i16, RTLIB::__aeabi_uidiv__i32,
129+
RTLIB::__aeabi_uldivmod, RTLIB::__aeabi_f2h,
130+
RTLIB::__aeabi_d2h, RTLIB::__aeabi_h2f,
131+
RTLIB::__aeabi_memcpy, RTLIB::__aeabi_memmove,
132+
RTLIB::__aeabi_memset, RTLIB::__aeabi_memcpy4,
133+
RTLIB::__aeabi_memcpy8, RTLIB::__aeabi_memmove4,
134+
RTLIB::__aeabi_memmove8, RTLIB::__aeabi_memset4,
135+
RTLIB::__aeabi_memset8, RTLIB::__aeabi_memclr,
136+
RTLIB::__aeabi_memclr4, RTLIB::__aeabi_memclr8};
137+
138+
for (RTLIB::LibcallImpl Impl : AAPCS_Libcalls)
139+
Info.setLibcallImplCallingConv(Impl, CallingConv::ARM_AAPCS);
101140
}
102141

103142
static void setLongDoubleIsF128Libm(RuntimeLibcallsInfo &Info,

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 71 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -578,9 +578,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
578578
};
579579
// clang-format on
580580

581-
for (const auto &LC : LibraryCalls) {
581+
for (const auto &LC : LibraryCalls)
582582
setLibcallImpl(LC.Op, LC.Impl);
583-
}
584583
}
585584
}
586585

@@ -594,131 +593,117 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
594593
static const struct {
595594
const RTLIB::Libcall Op;
596595
const RTLIB::LibcallImpl Impl;
597-
const CallingConv::ID CC;
598596
} LibraryCalls[] = {
599597
// Double-precision floating-point arithmetic helper functions
600598
// RTABI chapter 4.1.2, Table 2
601-
{ RTLIB::ADD_F64, RTLIB::__aeabi_dadd, CallingConv::ARM_AAPCS },
602-
{ RTLIB::DIV_F64, RTLIB::__aeabi_ddiv, CallingConv::ARM_AAPCS },
603-
{ RTLIB::MUL_F64, RTLIB::__aeabi_dmul, CallingConv::ARM_AAPCS },
604-
{ RTLIB::SUB_F64, RTLIB::__aeabi_dsub, CallingConv::ARM_AAPCS },
599+
{ RTLIB::ADD_F64, RTLIB::__aeabi_dadd },
600+
{ RTLIB::DIV_F64, RTLIB::__aeabi_ddiv },
601+
{ RTLIB::MUL_F64, RTLIB::__aeabi_dmul },
602+
{ RTLIB::SUB_F64, RTLIB::__aeabi_dsub },
605603

606604
// Double-precision floating-point comparison helper functions
607605
// RTABI chapter 4.1.2, Table 3
608-
{ RTLIB::OEQ_F64, RTLIB::__aeabi_dcmpeq__ne, CallingConv::ARM_AAPCS },
609-
{ RTLIB::UNE_F64, RTLIB::__aeabi_dcmpeq__eq, CallingConv::ARM_AAPCS },
610-
{ RTLIB::OLT_F64, RTLIB::__aeabi_dcmplt, CallingConv::ARM_AAPCS },
611-
{ RTLIB::OLE_F64, RTLIB::__aeabi_dcmple, CallingConv::ARM_AAPCS },
612-
{ RTLIB::OGE_F64, RTLIB::__aeabi_dcmpge, CallingConv::ARM_AAPCS },
613-
{ RTLIB::OGT_F64, RTLIB::__aeabi_dcmpgt, CallingConv::ARM_AAPCS },
614-
{ RTLIB::UO_F64, RTLIB::__aeabi_dcmpun, CallingConv::ARM_AAPCS },
606+
{ RTLIB::OEQ_F64, RTLIB::__aeabi_dcmpeq__ne },
607+
{ RTLIB::UNE_F64, RTLIB::__aeabi_dcmpeq__eq },
608+
{ RTLIB::OLT_F64, RTLIB::__aeabi_dcmplt },
609+
{ RTLIB::OLE_F64, RTLIB::__aeabi_dcmple },
610+
{ RTLIB::OGE_F64, RTLIB::__aeabi_dcmpge },
611+
{ RTLIB::OGT_F64, RTLIB::__aeabi_dcmpgt },
612+
{ RTLIB::UO_F64, RTLIB::__aeabi_dcmpun },
615613

616614
// Single-precision floating-point arithmetic helper functions
617615
// RTABI chapter 4.1.2, Table 4
618-
{ RTLIB::ADD_F32, RTLIB::__aeabi_fadd, CallingConv::ARM_AAPCS },
619-
{ RTLIB::DIV_F32, RTLIB::__aeabi_fdiv, CallingConv::ARM_AAPCS },
620-
{ RTLIB::MUL_F32, RTLIB::__aeabi_fmul, CallingConv::ARM_AAPCS },
621-
{ RTLIB::SUB_F32, RTLIB::__aeabi_fsub, CallingConv::ARM_AAPCS },
616+
{ RTLIB::ADD_F32, RTLIB::__aeabi_fadd },
617+
{ RTLIB::DIV_F32, RTLIB::__aeabi_fdiv },
618+
{ RTLIB::MUL_F32, RTLIB::__aeabi_fmul },
619+
{ RTLIB::SUB_F32, RTLIB::__aeabi_fsub },
622620

623621
// Single-precision floating-point comparison helper functions
624622
// RTABI chapter 4.1.2, Table 5
625-
{ RTLIB::OEQ_F32, RTLIB::__aeabi_fcmpeq__ne, CallingConv::ARM_AAPCS },
626-
{ RTLIB::UNE_F32, RTLIB::__aeabi_fcmpeq__eq, CallingConv::ARM_AAPCS },
627-
{ RTLIB::OLT_F32, RTLIB::__aeabi_fcmplt, CallingConv::ARM_AAPCS},
628-
{ RTLIB::OLE_F32, RTLIB::__aeabi_fcmple, CallingConv::ARM_AAPCS },
629-
{ RTLIB::OGE_F32, RTLIB::__aeabi_fcmpge, CallingConv::ARM_AAPCS },
630-
{ RTLIB::OGT_F32, RTLIB::__aeabi_fcmpgt, CallingConv::ARM_AAPCS },
631-
{ RTLIB::UO_F32, RTLIB::__aeabi_fcmpun, CallingConv::ARM_AAPCS },
623+
{ RTLIB::OEQ_F32, RTLIB::__aeabi_fcmpeq__ne },
624+
{ RTLIB::UNE_F32, RTLIB::__aeabi_fcmpeq__eq },
625+
{ RTLIB::OLT_F32, RTLIB::__aeabi_fcmplt},
626+
{ RTLIB::OLE_F32, RTLIB::__aeabi_fcmple },
627+
{ RTLIB::OGE_F32, RTLIB::__aeabi_fcmpge },
628+
{ RTLIB::OGT_F32, RTLIB::__aeabi_fcmpgt },
629+
{ RTLIB::UO_F32, RTLIB::__aeabi_fcmpun },
632630

633631
// Floating-point to integer conversions.
634632
// RTABI chapter 4.1.2, Table 6
635-
{ RTLIB::FPTOSINT_F64_I32, RTLIB::__aeabi_d2iz, CallingConv::ARM_AAPCS },
636-
{ RTLIB::FPTOUINT_F64_I32, RTLIB::__aeabi_d2uiz, CallingConv::ARM_AAPCS },
637-
{ RTLIB::FPTOSINT_F64_I64, RTLIB::__aeabi_d2lz, CallingConv::ARM_AAPCS },
638-
{ RTLIB::FPTOUINT_F64_I64, RTLIB::__aeabi_d2ulz, CallingConv::ARM_AAPCS },
639-
{ RTLIB::FPTOSINT_F32_I32, RTLIB::__aeabi_f2iz, CallingConv::ARM_AAPCS },
640-
{ RTLIB::FPTOUINT_F32_I32, RTLIB::__aeabi_f2uiz, CallingConv::ARM_AAPCS },
641-
{ RTLIB::FPTOSINT_F32_I64, RTLIB::__aeabi_f2lz, CallingConv::ARM_AAPCS },
642-
{ RTLIB::FPTOUINT_F32_I64, RTLIB::__aeabi_f2ulz, CallingConv::ARM_AAPCS },
633+
{ RTLIB::FPTOSINT_F64_I32, RTLIB::__aeabi_d2iz },
634+
{ RTLIB::FPTOUINT_F64_I32, RTLIB::__aeabi_d2uiz },
635+
{ RTLIB::FPTOSINT_F64_I64, RTLIB::__aeabi_d2lz },
636+
{ RTLIB::FPTOUINT_F64_I64, RTLIB::__aeabi_d2ulz },
637+
{ RTLIB::FPTOSINT_F32_I32, RTLIB::__aeabi_f2iz },
638+
{ RTLIB::FPTOUINT_F32_I32, RTLIB::__aeabi_f2uiz },
639+
{ RTLIB::FPTOSINT_F32_I64, RTLIB::__aeabi_f2lz },
640+
{ RTLIB::FPTOUINT_F32_I64, RTLIB::__aeabi_f2ulz },
643641

644642
// Conversions between floating types.
645643
// RTABI chapter 4.1.2, Table 7
646-
{ RTLIB::FPROUND_F64_F32, RTLIB::__aeabi_d2f, CallingConv::ARM_AAPCS },
647-
{ RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h, CallingConv::ARM_AAPCS },
648-
{ RTLIB::FPEXT_F32_F64, RTLIB::__aeabi_f2d, CallingConv::ARM_AAPCS },
644+
{ RTLIB::FPROUND_F64_F32, RTLIB::__aeabi_d2f },
645+
{ RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h },
646+
{ RTLIB::FPEXT_F32_F64, RTLIB::__aeabi_f2d },
649647

650648
// Integer to floating-point conversions.
651649
// RTABI chapter 4.1.2, Table 8
652-
{ RTLIB::SINTTOFP_I32_F64, RTLIB::__aeabi_i2d, CallingConv::ARM_AAPCS },
653-
{ RTLIB::UINTTOFP_I32_F64, RTLIB::__aeabi_ui2d, CallingConv::ARM_AAPCS },
654-
{ RTLIB::SINTTOFP_I64_F64, RTLIB::__aeabi_l2d, CallingConv::ARM_AAPCS },
655-
{ RTLIB::UINTTOFP_I64_F64, RTLIB::__aeabi_ul2d, CallingConv::ARM_AAPCS },
656-
{ RTLIB::SINTTOFP_I32_F32, RTLIB::__aeabi_i2f, CallingConv::ARM_AAPCS },
657-
{ RTLIB::UINTTOFP_I32_F32, RTLIB::__aeabi_ui2f, CallingConv::ARM_AAPCS },
658-
{ RTLIB::SINTTOFP_I64_F32, RTLIB::__aeabi_l2f, CallingConv::ARM_AAPCS },
659-
{ RTLIB::UINTTOFP_I64_F32, RTLIB::__aeabi_ul2f, CallingConv::ARM_AAPCS },
650+
{ RTLIB::SINTTOFP_I32_F64, RTLIB::__aeabi_i2d },
651+
{ RTLIB::UINTTOFP_I32_F64, RTLIB::__aeabi_ui2d },
652+
{ RTLIB::SINTTOFP_I64_F64, RTLIB::__aeabi_l2d },
653+
{ RTLIB::UINTTOFP_I64_F64, RTLIB::__aeabi_ul2d },
654+
{ RTLIB::SINTTOFP_I32_F32, RTLIB::__aeabi_i2f },
655+
{ RTLIB::UINTTOFP_I32_F32, RTLIB::__aeabi_ui2f },
656+
{ RTLIB::SINTTOFP_I64_F32, RTLIB::__aeabi_l2f },
657+
{ RTLIB::UINTTOFP_I64_F32, RTLIB::__aeabi_ul2f },
660658

661659
// Long long helper functions
662660
// RTABI chapter 4.2, Table 9
663-
{ RTLIB::MUL_I64, RTLIB::__aeabi_lmul, CallingConv::ARM_AAPCS },
664-
{ RTLIB::SHL_I64, RTLIB::__aeabi_llsl, CallingConv::ARM_AAPCS },
665-
{ RTLIB::SRL_I64, RTLIB::__aeabi_llsr, CallingConv::ARM_AAPCS },
666-
{ RTLIB::SRA_I64, RTLIB::__aeabi_lasr, CallingConv::ARM_AAPCS },
661+
{ RTLIB::MUL_I64, RTLIB::__aeabi_lmul },
662+
{ RTLIB::SHL_I64, RTLIB::__aeabi_llsl },
663+
{ RTLIB::SRL_I64, RTLIB::__aeabi_llsr },
664+
{ RTLIB::SRA_I64, RTLIB::__aeabi_lasr },
667665

668666
// Integer division functions
669667
// RTABI chapter 4.3.1
670-
{ RTLIB::SDIV_I8, RTLIB::__aeabi_idiv__i8, CallingConv::ARM_AAPCS },
671-
{ RTLIB::SDIV_I16, RTLIB::__aeabi_idiv__i16, CallingConv::ARM_AAPCS },
672-
{ RTLIB::SDIV_I32, RTLIB::__aeabi_idiv__i32, CallingConv::ARM_AAPCS },
673-
{ RTLIB::SDIV_I64, RTLIB::__aeabi_ldivmod, CallingConv::ARM_AAPCS },
674-
{ RTLIB::UDIV_I8, RTLIB::__aeabi_uidiv__i8, CallingConv::ARM_AAPCS },
675-
{ RTLIB::UDIV_I16, RTLIB::__aeabi_uidiv__i16, CallingConv::ARM_AAPCS },
676-
{ RTLIB::UDIV_I32, RTLIB::__aeabi_uidiv__i32, CallingConv::ARM_AAPCS },
677-
{ RTLIB::UDIV_I64, RTLIB::__aeabi_uldivmod, CallingConv::ARM_AAPCS },
668+
{ RTLIB::SDIV_I8, RTLIB::__aeabi_idiv__i8 },
669+
{ RTLIB::SDIV_I16, RTLIB::__aeabi_idiv__i16 },
670+
{ RTLIB::SDIV_I32, RTLIB::__aeabi_idiv__i32},
671+
{ RTLIB::SDIV_I64, RTLIB::__aeabi_ldivmod },
672+
{ RTLIB::UDIV_I8, RTLIB::__aeabi_uidiv__i8 },
673+
{ RTLIB::UDIV_I16, RTLIB::__aeabi_uidiv__i16 },
674+
{ RTLIB::UDIV_I32, RTLIB::__aeabi_uidiv__i32 },
675+
{ RTLIB::UDIV_I64, RTLIB::__aeabi_uldivmod },
678676
};
679677
// clang-format on
680678

681-
for (const auto &LC : LibraryCalls) {
679+
for (const auto &LC : LibraryCalls)
682680
setLibcallImpl(LC.Op, LC.Impl);
683-
setLibcallImplCallingConv(LC.Impl, LC.CC);
684-
}
685681

686682
// EABI dependent RTLIB
687683
if (TM.Options.EABIVersion == EABI::EABI4 ||
688684
TM.Options.EABIVersion == EABI::EABI5) {
689685
static const struct {
690686
const RTLIB::Libcall Op;
691687
const RTLIB::LibcallImpl Impl;
692-
const CallingConv::ID CC;
693688
} MemOpsLibraryCalls[] = {
694689
// Memory operations
695690
// RTABI chapter 4.3.4
696-
{RTLIB::MEMCPY, RTLIB::__aeabi_memcpy, CallingConv::ARM_AAPCS},
697-
{RTLIB::MEMMOVE, RTLIB::__aeabi_memmove, CallingConv::ARM_AAPCS},
698-
{RTLIB::MEMSET, RTLIB::__aeabi_memset, CallingConv::ARM_AAPCS},
699-
{RTLIB::AEABI_MEMCPY4, RTLIB::__aeabi_memcpy4,
700-
CallingConv::ARM_AAPCS},
701-
{RTLIB::AEABI_MEMCPY8, RTLIB::__aeabi_memcpy8,
702-
CallingConv::ARM_AAPCS},
703-
{RTLIB::AEABI_MEMMOVE4, RTLIB::__aeabi_memmove4,
704-
CallingConv::ARM_AAPCS},
705-
{RTLIB::AEABI_MEMMOVE8, RTLIB::__aeabi_memmove8,
706-
CallingConv::ARM_AAPCS},
707-
{RTLIB::AEABI_MEMSET4, RTLIB::__aeabi_memset4,
708-
CallingConv::ARM_AAPCS},
709-
{RTLIB::AEABI_MEMSET8, RTLIB::__aeabi_memset8,
710-
CallingConv::ARM_AAPCS},
711-
{RTLIB::AEABI_MEMCLR, RTLIB::__aeabi_memclr, CallingConv::ARM_AAPCS},
712-
{RTLIB::AEABI_MEMCLR4, RTLIB::__aeabi_memclr4,
713-
CallingConv::ARM_AAPCS},
714-
{RTLIB::AEABI_MEMCLR8, RTLIB::__aeabi_memclr8,
715-
CallingConv::ARM_AAPCS},
691+
{RTLIB::MEMCPY, RTLIB::__aeabi_memcpy},
692+
{RTLIB::MEMMOVE, RTLIB::__aeabi_memmove},
693+
{RTLIB::MEMSET, RTLIB::__aeabi_memset},
694+
{RTLIB::AEABI_MEMCPY4, RTLIB::__aeabi_memcpy4},
695+
{RTLIB::AEABI_MEMCPY8, RTLIB::__aeabi_memcpy8},
696+
{RTLIB::AEABI_MEMMOVE4, RTLIB::__aeabi_memmove4},
697+
{RTLIB::AEABI_MEMMOVE8, RTLIB::__aeabi_memmove8},
698+
{RTLIB::AEABI_MEMSET4, RTLIB::__aeabi_memset4},
699+
{RTLIB::AEABI_MEMSET8, RTLIB::__aeabi_memset8},
700+
{RTLIB::AEABI_MEMCLR, RTLIB::__aeabi_memclr},
701+
{RTLIB::AEABI_MEMCLR4, RTLIB::__aeabi_memclr4},
702+
{RTLIB::AEABI_MEMCLR8, RTLIB::__aeabi_memclr8},
716703
};
717704

718-
for (const auto &LC : MemOpsLibraryCalls) {
705+
for (const auto &LC : MemOpsLibraryCalls)
719706
setLibcallImpl(LC.Op, LC.Impl);
720-
setLibcallImplCallingConv(LC.Impl, LC.CC);
721-
}
722707
}
723708
}
724709

@@ -746,16 +731,14 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
746731
static const struct {
747732
const RTLIB::Libcall Op;
748733
const RTLIB::LibcallImpl Impl;
749-
const CallingConv::ID CC;
750734
} LibraryCalls[] = {
751-
{RTLIB::FPROUND_F32_F16, RTLIB::__aeabi_f2h, CallingConv::ARM_AAPCS},
752-
{RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h, CallingConv::ARM_AAPCS},
753-
{RTLIB::FPEXT_F16_F32, RTLIB::__aeabi_h2f, CallingConv::ARM_AAPCS},
735+
{RTLIB::FPROUND_F32_F16, RTLIB::__aeabi_f2h},
736+
{RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h},
737+
{RTLIB::FPEXT_F16_F32, RTLIB::__aeabi_h2f},
754738
};
755739

756740
for (const auto &LC : LibraryCalls) {
757741
setLibcallImpl(LC.Op, LC.Impl);
758-
setLibcallImplCallingConv(LC.Impl, LC.CC);
759742
}
760743
} else if (!TT.isOSBinFormatMachO()) {
761744
setLibcallImpl(RTLIB::FPROUND_F32_F16, RTLIB::__gnu_f2h_ieee);

0 commit comments

Comments
 (0)