forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			136 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			OCaml
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			OCaml
		
	
	
	
| (*===-- 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
 |