llvm/llvm/bindings/ocaml/llvm/llvm_ocaml.h

/*===-- llvm_ocaml.h - LLVM OCaml Glue --------------------------*- C++ -*-===*\
|*                                                                            *|
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
|* Exceptions.                                                                *|
|* See https://llvm.org/LICENSE.txt for license information.                  *|
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
|*                                                                            *|
|*===----------------------------------------------------------------------===*|
|*                                                                            *|
|* This file glues LLVM's OCaml interface to its C interface. These functions *|
|* are by and large transparent wrappers to the corresponding C functions.    *|
|*                                                                            *|
|* Note that these functions intentionally take liberties with the CAMLparamX *|
|* macros, since most of the parameters are not GC heap objects.              *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/

#ifndef LLVM_LLVM_OCAML_H
#define LLVM_LLVM_OCAML_H

#include "caml/alloc.h"
#include "caml/custom.h"
#include "caml/version.h"

#if OCAML_VERSION < 41200
/* operations on OCaml option values, defined by OCaml 4.12 */
#define Val_none Val_int(0)
#define Some_val(v) Field(v, 0)
#define Tag_some 0
#define Is_none(v) ((v) == Val_none)
#define Is_some(v) Is_block(v)
value caml_alloc_some(value);
#endif

/* to_val and from_val convert between an OCaml value and a pointer from LLVM,
   which points outside the OCaml heap. They assume that all pointers from LLVM
   are 2-byte aligned: to_val sets the low bit so that OCaml treats the value
   as an integer, and from_val clears the low bit. */
value to_val(void *ptr);

void *from_val(value v);

/* from_val_array takes an OCaml array value of LLVM references encoded with
   the representation described above and returns a malloc'd array
   of decoded LLVM references. The returned array must be deallocated using
   free. */
void *from_val_array(value Elements);

#define DiagnosticInfo_val(v) ((LLVMDiagnosticInfoRef)from_val(v))
#define Context_val(v) ((LLVMContextRef)from_val(v))
#define Attribute_val(v) ((LLVMAttributeRef)from_val(v))
#define Module_val(v) ((LLVMModuleRef)from_val(v))
#define Metadata_val(v) ((LLVMMetadataRef)from_val(v))
#define Type_val(v) ((LLVMTypeRef)from_val(v))
#define Value_val(v) ((LLVMValueRef)from_val(v))
#define DbgRecord_val(v) ((LLVMDbgRecordRef)from_val(v))
#define Use_val(v) ((LLVMUseRef)from_val(v))
#define BasicBlock_val(v) ((LLVMBasicBlockRef)from_val(v))
#define MemoryBuffer_val(v) ((LLVMMemoryBufferRef)from_val(v))

/* Convert a C pointer to an OCaml option */
value ptr_to_option(void *Ptr);

/* Convert a C string into an OCaml string */
value cstr_to_string(const char *Str, mlsize_t Len);

#endif // LLVM_LLVM_OCAML_H