summaryrefslogtreecommitdiffstats
path: root/llvm/bindings/ocaml/bitreader/bitreader_ocaml.c
diff options
context:
space:
mode:
authorGordon Henriksen <gordonhenriksen@mac.com>2007-12-19 22:30:40 +0000
committerGordon Henriksen <gordonhenriksen@mac.com>2007-12-19 22:30:40 +0000
commit34eb6d877eb8e563bc3b546dbcd9f9c1644e7a98 (patch)
treea0f5bd941ea91cf6f36a4149e33ac79163ad5d84 /llvm/bindings/ocaml/bitreader/bitreader_ocaml.c
parent9a53275918ef130dedc7b09234f42c5db6de8068 (diff)
downloadbcm5719-llvm-34eb6d877eb8e563bc3b546dbcd9f9c1644e7a98.tar.gz
bcm5719-llvm-34eb6d877eb8e563bc3b546dbcd9f9c1644e7a98.zip
Adding bindings for memory buffers and module providers. Switching
to exceptions rather than variants for error handling in Ocaml. llvm-svn: 45226
Diffstat (limited to 'llvm/bindings/ocaml/bitreader/bitreader_ocaml.c')
-rw-r--r--llvm/bindings/ocaml/bitreader/bitreader_ocaml.c53
1 files changed, 34 insertions, 19 deletions
diff --git a/llvm/bindings/ocaml/bitreader/bitreader_ocaml.c b/llvm/bindings/ocaml/bitreader/bitreader_ocaml.c
index 7088fa5a478..87477f6312d 100644
--- a/llvm/bindings/ocaml/bitreader/bitreader_ocaml.c
+++ b/llvm/bindings/ocaml/bitreader/bitreader_ocaml.c
@@ -16,31 +16,46 @@
#include "caml/alloc.h"
#include "caml/mlvalues.h"
#include "caml/memory.h"
+#include <stdio.h>
+
+
+/* Can't use the recommended caml_named_value mechanism for backwards
+ compatibility reasons. This is largely equivalent. */
+static value llvm_bitreader_error_exn;
+
+CAMLprim value llvm_register_bitreader_exns(value Error) {
+ llvm_bitreader_error_exn = Field(Error, 0);
+ register_global_root(&llvm_bitreader_error_exn);
+ return Val_unit;
+}
+
+void llvm_raise(value Prototype, char *Message);
+
/*===-- Modules -----------------------------------------------------------===*/
-/* string -> bitreader_result
+/* Llvm.llmemorybuffer -> Llvm.module */
+CAMLprim value llvm_get_module_provider(LLVMMemoryBufferRef MemBuf) {
+ CAMLparam0();
+ CAMLlocal2(Variant, MessageVal);
+ char *Message;
+
+ LLVMModuleProviderRef MP;
+ if (LLVMGetBitcodeModuleProvider(MemBuf, &MP, &Message))
+ llvm_raise(llvm_bitreader_error_exn, Message);
+
+ CAMLreturn((value) MemBuf);
+}
- type bitreader_result =
- | Bitreader_success of Llvm.llmodule
- | Bitreader_failure of string
- */
-CAMLprim value llvm_read_bitcode_file(value Path) {
+/* Llvm.llmemorybuffer -> Llvm.llmodule */
+CAMLprim value llvm_parse_bitcode(LLVMMemoryBufferRef MemBuf) {
+ CAMLparam0();
+ CAMLlocal2(Variant, MessageVal);
LLVMModuleRef M;
char *Message;
- CAMLparam1(Path);
- CAMLlocal2(Variant, MessageVal);
- if (LLVMReadBitcodeFromFile(String_val(Path), &M, &Message)) {
- MessageVal = copy_string(Message);
- LLVMDisposeBitcodeReaderMessage(Message);
-
- Variant = alloc(1, 1);
- Field(Variant, 0) = MessageVal;
- } else {
- Variant = alloc(1, 0);
- Field(Variant, 0) = Val_op(M);
- }
+ if (LLVMParseBitcode(MemBuf, &M, &Message))
+ llvm_raise(llvm_bitreader_error_exn, Message);
- CAMLreturn(Variant);
+ CAMLreturn((value) M);
}
OpenPOWER on IntegriCloud