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