@@ -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
457462defm 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<[
737743def 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)>;
11721178def CSR_32 : CalleeSavedRegs<(add ESI, EDI, EBX, EBP)>;
11731179def 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+
11751184def CSR_64_SwiftError : CalleeSavedRegs<(sub CSR_64, R12)>;
11761185def CSR_64_SwiftTail : CalleeSavedRegs<(sub CSR_64, R13, R14)>;
11771186
0 commit comments