-
Notifications
You must be signed in to change notification settings - Fork 14.4k
ARM: Unconditionally set eabi libcall calling convs in RuntimeLibcalls #146083
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ARM: Unconditionally set eabi libcall calling convs in RuntimeLibcalls #146083
Conversation
@llvm/pr-subscribers-backend-arm @llvm/pr-subscribers-llvm-ir Author: Matt Arsenault (arsenm) ChangesThis fully consolidates all the calling convention configuration into Full diff: https://github.com/llvm/llvm-project/pull/146083.diff 2 Files Affected:
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index b08ee16791dfd..9f24e9d1fc4b1 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -98,6 +98,45 @@ static void setARMLibcallNames(RuntimeLibcallsInfo &Info, const Triple &TT,
Info.setLibcallImpl(RTLIB::SDIVREM_I32, RTLIB::__divmodsi4);
Info.setLibcallImpl(RTLIB::UDIVREM_I32, RTLIB::__udivmodsi4);
}
+
+ static const RTLIB::LibcallImpl AAPCS_Libcalls[] = {
+ RTLIB::__aeabi_dadd, RTLIB::__aeabi_ddiv,
+ RTLIB::__aeabi_dmul, RTLIB::__aeabi_dsub,
+ RTLIB::__aeabi_dcmpeq__ne, RTLIB::__aeabi_dcmpeq__eq,
+ RTLIB::__aeabi_dcmplt, RTLIB::__aeabi_dcmple,
+ RTLIB::__aeabi_dcmpge, RTLIB::__aeabi_dcmpgt,
+ RTLIB::__aeabi_dcmpun, RTLIB::__aeabi_fadd,
+ RTLIB::__aeabi_fdiv, RTLIB::__aeabi_fmul,
+ RTLIB::__aeabi_fsub, RTLIB::__aeabi_fcmpeq__ne,
+ RTLIB::__aeabi_fcmpeq__eq, RTLIB::__aeabi_fcmplt,
+ RTLIB::__aeabi_fcmple, RTLIB::__aeabi_fcmpge,
+ RTLIB::__aeabi_fcmpgt, RTLIB::__aeabi_fcmpun,
+ RTLIB::__aeabi_d2iz, RTLIB::__aeabi_d2uiz,
+ RTLIB::__aeabi_d2lz, RTLIB::__aeabi_d2ulz,
+ RTLIB::__aeabi_f2iz, RTLIB::__aeabi_f2uiz,
+ RTLIB::__aeabi_f2lz, RTLIB::__aeabi_f2ulz,
+ RTLIB::__aeabi_d2f, RTLIB::__aeabi_d2h,
+ RTLIB::__aeabi_f2d, RTLIB::__aeabi_i2d,
+ RTLIB::__aeabi_ui2d, RTLIB::__aeabi_l2d,
+ RTLIB::__aeabi_ul2d, RTLIB::__aeabi_i2f,
+ RTLIB::__aeabi_ui2f, RTLIB::__aeabi_l2f,
+ RTLIB::__aeabi_ul2f, RTLIB::__aeabi_lmul,
+ RTLIB::__aeabi_llsl, RTLIB::__aeabi_llsr,
+ RTLIB::__aeabi_lasr, RTLIB::__aeabi_idiv__i8,
+ RTLIB::__aeabi_idiv__i16, RTLIB::__aeabi_idiv__i32,
+ RTLIB::__aeabi_ldivmod, RTLIB::__aeabi_uidiv__i8,
+ RTLIB::__aeabi_uidiv__i16, RTLIB::__aeabi_uidiv__i32,
+ RTLIB::__aeabi_uldivmod, RTLIB::__aeabi_f2h,
+ RTLIB::__aeabi_d2h, RTLIB::__aeabi_h2f,
+ RTLIB::__aeabi_memcpy, RTLIB::__aeabi_memmove,
+ RTLIB::__aeabi_memset, RTLIB::__aeabi_memcpy4,
+ RTLIB::__aeabi_memcpy8, RTLIB::__aeabi_memmove4,
+ RTLIB::__aeabi_memmove8, RTLIB::__aeabi_memset4,
+ RTLIB::__aeabi_memset8, RTLIB::__aeabi_memclr,
+ RTLIB::__aeabi_memclr4, RTLIB::__aeabi_memclr8};
+
+ for (RTLIB::LibcallImpl Impl : AAPCS_Libcalls)
+ Info.setLibcallImplCallingConv(Impl, CallingConv::ARM_AAPCS);
}
static void setLongDoubleIsF128Libm(RuntimeLibcallsInfo &Info,
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 78ef3c23e8423..2ece698df264b 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -578,9 +578,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
};
// clang-format on
- for (const auto &LC : LibraryCalls) {
+ for (const auto &LC : LibraryCalls)
setLibcallImpl(LC.Op, LC.Impl);
- }
}
}
@@ -594,94 +593,91 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
static const struct {
const RTLIB::Libcall Op;
const RTLIB::LibcallImpl Impl;
- const CallingConv::ID CC;
} LibraryCalls[] = {
// Double-precision floating-point arithmetic helper functions
// RTABI chapter 4.1.2, Table 2
- { RTLIB::ADD_F64, RTLIB::__aeabi_dadd, CallingConv::ARM_AAPCS },
- { RTLIB::DIV_F64, RTLIB::__aeabi_ddiv, CallingConv::ARM_AAPCS },
- { RTLIB::MUL_F64, RTLIB::__aeabi_dmul, CallingConv::ARM_AAPCS },
- { RTLIB::SUB_F64, RTLIB::__aeabi_dsub, CallingConv::ARM_AAPCS },
+ { RTLIB::ADD_F64, RTLIB::__aeabi_dadd },
+ { RTLIB::DIV_F64, RTLIB::__aeabi_ddiv },
+ { RTLIB::MUL_F64, RTLIB::__aeabi_dmul },
+ { RTLIB::SUB_F64, RTLIB::__aeabi_dsub },
// Double-precision floating-point comparison helper functions
// RTABI chapter 4.1.2, Table 3
- { RTLIB::OEQ_F64, RTLIB::__aeabi_dcmpeq__ne, CallingConv::ARM_AAPCS },
- { RTLIB::UNE_F64, RTLIB::__aeabi_dcmpeq__eq, CallingConv::ARM_AAPCS },
- { RTLIB::OLT_F64, RTLIB::__aeabi_dcmplt, CallingConv::ARM_AAPCS },
- { RTLIB::OLE_F64, RTLIB::__aeabi_dcmple, CallingConv::ARM_AAPCS },
- { RTLIB::OGE_F64, RTLIB::__aeabi_dcmpge, CallingConv::ARM_AAPCS },
- { RTLIB::OGT_F64, RTLIB::__aeabi_dcmpgt, CallingConv::ARM_AAPCS },
- { RTLIB::UO_F64, RTLIB::__aeabi_dcmpun, CallingConv::ARM_AAPCS },
+ { RTLIB::OEQ_F64, RTLIB::__aeabi_dcmpeq__ne },
+ { RTLIB::UNE_F64, RTLIB::__aeabi_dcmpeq__eq },
+ { RTLIB::OLT_F64, RTLIB::__aeabi_dcmplt },
+ { RTLIB::OLE_F64, RTLIB::__aeabi_dcmple },
+ { RTLIB::OGE_F64, RTLIB::__aeabi_dcmpge },
+ { RTLIB::OGT_F64, RTLIB::__aeabi_dcmpgt },
+ { RTLIB::UO_F64, RTLIB::__aeabi_dcmpun },
// Single-precision floating-point arithmetic helper functions
// RTABI chapter 4.1.2, Table 4
- { RTLIB::ADD_F32, RTLIB::__aeabi_fadd, CallingConv::ARM_AAPCS },
- { RTLIB::DIV_F32, RTLIB::__aeabi_fdiv, CallingConv::ARM_AAPCS },
- { RTLIB::MUL_F32, RTLIB::__aeabi_fmul, CallingConv::ARM_AAPCS },
- { RTLIB::SUB_F32, RTLIB::__aeabi_fsub, CallingConv::ARM_AAPCS },
+ { RTLIB::ADD_F32, RTLIB::__aeabi_fadd },
+ { RTLIB::DIV_F32, RTLIB::__aeabi_fdiv },
+ { RTLIB::MUL_F32, RTLIB::__aeabi_fmul },
+ { RTLIB::SUB_F32, RTLIB::__aeabi_fsub },
// Single-precision floating-point comparison helper functions
// RTABI chapter 4.1.2, Table 5
- { RTLIB::OEQ_F32, RTLIB::__aeabi_fcmpeq__ne, CallingConv::ARM_AAPCS },
- { RTLIB::UNE_F32, RTLIB::__aeabi_fcmpeq__eq, CallingConv::ARM_AAPCS },
- { RTLIB::OLT_F32, RTLIB::__aeabi_fcmplt, CallingConv::ARM_AAPCS},
- { RTLIB::OLE_F32, RTLIB::__aeabi_fcmple, CallingConv::ARM_AAPCS },
- { RTLIB::OGE_F32, RTLIB::__aeabi_fcmpge, CallingConv::ARM_AAPCS },
- { RTLIB::OGT_F32, RTLIB::__aeabi_fcmpgt, CallingConv::ARM_AAPCS },
- { RTLIB::UO_F32, RTLIB::__aeabi_fcmpun, CallingConv::ARM_AAPCS },
+ { RTLIB::OEQ_F32, RTLIB::__aeabi_fcmpeq__ne },
+ { RTLIB::UNE_F32, RTLIB::__aeabi_fcmpeq__eq },
+ { RTLIB::OLT_F32, RTLIB::__aeabi_fcmplt},
+ { RTLIB::OLE_F32, RTLIB::__aeabi_fcmple },
+ { RTLIB::OGE_F32, RTLIB::__aeabi_fcmpge },
+ { RTLIB::OGT_F32, RTLIB::__aeabi_fcmpgt },
+ { RTLIB::UO_F32, RTLIB::__aeabi_fcmpun },
// Floating-point to integer conversions.
// RTABI chapter 4.1.2, Table 6
- { RTLIB::FPTOSINT_F64_I32, RTLIB::__aeabi_d2iz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOUINT_F64_I32, RTLIB::__aeabi_d2uiz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOSINT_F64_I64, RTLIB::__aeabi_d2lz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOUINT_F64_I64, RTLIB::__aeabi_d2ulz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOSINT_F32_I32, RTLIB::__aeabi_f2iz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOUINT_F32_I32, RTLIB::__aeabi_f2uiz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOSINT_F32_I64, RTLIB::__aeabi_f2lz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOUINT_F32_I64, RTLIB::__aeabi_f2ulz, CallingConv::ARM_AAPCS },
+ { RTLIB::FPTOSINT_F64_I32, RTLIB::__aeabi_d2iz },
+ { RTLIB::FPTOUINT_F64_I32, RTLIB::__aeabi_d2uiz },
+ { RTLIB::FPTOSINT_F64_I64, RTLIB::__aeabi_d2lz },
+ { RTLIB::FPTOUINT_F64_I64, RTLIB::__aeabi_d2ulz },
+ { RTLIB::FPTOSINT_F32_I32, RTLIB::__aeabi_f2iz },
+ { RTLIB::FPTOUINT_F32_I32, RTLIB::__aeabi_f2uiz },
+ { RTLIB::FPTOSINT_F32_I64, RTLIB::__aeabi_f2lz },
+ { RTLIB::FPTOUINT_F32_I64, RTLIB::__aeabi_f2ulz },
// Conversions between floating types.
// RTABI chapter 4.1.2, Table 7
- { RTLIB::FPROUND_F64_F32, RTLIB::__aeabi_d2f, CallingConv::ARM_AAPCS },
- { RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h, CallingConv::ARM_AAPCS },
- { RTLIB::FPEXT_F32_F64, RTLIB::__aeabi_f2d, CallingConv::ARM_AAPCS },
+ { RTLIB::FPROUND_F64_F32, RTLIB::__aeabi_d2f },
+ { RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h },
+ { RTLIB::FPEXT_F32_F64, RTLIB::__aeabi_f2d },
// Integer to floating-point conversions.
// RTABI chapter 4.1.2, Table 8
- { RTLIB::SINTTOFP_I32_F64, RTLIB::__aeabi_i2d, CallingConv::ARM_AAPCS },
- { RTLIB::UINTTOFP_I32_F64, RTLIB::__aeabi_ui2d, CallingConv::ARM_AAPCS },
- { RTLIB::SINTTOFP_I64_F64, RTLIB::__aeabi_l2d, CallingConv::ARM_AAPCS },
- { RTLIB::UINTTOFP_I64_F64, RTLIB::__aeabi_ul2d, CallingConv::ARM_AAPCS },
- { RTLIB::SINTTOFP_I32_F32, RTLIB::__aeabi_i2f, CallingConv::ARM_AAPCS },
- { RTLIB::UINTTOFP_I32_F32, RTLIB::__aeabi_ui2f, CallingConv::ARM_AAPCS },
- { RTLIB::SINTTOFP_I64_F32, RTLIB::__aeabi_l2f, CallingConv::ARM_AAPCS },
- { RTLIB::UINTTOFP_I64_F32, RTLIB::__aeabi_ul2f, CallingConv::ARM_AAPCS },
+ { RTLIB::SINTTOFP_I32_F64, RTLIB::__aeabi_i2d },
+ { RTLIB::UINTTOFP_I32_F64, RTLIB::__aeabi_ui2d },
+ { RTLIB::SINTTOFP_I64_F64, RTLIB::__aeabi_l2d },
+ { RTLIB::UINTTOFP_I64_F64, RTLIB::__aeabi_ul2d },
+ { RTLIB::SINTTOFP_I32_F32, RTLIB::__aeabi_i2f },
+ { RTLIB::UINTTOFP_I32_F32, RTLIB::__aeabi_ui2f },
+ { RTLIB::SINTTOFP_I64_F32, RTLIB::__aeabi_l2f },
+ { RTLIB::UINTTOFP_I64_F32, RTLIB::__aeabi_ul2f },
// Long long helper functions
// RTABI chapter 4.2, Table 9
- { RTLIB::MUL_I64, RTLIB::__aeabi_lmul, CallingConv::ARM_AAPCS },
- { RTLIB::SHL_I64, RTLIB::__aeabi_llsl, CallingConv::ARM_AAPCS },
- { RTLIB::SRL_I64, RTLIB::__aeabi_llsr, CallingConv::ARM_AAPCS },
- { RTLIB::SRA_I64, RTLIB::__aeabi_lasr, CallingConv::ARM_AAPCS },
+ { RTLIB::MUL_I64, RTLIB::__aeabi_lmul },
+ { RTLIB::SHL_I64, RTLIB::__aeabi_llsl },
+ { RTLIB::SRL_I64, RTLIB::__aeabi_llsr },
+ { RTLIB::SRA_I64, RTLIB::__aeabi_lasr },
// Integer division functions
// RTABI chapter 4.3.1
- { RTLIB::SDIV_I8, RTLIB::__aeabi_idiv__i8, CallingConv::ARM_AAPCS },
- { RTLIB::SDIV_I16, RTLIB::__aeabi_idiv__i16, CallingConv::ARM_AAPCS },
- { RTLIB::SDIV_I32, RTLIB::__aeabi_idiv__i32, CallingConv::ARM_AAPCS },
- { RTLIB::SDIV_I64, RTLIB::__aeabi_ldivmod, CallingConv::ARM_AAPCS },
- { RTLIB::UDIV_I8, RTLIB::__aeabi_uidiv__i8, CallingConv::ARM_AAPCS },
- { RTLIB::UDIV_I16, RTLIB::__aeabi_uidiv__i16, CallingConv::ARM_AAPCS },
- { RTLIB::UDIV_I32, RTLIB::__aeabi_uidiv__i32, CallingConv::ARM_AAPCS },
- { RTLIB::UDIV_I64, RTLIB::__aeabi_uldivmod, CallingConv::ARM_AAPCS },
+ { RTLIB::SDIV_I8, RTLIB::__aeabi_idiv__i8 },
+ { RTLIB::SDIV_I16, RTLIB::__aeabi_idiv__i16 },
+ { RTLIB::SDIV_I32, RTLIB::__aeabi_idiv__i32},
+ { RTLIB::SDIV_I64, RTLIB::__aeabi_ldivmod },
+ { RTLIB::UDIV_I8, RTLIB::__aeabi_uidiv__i8 },
+ { RTLIB::UDIV_I16, RTLIB::__aeabi_uidiv__i16 },
+ { RTLIB::UDIV_I32, RTLIB::__aeabi_uidiv__i32 },
+ { RTLIB::UDIV_I64, RTLIB::__aeabi_uldivmod },
};
// clang-format on
- for (const auto &LC : LibraryCalls) {
+ for (const auto &LC : LibraryCalls)
setLibcallImpl(LC.Op, LC.Impl);
- setLibcallImplCallingConv(LC.Impl, LC.CC);
- }
// EABI dependent RTLIB
if (TM.Options.EABIVersion == EABI::EABI4 ||
@@ -689,36 +685,25 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
static const struct {
const RTLIB::Libcall Op;
const RTLIB::LibcallImpl Impl;
- const CallingConv::ID CC;
} MemOpsLibraryCalls[] = {
// Memory operations
// RTABI chapter 4.3.4
- {RTLIB::MEMCPY, RTLIB::__aeabi_memcpy, CallingConv::ARM_AAPCS},
- {RTLIB::MEMMOVE, RTLIB::__aeabi_memmove, CallingConv::ARM_AAPCS},
- {RTLIB::MEMSET, RTLIB::__aeabi_memset, CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCPY4, RTLIB::__aeabi_memcpy4,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCPY8, RTLIB::__aeabi_memcpy8,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMMOVE4, RTLIB::__aeabi_memmove4,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMMOVE8, RTLIB::__aeabi_memmove8,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMSET4, RTLIB::__aeabi_memset4,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMSET8, RTLIB::__aeabi_memset8,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCLR, RTLIB::__aeabi_memclr, CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCLR4, RTLIB::__aeabi_memclr4,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCLR8, RTLIB::__aeabi_memclr8,
- CallingConv::ARM_AAPCS},
+ {RTLIB::MEMCPY, RTLIB::__aeabi_memcpy},
+ {RTLIB::MEMMOVE, RTLIB::__aeabi_memmove},
+ {RTLIB::MEMSET, RTLIB::__aeabi_memset},
+ {RTLIB::AEABI_MEMCPY4, RTLIB::__aeabi_memcpy4},
+ {RTLIB::AEABI_MEMCPY8, RTLIB::__aeabi_memcpy8},
+ {RTLIB::AEABI_MEMMOVE4, RTLIB::__aeabi_memmove4},
+ {RTLIB::AEABI_MEMMOVE8, RTLIB::__aeabi_memmove8},
+ {RTLIB::AEABI_MEMSET4, RTLIB::__aeabi_memset4},
+ {RTLIB::AEABI_MEMSET8, RTLIB::__aeabi_memset8},
+ {RTLIB::AEABI_MEMCLR, RTLIB::__aeabi_memclr},
+ {RTLIB::AEABI_MEMCLR4, RTLIB::__aeabi_memclr4},
+ {RTLIB::AEABI_MEMCLR8, RTLIB::__aeabi_memclr8},
};
- for (const auto &LC : MemOpsLibraryCalls) {
+ for (const auto &LC : MemOpsLibraryCalls)
setLibcallImpl(LC.Op, LC.Impl);
- setLibcallImplCallingConv(LC.Impl, LC.CC);
- }
}
}
@@ -746,16 +731,14 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
static const struct {
const RTLIB::Libcall Op;
const RTLIB::LibcallImpl Impl;
- const CallingConv::ID CC;
} LibraryCalls[] = {
- {RTLIB::FPROUND_F32_F16, RTLIB::__aeabi_f2h, CallingConv::ARM_AAPCS},
- {RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h, CallingConv::ARM_AAPCS},
- {RTLIB::FPEXT_F16_F32, RTLIB::__aeabi_h2f, CallingConv::ARM_AAPCS},
+ {RTLIB::FPROUND_F32_F16, RTLIB::__aeabi_f2h},
+ {RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h},
+ {RTLIB::FPEXT_F16_F32, RTLIB::__aeabi_h2f},
};
for (const auto &LC : LibraryCalls) {
setLibcallImpl(LC.Op, LC.Impl);
- setLibcallImplCallingConv(LC.Impl, LC.CC);
}
} else if (!TT.isOSBinFormatMachO()) {
setLibcallImpl(RTLIB::FPROUND_F32_F16, RTLIB::__gnu_f2h_ieee);
|
4e8ecb3
to
effe1ad
Compare
7663236
to
b49694f
Compare
effe1ad
to
1070967
Compare
f5915e2
to
b90e7ff
Compare
48fcd78
to
0daf2fa
Compare
57f1f29
to
ce9644f
Compare
0daf2fa
to
66fa070
Compare
66fa070
to
f06a7b1
Compare
30bc9f8
to
fe15c75
Compare
f06a7b1
to
e31b61b
Compare
e31b61b
to
1391620
Compare
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.
fe15c75
to
3e51d0b
Compare
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.