Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 1 | /*===-- bitwriter_ocaml.c - LLVM Ocaml Glue ---------------------*- C++ -*-===*\ |
| 2 | |* *| |
| 3 | |* The LLVM Compiler Infrastructure *| |
| 4 | |* *| |
Chris Lattner | 6787a45 | 2007-12-29 22:59:10 +0000 | [diff] [blame] | 5 | |* This file is distributed under the University of Illinois Open Source *| |
| 6 | |* License. See LICENSE.TXT for details. *| |
Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 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 | \*===----------------------------------------------------------------------===*/ |
| 14 | |
| 15 | #include "llvm-c/BitReader.h" |
| 16 | #include "caml/alloc.h" |
Gordon Henriksen | 2a8cd89 | 2007-12-23 16:59:28 +0000 | [diff] [blame] | 17 | #include "caml/fail.h" |
Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 18 | #include "caml/memory.h" |
Gordon Henriksen | 34eb6d8 | 2007-12-19 22:30:40 +0000 | [diff] [blame] | 19 | |
| 20 | |
| 21 | /* Can't use the recommended caml_named_value mechanism for backwards |
| 22 | compatibility reasons. This is largely equivalent. */ |
| 23 | static value llvm_bitreader_error_exn; |
| 24 | |
| 25 | CAMLprim value llvm_register_bitreader_exns(value Error) { |
| 26 | llvm_bitreader_error_exn = Field(Error, 0); |
| 27 | register_global_root(&llvm_bitreader_error_exn); |
| 28 | return Val_unit; |
| 29 | } |
| 30 | |
Gordon Henriksen | 2a8cd89 | 2007-12-23 16:59:28 +0000 | [diff] [blame] | 31 | static 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 */ |
Gordon Henriksen | 86427bb | 2007-12-30 18:12:41 +0000 | [diff] [blame] | 40 | #ifdef CAMLnoreturn |
| 41 | CAMLnoreturn; /* Silences warnings, but is missing in some versions. */ |
| 42 | #endif |
Gordon Henriksen | 2a8cd89 | 2007-12-23 16:59:28 +0000 | [diff] [blame] | 43 | } |
Gordon Henriksen | 34eb6d8 | 2007-12-19 22:30:40 +0000 | [diff] [blame] | 44 | |
Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 45 | |
| 46 | /*===-- Modules -----------------------------------------------------------===*/ |
| 47 | |
Erick Tryzelaar | 5c35b5c | 2009-08-19 06:40:29 +0000 | [diff] [blame] | 48 | /* Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule */ |
Erick Tryzelaar | 98b05d6 | 2010-03-02 23:59:00 +0000 | [diff] [blame] | 49 | CAMLprim value llvm_get_module(LLVMContextRef C, LLVMMemoryBufferRef MemBuf) { |
Gordon Henriksen | 34eb6d8 | 2007-12-19 22:30:40 +0000 | [diff] [blame] | 50 | CAMLparam0(); |
| 51 | CAMLlocal2(Variant, MessageVal); |
| 52 | char *Message; |
| 53 | |
Erick Tryzelaar | 98b05d6 | 2010-03-02 23:59:00 +0000 | [diff] [blame] | 54 | LLVMModuleRef M; |
| 55 | if (LLVMGetBitcodeModuleInContext(C, MemBuf, &M, &Message)) |
Gordon Henriksen | 34eb6d8 | 2007-12-19 22:30:40 +0000 | [diff] [blame] | 56 | llvm_raise(llvm_bitreader_error_exn, Message); |
| 57 | |
Erick Tryzelaar | 98b05d6 | 2010-03-02 23:59:00 +0000 | [diff] [blame] | 58 | CAMLreturn((value) M); |
Gordon Henriksen | 34eb6d8 | 2007-12-19 22:30:40 +0000 | [diff] [blame] | 59 | } |
Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 60 | |
Erick Tryzelaar | 5c35b5c | 2009-08-19 06:40:29 +0000 | [diff] [blame] | 61 | /* Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule */ |
| 62 | CAMLprim value llvm_parse_bitcode(LLVMContextRef C, |
| 63 | LLVMMemoryBufferRef MemBuf) { |
Gordon Henriksen | 34eb6d8 | 2007-12-19 22:30:40 +0000 | [diff] [blame] | 64 | CAMLparam0(); |
| 65 | CAMLlocal2(Variant, MessageVal); |
Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 66 | LLVMModuleRef M; |
| 67 | char *Message; |
Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 68 | |
Erick Tryzelaar | 5c35b5c | 2009-08-19 06:40:29 +0000 | [diff] [blame] | 69 | if (LLVMParseBitcodeInContext(C, MemBuf, &M, &Message)) |
Gordon Henriksen | 34eb6d8 | 2007-12-19 22:30:40 +0000 | [diff] [blame] | 70 | llvm_raise(llvm_bitreader_error_exn, Message); |
Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 71 | |
Gordon Henriksen | 34eb6d8 | 2007-12-19 22:30:40 +0000 | [diff] [blame] | 72 | CAMLreturn((value) M); |
Gordon Henriksen | 2b0eed2 | 2007-12-11 00:20:48 +0000 | [diff] [blame] | 73 | } |