From a353ffa7e556bfd2864474911174da691117f691 Mon Sep 17 00:00:00 2001 From: Gordon Henriksen Date: Thu, 27 Dec 2007 20:13:47 +0000 Subject: [PATCH] Adding bindings for target triple and data layout. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45369 91177308-0d34-0410-b5e6-96231b3b80d8 --- bindings/ocaml/llvm/llvm.ml | 8 ++++++++ bindings/ocaml/llvm/llvm.mli | 21 +++++++++++++++++++++ bindings/ocaml/llvm/llvm_ocaml.c | 22 ++++++++++++++++++++++ include/llvm-c/Core.h | 8 ++++++++ lib/VMCore/Core.cpp | 19 +++++++++++++++++++ test/Bindings/Ocaml/vmcore.ml | 20 ++++++++++++++++++++ 6 files changed, 98 insertions(+) diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml index b5d1d3df829..457677b493a 100644 --- a/bindings/ocaml/llvm/llvm.ml +++ b/bindings/ocaml/llvm/llvm.ml @@ -107,6 +107,14 @@ let _ = register_exns (IoError "") external create_module : string -> llmodule = "llvm_create_module" external dispose_module : llmodule -> unit = "llvm_dispose_module" +external target_triple: llmodule -> string + = "llvm_target_triple" +external set_target_triple: string -> llmodule -> unit + = "llvm_set_target_triple" +external data_layout: llmodule -> string + = "llvm_data_layout" +external set_data_layout: string -> llmodule -> unit + = "llvm_set_data_layout" external define_type_name : string -> lltype -> llmodule -> bool = "llvm_add_type_name" external delete_type_name : string -> llmodule -> unit diff --git a/bindings/ocaml/llvm/llvm.mli b/bindings/ocaml/llvm/llvm.mli index 8d9d21261df..8f2c9219e36 100644 --- a/bindings/ocaml/llvm/llvm.mli +++ b/bindings/ocaml/llvm/llvm.mli @@ -162,6 +162,27 @@ external create_module : string -> llmodule = "llvm_create_module" [llvm::Module::~Module]. **) external dispose_module : llmodule -> unit = "llvm_dispose_module" +(** [target_triple m] is the target specifier for the module [m], something like + [i686-apple-darwin8]. See the method [llvm::Module::getTargetTriple]. **) +external target_triple: llmodule -> string + = "llvm_target_triple" + +(** [target_triple triple m] changes the target specifier for the module [m] to + the string [triple]. See the method [llvm::Module::setTargetTriple]. **) +external set_target_triple: string -> llmodule -> unit + = "llvm_set_target_triple" + +(** [data_layout m] is the data layout specifier for the module [m], something + like [e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-...-a0:0:64-f80:128:128]. See the + method [llvm::Module::getDataLayout]. **) +external data_layout: llmodule -> string + = "llvm_data_layout" + +(** [set_data_layout s m] changes the data layout specifier for the module [m] + to the string [s]. See the method [llvm::Module::setDataLayout]. **) +external set_data_layout: string -> llmodule -> unit + = "llvm_set_data_layout" + (** [define_type_name name ty m] adds a named type to the module's symbol table. Returns [true] if successful. If such a name already exists, then no entry is added and [false] is returned. See the [llvm::Module::addTypeName] diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c index d8856e74e4d..d0955509622 100644 --- a/bindings/ocaml/llvm/llvm_ocaml.c +++ b/bindings/ocaml/llvm/llvm_ocaml.c @@ -62,6 +62,28 @@ CAMLprim value llvm_dispose_module(LLVMModuleRef M) { 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); diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h index 7dc1a07657b..3e5d201f077 100644 --- a/include/llvm-c/Core.h +++ b/include/llvm-c/Core.h @@ -149,6 +149,14 @@ void LLVMDisposeMessage(char *Message); LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID); void LLVMDisposeModule(LLVMModuleRef M); +/* Data layout */ +const char *LLVMGetDataLayout(LLVMModuleRef M); +void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple); + +/* Target triple */ +const char *LLVMGetTarget(LLVMModuleRef M); +void LLVMSetTarget(LLVMModuleRef M, const char *Triple); + /* Same as Module::addTypeName. */ int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty); void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name); diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index 6c57d741e9e..701829bd7a6 100644 --- a/lib/VMCore/Core.cpp +++ b/lib/VMCore/Core.cpp @@ -43,6 +43,25 @@ void LLVMDisposeModule(LLVMModuleRef M) { delete unwrap(M); } +/*--.. Data layout .........................................................--*/ +const char * LLVMGetDataLayout(LLVMModuleRef M) { + return unwrap(M)->getDataLayout().c_str(); +} + +void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple) { + unwrap(M)->setDataLayout(Triple); +} + +/*--.. Target triple .......................................................--*/ +const char * LLVMGetTarget(LLVMModuleRef M) { + return unwrap(M)->getTargetTriple().c_str(); +} + +void LLVMSetTarget(LLVMModuleRef M, const char *Triple) { + unwrap(M)->setTargetTriple(Triple); +} + +/*--.. Type names ..........................................................--*/ int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty) { return unwrap(M)->addTypeName(Name, unwrap(Ty)); } diff --git a/test/Bindings/Ocaml/vmcore.ml b/test/Bindings/Ocaml/vmcore.ml index 2597c6fa3a6..6b103cb8fc9 100644 --- a/test/Bindings/Ocaml/vmcore.ml +++ b/test/Bindings/Ocaml/vmcore.ml @@ -36,6 +36,25 @@ let filename = Sys.argv.(1) let m = create_module filename +(*===-- Target ------------------------------------------------------------===*) + +let test_target () = + begin group "triple"; + (* RUN: grep "i686-apple-darwin8" < %t.ll + *) + let trip = "i686-apple-darwin8" in + set_target_triple trip m; + insist (trip = target_triple m) + end; + + begin group "layout"; + (* RUN: grep "bogus" < %t.ll + *) + let layout = "bogus" in + set_data_layout layout m; + insist (layout = data_layout m) + end + (*===-- Types -------------------------------------------------------------===*) let test_types () = @@ -823,6 +842,7 @@ let test_writer () = (*===-- Driver ------------------------------------------------------------===*) let _ = + suite "target" test_target; suite "types" test_types; suite "constants" test_constants; suite "global values" test_global_values; -- 2.34.1