Skip to content

Commit 41a7d0d

Browse files
committed
Change OCaml_C_Call calling convention to account for runtime registers
1 parent 7746b6c commit 41a7d0d

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

llvm/lib/Target/X86/X86CallingConv.td

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,11 @@ def RetCC_X86_64_OCaml : CallingConv<[
453453
]>>
454454
]>;
455455

456+
def RetCC_X86_64_OCaml_C_Call : CallingConv<[
457+
CCIfType<[i64], CCAssignToReg<[R14, R15]>>,
458+
459+
CCDelegateTo<RetCC_X86_64_C>
460+
]>;
456461

457462
defm X86_32_RegCall :
458463
X86_RegCall_base<RC_X86_32_RegCall>;
@@ -509,6 +514,7 @@ def RetCC_X86_64 : CallingConv<[
509514

510515
// Handle OCaml calls
511516
CCIfCC<"CallingConv::OCaml", CCDelegateTo<RetCC_X86_64_OCaml>>,
517+
CCIfCC<"CallingConv::OCaml_C_Call", CCDelegateTo<RetCC_X86_64_OCaml_C_Call>>,
512518

513519
// Otherwise, drop to normal X86-64 CC
514520
CCDelegateTo<RetCC_X86_64_C>
@@ -737,7 +743,7 @@ def CC_X86_64_OCaml : CallingConv<[
737743
def CC_X86_64_OCaml_C_Call : CallingConv<[
738744
// OCaml wraps C calls with another function that transfers stack arguments.
739745
// RAX contains the function address, and R12 contains the size of the stack arguments.
740-
CCIfType<[i64], CCAssignToReg<[RAX, R12]>>,
746+
CCIfType<[i64], CCAssignToReg<[R14, R15, RAX, R12]>>,
741747

742748
// Follow C convention normally otherwise
743749
CCDelegateTo<CC_X86_64_C>
@@ -1172,6 +1178,9 @@ def CSR_NoRegs : CalleeSavedRegs<(add)>;
11721178
def CSR_32 : CalleeSavedRegs<(add ESI, EDI, EBX, EBP)>;
11731179
def CSR_64 : CalleeSavedRegs<(add RBX, R12, R13, R14, R15, RBP)>;
11741180

1181+
// R14 and R15 are used as return registers, so they aren't callee saved.
1182+
def CSR_64_OCaml_C_Call : CalleeSavedRegs<(add RBX, R12, R13, RBP)>;
1183+
11751184
def CSR_64_SwiftError : CalleeSavedRegs<(sub CSR_64, R12)>;
11761185
def CSR_64_SwiftTail : CalleeSavedRegs<(sub CSR_64, R13, R14)>;
11771186

llvm/lib/Target/X86/X86RegisterInfo.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
302302
case CallingConv::HiPE:
303303
case CallingConv::OCaml:
304304
return CSR_NoRegs_SaveList;
305+
case CallingConv::OCaml_C_Call:
306+
return CSR_64_OCaml_C_Call_SaveList;
305307
case CallingConv::AnyReg:
306308
if (HasAVX)
307309
return CSR_64_AllRegs_AVX_SaveList;
@@ -426,6 +428,8 @@ X86RegisterInfo::getCallPreservedMask(const MachineFunction &MF,
426428
case CallingConv::HiPE:
427429
case CallingConv::OCaml:
428430
return CSR_NoRegs_RegMask;
431+
case CallingConv::OCaml_C_Call:
432+
return CSR_64_OCaml_C_Call_RegMask;
429433
case CallingConv::AnyReg:
430434
if (HasAVX)
431435
return CSR_64_AllRegs_AVX_RegMask;

0 commit comments

Comments
 (0)