(*===-- llvm_target.ml - LLVM OCaml Interface ------------------*- OCaml -*-===* * * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. * See https://llvm.org/LICENSE.txt for license information. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception * *===----------------------------------------------------------------------===*) module Endian = struct type t = | Big | Little end module CodeGenOptLevel = struct type t = | None | Less | Default | Aggressive end module RelocMode = struct type t = | Default | Static | PIC | DynamicNoPIC end module CodeModel = struct type t = | Default | JITDefault | Small | Kernel | Medium | Large end module CodeGenFileType = struct type t = | AssemblyFile | ObjectFile end exception Error of string let () = Callback.register_exception "Llvm_target.Error" (Error "") module DataLayout = struct type t external of_string : string -> t = "llvm_datalayout_of_string" external as_string : t -> string = "llvm_datalayout_as_string" external byte_order : t -> Endian.t = "llvm_datalayout_byte_order" external pointer_size : t -> int = "llvm_datalayout_pointer_size" external intptr_type : Llvm.llcontext -> t -> Llvm.lltype = "llvm_datalayout_intptr_type" external qualified_pointer_size : int -> t -> int = "llvm_datalayout_qualified_pointer_size" external qualified_intptr_type : Llvm.llcontext -> int -> t -> Llvm.lltype = "llvm_datalayout_qualified_intptr_type" external size_in_bits : Llvm.lltype -> t -> Int64.t = "llvm_datalayout_size_in_bits" external store_size : Llvm.lltype -> t -> Int64.t = "llvm_datalayout_store_size" external abi_size : Llvm.lltype -> t -> Int64.t = "llvm_datalayout_abi_size" external abi_align : Llvm.lltype -> t -> int = "llvm_datalayout_abi_align" external stack_align : Llvm.lltype -> t -> int = "llvm_datalayout_stack_align" external preferred_align : Llvm.lltype -> t -> int = "llvm_datalayout_preferred_align" external preferred_align_of_global : Llvm.llvalue -> t -> int = "llvm_datalayout_preferred_align_of_global" external element_at_offset : Llvm.lltype -> Int64.t -> t -> int = "llvm_datalayout_element_at_offset" external offset_of_element : Llvm.lltype -> int -> t -> Int64.t = "llvm_datalayout_offset_of_element" end module Target = struct type t external default_triple : unit -> string = "llvm_target_default_triple" external first : unit -> t option = "llvm_target_first" external succ : t -> t option = "llvm_target_succ" external by_name : string -> t option = "llvm_target_by_name" external by_triple : string -> t = "llvm_target_by_triple" external name : t -> string = "llvm_target_name" external description : t -> string = "llvm_target_description" external has_jit : t -> bool = "llvm_target_has_jit" external has_target_machine : t -> bool = "llvm_target_has_target_machine" external has_asm_backend : t -> bool = "llvm_target_has_asm_backend" let all () = let rec step elem lst = match elem with | Some target -> step (succ target) (target :: lst) | None -> lst in step (first ()) [] end module TargetMachine = struct type t external create : triple:string -> ?cpu:string -> ?features:string -> ?level:CodeGenOptLevel.t -> ?reloc_mode:RelocMode.t -> ?code_model:CodeModel.t -> Target.t -> t = "llvm_create_targetmachine_bytecode" "llvm_create_targetmachine_native" external target : t -> Target.t = "llvm_targetmachine_target" external triple : t -> string = "llvm_targetmachine_triple" external cpu : t -> string = "llvm_targetmachine_cpu" external features : t -> string = "llvm_targetmachine_features" external data_layout : t -> DataLayout.t = "llvm_targetmachine_data_layout" external add_analysis_passes : [< Llvm.PassManager.any ] Llvm.PassManager.t -> t -> unit = "llvm_targetmachine_add_analysis_passes" external set_verbose_asm : bool -> t -> unit = "llvm_targetmachine_set_verbose_asm" external emit_to_file : Llvm.llmodule -> CodeGenFileType.t -> string -> t -> unit = "llvm_targetmachine_emit_to_file" external emit_to_memory_buffer : Llvm.llmodule -> CodeGenFileType.t -> t -> Llvm.llmemorybuffer = "llvm_targetmachine_emit_to_memory_buffer" end