1/*===-- linker_ocaml.c - LLVM Ocaml Glue ------------------------*- C++ -*-===*\
2|*                                                                            *|
3|*                     The LLVM Compiler Infrastructure                       *|
4|*                                                                            *|
5|* This file is distributed under the University of Illinois Open Source      *|
6|* License. See LICENSE.TXT for details.                                      *|
7|*                                                                            *|
8|*===----------------------------------------------------------------------===*|
9|*                                                                            *|
10|* This file glues LLVM's OCaml interface to its C interface. These functions *|
11|* are by and large transparent wrappers to the corresponding C functions.    *|
12|*                                                                            *|
13|* Note that these functions intentionally take liberties with the CAMLparamX *|
14|* macros, since most of the parameters are not GC heap objects.              *|
15|*                                                                            *|
16\*===----------------------------------------------------------------------===*/
17
18#include "llvm-c/Linker.h"
19#include "caml/alloc.h"
20#include "caml/memory.h"
21#include "caml/fail.h"
22
23static value llvm_linker_error_exn;
24
25CAMLprim value llvm_register_linker_exns(value Error) {
26  llvm_linker_error_exn = Field(Error, 0);
27  register_global_root(&llvm_linker_error_exn);
28  return Val_unit;
29}
30
31static void llvm_raise(value Prototype, char *Message) {
32  CAMLparam1(Prototype);
33  CAMLlocal1(CamlMessage);
34
35  CamlMessage = copy_string(Message);
36  LLVMDisposeMessage(Message);
37
38  raise_with_arg(Prototype, CamlMessage);
39  abort(); /* NOTREACHED */
40#ifdef CAMLnoreturn
41  CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
42#endif
43}
44
45/* llmodule -> llmodule -> Mode.t -> unit
46   raises Error msg on error */
47CAMLprim value llvm_link_modules(LLVMModuleRef Dst, LLVMModuleRef Src, value Mode) {
48  char* Message;
49
50  if (LLVMLinkModules(Dst, Src, Int_val(Mode), &Message))
51    llvm_raise(llvm_linker_error_exn, Message);
52
53  return Val_unit;
54}
55