diff --git a/bindings/ocaml/executionengine/Makefile b/bindings/ocaml/executionengine/Makefile index 445e0ea4019..40fb98e1914 100644 --- a/bindings/ocaml/executionengine/Makefile +++ b/bindings/ocaml/executionengine/Makefile @@ -15,6 +15,6 @@ LEVEL := ../../.. LIBRARYNAME := llvm_executionengine DONT_BUILD_RELINKED := 1 UsedComponents := executionengine jit interpreter native -UsedOcamlInterfaces := llvm +UsedOcamlInterfaces := llvm llvm_target include ../Makefile.ocaml diff --git a/bindings/ocaml/executionengine/llvm_executionengine.ml b/bindings/ocaml/executionengine/llvm_executionengine.ml index a73fc1e4bae..4b9132df052 100644 --- a/bindings/ocaml/executionengine/llvm_executionengine.ml +++ b/bindings/ocaml/executionengine/llvm_executionengine.ml @@ -82,6 +82,9 @@ module ExecutionEngine = struct = "llvm_ee_run_function_as_main" external free_machine_code: Llvm.llvalue -> t -> unit = "llvm_ee_free_machine_code" + + external target_data: t -> Llvm_target.TargetData.t + = "LLVMGetExecutionEngineTargetData" (* The following are not bound. Patches are welcome. diff --git a/bindings/ocaml/executionengine/llvm_executionengine.mli b/bindings/ocaml/executionengine/llvm_executionengine.mli index d3037fe8568..9794f358fff 100644 --- a/bindings/ocaml/executionengine/llvm_executionengine.mli +++ b/bindings/ocaml/executionengine/llvm_executionengine.mli @@ -147,4 +147,8 @@ module ExecutionEngine: sig (** [free_machine_code f ee] releases the memory in the execution engine [ee] used to store the machine code for the function [f]. *) val free_machine_code: Llvm.llvalue -> t -> unit + + (** [target_data ee] is the target data owned by the execution engine + [ee]. *) + val target_data: t -> Llvm_target.TargetData.t end diff --git a/include/llvm-c/ExecutionEngine.h b/include/llvm-c/ExecutionEngine.h index cfa6f521bf1..b1d130c20fe 100644 --- a/include/llvm-c/ExecutionEngine.h +++ b/include/llvm-c/ExecutionEngine.h @@ -20,6 +20,7 @@ #define LLVM_C_EXECUTIONENGINE_H #include "llvm-c/Core.h" +#include "llvm-c/Target.h" #ifdef __cplusplus extern "C" { @@ -88,6 +89,8 @@ int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE, int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, LLVMValueRef *OutFn); +LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE); + #ifdef __cplusplus } diff --git a/lib/ExecutionEngine/ExecutionEngineBindings.cpp b/lib/ExecutionEngine/ExecutionEngineBindings.cpp index 20ee78044cf..4dc0add0699 100644 --- a/lib/ExecutionEngine/ExecutionEngineBindings.cpp +++ b/lib/ExecutionEngine/ExecutionEngineBindings.cpp @@ -187,3 +187,7 @@ int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, } return 1; } + +LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) { + return wrap(unwrap(EE)->getTargetData()); +} diff --git a/test/Bindings/Ocaml/executionengine.ml b/test/Bindings/Ocaml/executionengine.ml index a091098b5b4..d238076a065 100644 --- a/test/Bindings/Ocaml/executionengine.ml +++ b/test/Bindings/Ocaml/executionengine.ml @@ -1,9 +1,10 @@ -(* RUN: %ocamlc -warn-error A llvm.cma llvm_executionengine.cma %s -o %t +(* RUN: %ocamlc -warn-error A llvm.cma llvm_target.cma llvm_executionengine.cma %s -o %t * RUN: ./%t %t.bc *) open Llvm open Llvm_executionengine +open Llvm_target (* Note that this takes a moment to link, so it's best to keep the number of individual tests low. *) @@ -92,6 +93,13 @@ let test_executionengine () = (* run_static_dtors *) ExecutionEngine.run_static_dtors ee; + + (* Show that the target data binding links and runs.*) + let td = ExecutionEngine.target_data ee in + + (* Demonstrate that a garbage pointer wasn't returned. *) + let ty = intptr_type td in + if ty != i32_type && ty != i64_type then bomb "target_data did not work"; (* dispose *) ExecutionEngine.dispose ee