Bindings for the verifier.
[oota-llvm.git] / bindings / ocaml / analysis / analysis_ocaml.c
diff --git a/bindings/ocaml/analysis/analysis_ocaml.c b/bindings/ocaml/analysis/analysis_ocaml.c
new file mode 100644 (file)
index 0000000..cc1098a
--- /dev/null
@@ -0,0 +1,60 @@
+/*===-- analysis_ocaml.c - LLVM Ocaml Glue ----------------------*- C++ -*-===*\
+|*                                                                            *|
+|*                     The LLVM Compiler Infrastructure                       *|
+|*                                                                            *|
+|* This file was developed by Gordon Henriksen and is distributed under the   *|
+|* University of Illinois Open Source License. See LICENSE.TXT for details.   *|
+|*                                                                            *|
+|*===----------------------------------------------------------------------===*|
+|*                                                                            *|
+|* This file glues LLVM's ocaml interface to its C interface. These functions *|
+|* are by and large transparent wrappers to the corresponding C functions.    *|
+|*                                                                            *|
+|* Note that these functions intentionally take liberties with the CAMLparamX *|
+|* macros, since most of the parameters are not GC heap objects.              *|
+|*                                                                            *|
+\*===----------------------------------------------------------------------===*/
+
+#include "llvm-c/Analysis.h"
+#include "caml/alloc.h"
+#include "caml/mlvalues.h"
+#include "caml/memory.h"
+
+
+/* Llvm.llmodule -> string option */
+CAMLprim value llvm_verify_module(LLVMModuleRef M) {
+  CAMLparam0();
+  CAMLlocal2(String, Option);
+  
+  char *Message;
+  int Result = LLVMVerifyModule(M, LLVMReturnStatusAction, &Message);
+  
+  if (0 == Result) {
+    Option = Val_int(0);
+  } else {
+    Option = alloc(1, 1);
+    String = copy_string(Message);
+    Store_field(Option, 0, String);
+  }
+  
+  LLVMDisposeVerifierMessage(Message);
+  
+  CAMLreturn(Option);
+}
+
+/* Llvm.llvalue -> bool */
+CAMLprim value llvm_verify_function(LLVMValueRef Fn) {
+  return Val_bool(LLVMVerifyFunction(Fn, LLVMReturnStatusAction) == 0);
+}
+
+/* Llvm.llmodule -> unit */
+CAMLprim value llvm_assert_valid_module(LLVMModuleRef M) {
+  LLVMVerifyModule(M, LLVMAbortProcessAction, 0);
+  return Val_unit;
+}
+
+/* Llvm.llvalue -> unit */
+CAMLprim value llvm_assert_valid_function(LLVMValueRef Fn) {
+  LLVMVerifyFunction(Fn, LLVMAbortProcessAction);
+  return Val_unit;
+}