1dfc58e3bcfcb8f37796b2ca1c289dd202f26d03cSylvestre Ledru/*===-- analysis_ocaml.c - LLVM OCaml Glue ----------------------*- C++ -*-===*\ 2c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* *| 3c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* The LLVM Compiler Infrastructure *| 4c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* *| 5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* This file is distributed under the University of Illinois Open Source *| 6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* License. See LICENSE.TXT for details. *| 7c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* *| 8c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|*===----------------------------------------------------------------------===*| 9c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* *| 10dfc58e3bcfcb8f37796b2ca1c289dd202f26d03cSylvestre Ledru|* This file glues LLVM's OCaml interface to its C interface. These functions *| 11c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* are by and large transparent wrappers to the corresponding C functions. *| 12c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* *| 13c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *| 14c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* macros, since most of the parameters are not GC heap objects. *| 15c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen|* *| 16c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen\*===----------------------------------------------------------------------===*/ 17c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 18c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen#include "llvm-c/Analysis.h" 19c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen#include "caml/alloc.h" 20c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen#include "caml/mlvalues.h" 21c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen#include "caml/memory.h" 22c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 23c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 24c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen/* Llvm.llmodule -> string option */ 25c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon HenriksenCAMLprim value llvm_verify_module(LLVMModuleRef M) { 26c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen CAMLparam0(); 27c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen CAMLlocal2(String, Option); 28c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 29c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen char *Message; 30c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen int Result = LLVMVerifyModule(M, LLVMReturnStatusAction, &Message); 31c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 32c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen if (0 == Result) { 33c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen Option = Val_int(0); 34c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen } else { 3575e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen Option = alloc(1, 0); 36c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen String = copy_string(Message); 37c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen Store_field(Option, 0, String); 38c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen } 39c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 40da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMDisposeMessage(Message); 41c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 42c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen CAMLreturn(Option); 43c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen} 44c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 45c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen/* Llvm.llvalue -> bool */ 46c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon HenriksenCAMLprim value llvm_verify_function(LLVMValueRef Fn) { 47c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen return Val_bool(LLVMVerifyFunction(Fn, LLVMReturnStatusAction) == 0); 48c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen} 49c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 50c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen/* Llvm.llmodule -> unit */ 51c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon HenriksenCAMLprim value llvm_assert_valid_module(LLVMModuleRef M) { 52c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen LLVMVerifyModule(M, LLVMAbortProcessAction, 0); 53c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen return Val_unit; 54c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen} 55c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen 56c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen/* Llvm.llvalue -> unit */ 57c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon HenriksenCAMLprim value llvm_assert_valid_function(LLVMValueRef Fn) { 58c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen LLVMVerifyFunction(Fn, LLVMAbortProcessAction); 59c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen return Val_unit; 60c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen} 61d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar 62d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar/* Llvm.llvalue -> unit */ 63d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick TryzelaarCAMLprim value llvm_view_function_cfg(LLVMValueRef Fn) { 64d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar LLVMViewFunctionCFG(Fn); 65d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar return Val_unit; 66d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar} 67d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar 68d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar/* Llvm.llvalue -> unit */ 69d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick TryzelaarCAMLprim value llvm_view_function_cfg_only(LLVMValueRef Fn) { 70d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar LLVMViewFunctionCFGOnly(Fn); 71d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar return Val_unit; 72d6d018589cf3de22bc5d0b2b229e37cdb6afca61Erick Tryzelaar} 73