diff options
| -rw-r--r-- | bindings/ocaml/llvm/llvm.ml | 8 | ||||
| -rw-r--r-- | bindings/ocaml/llvm/llvm.mli | 21 | ||||
| -rw-r--r-- | bindings/ocaml/llvm/llvm_ocaml.c | 22 | ||||
| -rw-r--r-- | include/llvm-c/Core.h | 8 | ||||
| -rw-r--r-- | lib/VMCore/Core.cpp | 19 | ||||
| -rw-r--r-- | test/Bindings/Ocaml/vmcore.ml | 20 | 
6 files changed, 98 insertions, 0 deletions
| diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml index b5d1d3d..457677b 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 8d9d212..8f2c921 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 d8856e7..d095550 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 7dc1a07..3e5d201 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 6c57d74..701829b 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 2597c6f..6b103cb 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; | 
