@@ -735,6 +735,15 @@ def CC_X86_64_OCaml : CallingConv<[
735735 ]>>
736736]>;
737737
738+ def CC_X86_64_OCaml_C_Call : CallingConv<[
739+ // OCaml wraps C calls with another function that transfers stack arguments.
740+ // RAX contains the function address, and R12 contains the size of the stack arguments.
741+ CCIfType<[i64], CCAssignToReg<[RAX, R12]>>,
742+
743+ // Follow C convention normally otherwise
744+ CCDelegateTo<CC_X86_64_C>
745+ ]>;
746+
738747def CC_X86_64_GHC : CallingConv<[
739748 // Promote i8/i16/i32 arguments to i64.
740749 CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
@@ -1138,6 +1147,7 @@ def CC_X86_64 : CallingConv<[
11381147 CCIfCC<"CallingConv::X86_RegCall", CCDelegateTo<CC_X86_SysV64_RegCall>>,
11391148 CCIfCC<"CallingConv::X86_INTR", CCCustom<"CC_X86_Intr">>,
11401149 CCIfCC<"CallingConv::OCaml", CCDelegateTo<CC_X86_64_OCaml>>,
1150+ CCIfCC<"CallingConv::OCaml_C_Call", CCDelegateTo<CC_X86_64_OCaml_C_Call>>,
11411151
11421152 // Mingw64 and native Win64 use Win64 CC
11431153 CCIfSubtarget<"isTargetWin64()", CCDelegateTo<CC_X86_Win64_C>>,
0 commit comments