-/*===-- llvm_ocaml.h - LLVM Ocaml Glue --------------------------*- C++ -*-===*\
+/*===-- llvm_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 is distributed under the University of Illinois Open Source *|
+|* License. See LICENSE.TXT for details. *|
|* *|
|*===----------------------------------------------------------------------===*|
|* *|
#include "llvm-c/Core.h"
#include "caml/alloc.h"
#include "caml/custom.h"
-#include "caml/mlvalues.h"
#include "caml/memory.h"
#include "caml/fail.h"
#include "caml/callback.h"
return Val_unit;
}
-void llvm_raise(value Prototype, char *Message) {
+static void llvm_raise(value Prototype, char *Message) {
CAMLparam1(Prototype);
CAMLlocal1(CamlMessage);
LLVMDisposeMessage(Message);
raise_with_arg(Prototype, CamlMessage);
- CAMLnoreturn;
+ abort(); /* NOTREACHED */
+#ifdef CAMLnoreturn
+ CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
+#endif
}
return Val_unit;
}
+/* llmodule -> string */
+CAMLprim value llvm_target_triple(LLVMModuleRef M) {
+ return copy_string(LLVMGetTarget(M));
+}
+
+/* string -> llmodule -> unit */
+CAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) {
+ LLVMSetTarget(M, String_val(Trip));
+ return Val_unit;
+}
+
+/* llmodule -> string */
+CAMLprim value llvm_data_layout(LLVMModuleRef M) {
+ return copy_string(LLVMGetDataLayout(M));
+}
+
+/* string -> llmodule -> unit */
+CAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) {
+ LLVMSetDataLayout(M, String_val(Layout));
+ return Val_unit;
+}
+
/* string -> lltype -> llmodule -> bool */
CAMLprim value llvm_add_type_name(value Name, LLVMTypeRef Ty, LLVMModuleRef M) {
int res = LLVMAddTypeName(M, String_val(Name), Ty);
#define Typehandle_val(v) (*(LLVMTypeHandleRef *)(Data_custom_val(v)))
-void llvm_finalize_handle(value TH) {
+static void llvm_finalize_handle(value TH) {
LLVMDisposeTypeHandle(Typehandle_val(TH));
}
return Val_bool(LLVMValueIsBasicBlock(Val));
}
+/*--... Operations on call sites ...........................................--*/
+
+/* llvalue -> int */
+CAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
+ return Val_int(LLVMGetInstructionCallConv(Inst));
+}
+
+/* int -> llvalue -> unit */
+CAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
+ LLVMSetInstructionCallConv(Inst, Int_val(CC));
+ return Val_unit;
+}
+
/*--... Operations on phi nodes ............................................--*/
/* (llvalue * llbasicblock) -> llvalue -> unit */
#define Builder_val(v) (*(LLVMBuilderRef *)(Data_custom_val(v)))
-void llvm_finalize_builder(value B) {
+static void llvm_finalize_builder(value B) {
LLVMDisposeBuilder(Builder_val(B));
}
custom_deserialize_default
};
+static value alloc_builder(LLVMBuilderRef B) {
+ value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
+ Builder_val(V) = B;
+ return V;
+}
+
+/* unit-> llbuilder */
+CAMLprim value llvm_builder(value Unit) {
+ return alloc_builder(LLVMCreateBuilder());
+}
+
/* llvalue -> llbuilder */
CAMLprim value llvm_builder_before(LLVMValueRef Inst) {
- value V;
LLVMBuilderRef B = LLVMCreateBuilder();
LLVMPositionBuilderBefore(B, Inst);
- V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
- Builder_val(V) = B;
- return V;
+ return alloc_builder(B);
}
/* llbasicblock -> llbuilder */
CAMLprim value llvm_builder_at_end(LLVMBasicBlockRef BB) {
- value V;
LLVMBuilderRef B = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(B, BB);
- V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
- Builder_val(V) = B;
- return V;
+ return alloc_builder(B);
}
/* llvalue -> llbuilder -> unit */