Skip to content

Commit 68bfe91

Browse files
authored
[llvm] X86_64 CC for UEFI (#137905)
Select appropriate registers for X86_64 UEFI.
1 parent 8a84a19 commit 68bfe91

File tree

4 files changed

+19
-5
lines changed

4 files changed

+19
-5
lines changed

llvm/lib/Target/X86/X86CallingConv.td

+10-2
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,10 @@ def RetCC_X86Common : CallingConv<[
283283
CCAssignToReg<[ZMM0,ZMM1,ZMM2,ZMM3]>>,
284284

285285
// Long double types are always returned in FP0 (even with SSE),
286-
// except on Win64.
287-
CCIfNotSubtarget<"isTargetWin64()", CCIfType<[f80], CCAssignToReg<[FP0, FP1]>>>
286+
// except on Win64 and UEFI64.
287+
CCIfNotSubtarget<"isTargetWin64()",
288+
CCIfNotSubtarget<"isTargetUEFI64()",
289+
CCIfType<[f80], CCAssignToReg<[FP0, FP1]>>>>
288290
]>;
289291

290292
// X86-32 C return-value convention.
@@ -495,6 +497,9 @@ def RetCC_X86_64 : CallingConv<[
495497
// Mingw64 and native Win64 use Win64 CC
496498
CCIfSubtarget<"isTargetWin64()", CCDelegateTo<RetCC_X86_Win64_C>>,
497499

500+
// UEFI64 uses Win64 CC
501+
CCIfSubtarget<"isTargetUEFI64()", CCDelegateTo<RetCC_X86_Win64_C>>,
502+
498503
// Otherwise, drop to normal X86-64 CC
499504
CCDelegateTo<RetCC_X86_64_C>
500505
]>;
@@ -1085,6 +1090,9 @@ def CC_X86_64 : CallingConv<[
10851090
// Mingw64 and native Win64 use Win64 CC
10861091
CCIfSubtarget<"isTargetWin64()", CCDelegateTo<CC_X86_Win64_C>>,
10871092

1093+
// UEFI uses Win64 CC
1094+
CCIfSubtarget<"isTargetUEFI64()", CCDelegateTo<CC_X86_Win64_C>>,
1095+
10881096
// Otherwise, drop to normal X86-64 CC
10891097
CCDelegateTo<CC_X86_64_C>
10901098
]>;

llvm/lib/Target/X86/X86RegisterInfo.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ X86RegisterInfo::X86RegisterInfo(const Triple &TT)
6060
// Cache some information.
6161
Is64Bit = TT.isArch64Bit();
6262
IsWin64 = Is64Bit && TT.isOSWindows();
63+
IsUEFI64 = Is64Bit && TT.isUEFI();
6364

6465
// Use a callee-saved register as the base pointer. These registers must
6566
// not conflict with any ABI requirements. For example, in 32-bit mode PIC
@@ -227,7 +228,7 @@ X86RegisterInfo::getPointerRegClass(const MachineFunction &MF,
227228
const TargetRegisterClass *
228229
X86RegisterInfo::getGPRsForTailCall(const MachineFunction &MF) const {
229230
const Function &F = MF.getFunction();
230-
if (IsWin64 || (F.getCallingConv() == CallingConv::Win64))
231+
if (IsWin64 || IsUEFI64 || (F.getCallingConv() == CallingConv::Win64))
231232
return &X86::GR64_TCW64RegClass;
232233
else if (Is64Bit)
233234
return &X86::GR64_TCRegClass;
@@ -389,7 +390,7 @@ X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
389390
return IsWin64 ? CSR_Win64_SwiftError_SaveList
390391
: CSR_64_SwiftError_SaveList;
391392

392-
if (IsWin64)
393+
if (IsWin64 || IsUEFI64)
393394
return HasSSE ? CSR_Win64_SaveList : CSR_Win64_NoSSE_SaveList;
394395
if (CallsEHReturn)
395396
return CSR_64EHRet_SaveList;
@@ -514,7 +515,7 @@ X86RegisterInfo::getCallPreservedMask(const MachineFunction &MF,
514515
if (IsSwiftCC)
515516
return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask;
516517

517-
return IsWin64 ? CSR_Win64_RegMask : CSR_64_RegMask;
518+
return (IsWin64 || IsUEFI64) ? CSR_Win64_RegMask : CSR_64_RegMask;
518519
}
519520

520521
return CSR_32_RegMask;

llvm/lib/Target/X86/X86RegisterInfo.h

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ class X86RegisterInfo final : public X86GenRegisterInfo {
3131
///
3232
bool IsWin64;
3333

34+
/// IsUEFI64 - Is UEFI 64 bit target.
35+
///
36+
bool IsUEFI64;
37+
3438
/// SlotSize - Stack slot size in bytes.
3539
///
3640
unsigned SlotSize;

llvm/lib/Target/X86/X86Subtarget.h

+1
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ class X86Subtarget final : public X86GenSubtargetInfo {
352352
switch (CC) {
353353
// On Win64, all these conventions just use the default convention.
354354
case CallingConv::C:
355+
return isTargetWin64() || isTargetUEFI64();
355356
case CallingConv::Fast:
356357
case CallingConv::Tail:
357358
case CallingConv::Swift:

0 commit comments

Comments
 (0)