Adding bindings for target triple and data layout.
authorGordon Henriksen <gordonhenriksen@mac.com>
Thu, 27 Dec 2007 20:13:47 +0000 (20:13 +0000)
committerGordon Henriksen <gordonhenriksen@mac.com>
Thu, 27 Dec 2007 20:13:47 +0000 (20:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45369 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/ocaml/llvm/llvm.ml
bindings/ocaml/llvm/llvm.mli
bindings/ocaml/llvm/llvm_ocaml.c
include/llvm-c/Core.h
lib/VMCore/Core.cpp
test/Bindings/Ocaml/vmcore.ml

index b5d1d3df829eb4c4f4aa03d92759019002a6adac..457677b493a301b8f54dd978f469a98a8f57b56b 100644 (file)
@@ -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
index 8d9d21261df105cbc539cf56c12e6b69576f9322..8f2c9219e369470062de1c13bfef3a27134ed430 100644 (file)
@@ -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]
index d8856e74e4d75daadb778f9ef5f128ce9f8fad5c..d095550962297737f29e6fa720bd8d92f4f4d028 100644 (file)
@@ -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);
index 7dc1a07657b4c9515cd825924b8a90b2adecb7a6..3e5d201f07711452cf16995596fde4138f869cb2 100644 (file)
@@ -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);
index 6c57d741e9eff659828dff14aadec08ba758f169..701829bd7a635d9de0c926bbdc02e30bcdac7adc 100644 (file)
@@ -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));
 }
index 2597c6fa3a62af32e75862f2b130e64eea127ecc..6b103cb8fc985c51987c1550e8a5cc14a832d978 100644 (file)
@@ -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;