Skip to content

Commit a440d97

Browse files
authored
add extcall conventions for ocaml (#11)
1 parent 000d4b0 commit a440d97

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

llvm/include/llvm/IR/CallingConv.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,9 @@ namespace CallingConv {
244244
/// Calling convention for OCaml
245245
OCaml = 104,
246246

247+
/// Special case of the C calling convention for calling from OCaml
248+
OCaml_C_Call = 105,
249+
247250
/// The highest possible ID. Must be some 2^k - 1.
248251
MaxID = 1023
249252
};

llvm/lib/Target/X86/X86CallingConv.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
738747
def 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

Comments
 (0)