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