1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/*===-- bitwriter_ocaml.c - LLVM Ocaml Glue ---------------------*- C++ -*-===*\
2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|*                                                                            *|
3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|*                     The LLVM Compiler Infrastructure                       *|
4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|*                                                                            *|
5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|* This file is distributed under the University of Illinois Open Source      *|
6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|* License. See LICENSE.TXT for details.                                      *|
7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|*                                                                            *|
8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|*===----------------------------------------------------------------------===*|
9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|*                                                                            *|
10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|* This file glues LLVM's ocaml interface to its C interface. These functions *|
11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|* are by and large transparent wrappers to the corresponding C functions.    *|
12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|*                                                                            *|
13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|* Note that these functions intentionally take liberties with the CAMLparamX *|
14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|* macros, since most of the parameters are not GC heap objects.              *|
15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao|*                                                                            *|
16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao\*===----------------------------------------------------------------------===*/
17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm-c/BitWriter.h"
19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm-c/Core.h"
20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "caml/alloc.h"
21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "caml/mlvalues.h"
22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "caml/memory.h"
23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/*===-- Modules -----------------------------------------------------------===*/
25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/* Llvm.llmodule -> string -> bool */
27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoCAMLprim value llvm_write_bitcode_file(value M, value Path) {
28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  int res = LLVMWriteBitcodeToFile((LLVMModuleRef) M, String_val(Path));
29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return Val_bool(res == 0);
30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
31e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao
32e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao/* ?unbuffered:bool -> Llvm.llmodule -> Unix.file_descr -> bool */
33e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei LiaoCAMLprim value llvm_write_bitcode_to_fd(value U, value M, value FD) {
34e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao  int Unbuffered;
35e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao  int res;
36e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao
37e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao  if (U == Val_int(0)) {
38e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao    Unbuffered = 0;
39e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao  } else {
40e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao    Unbuffered = Bool_val(Field(U,0));
41e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao  }
42e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao
43e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao  res = LLVMWriteBitcodeToFD((LLVMModuleRef) M, Int_val(FD), 0, Unbuffered);
44e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao  return Val_bool(res == 0);
45e4454320b3cfffe926a487c33fbeb454366de2f8Shih-wei Liao}
46