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