[llvm-commits] [llvm] r42093 - in /llvm/trunk: ./ bindings/ bindings/ocaml/ bindings/ocaml/bitwriter/ bindings/ocaml/llvm/ test/Bindings/ test/Bindings/Ocaml/ test/lib/

Bill Wendling isanbard at gmail.com
Sat Sep 22 00:50:35 PDT 2007


Hi Gordon,

> ====================================================================== 
> ========
> --- llvm/trunk/bindings/ocaml/bitwriter/Makefile (added)
> +++ llvm/trunk/bindings/ocaml/bitwriter/Makefile Tue Sep 18  
> 07:49:39 2007
> @@ -0,0 +1,23 @@
> +##===- bindings/ocaml/llvm/Makefile ------------------------*-  
> Makefile -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file was developed by the LLVM research group and is  
> distributed under
> +# the University of Illinois Open Source License. See LICENSE.TXT  
> for details.
> +#
> +##===---------------------------------------------------------------- 
> ------===##
> +#
> +# This is the makefile for the llvm-ml interface. Reference  
> materials on
> +# installing ocaml libraries:
> +#
> +#   https://fedoraproject.org/wiki/Packaging/OCaml
> +#   http://pkg-ocaml-maint.alioth.debian.org/ 
> ocaml_packaging_policy.txt
> +#
> +##===---------------------------------------------------------------- 
> ------===##
> +
> +LEVEL := ../../..
> +LIBRARYNAME := llvm_bitwriter
> +DONT_BUILD_RELINKED := 1
> +UsedComponents := bitwriter
> +
> +include ../Makefile.ocaml
>
This won't work if source dir != obj directory. It won't find the  
Makefile.ocaml unless it's also copied over...

> ====================================================================== 
> ========
> --- llvm/trunk/bindings/ocaml/llvm/Makefile (added)
> +++ llvm/trunk/bindings/ocaml/llvm/Makefile Tue Sep 18 07:49:39 2007
> @@ -0,0 +1,24 @@
> +##===- bindings/ocaml/bitwriter/Makefile -------------------*-  
> Makefile -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file was developed by the LLVM research group and is  
> distributed under
> +# the University of Illinois Open Source License. See LICENSE.TXT  
> for details.
> +#
> +##===---------------------------------------------------------------- 
> ------===##
> +#
> +# This is the makefile for the llvm-ml interface. Reference  
> materials on
> +# installing ocaml libraries:
> +#
> +#   https://fedoraproject.org/wiki/Packaging/OCaml
> +#   http://pkg-ocaml-maint.alioth.debian.org/ 
> ocaml_packaging_policy.txt
> +#
> +##===---------------------------------------------------------------- 
> ------===##
> +
> +LEVEL := ../../..
> +LIBRARYNAME := llvm
> +DONT_BUILD_RELINKED := 1
> +UsedComponents := core
> +UsedOcamLibs := llvm
> +
> +include ../Makefile.ocaml
>
> Added: llvm/trunk/bindings/ocaml/llvm/llvm.ml
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ 
> llvm/llvm.ml?rev=42093&view=auto
>
> ====================================================================== 
> ========
> --- llvm/trunk/bindings/ocaml/llvm/llvm.ml (added)
> +++ llvm/trunk/bindings/ocaml/llvm/llvm.ml Tue Sep 18 07:49:39 2007
> @@ -0,0 +1,228 @@
> +(*===-- tools/ml/llvm.ml - LLVM Ocaml Interface  
> ---------------------------===*
> + *
> + *                     The LLVM Compiler Infrastructure
> + *
> + * This file was developed by Gordon Henriksen and is distributed  
> under the
> + * University of Illinois Open Source License. See LICENSE.TXT for  
> details.
> + *
> +  
> *===------------------------------------------------------------------ 
> ----===
> + *
> + * This interface provides an ocaml API for the LLVM intermediate
> + * representation, the classes in the VMCore library.
> + *
> +  
> *===------------------------------------------------------------------ 
> ----===*)
> +
> +
> +(* These abstract types correlate directly to the LLVM VMCore  
> classes. *)
> +type llmodule
> +type lltype
> +type llvalue
> +
> +type type_kind =
> +  Void_type
> +| Float_type
> +| Double_type
> +| X86fp80_type
> +| Fp128_type
> +| Ppc_fp128_type
> +| Label_type
> +| Integer_type
> +| Function_type
> +| Struct_type
> +| Array_type
> +| Pointer_type
> +| Opaque_type
> +| Vector_type
> +
> +type linkage =
> +  External_linkage
> +| Link_once_linkage
> +| Weak_linkage
> +| Appending_linkage
> +| Internal_linkage
> +| Dllimport_linkage
> +| Dllexport_linkage
> +| External_weak_linkage
> +| Ghost_linkage
> +
> +type visibility =
> +  Default_visibility
> +| Hidden_visibility
> +| Protected_visibility
> +
> +
> +(*===-- Modules  
> -----------------------------------------------------------===*)
> +
> +(* Creates a module with the supplied module ID. Modules are not  
> garbage
> +   collected; it is mandatory to call dispose_module to free  
> memory. *)
> +external create_module : string -> llmodule = "llvm_create_module"
> +
> +(* Disposes a module. All references to subordinate objects are  
> invalidated;
> +   referencing them will invoke undefined behavior. *)
> +external dispose_module : llmodule -> unit = "llvm_dispose_module"
> +
> +(* 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  
> returns false. *)
> +external add_type_name : string -> lltype -> llmodule -> bool
> +                       = "llvm_add_type_name"
> +
> +
> +(*===-- Types  
> -------------------------------------------------------------===*)
> +
> +external classify_type : lltype -> type_kind = "llvm_classify_type"
> +external refine_abstract_type : lltype -> lltype -> unit
> +                              = "llvm_refine_abstract_type"
> +
> +(*--... Operations on integer  
> types ........................................--*)
> +external _i1_type : unit -> lltype = "llvm_i1_type"
> +external _i8_type : unit -> lltype = "llvm_i8_type"
> +external _i16_type : unit -> lltype = "llvm_i16_type"
> +external _i32_type : unit -> lltype = "llvm_i32_type"
> +external _i64_type : unit -> lltype = "llvm_i64_type"
> +
> +let i1_type = _i1_type ()
> +let i8_type = _i8_type ()
> +let i16_type = _i16_type ()
> +let i32_type = _i32_type ()
> +let i64_type = _i64_type ()
> +
> +external make_integer_type : int -> lltype = "llvm_make_integer_type"
> +external integer_bitwidth : lltype -> int = "llvm_integer_bitwidth"
> +
> +(*--... Operations on real  
> types ...........................................--*)
> +external _float_type : unit -> lltype = "llvm_float_type"
> +external _double_type : unit -> lltype = "llvm_double_type"
> +external _x86fp80_type : unit -> lltype = "llvm_x86fp80_type"
> +external _fp128_type : unit -> lltype = "llvm_fp128_type"
> +external _ppc_fp128_type : unit -> lltype = "llvm_ppc_fp128_type"
> +
> +let float_type = _float_type ()
> +let double_type = _double_type ()
> +let x86fp80_type = _x86fp80_type ()
> +let fp128_type = _fp128_type ()
> +let ppc_fp128_type = _ppc_fp128_type ()
> +
> +(*--... Operations on function  
> types .......................................--*)
> +(* FIXME: handle parameter attributes *)
> +external make_function_type : lltype -> lltype array -> bool ->  
> lltype
> +                            = "llvm_make_function_type"
> +external is_var_arg : lltype -> bool = "llvm_is_var_arg"
> +external return_type : lltype -> lltype = "llvm_return_type"
> +external param_types : lltype -> lltype array = "llvm_param_types"
> +
> +(*--... Operations on struct  
> types .........................................--*)
> +external make_struct_type : lltype array -> bool -> lltype
> +                          = "llvm_make_struct_type"
> +external element_types : lltype -> lltype array =  
> "llvm_element_types"
> +external is_packed : lltype -> bool = "llvm_is_packed"
> +
> +(*--... Operations on pointer, vector, and array  
> types .....................--*)
> +external make_array_type : lltype -> int -> lltype =  
> "llvm_make_array_type"
> +external make_pointer_type : lltype -> lltype =  
> "llvm_make_pointer_type"
> +external make_vector_type : lltype -> int -> lltype =  
> "llvm_make_vector_type"
> +
> +external element_type : lltype -> lltype = "llvm_element_type"
> +external array_length : lltype -> int = "llvm_array_length"
> +external vector_size : lltype -> int = "llvm_vector_size"
> +
> +(*--... Operations on other  
> types ..........................................--*)
> +external make_opaque_type : unit -> lltype = "llvm_make_opaque_type"
> +external _void_type : unit -> lltype = "llvm_void_type"
> +external _label_type : unit -> lltype = "llvm_label_type"
> +
> +let void_type = _void_type ()
> +let label_type = _label_type ()
> +
> +
> +(*===-- Values  
> ------------------------------------------------------------===*)
> +
> +external type_of : llvalue -> lltype = "llvm_type_of"
> +external value_name : llvalue -> string = "llvm_value_name"
> +external set_value_name : string -> llvalue -> unit =  
> "llvm_set_value_name"
> +
> +(*--... Operations on constants of (mostly) any  
> type .......................--*)
> +external make_null : lltype -> llvalue = "llvm_make_null"
> +external make_all_ones : lltype -> llvalue = "llvm_make_all_ones"
> +external make_undef : lltype -> llvalue = "llvm_make_undef"
> +external is_null : llvalue -> bool = "llvm_is_null"
> +
> +(*--... Operations on scalar  
> constants .....................................--*)
> +external make_int_constant : lltype -> int -> bool -> llvalue
> +                           = "llvm_make_int_constant"
> +external make_real_constant : lltype -> float -> llvalue
> +                            = "llvm_make_real_constant"
> +
> +(*--... Operations on composite  
> constants ..................................--*)
> +external make_string_constant : string -> bool -> llvalue
> +                              = "llvm_make_string_constant"
> +external make_array_constant : lltype -> llvalue array -> llvalue
> +                             = "llvm_make_array_constant"
> +external make_struct_constant : llvalue array -> bool -> llvalue
> +                              = "llvm_make_struct_constant"
> +external make_vector_constant : llvalue array -> llvalue
> +                              = "llvm_make_vector_constant"
> +
> +(*--... Operations on global variables, functions, and aliases  
> (globals) ...--*)
> +external is_declaration : llvalue -> bool = "llvm_is_declaration"
> +external linkage : llvalue -> linkage = "llvm_linkage"
> +external set_linkage : linkage -> llvalue -> unit =  
> "llvm_set_linkage"
> +external section : llvalue -> string = "llvm_section"
> +external set_section : string -> llvalue -> unit = "llvm_set_section"
> +external visibility : llvalue -> visibility = "llvm_visibility"
> +external set_visibility : visibility -> llvalue -> unit =  
> "llvm_set_visibility"
> +external alignment : llvalue -> int = "llvm_alignment"
> +external set_alignment : int -> llvalue -> unit =  
> "llvm_set_alignment"
> +
> +(*--... Operations on global  
> variables .....................................--*)
> +external declare_global : lltype -> string -> llmodule -> llvalue
> +                        = "llvm_declare_global"
> +external define_global : string -> llvalue -> llmodule -> llvalue
> +                       = "llvm_define_global"
> +external delete_global : llvalue -> unit = "llvm_delete_global"
> +external global_initializer : llvalue -> llvalue =  
> "llvm_global_initializer"
> +external set_initializer : llvalue -> llvalue -> unit =  
> "llvm_set_initializer"
> +external remove_initializer : llvalue -> unit =  
> "llvm_remove_initializer"
> +external is_thread_local : llvalue -> bool = "llvm_is_thread_local"
> +external set_thread_local : bool -> llvalue -> unit =  
> "llvm_set_thread_local"
> +
> +
> +(*===-- Non-Externs  
> -------------------------------------------------------===*)
> +(* These functions are built using the externals, so must be  
> declared late.   *)
> +
> +let concat2 sep arr =
> +  let s = ref "" in
> +  if 0 < Array.length arr then begin
> +    s := !s ^ arr.(0);
> +    for i = 1 to (Array.length arr) - 1 do
> +      s := !s ^ sep ^ arr.(i)
> +    done
> +  end;
> +  !s
> +
> +let rec string_of_lltype ty =
> +  match classify_type ty with
> +    Integer_type -> "i" ^ string_of_int (integer_bitwidth ty)
> +  | Pointer_type -> (string_of_lltype (element_type ty)) ^ "*"
> +  | Struct_type ->
> +      let s = "{ " ^ (concat2 ", " (
> +                Array.map string_of_lltype (element_types ty)
> +              )) ^ " }" in
> +      if is_packed ty
> +        then "<" ^ s ^ ">"
> +        else s
> +  | Array_type -> "["   ^ (string_of_int (array_length ty)) ^
> +                  " x " ^ (string_of_lltype (element_type ty)) ^ "]"
> +  | Vector_type -> "<"   ^ (string_of_int (vector_size ty)) ^
> +                   " x " ^ (string_of_lltype (element_type ty)) ^ ">"
> +  | Opaque_type -> "opaque"
> +  | Function_type -> string_of_lltype (return_type ty) ^
> +                     " (" ^ (concat2 ", " (
> +                       Array.map string_of_lltype (param_types ty)
> +                     )) ^ ")"
> +  | Label_type -> "label"
> +  | Ppc_fp128_type -> "ppc_fp128"
> +  | Fp128_type -> "fp128"
> +  | X86fp80_type -> "x86_fp80"
> +  | Double_type -> "double"
> +  | Float_type -> "float"
> +  | Void_type -> "void"
>
> Added: llvm/trunk/bindings/ocaml/llvm/llvm.mli
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ 
> llvm/llvm.mli?rev=42093&view=auto
>
> ====================================================================== 
> ========
> --- llvm/trunk/bindings/ocaml/llvm/llvm.mli (added)
> +++ llvm/trunk/bindings/ocaml/llvm/llvm.mli Tue Sep 18 07:49:39 2007
> @@ -0,0 +1,170 @@
> +(*===-- tools/ml/llvm.ml - LLVM Ocaml Interface  
> ---------------------------===*
> + *
> + *                     The LLVM Compiler Infrastructure
> + *
> + * This file was developed by Gordon Henriksen and is distributed  
> under the
> + * University of Illinois Open Source License. See LICENSE.TXT for  
> details.
> + *
> +  
> *===------------------------------------------------------------------ 
> ----===
> + *
> + * This interface provides an ocaml API for the LLVM intermediate
> + * representation, the classes in the VMCore library.
> + *
> +  
> *===------------------------------------------------------------------ 
> ----===*)
> +
> +
> +(* These abstract types correlate directly to the LLVM VMCore  
> classes. *)
> +type llmodule
> +type lltype
> +type llvalue
> +
> +type type_kind =
> +  Void_type
> +| Float_type
> +| Double_type
> +| X86fp80_type
> +| Fp128_type
> +| Ppc_fp128_type
> +| Label_type
> +| Integer_type
> +| Function_type
> +| Struct_type
> +| Array_type
> +| Pointer_type
> +| Opaque_type
> +| Vector_type
> +
> +type linkage =
> +  External_linkage
> +| Link_once_linkage
> +| Weak_linkage
> +| Appending_linkage
> +| Internal_linkage
> +| Dllimport_linkage
> +| Dllexport_linkage
> +| External_weak_linkage
> +| Ghost_linkage
> +
> +type visibility =
> +  Default_visibility
> +| Hidden_visibility
> +| Protected_visibility
> +
> +
> +(*===-- Modules  
> -----------------------------------------------------------===*)
> +
> +(* Creates a module with the supplied module ID. Modules are not  
> garbage
> +   collected; it is mandatory to call dispose_module to free  
> memory. *)
> +external create_module : string -> llmodule = "llvm_create_module"
> +
> +(* Disposes a module. All references to subordinate objects are  
> invalidated;
> +   referencing them will invoke undefined behavior. *)
> +external dispose_module : llmodule -> unit = "llvm_dispose_module"
> +
> +(* 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  
> returns false. *)
> +external add_type_name : string -> lltype -> llmodule -> bool
> +                       = "llvm_add_type_name"
> +
> +
> +(*===-- Types  
> -------------------------------------------------------------===*)
> +external classify_type : lltype -> type_kind = "llvm_classify_type"
> +external refine_abstract_type : lltype -> lltype -> unit
> +                              = "llvm_refine_abstract_type"
> +val string_of_lltype : lltype -> string
> +
> +(*--... Operations on integer  
> types ........................................--*)
> +val i1_type : lltype
> +val i8_type : lltype
> +val i16_type : lltype
> +val i32_type : lltype
> +val i64_type : lltype
> +external make_integer_type : int -> lltype = "llvm_make_integer_type"
> +external integer_bitwidth : lltype -> int = "llvm_integer_bitwidth"
> +
> +(*--... Operations on real  
> types ...........................................--*)
> +val float_type : lltype
> +val double_type : lltype
> +val x86fp80_type : lltype
> +val fp128_type : lltype
> +val ppc_fp128_type : lltype
> +
> +(*--... Operations on function  
> types .......................................--*)
> +(* FIXME: handle parameter  
> attributes                                         *)
> +external make_function_type : lltype -> lltype array -> bool ->  
> lltype
> +                            = "llvm_make_function_type"
> +external is_var_arg : lltype -> bool = "llvm_is_var_arg"
> +external return_type : lltype -> lltype = "llvm_return_type"
> +external param_types : lltype -> lltype array = "llvm_param_types"
> +
> +(*--... Operations on struct  
> types .........................................--*)
> +external make_struct_type : lltype array -> bool -> lltype
> +                          = "llvm_make_struct_type"
> +external element_types : lltype -> lltype array =  
> "llvm_element_types"
> +external is_packed : lltype -> bool = "llvm_is_packed"
> +
> +(*--... Operations on pointer, vector, and array  
> types .....................--*)
> +external make_array_type : lltype -> int -> lltype =  
> "llvm_make_array_type"
> +external make_pointer_type : lltype -> lltype =  
> "llvm_make_pointer_type"
> +external make_vector_type : lltype -> int -> lltype =  
> "llvm_make_vector_type"
> +
> +external element_type : lltype -> lltype = "llvm_element_type"
> +external array_length : lltype -> int = "llvm_array_length"
> +external vector_size : lltype -> int = "llvm_vector_size"
> +
> +(*--... Operations on other  
> types ..........................................--*)
> +external make_opaque_type : unit -> lltype = "llvm_make_opaque_type"
> +val void_type : lltype
> +val label_type : lltype
> +
> +
> +(*===-- Values  
> ------------------------------------------------------------===*)
> +external type_of : llvalue -> lltype = "llvm_type_of"
> +external value_name : llvalue -> string = "llvm_value_name"
> +external set_value_name : string -> llvalue -> unit =  
> "llvm_set_value_name"
> +
> +(*--... Operations on constants of (mostly) any  
> type .......................--*)
> +external make_null : lltype -> llvalue = "llvm_make_null"
> +external make_all_ones : lltype -> llvalue = "llvm_make_all_ones"
> +external make_undef : lltype -> llvalue = "llvm_make_undef"
> +external is_null : llvalue -> bool = "llvm_is_null"
> +
> +(*--... Operations on scalar  
> constants .....................................--*)
> +external make_int_constant : lltype -> int -> bool -> llvalue
> +                           = "llvm_make_int_constant"
> +external make_real_constant : lltype -> float -> llvalue
> +                            = "llvm_make_real_constant"
> +
> +(*--... Operations on composite  
> constants ..................................--*)
> +external make_string_constant : string -> bool -> llvalue
> +                              = "llvm_make_string_constant"
> +external make_array_constant : lltype -> llvalue array -> llvalue
> +                             = "llvm_make_array_constant"
> +external make_struct_constant : llvalue array -> bool -> llvalue
> +                              = "llvm_make_struct_constant"
> +external make_vector_constant : llvalue array -> llvalue
> +                              = "llvm_make_vector_constant"
> +
> +(*--... Operations on global variables, functions, and aliases  
> (globals) ...--*)
> +external is_declaration : llvalue -> bool = "llvm_is_declaration"
> +external linkage : llvalue -> linkage = "llvm_linkage"
> +external set_linkage : linkage -> llvalue -> unit =  
> "llvm_set_linkage"
> +external section : llvalue -> string = "llvm_section"
> +external set_section : string -> llvalue -> unit = "llvm_set_section"
> +external visibility : llvalue -> visibility = "llvm_visibility"
> +external set_visibility : visibility -> llvalue -> unit =  
> "llvm_set_visibility"
> +external alignment : llvalue -> int = "llvm_alignment"
> +external set_alignment : int -> llvalue -> unit =  
> "llvm_set_alignment"
> +
> +(*--... Operations on global  
> variables .....................................--*)
> +external declare_global : lltype -> string -> llmodule -> llvalue
> +                        = "llvm_declare_global"
> +external define_global : string -> llvalue -> llmodule -> llvalue
> +                       = "llvm_define_global"
> +external delete_global : llvalue -> unit = "llvm_delete_global"
> +external global_initializer : llvalue -> llvalue =  
> "llvm_global_initializer"
> +external set_initializer : llvalue -> llvalue -> unit =  
> "llvm_set_initializer"
> +external remove_initializer : llvalue -> unit =  
> "llvm_remove_initializer"
> +external is_thread_local : llvalue -> bool = "llvm_is_thread_local"
> +external set_thread_local : bool -> llvalue -> unit =  
> "llvm_set_thread_local"
> +
>
> Added: llvm/trunk/bindings/ocaml/llvm/llvm_ocaml.c
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ 
> llvm/llvm_ocaml.c?rev=42093&view=auto
>
> ====================================================================== 
> ========
> --- llvm/trunk/bindings/ocaml/llvm/llvm_ocaml.c (added)
> +++ llvm/trunk/bindings/ocaml/llvm/llvm_ocaml.c Tue Sep 18 07:49:39  
> 2007
> @@ -0,0 +1,410 @@
> +/*===-- llvm_ocaml.h - LLVM Ocaml Glue -------------------------- 
> *- C++ -*-===*\
> +| 
> *                                                                      
>        *|
> +|*                     The LLVM Compiler  
> Infrastructure                       *|
> +| 
> *                                                                      
>        *|
> +|* This file was developed by Gordon Henriksen and is distributed  
> under the   *|
> +|* University of Illinois Open Source License. See LICENSE.TXT for  
> details.   *|
> +| 
> *                                                                      
>        *|
> +| 
> *===------------------------------------------------------------------ 
> ----===*|
> +| 
> *                                                                      
>        *|
> +|* This file glues LLVM's ocaml interface to its C interface.  
> These functions *|
> +|* are by and large transparent wrappers to the corresponding C  
> functions.    *|
> +| 
> *                                                                      
>        *|
> +|* Note that these functions intentionally take liberties with the  
> CAMLparamX *|
> +|* macros, since most of the parameters are not GC heap  
> objects.              *|
> +| 
> *                                                                      
>        *|
> + 
> \*===----------------------------------------------------------------- 
> -----===*/
> +
> +#include "llvm-c/Core.h"
> +#include "caml/alloc.h"
> +#include "caml/mlvalues.h"
> +#include "caml/memory.h"
> +#include "stdio.h"
> +
> +
> +/*===-- Modules  
> -----------------------------------------------------------===*/
> +
> +/* string -> llmodule */
> +CAMLprim value llvm_create_module(value ModuleID) {
> +  return (value) LLVMModuleCreateWithName(String_val(ModuleID));
> +}
> +
> +/* llmodule -> unit */
> +CAMLprim value llvm_dispose_module(value M) {
> +  LLVMDisposeModule((LLVMModuleRef) M);
> +  return Val_unit;
> +}
> +
> +/* string -> lltype -> llmodule -> bool */
> +CAMLprim value llvm_add_type_name(value Name, value Ty, value M) {
> +  int res = LLVMAddTypeName((LLVMModuleRef) M,
> +                            String_val(Name), (LLVMTypeRef) Ty);
> +  return Val_bool(res == 0);
> +}
> +
> +
> +/*===-- Types  
> -------------------------------------------------------------===*/
> +
> +/* lltype -> type_kind */
> +CAMLprim value llvm_classify_type(value Ty) {
> +  return Val_int(LLVMGetTypeKind((LLVMTypeRef) Ty));
> +}
> +
> +/* lltype -> lltype -> unit */
> +CAMLprim value llvm_refine_abstract_type(value ConcreteTy, value  
> AbstractTy) {
> +  LLVMRefineAbstractType((LLVMTypeRef) AbstractTy, (LLVMTypeRef)  
> ConcreteTy);
> +  return (value) Val_unit;
> +}
> +
> +/*--... Operations on integer  
> types ........................................--*/
> +
> +/* unit -> lltype */
> +CAMLprim value llvm_i1_type (value Unit) { return (value)  
> LLVMInt1Type();  }
> +CAMLprim value llvm_i8_type (value Unit) { return (value)  
> LLVMInt8Type();  }
> +CAMLprim value llvm_i16_type(value Unit) { return (value)  
> LLVMInt16Type(); }
> +CAMLprim value llvm_i32_type(value Unit) { return (value)  
> LLVMInt32Type(); }
> +CAMLprim value llvm_i64_type(value Unit) { return (value)  
> LLVMInt64Type(); }
> +
> +/* int -> lltype */
> +CAMLprim value llvm_make_integer_type(value Width) {
> +  return (value) LLVMCreateIntegerType(Int_val(Width));
> +}
> +
> +/* lltype -> int */
> +CAMLprim value llvm_integer_bitwidth(value IntegerTy) {
> +  return Val_int(LLVMGetIntegerTypeWidth((LLVMTypeRef) IntegerTy));
> +}
> +
> +/*--... Operations on real  
> types ...........................................--*/
> +
> +/* unit -> lltype */
> +CAMLprim value llvm_float_type(value Unit) {
> +  return (value) LLVMFloatType();
> +}
> +
> +/* unit -> lltype */
> +CAMLprim value llvm_double_type(value Unit) {
> +  return (value) LLVMDoubleType();
> +}
> +
> +/* unit -> lltype */
> +CAMLprim value llvm_x86fp80_type(value Unit) {
> +  return (value) LLVMX86FP80Type();
> +}
> +
> +/* unit -> lltype */
> +CAMLprim value llvm_fp128_type(value Unit) {
> +  return (value) LLVMFP128Type();
> +}
> +
> +/* unit -> lltype */
> +CAMLprim value llvm_ppc_fp128_type(value Unit) {
> +  return (value) LLVMPPCFP128Type();
> +}
> +
> +/*--... Operations on function  
> types .......................................--*/
> +
> +/* lltype -> lltype array -> bool -> lltype */
> +CAMLprim value llvm_make_function_type(value RetTy, value ParamTys,
> +                                       value IsVarArg) {
> +  return (value) LLVMCreateFunctionType((LLVMTypeRef) RetTy,
> +                                        (LLVMTypeRef *) ParamTys,
> +                                        Wosize_val(ParamTys),
> +                                        Bool_val(IsVarArg));
> +}
> +
> +/* lltype -> bool */
> +CAMLprim value llvm_is_var_arg(value FunTy) {
> +  return Val_bool(LLVMIsFunctionVarArg((LLVMTypeRef) FunTy));
> +}
> +
> +/* lltype -> lltype */
> +CAMLprim value llvm_return_type(value FunTy) {
> +  return (value) LLVMGetFunctionReturnType((LLVMTypeRef) FunTy);
> +}
> +
> +/* lltype -> lltype array */
> +CAMLprim value llvm_param_types(value FunTy) {
> +  unsigned Count = LLVMGetFunctionParamCount((LLVMTypeRef) FunTy);
> +  LLVMTypeRef *FunTys = alloca(Count * sizeof(LLVMTypeRef));
> +
> +  /* copy into an ocaml array */
> +  unsigned i;
> +  value ParamTys = caml_alloc(Count, 0);
> +
> +  LLVMGetFunctionParamTypes((LLVMTypeRef) FunTy, FunTys);
> +  for (i = 0; i != Count; ++i)
> +    Store_field(ParamTys, i, (value) FunTys[i]);
> +
> +  return ParamTys;
> +}
> +
> +/*--... Operations on struct  
> types .........................................--*/
> +
> +/* lltype array -> bool -> lltype */
> +CAMLprim value llvm_make_struct_type(value ElementTypes, value  
> Packed) {
> +  return (value) LLVMCreateStructType((LLVMTypeRef *) ElementTypes,
> +                                      Wosize_val(ElementTypes),
> +                                      Bool_val(Packed));
> +}
> +
> +/* lltype -> lltype array */
> +CAMLprim value llvm_element_types(value StructTy) {
> +  unsigned Count = LLVMGetStructElementCount((LLVMTypeRef) StructTy);
> +  LLVMTypeRef *Tys = alloca(Count * sizeof(LLVMTypeRef));
> +
> +  /* copy into an ocaml array */
> +  unsigned i;
> +  value ElementTys = caml_alloc(Count, 0);
> +
> +  LLVMGetStructElementTypes((LLVMTypeRef) StructTy, Tys);
> +  for (i = 0; i != Count; ++i)
> +    Store_field(ElementTys, i, (value) Tys[i]);
> +
> +  return ElementTys;
> +}
> +
> +CAMLprim value llvm_is_packed(value StructTy) {
> +  return Val_bool(LLVMIsPackedStruct((LLVMTypeRef) StructTy));
> +}
> +
> +/*--... Operations on array, pointer, and vector  
> types .....................--*/
> +
> +/* lltype -> int -> lltype */
> +CAMLprim value llvm_make_array_type(value ElementTy, value Count) {
> +  return (value) LLVMCreateArrayType((LLVMTypeRef) ElementTy,  
> Int_val(Count));
> +}
> +
> +/* lltype -> lltype */
> +CAMLprim value llvm_make_pointer_type(value ElementTy) {
> +  return (value) LLVMCreatePointerType((LLVMTypeRef) ElementTy);
> +}
> +
> +/* lltype -> int -> lltype */
> +CAMLprim value llvm_make_vector_type(value ElementTy, value Count) {
> +  return (value) LLVMCreateVectorType((LLVMTypeRef) ElementTy,  
> Int_val(Count));
> +}
> +
> +/* lltype -> lltype */
> +CAMLprim value llvm_element_type(value Ty) {
> +  return (value) LLVMGetElementType((LLVMTypeRef) Ty);
> +}
> +
> +/* lltype -> int */
> +CAMLprim value llvm_array_length(value ArrayTy) {
> +  return Val_int(LLVMGetArrayLength((LLVMTypeRef) ArrayTy));
> +}
> +
> +/* lltype -> int */
> +CAMLprim value llvm_vector_size(value VectorTy) {
> +  return Val_int(LLVMGetVectorSize((LLVMTypeRef) VectorTy));
> +}
> +
> +/*--... Operations on other  
> types ..........................................--*/
> +
> +/* unit -> lltype */
> +CAMLprim value llvm_void_type (value Unit) { return (value)  
> LLVMVoidType();  }
> +CAMLprim value llvm_label_type(value Unit) { return (value)  
> LLVMLabelType(); }
> +
> +/* unit -> lltype */
> +CAMLprim value llvm_make_opaque_type(value Unit) {
> +  return (value) LLVMCreateOpaqueType();
> +}
> +
> +
> +/*===-- VALUES  
> ------------------------------------------------------------===*/
> +
> +/* llvalue -> lltype */
> +CAMLprim value llvm_type_of(value Val) {
> +  return (value) LLVMGetTypeOfValue((LLVMValueRef) Val);
> +}
> +
> +/* llvalue -> string */
> +CAMLprim value llvm_value_name(value Val) {
> +  return caml_copy_string(LLVMGetValueName((LLVMValueRef) Val));
> +}
> +
> +/* string -> llvalue -> unit */
> +CAMLprim value llvm_set_value_name(value Name, value Val) {
> +  LLVMSetValueName((LLVMValueRef) Val, String_val(Name));
> +  return Val_unit;
> +}
> +
> +/*--... Operations on constants of (mostly) any  
> type .......................--*/
> +
> +/* lltype -> llvalue */
> +CAMLprim value llvm_make_null(value Ty) {
> +  return (value) LLVMGetNull((LLVMTypeRef) Ty);
> +}
> +
> +/* lltype -> llvalue */
> +CAMLprim value llvm_make_all_ones(value Ty) {
> +  return (value) LLVMGetAllOnes((LLVMTypeRef) Ty);
> +}
> +
> +/* lltype -> llvalue */
> +CAMLprim value llvm_make_undef(value Ty) {
> +  return (value) LLVMGetUndef((LLVMTypeRef) Ty);
> +}
> +
> +/* llvalue -> bool */
> +CAMLprim value llvm_is_null(value Val) {
> +  return Val_bool(LLVMIsNull((LLVMValueRef) Val));
> +}
> +
> +/*--... Operations on scalar  
> constants .....................................--*/
> +
> +/* lltype -> int -> bool -> llvalue */
> +CAMLprim value llvm_make_int_constant(value IntTy, value N, value  
> SExt) {
> +  /* GCC warns if we use the ternary operator. */
> +  unsigned long long N2;
> +  if (Bool_val(SExt))
> +    N2 = (intnat) Int_val(N);
> +  else
> +    N2 = (uintnat) Int_val(N);
> +
> +  return (value) LLVMGetIntConstant((LLVMTypeRef) IntTy, N2,  
> Bool_val(SExt));
> +}
> +
> +/* lltype -> float -> llvalue */
> +CAMLprim value llvm_make_real_constant(value RealTy, value N) {
> +  return (value) LLVMGetRealConstant((LLVMTypeRef) RealTy,  
> Double_val(N));
> +}
> +
> +/*--... Operations on composite  
> constants ..................................--*/
> +
> +/* string -> bool -> llvalue */
> +CAMLprim value llvm_make_string_constant(value Str, value  
> NullTerminate) {
> +  return (value) LLVMGetStringConstant(String_val(Str),
> +                                       Wosize_val(Str),
> +                                       Bool_val(NullTerminate) == 0);
> +}
> +
> +/* lltype -> llvalue array -> llvalue */
> +CAMLprim value llvm_make_array_constant(value ElementTy, value  
> ElementVals) {
> +  return (value) LLVMGetArrayConstant((LLVMTypeRef) ElementTy,
> +                                      (LLVMValueRef*) Op_val 
> (ElementVals),
> +                                      Wosize_val(ElementVals));
> +}
> +
> +/* llvalue array -> bool -> llvalue */
> +CAMLprim value llvm_make_struct_constant(value ElementVals, value  
> Packed) {
> +  return (value) LLVMGetStructConstant((LLVMValueRef*) Op_val 
> (ElementVals),
> +                                       Wosize_val(ElementVals),
> +                                       Bool_val(Packed));
> +}
> +
> +/* llvalue array -> llvalue */
> +CAMLprim value llvm_make_vector_constant(value ElementVals) {
> +  return (value) LLVMGetVectorConstant((LLVMValueRef*) Op_val 
> (ElementVals),
> +                                       Wosize_val(ElementVals));
> +}
> +
> +/*--... Operations on global variables, functions, and aliases  
> (globals) ...--*/
> +
> +/* llvalue -> bool */
> +CAMLprim value llvm_is_declaration(value Global) {
> +  return Val_bool(LLVMIsDeclaration((LLVMValueRef) Global));
> +}
> +
> +/* llvalue -> linkage */
> +CAMLprim value llvm_linkage(value Global) {
> +  return Val_int(LLVMGetLinkage((LLVMValueRef) Global));
> +}
> +
> +/* linkage -> llvalue -> unit */
> +CAMLprim value llvm_set_linkage(value Linkage, value Global) {
> +  LLVMSetLinkage((LLVMValueRef) Global, Int_val(Linkage));
> +  return Val_unit;
> +}
> +
> +/* llvalue -> string */
> +CAMLprim value llvm_section(value Global) {
> +  return caml_copy_string(LLVMGetSection((LLVMValueRef) Global));
> +}
> +
> +/* string -> llvalue -> unit */
> +CAMLprim value llvm_set_section(value Section, value Global) {
> +  LLVMSetSection((LLVMValueRef) Global, String_val(Section));
> +  return Val_unit;
> +}
> +
> +/* llvalue -> visibility */
> +CAMLprim value llvm_visibility(value Global) {
> +  return Val_int(LLVMGetVisibility((LLVMValueRef) Global));
> +}
> +
> +/* visibility -> llvalue -> unit */
> +CAMLprim value llvm_set_visibility(value Viz, value Global) {
> +  LLVMSetVisibility((LLVMValueRef) Global, Int_val(Viz));
> +  return Val_unit;
> +}
> +
> +/* llvalue -> int */
> +CAMLprim value llvm_alignment(value Global) {
> +  return Val_int(LLVMGetAlignment((LLVMValueRef) Global));
> +}
> +
> +/* int -> llvalue -> unit */
> +CAMLprim value llvm_set_alignment(value Bytes, value Global) {
> +  LLVMSetAlignment((LLVMValueRef) Global, Int_val(Bytes));
> +  return Val_unit;
> +}
> +
> +/*--... Operations on global  
> variables .....................................--*/
> +
> +/* lltype -> string -> llmodule -> llvalue */
> +CAMLprim value llvm_add_global(value Ty, value Name, value M) {
> +  return (value) LLVMAddGlobal((LLVMModuleRef) M,
> +                               (LLVMTypeRef) Ty, String_val(Name));
> +}
> +
> +/* lltype -> string -> llmodule -> llvalue */
> +CAMLprim value llvm_declare_global(value Ty, value Name, value M) {
> +  return (value) LLVMAddGlobal((LLVMModuleRef) M,
> +                               (LLVMTypeRef) Ty, String_val(Name));
> +}
> +
> +/* string -> llvalue -> llmodule -> llvalue */
> +CAMLprim value llvm_define_global(value Name, value ConstantVal,  
> value M) {
> +  LLVMValueRef Initializer = (LLVMValueRef) ConstantVal;
> +  LLVMValueRef GlobalVar = LLVMAddGlobal((LLVMModuleRef) M,
> +                                         LLVMGetTypeOfValue 
> (Initializer),
> +                                         String_val(Name));
> +  LLVMSetInitializer(GlobalVar, Initializer);
> +  return (value) GlobalVar;
> +}
> +
> +/* llvalue -> unit */
> +CAMLprim value llvm_delete_global(value GlobalVar) {
> +  LLVMDeleteGlobal((LLVMValueRef) GlobalVar);
> +  return Val_unit;
> +}
> +
> +/* llvalue -> llvalue */
> +CAMLprim value llvm_global_initializer(value GlobalVar) {
> +  return (value) LLVMGetInitializer((LLVMValueRef) GlobalVar);
> +}
> +
> +/* llvalue -> llvalue -> unit */
> +CAMLprim value llvm_set_initializer(value ConstantVal, value  
> GlobalVar) {
> +  LLVMSetInitializer((LLVMValueRef) GlobalVar, (LLVMValueRef)  
> ConstantVal);
> +  return Val_unit;
> +}
> +
> +/* llvalue -> unit */
> +CAMLprim value llvm_remove_initializer(value GlobalVar) {
> +  LLVMSetInitializer((LLVMValueRef) GlobalVar, NULL);
> +  return Val_unit;
> +}
> +
> +/* llvalue -> bool */
> +CAMLprim value llvm_is_thread_local(value GlobalVar) {
> +  return Val_bool(LLVMIsThreadLocal((LLVMValueRef) GlobalVar));
> +}
> +
> +/* bool -> llvalue -> unit */
> +CAMLprim value llvm_set_thread_local(value IsThreadLocal, value  
> GlobalVar) {
> +  LLVMSetThreadLocal((LLVMValueRef) GlobalVar, Bool_val 
> (IsThreadLocal));
> +  return Val_unit;
> +}
>
> Propchange: llvm/trunk/test/Bindings/Ocaml/
>
> ---------------------------------------------------------------------- 
> --------
> --- svn:ignore (added)
> +++ svn:ignore Tue Sep 18 07:49:39 2007
> @@ -0,0 +1,3 @@
> +Output
> +*.cmi
> +*.cmo
>
> Added: llvm/trunk/test/Bindings/Ocaml/bitwriter.ml
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/ 
> Ocaml/bitwriter.ml?rev=42093&view=auto
>
> ====================================================================== 
> ========
> --- llvm/trunk/test/Bindings/Ocaml/bitwriter.ml (added)
> +++ llvm/trunk/test/Bindings/Ocaml/bitwriter.ml Tue Sep 18 07:49:39  
> 2007
> @@ -0,0 +1,16 @@
> +(* RUN: %ocamlc llvm.cma llvm_bitwriter.cma %s -o %t
> + * RUN: ./%t %t.bc
> + * RUN: llvm-dis < %t.bc | grep caml_int_ty
> + *)
> +
> +(* Note that this takes a moment to link, so it's best to keep the  
> number of
> +   individual tests low. *)
> +
> +let test x = if not x then exit 1 else ()
> +
> +let _ =
> +  let m = Llvm.create_module "ocaml_test_module" in
> +
> +  ignore (Llvm.add_type_name "caml_int_ty" Llvm.i32_type m);
> +
> +  test (Llvm_bitwriter.write_bitcode_file m Sys.argv.(1))
>
> Added: llvm/trunk/test/Bindings/Ocaml/ocaml.exp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/ 
> Ocaml/ocaml.exp?rev=42093&view=auto
>
> ====================================================================== 
> ========
> --- llvm/trunk/test/Bindings/Ocaml/ocaml.exp (added)
> +++ llvm/trunk/test/Bindings/Ocaml/ocaml.exp Tue Sep 18 07:49:39 2007
> @@ -0,0 +1,3 @@
> +load_lib llvm.exp
> +
> +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*. 
> {ll,llx,c,cpp,tr,ml}]]
>
> Added: llvm/trunk/test/Bindings/Ocaml/vmcore.ml
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/ 
> Ocaml/vmcore.ml?rev=42093&view=auto
>
> ====================================================================== 
> ========
> --- llvm/trunk/test/Bindings/Ocaml/vmcore.ml (added)
> +++ llvm/trunk/test/Bindings/Ocaml/vmcore.ml Tue Sep 18 07:49:39 2007
> @@ -0,0 +1,233 @@
> +(* RUN: %ocamlc llvm.cma llvm_bitwriter.cma %s -o %t
> + * RUN: ./%t %t.bc
> + * RUN: llvm-dis < %t.bc > %t.ll
> + *)
> +
> +(* Note: It takes several seconds for ocamlc to link an executable  
> with
> +         libLLVMCore.a, so it's better to write a big test than a  
> bunch of
> +         little ones. *)
> +
> +open Llvm
> +open Llvm_bitwriter
> +
> +
> +(* Tiny unit test framework *)
> +let exit_status = ref 0
> +let case_num = ref 0
> +
> +let all_done () =
> +  prerr_endline "";
> +  exit !exit_status
> +
> +let group name =
> +  prerr_endline "";
> +  case_num := 0;
> +  prerr_string ("  " ^ name ^ "... ")
> +
> +let insist cond =
> +  incr case_num;
> +  prerr_char ' ';
> +  if not cond then begin
> +     exit_status := 10;
> +     prerr_char '!'
> +  end;
> +  prerr_int !case_num
> +
> +let suite name f =
> +  prerr_endline (name ^ ":");
> +  f ()
> +
> +
> +(*===-- Fixture  
> -----------------------------------------------------------===*)
> +
> +let filename = Sys.argv.(1)
> +let m = create_module filename
> +
> +
> +(*===-- Types  
> -------------------------------------------------------------===*)
> +
> +let test_types () =
> +  (* RUN: grep {Ty01.*void} < %t.ll
> +   *)
> +  group "void";
> +  insist (add_type_name "Ty01" void_type m);
> +  insist (Void_type == classify_type void_type);
> +
> +  (* RUN: grep {Ty02.*i1} < %t.ll
> +   *)
> +  group "i1";
> +  insist (add_type_name "Ty02" i1_type m);
> +  insist (Integer_type == classify_type i1_type);
> +
> +  (* RUN: grep {Ty03.*i32} < %t.ll
> +   *)
> +  group "i32";
> +  insist (add_type_name "Ty03" i32_type m);
> +
> +  (* RUN: grep {Ty04.*i42} < %t.ll
> +   *)
> +  group "i42";
> +  let ty = make_integer_type 42 in
> +  insist (add_type_name "Ty04" ty m);
> +
> +  (* RUN: grep {Ty05.*float} < %t.ll
> +   *)
> +  group "float";
> +  insist (add_type_name "Ty05" float_type m);
> +  insist (Float_type == classify_type float_type);
> +
> +  (* RUN: grep {Ty06.*double} < %t.ll
> +   *)
> +  group "double";
> +  insist (add_type_name "Ty06" double_type m);
> +  insist (Double_type == classify_type double_type);
> +
> +  (* RUN: grep {Ty07.*i32.*i1, double} < %t.ll
> +   *)
> +  group "function";
> +  let ty = make_function_type i32_type [| i1_type; double_type |]  
> false in
> +  insist (add_type_name "Ty07" ty m);
> +  insist (Function_type = classify_type ty);
> +  insist (not (is_var_arg ty));
> +  insist (i32_type == return_type ty);
> +  insist (double_type == (param_types ty).(1));
> +
> +  (* RUN: grep {Ty08.*\.\.\.} < %t.ll
> +   *)
> +  group "vararg";
> +  let ty = make_function_type void_type [| i32_type |] true in
> +  insist (add_type_name "Ty08" ty m);
> +  insist (is_var_arg ty);
> +
> +  (* RUN: grep {Ty09.*\\\[7 x i8\\\]} < %t.ll
> +   *)
> +  group "array";
> +  let ty = make_array_type i8_type 7 in
> +  insist (add_type_name "Ty09" ty m);
> +  insist (7 = array_length ty);
> +  insist (i8_type == element_type ty);
> +  insist (Array_type == classify_type ty);
> +
> +  (* RUN: grep {Ty10.*float\*} < %t.ll
> +   *)
> +  group "pointer";
> +  let ty = make_pointer_type float_type in
> +  insist (add_type_name "Ty10" ty m);
> +  insist (float_type == element_type ty);
> +  insist (Pointer_type == classify_type ty);
> +
> +  (* RUN: grep {Ty11.*\<4 x i16\>} < %t.ll
> +   *)
> +  group "vector";
> +  let ty = make_vector_type i16_type 4 in
> +  insist (add_type_name "Ty11" ty m);
> +  insist (i16_type == element_type ty);
> +  insist (4 = vector_size ty);
> +
> +  (* RUN: grep {Ty12.*opaque} < %t.ll
> +   *)
> +  group "opaque";
> +  let ty = make_opaque_type () in
> +  insist (add_type_name "Ty12" ty m);
> +  insist (ty == ty);
> +  insist (ty <> make_opaque_type ())
> +
> +
> +(*===-- Global Values  
> -----------------------------------------------------===*)
> +
> +let test_global_values () =
> +  let (++) x f = f x; x in
> +  let zero32 = make_null i32_type in
> +
> +  (* RUN: grep {GVal01} < %t.ll
> +   *)
> +  group "naming";
> +  let g = define_global "TEMPORARY" zero32 m in
> +  prerr_endline "";
> +  prerr_endline (value_name g);
> +  insist ("TEMPORARY" = value_name g);
> +  set_value_name "GVal01" g;
> +  insist ("GVal01" = value_name g);
> +
> +  (* RUN: grep {GVal02.*linkonce} < %t.ll
> +   *)
> +  group "linkage";
> +  let g = define_global "GVal02" zero32 m ++
> +          set_linkage Link_once_linkage in
> +  insist (Link_once_linkage = linkage g);
> +
> +  (* RUN: grep {GVal03.*Hanalei} < %t.ll
> +   *)
> +  group "section";
> +  let g = define_global "GVal03" zero32 m ++
> +          set_section "Hanalei" in
> +  insist ("Hanalei" = section g);
> +
> +  (* RUN: grep {GVal04.*hidden} < %t.ll
> +   *)
> +  group "visibility";
> +  let g = define_global "GVal04" zero32 m ++
> +          set_visibility Hidden_visibility in
> +  insist (Hidden_visibility = visibility g);
> +
> +  (* RUN: grep {GVal05.*align 128} < %t.ll
> +   *)
> +  group "alignment";
> +  let g = define_global "GVal05" zero32 m ++
> +          set_alignment 128 in
> +  insist (128 = alignment g)
> +
> +
> +(*===-- Global Variables  
> --------------------------------------------------===*)
> +
> +let test_global_variables () =
> +  let (++) x f = f x; x in
> +  let fourty_two32 = make_int_constant i32_type 42 false in
> +
> +  (* RUN: grep {GVar01.*external} < %t.ll
> +   *)
> +  group "declarations";
> +  let g = declare_global i32_type "GVar01" m in
> +  insist (is_declaration g);
> +
> +  (* RUN: grep {GVar02.*42} < %t.ll
> +   * RUN: grep {GVar03.*42} < %t.ll
> +   *)
> +  group "definitions";
> +  let g = define_global "GVar02" fourty_two32 m in
> +  let g2 = declare_global i32_type "GVar03" m ++
> +           set_initializer fourty_two32 in
> +  insist (not (is_declaration g));
> +  insist (not (is_declaration g2));
> +  insist ((global_initializer g) == (global_initializer g2));
> +
> +  (* RUN: grep {GVar04.*thread_local} < %t.ll
> +   *)
> +  group "threadlocal";
> +  let g = define_global "GVar04" fourty_two32 m ++
> +          set_thread_local true in
> +  insist (is_thread_local g);
> +
> +  (* RUN: grep -v {GVar05} < %t.ll
> +   *)
> +  let g = define_global "GVar05" fourty_two32 m in
> +  delete_global g
> +
> +
> +(*===-- Writer  
> ------------------------------------------------------------===*)
> +
> +let test_writer () =
> +  group "writer";
> +  insist (write_bitcode_file m filename);
> +
> +  dispose_module m
> +
> +
> +(*===-- Driver  
> ------------------------------------------------------------===*)
> +
> +let _ =
> +  suite "types"            test_types;
> +  suite "global values"    test_global_values;
> +  suite "global variables" test_global_variables;
> +  suite "writer"           test_writer;
> +  all_done ()
>
> Modified: llvm/trunk/test/lib/llvm.exp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/lib/ 
> llvm.exp?rev=42093&r1=42092&r2=42093&view=diff
>
> ====================================================================== 
> ========
> --- llvm/trunk/test/lib/llvm.exp (original)
> +++ llvm/trunk/test/lib/llvm.exp Tue Sep 18 07:49:39 2007
> @@ -43,7 +43,7 @@
>  # cases.
>  proc substitute { line test tmpFile } {
>    global srcroot objroot srcdir objdir subdir target_triplet  
> prcontext
> -  global llvmgcc llvmgxx llvmgcc_version llvmgccmajvers
> +  global llvmgcc llvmgxx llvmgcc_version llvmgccmajvers ocamlc
>    global gccpath gxxpath compile_c compile_cxx link shlibext  
> llvmlibsdir
>    set path [file join $srcdir $subdir]
>
> @@ -64,6 +64,8 @@
>    regsub -all {%link} $new_line "$link" new_line
>    #replace %shlibext with shared library extension
>    regsub -all {%shlibext} $new_line "$shlibext" new_line
> +  #replace %ocamlc with ocaml compiler command
> +  regsub -all {%ocamlc} $new_line "$ocamlc" new_line
>    #replace %llvmlibsdir with configure library directory
>    regsub -all {%llvmlibsdir} $new_line "$llvmlibsdir" new_line
>    #replace %p with path to source,
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list