[PATCH] [OCaml] Build a wrapper for LLVMGetFunctionAddress

Ramkumar Ramachandra artagnon at gmail.com
Tue Dec 23 16:12:18 PST 2014


Note the limitations of gfa, fix tests.


http://reviews.llvm.org/D6761

Files:
  bindings/ocaml/executionengine/executionengine_ocaml.c
  bindings/ocaml/executionengine/llvm_executionengine.ml
  bindings/ocaml/executionengine/llvm_executionengine.mli
  test/Bindings/OCaml/executionengine.ml

Index: bindings/ocaml/executionengine/executionengine_ocaml.c
===================================================================
--- bindings/ocaml/executionengine/executionengine_ocaml.c
+++ bindings/ocaml/executionengine/executionengine_ocaml.c
@@ -120,3 +120,8 @@
                                              LLVMExecutionEngineRef EE) {
   return caml_copy_int64((int64_t) LLVMGetPointerToGlobal(EE, Global));
 }
+
+CAMLprim value llvm_ee_get_function_address(value Name,
+					    LLVMExecutionEngineRef EE) {
+  return caml_copy_int64((int64_t) LLVMGetFunctionAddress(EE, String_val(Name)));
+}
Index: bindings/ocaml/executionengine/llvm_executionengine.ml
===================================================================
--- bindings/ocaml/executionengine/llvm_executionengine.ml
+++ bindings/ocaml/executionengine/llvm_executionengine.ml
@@ -47,14 +47,23 @@
   = "llvm_ee_add_global_mapping"
 external get_pointer_to_global_ : Llvm.llvalue -> llexecutionengine -> int64
   = "llvm_ee_get_pointer_to_global"
+external get_function_address_ : string -> llexecutionengine -> int64
+  = "llvm_ee_get_function_address"
 
 let add_global_mapping llval ptr ee =
   add_global_mapping_ llval (Ctypes.raw_address_of_ptr (Ctypes.to_voidp ptr)) ee
 
 let get_pointer_to_global llval typ ee =
   Ctypes.coerce (let open Ctypes in ptr void) typ
                 (Ctypes.ptr_of_raw_address (get_pointer_to_global_ llval ee))
 
+let get_function_address name typ ee =
+  let ptr = get_function_address_ name ee in
+  if Int64.to_int ptr <> 0 then
+    Ctypes.coerce (let open Ctypes in ptr void) typ (Ctypes.ptr_of_raw_address ptr)
+  else
+    raise (Error ("Function " ^ name ^ " not found"))
+
 (* The following are not bound. Patches are welcome.
 target_machine : llexecutionengine -> Llvm_target.TargetMachine.t
  *)
Index: bindings/ocaml/executionengine/llvm_executionengine.mli
===================================================================
--- bindings/ocaml/executionengine/llvm_executionengine.mli
+++ bindings/ocaml/executionengine/llvm_executionengine.mli
@@ -82,3 +82,12 @@
     a function (e.g. [(int -> int) typ]) type for functions, and which
     will be live as long as [gv] and [ee] are. *)
 val get_pointer_to_global : Llvm.llvalue -> 'a Ctypes.typ -> llexecutionengine -> 'a
+
+(** [get_function_address fn typ ee] returns a pointer to the function
+    [fn] as type [typ], which will be a pointer type for a function
+    (e.g. [(int -> int) typ]), and which will be live as long as [fn]
+    and [ee] are. CAUTION: This function finalizes loaded modules;
+    calls to this function must be batched up and executed all-at-once
+    at the end, after which no further items may be added to the
+    module. *)
+val get_function_address : string -> 'a Ctypes.typ -> llexecutionengine -> 'a
Index: test/Bindings/OCaml/executionengine.ml
===================================================================
--- test/Bindings/OCaml/executionengine.ml
+++ test/Bindings/OCaml/executionengine.ml
@@ -50,7 +50,7 @@
   let ee = create m in
 
   (* add plus *)
-  let plus = define_plus m in
+  ignore (define_plus m);
 
   (* add module *)
   let m2 = create_module (global_context ()) "test_module2" in
@@ -75,7 +75,7 @@
 
   (* call plus *)
   let cplusty = Foreign.funptr (int32_t @-> int32_t @-> returning int32_t) in
-  let cplus   = get_pointer_to_global plus cplusty ee in
+  let cplus   = get_function_address "plus" cplusty ee in
   if 4l <> cplus 2l 2l then bomb "plus didn't work";
 
   (* call getglobal *)

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D6761.17612.patch
Type: text/x-patch
Size: 3536 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141224/a1c530af/attachment.bin>


More information about the llvm-commits mailing list