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