Skip to content

Commit bdbc320

Browse files
committed
ARM: Add runtime libcall definitions for eabi memory functions
Fix bypassing ordinary RuntimeLibcalls APIs for cases handled in ARMSelectionDAGInfo
1 parent ecc24ea commit bdbc320

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.td

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,17 @@ multiclass LibmLongDoubleLibCall<string libcall_basename = !toupper(NAME),
357357
!strconcat(rtbasename, "l")>;
358358
}
359359

360+
// ARM EABI calls
361+
def AEABI_MEMCPY4 : RuntimeLibcall; // Align 4
362+
def AEABI_MEMCPY8 : RuntimeLibcall; // Align 8
363+
def AEABI_MEMMOVE4 : RuntimeLibcall;
364+
def AEABI_MEMMOVE8 : RuntimeLibcall;
365+
def AEABI_MEMSET4 : RuntimeLibcall;
366+
def AEABI_MEMSET8 : RuntimeLibcall;
367+
def AEABI_MEMCLR : RuntimeLibcall;
368+
def AEABI_MEMCLR4 : RuntimeLibcall;
369+
def AEABI_MEMCLR8 : RuntimeLibcall;
370+
360371
//--------------------------------------------------------------------
361372
// Define implementation default libcalls
362373
//--------------------------------------------------------------------
@@ -1134,8 +1145,20 @@ def __aeabi_uidivmod : RuntimeLibcallImpl<UDIVREM_I32>; // CallingConv::ARM_AAP
11341145
// Memory operations
11351146
// RTABI chapter 4.3.4
11361147
def __aeabi_memcpy : RuntimeLibcallImpl<MEMCPY>; // CallingConv::ARM_AAPCS
1148+
def __aeabi_memcpy4 : RuntimeLibcallImpl<AEABI_MEMCPY4>;
1149+
def __aeabi_memcpy8 : RuntimeLibcallImpl<AEABI_MEMCPY8>;
1150+
11371151
def __aeabi_memmove : RuntimeLibcallImpl<MEMMOVE>; // CallingConv::ARM_AAPCS
1152+
def __aeabi_memmove4 : RuntimeLibcallImpl<AEABI_MEMMOVE4>;
1153+
def __aeabi_memmove8 : RuntimeLibcallImpl<AEABI_MEMMOVE8>;
1154+
11381155
def __aeabi_memset : RuntimeLibcallImpl<MEMSET>; // CallingConv::ARM_AAPCS
1156+
def __aeabi_memset4 : RuntimeLibcallImpl<AEABI_MEMSET4>;
1157+
def __aeabi_memset8 : RuntimeLibcallImpl<AEABI_MEMSET8>;
1158+
1159+
def __aeabi_memclr : RuntimeLibcallImpl<AEABI_MEMCLR>;
1160+
def __aeabi_memclr4 : RuntimeLibcallImpl<AEABI_MEMCLR4>;
1161+
def __aeabi_memclr8 : RuntimeLibcallImpl<AEABI_MEMCLR8>;
11391162

11401163
// isTargetWindows()
11411164
def __stoi64 : RuntimeLibcallImpl<FPTOSINT_F32_I64>; // CallingConv::ARM_AAPCS_VFP

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,23 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
704704
{RTLIB::MEMCPY, RTLIB::__aeabi_memcpy, CallingConv::ARM_AAPCS},
705705
{RTLIB::MEMMOVE, RTLIB::__aeabi_memmove, CallingConv::ARM_AAPCS},
706706
{RTLIB::MEMSET, RTLIB::__aeabi_memset, CallingConv::ARM_AAPCS},
707+
{RTLIB::AEABI_MEMCPY4, RTLIB::__aeabi_memcpy4,
708+
CallingConv::ARM_AAPCS},
709+
{RTLIB::AEABI_MEMCPY8, RTLIB::__aeabi_memcpy8,
710+
CallingConv::ARM_AAPCS},
711+
{RTLIB::AEABI_MEMMOVE4, RTLIB::__aeabi_memmove4,
712+
CallingConv::ARM_AAPCS},
713+
{RTLIB::AEABI_MEMMOVE8, RTLIB::__aeabi_memmove8,
714+
CallingConv::ARM_AAPCS},
715+
{RTLIB::AEABI_MEMSET4, RTLIB::__aeabi_memset4,
716+
CallingConv::ARM_AAPCS},
717+
{RTLIB::AEABI_MEMSET8, RTLIB::__aeabi_memset8,
718+
CallingConv::ARM_AAPCS},
719+
{RTLIB::AEABI_MEMCLR, RTLIB::__aeabi_memclr, CallingConv::ARM_AAPCS},
720+
{RTLIB::AEABI_MEMCLR4, RTLIB::__aeabi_memclr4,
721+
CallingConv::ARM_AAPCS},
722+
{RTLIB::AEABI_MEMCLR8, RTLIB::__aeabi_memclr8,
723+
CallingConv::ARM_AAPCS},
707724
};
708725

709726
for (const auto &LC : MemOpsLibraryCalls) {

llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,20 @@ SDValue ARMSelectionDAGInfo::EmitSpecializedLibcall(
121121
Args.push_back(Entry);
122122
}
123123

124-
char const *FunctionNames[4][3] = {
125-
{ "__aeabi_memcpy", "__aeabi_memcpy4", "__aeabi_memcpy8" },
126-
{ "__aeabi_memmove", "__aeabi_memmove4", "__aeabi_memmove8" },
127-
{ "__aeabi_memset", "__aeabi_memset4", "__aeabi_memset8" },
128-
{ "__aeabi_memclr", "__aeabi_memclr4", "__aeabi_memclr8" }
129-
};
124+
static const RTLIB::Libcall FunctionImpls[4][3] = {
125+
{RTLIB::MEMCPY, RTLIB::AEABI_MEMCPY4, RTLIB::AEABI_MEMCPY8},
126+
{RTLIB::MEMMOVE, RTLIB::AEABI_MEMMOVE4, RTLIB::AEABI_MEMMOVE8},
127+
{RTLIB::MEMSET, RTLIB::AEABI_MEMSET4, RTLIB::AEABI_MEMSET8},
128+
{RTLIB::AEABI_MEMCLR, RTLIB::AEABI_MEMCLR4, RTLIB::AEABI_MEMCLR8}};
129+
130+
RTLIB::Libcall NewLC = FunctionImpls[AEABILibcall][AlignVariant];
131+
130132
TargetLowering::CallLoweringInfo CLI(DAG);
131133
CLI.setDebugLoc(dl)
132134
.setChain(Chain)
133135
.setLibCallee(
134-
TLI->getLibcallCallingConv(LC), Type::getVoidTy(*DAG.getContext()),
135-
DAG.getExternalSymbol(FunctionNames[AEABILibcall][AlignVariant],
136+
TLI->getLibcallCallingConv(NewLC), Type::getVoidTy(*DAG.getContext()),
137+
DAG.getExternalSymbol(TLI->getLibcallName(NewLC),
136138
TLI->getPointerTy(DAG.getDataLayout())),
137139
std::move(Args))
138140
.setDiscardResult();

0 commit comments

Comments
 (0)