diff options
| author | Gordon Henriksen <gordonhenriksen@mac.com> | 2007-10-08 03:45:09 +0000 |
|---|---|---|
| committer | Gordon Henriksen <gordonhenriksen@mac.com> | 2007-10-08 03:45:09 +0000 |
| commit | 6d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7 (patch) | |
| tree | 01f0b3310d4b51e014b781cbf183bc225c00eee8 /bindings | |
| parent | f443ba7f9733cf7505b71f14760dd6109a9d6bde (diff) | |
| download | external_llvm-6d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7.zip external_llvm-6d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7.tar.gz external_llvm-6d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7.tar.bz2 | |
C and Objective Caml bindings for getFunction and getNamedGlobal. Also enhanced
the Objective Caml 'declare_*' functions to behave more or less like
getOrInsertFunction.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42740 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'bindings')
| -rw-r--r-- | bindings/ocaml/llvm/llvm.ml | 4 | ||||
| -rw-r--r-- | bindings/ocaml/llvm/llvm.mli | 4 | ||||
| -rw-r--r-- | bindings/ocaml/llvm/llvm_ocaml.c | 38 |
3 files changed, 45 insertions, 1 deletions
diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml index 9766d83..779066b 100644 --- a/bindings/ocaml/llvm/llvm.ml +++ b/bindings/ocaml/llvm/llvm.ml @@ -277,6 +277,8 @@ external declare_global : lltype -> string -> llmodule -> llvalue = "llvm_declare_global" external define_global : string -> llvalue -> llmodule -> llvalue = "llvm_define_global" +external lookup_global : string -> llmodule -> llvalue option + = "llvm_lookup_global" external delete_global : llvalue -> unit = "llvm_delete_global" external global_initializer : llvalue -> llvalue = "LLVMGetInitializer" external set_initializer : llvalue -> llvalue -> unit = "llvm_set_initializer" @@ -289,6 +291,8 @@ external declare_function : string -> lltype -> llmodule -> llvalue = "llvm_declare_function" external define_function : string -> lltype -> llmodule -> llvalue = "llvm_define_function" +external lookup_function : string -> llmodule -> llvalue option + = "llvm_lookup_function" external delete_function : llvalue -> unit = "llvm_delete_function" external params : llvalue -> llvalue array = "llvm_params" external param : llvalue -> int -> llvalue = "llvm_param" diff --git a/bindings/ocaml/llvm/llvm.mli b/bindings/ocaml/llvm/llvm.mli index ae37e9d..5e55b20 100644 --- a/bindings/ocaml/llvm/llvm.mli +++ b/bindings/ocaml/llvm/llvm.mli @@ -260,6 +260,8 @@ external declare_global : lltype -> string -> llmodule -> llvalue = "llvm_declare_global" external define_global : string -> llvalue -> llmodule -> llvalue = "llvm_define_global" +external lookup_global : string -> llmodule -> llvalue option + = "llvm_lookup_global" external delete_global : llvalue -> unit = "llvm_delete_global" external global_initializer : llvalue -> llvalue = "LLVMGetInitializer" external set_initializer : llvalue -> llvalue -> unit = "llvm_set_initializer" @@ -272,6 +274,8 @@ external declare_function : string -> lltype -> llmodule -> llvalue = "llvm_declare_function" external define_function : string -> lltype -> llmodule -> llvalue = "llvm_define_function" +external lookup_function : string -> llmodule -> llvalue option + = "llvm_lookup_function" external delete_function : llvalue -> unit = "llvm_delete_function" external params : llvalue -> llvalue array = "llvm_params" external param : llvalue -> int -> llvalue = "llvm_param" diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c index 61115f2..3eae5d9 100644 --- a/bindings/ocaml/llvm/llvm_ocaml.c +++ b/bindings/ocaml/llvm/llvm_ocaml.c @@ -20,7 +20,7 @@ #include "caml/custom.h" #include "caml/mlvalues.h" #include "caml/memory.h" -#include "llvm/Config/config.h" +#include "llvm/Config/config.h" /*===-- Modules -----------------------------------------------------------===*/ @@ -402,9 +402,27 @@ CAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) { /* lltype -> string -> llmodule -> llvalue */ CAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name, LLVMModuleRef M) { + LLVMValueRef GlobalVar; + if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { + if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) + return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty)); + return GlobalVar; + } return LLVMAddGlobal(M, Ty, String_val(Name)); } +/* string -> llmodule -> llvalue option */ +CAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) { + CAMLparam1(Name); + LLVMValueRef GlobalVar; + if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { + value Option = caml_alloc(1, 1); + Field(Option, 0) = (value) GlobalVar; + CAMLreturn(Option); + } + CAMLreturn(Val_int(0)); +} + /* string -> llvalue -> llmodule -> llvalue */ CAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer, LLVMModuleRef M) { @@ -461,9 +479,27 @@ CAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) { /* string -> lltype -> llmodule -> llvalue */ CAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty, LLVMModuleRef M) { + LLVMValueRef Fn; + if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { + if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty) + return LLVMConstBitCast(Fn, LLVMPointerType(Ty)); + return Fn; + } return LLVMAddFunction(M, String_val(Name), Ty); } +/* string -> llmodule -> llvalue option */ +CAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) { + CAMLparam1(Name); + LLVMValueRef Fn; + if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { + value Option = caml_alloc(1, 1); + Field(Option, 0) = (value) Fn; + CAMLreturn(Option); + } + CAMLreturn(Val_int(0)); +} + /* string -> lltype -> llmodule -> llvalue */ CAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty, LLVMModuleRef M) { |
