diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2025-06-27 17:53:03 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-27 17:53:03 +0900 |
| commit | b4d3283ab79ceedc8819b36d8ce2f30dafb7c38e (patch) | |
| tree | 555858d4a5c2cf040a1e3e00312bf01d5b207741 /llvm/lib | |
| parent | 779f7243c8bb70ae0f63ea402bdc92a0cbf9b618 (diff) | |
AArch64: Add libcall impl declarations for __arm_sc* memory functions (#144977)
These were bypassing the ordinary libcall emission mechanism. Make sure
we have entries in RuntimeLibcalls, which should include all possible
calls the compiler could emit.
Fixes not emitting the # prefix in the arm64ec case.
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/IR/RuntimeLibcalls.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp | 15 |
2 files changed, 17 insertions, 9 deletions
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp index 79a49159efc7..712f1a48d0b7 100644 --- a/llvm/lib/IR/RuntimeLibcalls.cpp +++ b/llvm/lib/IR/RuntimeLibcalls.cpp @@ -489,8 +489,17 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT, } if (TT.isAArch64()) { - if (TT.isWindowsArm64EC()) + if (TT.isWindowsArm64EC()) { setWindowsArm64LibCallNameOverrides(); + setLibcallImpl(RTLIB::SC_MEMCPY, RTLIB::arm64ec___arm_sc_memcpy); + setLibcallImpl(RTLIB::SC_MEMMOVE, RTLIB::arm64ec___arm_sc_memmove); + setLibcallImpl(RTLIB::SC_MEMSET, RTLIB::arm64ec___arm_sc_memset); + } else { + setLibcallImpl(RTLIB::SC_MEMCPY, RTLIB::__arm_sc_memcpy); + setLibcallImpl(RTLIB::SC_MEMMOVE, RTLIB::__arm_sc_memmove); + setLibcallImpl(RTLIB::SC_MEMSET, RTLIB::__arm_sc_memset); + } + setAArch64LibcallNames(*this, TT); } else if (TT.isARM() || TT.isThumb()) { setARMLibcallNames(*this, TT, FloatABI, EABIVersion); diff --git a/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp b/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp index 90f6fc2ea664..d719f234b27f 100644 --- a/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp @@ -164,35 +164,34 @@ SDValue AArch64SelectionDAGInfo::EmitStreamingCompatibleMemLibCall( const AArch64Subtarget &STI = DAG.getMachineFunction().getSubtarget<AArch64Subtarget>(); const AArch64TargetLowering *TLI = STI.getTargetLowering(); - SDValue Symbol; TargetLowering::ArgListEntry DstEntry; DstEntry.Ty = PointerType::getUnqual(*DAG.getContext()); DstEntry.Node = Dst; TargetLowering::ArgListTy Args; Args.push_back(DstEntry); - EVT PointerVT = TLI->getPointerTy(DAG.getDataLayout()); + RTLIB::Libcall NewLC; switch (LC) { case RTLIB::MEMCPY: { + NewLC = RTLIB::SC_MEMCPY; TargetLowering::ArgListEntry Entry; Entry.Ty = PointerType::getUnqual(*DAG.getContext()); - Symbol = DAG.getExternalSymbol("__arm_sc_memcpy", PointerVT); Entry.Node = Src; Args.push_back(Entry); break; } case RTLIB::MEMMOVE: { + NewLC = RTLIB::SC_MEMMOVE; TargetLowering::ArgListEntry Entry; Entry.Ty = PointerType::getUnqual(*DAG.getContext()); - Symbol = DAG.getExternalSymbol("__arm_sc_memmove", PointerVT); Entry.Node = Src; Args.push_back(Entry); break; } case RTLIB::MEMSET: { + NewLC = RTLIB::SC_MEMSET; TargetLowering::ArgListEntry Entry; Entry.Ty = Type::getInt32Ty(*DAG.getContext()); - Symbol = DAG.getExternalSymbol("__arm_sc_memset", PointerVT); Src = DAG.getZExtOrTrunc(Src, DL, MVT::i32); Entry.Node = Src; Args.push_back(Entry); @@ -202,17 +201,17 @@ SDValue AArch64SelectionDAGInfo::EmitStreamingCompatibleMemLibCall( return SDValue(); } + EVT PointerVT = TLI->getPointerTy(DAG.getDataLayout()); + SDValue Symbol = DAG.getExternalSymbol(TLI->getLibcallName(NewLC), PointerVT); TargetLowering::ArgListEntry SizeEntry; SizeEntry.Node = Size; SizeEntry.Ty = DAG.getDataLayout().getIntPtrType(*DAG.getContext()); Args.push_back(SizeEntry); - assert(Symbol->getOpcode() == ISD::ExternalSymbol && - "Function name is not set"); TargetLowering::CallLoweringInfo CLI(DAG); PointerType *RetTy = PointerType::getUnqual(*DAG.getContext()); CLI.setDebugLoc(DL).setChain(Chain).setLibCallee( - TLI->getLibcallCallingConv(LC), RetTy, Symbol, std::move(Args)); + TLI->getLibcallCallingConv(NewLC), RetTy, Symbol, std::move(Args)); return TLI->LowerCallTo(CLI).second; } |
