Add (very basic) bindings for ModuleProvider.
[oota-llvm.git] / bindings / ocaml / llvm / llvm_ocaml.c
index a0b39c69fb5f3222b7989fc9c31656c29d031c8e..f9d7e6f4780f5e6c8201c05dace0e8af26fd2d05 100644 (file)
@@ -410,7 +410,7 @@ CAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
   CAMLparam1(Name);
   LLVMValueRef GlobalVar;
   if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
-    value Option = alloc(1, 1);
+    value Option = alloc(1, 0);
     Field(Option, 0) = (value) GlobalVar;
     CAMLreturn(Option);
   }
@@ -487,7 +487,7 @@ CAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
   CAMLparam1(Name);
   LLVMValueRef Fn;
   if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
-    value Option = alloc(1, 1);
+    value Option = alloc(1, 0);
     Field(Option, 0) = (value) Fn;
     CAMLreturn(Option);
   }
@@ -536,6 +536,29 @@ CAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
   return Val_unit;
 }
 
+/* llvalue -> string option */
+CAMLprim value llvm_collector(LLVMValueRef Fn) {
+  const char *Collector;
+  CAMLparam0();
+  CAMLlocal2(Name, Option);
+  
+  if ((Collector = LLVMGetCollector(Fn))) {
+    Name = copy_string(Collector);
+    
+    Option = alloc(1, 0);
+    Field(Option, 0) = Name;
+    CAMLreturn(Option);
+  } else {
+    CAMLreturn(Val_int(0));
+  }
+}
+
+/* string option -> llvalue -> unit */
+CAMLprim value llvm_set_collector(value GC, LLVMValueRef Fn) {
+  LLVMSetCollector(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
+  return Val_unit;
+}
+
 /*--... Operations on basic blocks .........................................--*/
 
 /* llvalue -> llbasicblock array */
@@ -1024,3 +1047,11 @@ CAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
   return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
 }
 
+
+/*===-- Module Providers --------------------------------------------------===*/
+
+/* llmoduleprovider -> unit */
+CAMLprim value llvm_dispose_module_provider(LLVMModuleProviderRef MP) {
+  LLVMDisposeModuleProvider(MP);
+  return Val_unit;
+}