[OCaml] Expose Llvm_executionengine.get_{global_value,function}_address.
[oota-llvm.git] / bindings / ocaml / target / llvm_target.ml
1 (*===-- llvm_target.ml - LLVM OCaml Interface ------------------*- OCaml -*-===*
2  *
3  *                     The LLVM Compiler Infrastructure
4  *
5  * This file is distributed under the University of Illinois Open Source
6  * License. See LICENSE.TXT for details.
7  *
8  *===----------------------------------------------------------------------===*)
9
10 module Endian = struct
11   type t =
12   | Big
13   | Little
14 end
15
16 module CodeGenOptLevel = struct
17   type t =
18   | None
19   | Less
20   | Default
21   | Aggressive
22 end
23
24 module RelocMode = struct
25   type t =
26   | Default
27   | Static
28   | PIC
29   | DynamicNoPIC
30 end
31
32 module CodeModel = struct
33   type t =
34   | Default
35   | JITDefault
36   | Small
37   | Kernel
38   | Medium
39   | Large
40 end
41
42 module CodeGenFileType = struct
43   type t =
44   | AssemblyFile
45   | ObjectFile
46 end
47
48 exception Error of string
49
50 let () = Callback.register_exception "Llvm_target.Error" (Error "")
51
52 module DataLayout = struct
53   type t
54
55   external of_string : string -> t = "llvm_datalayout_of_string"
56   external as_string : t -> string = "llvm_datalayout_as_string"
57   external add_to_pass_manager : [<Llvm.PassManager.any]
58                                  Llvm.PassManager.t -> t -> unit
59                                = "llvm_datalayout_add_to_pass_manager"
60   external byte_order : t -> Endian.t = "llvm_datalayout_byte_order"
61   external pointer_size : t -> int = "llvm_datalayout_pointer_size"
62   external intptr_type : Llvm.llcontext -> t -> Llvm.lltype
63                        = "llvm_datalayout_intptr_type"
64   external qualified_pointer_size : int -> t -> int
65                                   = "llvm_datalayout_qualified_pointer_size"
66   external qualified_intptr_type : Llvm.llcontext -> int -> t -> Llvm.lltype
67                                  = "llvm_datalayout_qualified_intptr_type"
68   external size_in_bits : Llvm.lltype -> t -> Int64.t
69                         = "llvm_datalayout_size_in_bits"
70   external store_size : Llvm.lltype -> t -> Int64.t
71                       = "llvm_datalayout_store_size"
72   external abi_size : Llvm.lltype -> t -> Int64.t
73                     = "llvm_datalayout_abi_size"
74   external abi_align : Llvm.lltype -> t -> int
75                      = "llvm_datalayout_abi_align"
76   external stack_align : Llvm.lltype -> t -> int
77                        = "llvm_datalayout_stack_align"
78   external preferred_align : Llvm.lltype -> t -> int
79                            = "llvm_datalayout_preferred_align"
80   external preferred_align_of_global : Llvm.llvalue -> t -> int
81                                    = "llvm_datalayout_preferred_align_of_global"
82   external element_at_offset : Llvm.lltype -> Int64.t -> t -> int
83                              = "llvm_datalayout_element_at_offset"
84   external offset_of_element : Llvm.lltype -> int -> t -> Int64.t
85                              = "llvm_datalayout_offset_of_element"
86 end
87
88 module Target = struct
89   type t
90
91   external default_triple : unit -> string = "llvm_target_default_triple"
92   external first : unit -> t option = "llvm_target_first"
93   external succ : t -> t option = "llvm_target_succ"
94   external by_name : string -> t option = "llvm_target_by_name"
95   external by_triple : string -> t = "llvm_target_by_triple"
96   external name : t -> string = "llvm_target_name"
97   external description : t -> string = "llvm_target_description"
98   external has_jit : t -> bool = "llvm_target_has_jit"
99   external has_target_machine : t -> bool = "llvm_target_has_target_machine"
100   external has_asm_backend : t -> bool = "llvm_target_has_asm_backend"
101
102   let all () =
103     let rec step elem lst =
104       match elem with
105       | Some target -> step (succ target) (target :: lst)
106       | None        -> lst
107     in
108     step (first ()) []
109 end
110
111 module TargetMachine = struct
112   type t
113
114   external create : triple:string -> ?cpu:string -> ?features:string ->
115                     ?level:CodeGenOptLevel.t -> ?reloc_mode:RelocMode.t ->
116                     ?code_model:CodeModel.t -> Target.t -> t
117                   = "llvm_create_targetmachine_bytecode"
118                     "llvm_create_targetmachine_native"
119   external target : t -> Target.t
120                   = "llvm_targetmachine_target"
121   external triple : t -> string
122                   = "llvm_targetmachine_triple"
123   external cpu : t -> string
124                = "llvm_targetmachine_cpu"
125   external features : t -> string
126                     = "llvm_targetmachine_features"
127   external data_layout : t -> DataLayout.t
128                        = "llvm_targetmachine_data_layout"
129   external add_analysis_passes : [< Llvm.PassManager.any ] Llvm.PassManager.t -> t -> unit
130                                = "llvm_targetmachine_add_analysis_passes"
131   external set_verbose_asm : bool -> t -> unit
132                            = "llvm_targetmachine_set_verbose_asm"
133   external emit_to_file : Llvm.llmodule -> CodeGenFileType.t -> string ->
134                           t -> unit
135                         = "llvm_targetmachine_emit_to_file"
136   external emit_to_memory_buffer : Llvm.llmodule -> CodeGenFileType.t ->
137                                    t -> Llvm.llmemorybuffer
138                                  = "llvm_targetmachine_emit_to_memory_buffer"
139 end