Home | History | Annotate | Download | only in target
      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
    140