diff options
author | Gordon Henriksen <gordonhenriksen@mac.com> | 2007-10-06 21:00:36 +0000 |
---|---|---|
committer | Gordon Henriksen <gordonhenriksen@mac.com> | 2007-10-06 21:00:36 +0000 |
commit | c3d661a0eec50ac21f9b0c2564d7a11be2001d97 (patch) | |
tree | b3b2d5fb60e4ff6e0ecae9d1d9bed1f954fe3400 /llvm/bindings/ocaml/analysis/analysis_ocaml.c | |
parent | ae0ec1d09fd68828adc5f0bb0186e4e15c6a8589 (diff) | |
download | bcm5719-llvm-c3d661a0eec50ac21f9b0c2564d7a11be2001d97.tar.gz bcm5719-llvm-c3d661a0eec50ac21f9b0c2564d7a11be2001d97.zip |
Bindings for the verifier.
llvm-svn: 42707
Diffstat (limited to 'llvm/bindings/ocaml/analysis/analysis_ocaml.c')
-rw-r--r-- | llvm/bindings/ocaml/analysis/analysis_ocaml.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/llvm/bindings/ocaml/analysis/analysis_ocaml.c b/llvm/bindings/ocaml/analysis/analysis_ocaml.c new file mode 100644 index 00000000000..cc1098a3749 --- /dev/null +++ b/llvm/bindings/ocaml/analysis/analysis_ocaml.c @@ -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; +} |