From 4385b41dd80f4182e700a93d6d38c7232cc1d2c5 Mon Sep 17 00:00:00 2001 From: usuyus Date: Thu, 31 Jul 2025 10:44:08 +0100 Subject: [PATCH] add extcall conventions for ocaml --- llvm/include/llvm/IR/CallingConv.h | 3 +++ llvm/lib/Target/X86/X86CallingConv.td | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/llvm/include/llvm/IR/CallingConv.h b/llvm/include/llvm/IR/CallingConv.h index aae7b60911200..7f60b0ea9876f 100644 --- a/llvm/include/llvm/IR/CallingConv.h +++ b/llvm/include/llvm/IR/CallingConv.h @@ -244,6 +244,9 @@ namespace CallingConv { /// Calling convention for OCaml OCaml = 104, + /// Special case of the C calling convention for calling from OCaml + OCaml_C_Call = 105, + /// The highest possible ID. Must be some 2^k - 1. MaxID = 1023 }; diff --git a/llvm/lib/Target/X86/X86CallingConv.td b/llvm/lib/Target/X86/X86CallingConv.td index b77154bf31e05..05dd537ec4280 100644 --- a/llvm/lib/Target/X86/X86CallingConv.td +++ b/llvm/lib/Target/X86/X86CallingConv.td @@ -735,6 +735,15 @@ def CC_X86_64_OCaml : CallingConv<[ ]>> ]>; +def CC_X86_64_OCaml_C_Call : CallingConv<[ + // OCaml wraps C calls with another function that transfers stack arguments. + // RAX contains the function address, and R12 contains the size of the stack arguments. + CCIfType<[i64], CCAssignToReg<[RAX, R12]>>, + + // Follow C convention normally otherwise + CCDelegateTo +]>; + def CC_X86_64_GHC : CallingConv<[ // Promote i8/i16/i32 arguments to i64. CCIfType<[i8, i16, i32], CCPromoteToType>, @@ -1138,6 +1147,7 @@ def CC_X86_64 : CallingConv<[ CCIfCC<"CallingConv::X86_RegCall", CCDelegateTo>, CCIfCC<"CallingConv::X86_INTR", CCCustom<"CC_X86_Intr">>, CCIfCC<"CallingConv::OCaml", CCDelegateTo>, + CCIfCC<"CallingConv::OCaml_C_Call", CCDelegateTo>, // Mingw64 and native Win64 use Win64 CC CCIfSubtarget<"isTargetWin64()", CCDelegateTo>,