1*9880d681SAndroid Build Coastguard Worker /*===-- irreader_ocaml.c - LLVM OCaml Glue ----------------------*- C++ -*-===*\ 2*9880d681SAndroid Build Coastguard Worker |* *| 3*9880d681SAndroid Build Coastguard Worker |* The LLVM Compiler Infrastructure *| 4*9880d681SAndroid Build Coastguard Worker |* *| 5*9880d681SAndroid Build Coastguard Worker |* This file is distributed under the University of Illinois Open Source *| 6*9880d681SAndroid Build Coastguard Worker |* License. See LICENSE.TXT for details. *| 7*9880d681SAndroid Build Coastguard Worker |* *| 8*9880d681SAndroid Build Coastguard Worker |*===----------------------------------------------------------------------===*| 9*9880d681SAndroid Build Coastguard Worker |* *| 10*9880d681SAndroid Build Coastguard Worker |* This file glues LLVM's OCaml interface to its C interface. These functions *| 11*9880d681SAndroid Build Coastguard Worker |* are by and large transparent wrappers to the corresponding C functions. *| 12*9880d681SAndroid Build Coastguard Worker |* *| 13*9880d681SAndroid Build Coastguard Worker \*===----------------------------------------------------------------------===*/ 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #include "llvm-c/IRReader.h" 16*9880d681SAndroid Build Coastguard Worker #include "caml/alloc.h" 17*9880d681SAndroid Build Coastguard Worker #include "caml/fail.h" 18*9880d681SAndroid Build Coastguard Worker #include "caml/memory.h" 19*9880d681SAndroid Build Coastguard Worker #include "caml/callback.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker void llvm_raise(value Prototype, char *Message); 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker /* Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule */ llvm_parse_ir(LLVMContextRef C,LLVMMemoryBufferRef MemBuf)24*9880d681SAndroid Build Coastguard WorkerCAMLprim value llvm_parse_ir(LLVMContextRef C, 25*9880d681SAndroid Build Coastguard Worker LLVMMemoryBufferRef MemBuf) { 26*9880d681SAndroid Build Coastguard Worker CAMLparam0(); 27*9880d681SAndroid Build Coastguard Worker CAMLlocal2(Variant, MessageVal); 28*9880d681SAndroid Build Coastguard Worker LLVMModuleRef M; 29*9880d681SAndroid Build Coastguard Worker char *Message; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker if (LLVMParseIRInContext(C, MemBuf, &M, &Message)) 32*9880d681SAndroid Build Coastguard Worker llvm_raise(*caml_named_value("Llvm_irreader.Error"), Message); 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker CAMLreturn((value) M); 35*9880d681SAndroid Build Coastguard Worker } 36