mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 00:21:03 +00:00
ocaml bindings: add getopcode for constant and instruction, and int64_of_const.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141990 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -130,6 +130,77 @@ module Fcmp = struct
|
|||||||
| True
|
| True
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module Opcode = struct
|
||||||
|
type t =
|
||||||
|
| Invalid (* not an instruction *)
|
||||||
|
(* Terminator Instructions *)
|
||||||
|
| Ret
|
||||||
|
| Br
|
||||||
|
| Switch
|
||||||
|
| IndirectBr
|
||||||
|
| Invoke
|
||||||
|
| Invalid2
|
||||||
|
| Unreachable
|
||||||
|
(* Standard Binary Operators *)
|
||||||
|
| Add
|
||||||
|
| FAdd
|
||||||
|
| Sub
|
||||||
|
| FSub
|
||||||
|
| Mul
|
||||||
|
| FMul
|
||||||
|
| UDiv
|
||||||
|
| SDiv
|
||||||
|
| FDiv
|
||||||
|
| URem
|
||||||
|
| SRem
|
||||||
|
| FRem
|
||||||
|
(* Logical Operators *)
|
||||||
|
| Shl
|
||||||
|
| LShr
|
||||||
|
| AShr
|
||||||
|
| And
|
||||||
|
| Or
|
||||||
|
| Xor
|
||||||
|
(* Memory Operators *)
|
||||||
|
| Alloca
|
||||||
|
| Load
|
||||||
|
| Store
|
||||||
|
| GetElementPtr
|
||||||
|
(* Cast Operators *)
|
||||||
|
| Trunc
|
||||||
|
| ZExt
|
||||||
|
| SExt
|
||||||
|
| FPToUI
|
||||||
|
| FPToSI
|
||||||
|
| UIToFP
|
||||||
|
| SIToFP
|
||||||
|
| FPTrunc
|
||||||
|
| FPExt
|
||||||
|
| PtrToInt
|
||||||
|
| IntToPtr
|
||||||
|
| BitCast
|
||||||
|
(* Other Operators *)
|
||||||
|
| ICmp
|
||||||
|
| FCmp
|
||||||
|
| PHI
|
||||||
|
| Call
|
||||||
|
| Select
|
||||||
|
| UserOp1
|
||||||
|
| UserOp2
|
||||||
|
| VAArg
|
||||||
|
| ExtractElement
|
||||||
|
| InsertElement
|
||||||
|
| ShuffleVector
|
||||||
|
| ExtractValue
|
||||||
|
| InsertValue
|
||||||
|
| Fence
|
||||||
|
| AtomicCmpXchg
|
||||||
|
| AtomicRMW
|
||||||
|
| Resume
|
||||||
|
| LandingPad
|
||||||
|
| Unwind
|
||||||
|
end
|
||||||
|
|
||||||
exception IoError of string
|
exception IoError of string
|
||||||
|
|
||||||
external register_exns : exn -> unit = "llvm_register_core_exns"
|
external register_exns : exn -> unit = "llvm_register_core_exns"
|
||||||
@@ -272,6 +343,7 @@ external const_pointer_null : lltype -> llvalue = "LLVMConstPointerNull"
|
|||||||
external undef : lltype -> llvalue = "LLVMGetUndef"
|
external undef : lltype -> llvalue = "LLVMGetUndef"
|
||||||
external is_null : llvalue -> bool = "llvm_is_null"
|
external is_null : llvalue -> bool = "llvm_is_null"
|
||||||
external is_undef : llvalue -> bool = "llvm_is_undef"
|
external is_undef : llvalue -> bool = "llvm_is_undef"
|
||||||
|
external constexpr_opcode : llvalue -> Opcode.t = "llvm_constexpr_get_opcode"
|
||||||
|
|
||||||
(*--... Operations on instructions .........................................--*)
|
(*--... Operations on instructions .........................................--*)
|
||||||
external has_metadata : llvalue -> bool = "llvm_has_metadata"
|
external has_metadata : llvalue -> bool = "llvm_has_metadata"
|
||||||
@@ -289,6 +361,8 @@ external get_named_metadata : llmodule -> string -> llvalue array = "llvm_get_na
|
|||||||
external const_int : lltype -> int -> llvalue = "llvm_const_int"
|
external const_int : lltype -> int -> llvalue = "llvm_const_int"
|
||||||
external const_of_int64 : lltype -> Int64.t -> bool -> llvalue
|
external const_of_int64 : lltype -> Int64.t -> bool -> llvalue
|
||||||
= "llvm_const_of_int64"
|
= "llvm_const_of_int64"
|
||||||
|
external int64_of_const : llvalue -> Int64.t option
|
||||||
|
= "llvm_int64_of_const"
|
||||||
external const_int_of_string : lltype -> string -> int -> llvalue
|
external const_int_of_string : lltype -> string -> int -> llvalue
|
||||||
= "llvm_const_int_of_string"
|
= "llvm_const_int_of_string"
|
||||||
external const_float : lltype -> float -> llvalue = "llvm_const_float"
|
external const_float : lltype -> float -> llvalue = "llvm_const_float"
|
||||||
@@ -706,6 +780,7 @@ external instr_end : llbasicblock -> (llbasicblock, llvalue) llrev_pos
|
|||||||
external instr_pred : llvalue -> (llbasicblock, llvalue) llrev_pos
|
external instr_pred : llvalue -> (llbasicblock, llvalue) llrev_pos
|
||||||
= "llvm_instr_pred"
|
= "llvm_instr_pred"
|
||||||
|
|
||||||
|
external instr_opcode : llvalue -> Opcode.t = "llvm_instr_get_opcode"
|
||||||
external icmp_predicate : llvalue -> Icmp.t option = "llvm_instr_icmp_predicate"
|
external icmp_predicate : llvalue -> Icmp.t option = "llvm_instr_icmp_predicate"
|
||||||
|
|
||||||
let rec iter_instrs_range f i e =
|
let rec iter_instrs_range f i e =
|
||||||
|
@@ -179,6 +179,78 @@ module Fcmp : sig
|
|||||||
| True
|
| True
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(** The opcodes for LLVM instructions and constant expressions. *)
|
||||||
|
module Opcode : sig
|
||||||
|
type t =
|
||||||
|
| Invalid (* not an instruction *)
|
||||||
|
(* Terminator Instructions *)
|
||||||
|
| Ret
|
||||||
|
| Br
|
||||||
|
| Switch
|
||||||
|
| IndirectBr
|
||||||
|
| Invoke
|
||||||
|
| Invalid2
|
||||||
|
| Unreachable
|
||||||
|
(* Standard Binary Operators *)
|
||||||
|
| Add
|
||||||
|
| FAdd
|
||||||
|
| Sub
|
||||||
|
| FSub
|
||||||
|
| Mul
|
||||||
|
| FMul
|
||||||
|
| UDiv
|
||||||
|
| SDiv
|
||||||
|
| FDiv
|
||||||
|
| URem
|
||||||
|
| SRem
|
||||||
|
| FRem
|
||||||
|
(* Logical Operators *)
|
||||||
|
| Shl
|
||||||
|
| LShr
|
||||||
|
| AShr
|
||||||
|
| And
|
||||||
|
| Or
|
||||||
|
| Xor
|
||||||
|
(* Memory Operators *)
|
||||||
|
| Alloca
|
||||||
|
| Load
|
||||||
|
| Store
|
||||||
|
| GetElementPtr
|
||||||
|
(* Cast Operators *)
|
||||||
|
| Trunc
|
||||||
|
| ZExt
|
||||||
|
| SExt
|
||||||
|
| FPToUI
|
||||||
|
| FPToSI
|
||||||
|
| UIToFP
|
||||||
|
| SIToFP
|
||||||
|
| FPTrunc
|
||||||
|
| FPExt
|
||||||
|
| PtrToInt
|
||||||
|
| IntToPtr
|
||||||
|
| BitCast
|
||||||
|
(* Other Operators *)
|
||||||
|
| ICmp
|
||||||
|
| FCmp
|
||||||
|
| PHI
|
||||||
|
| Call
|
||||||
|
| Select
|
||||||
|
| UserOp1
|
||||||
|
| UserOp2
|
||||||
|
| VAArg
|
||||||
|
| ExtractElement
|
||||||
|
| InsertElement
|
||||||
|
| ShuffleVector
|
||||||
|
| ExtractValue
|
||||||
|
| InsertValue
|
||||||
|
| Fence
|
||||||
|
| AtomicCmpXchg
|
||||||
|
| AtomicRMW
|
||||||
|
| Resume
|
||||||
|
| LandingPad
|
||||||
|
| Unwind
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
(** {6 Iteration} *)
|
(** {6 Iteration} *)
|
||||||
|
|
||||||
@@ -543,7 +615,7 @@ val is_null : llvalue -> bool
|
|||||||
otherwise. Similar to [llvm::isa<UndefValue>]. *)
|
otherwise. Similar to [llvm::isa<UndefValue>]. *)
|
||||||
val is_undef : llvalue -> bool
|
val is_undef : llvalue -> bool
|
||||||
|
|
||||||
|
val constexpr_opcode : llvalue -> Opcode.t
|
||||||
(** {7 Operations on instructions} *)
|
(** {7 Operations on instructions} *)
|
||||||
|
|
||||||
(** [has_metadata i] returns whether or not the instruction [i] has any
|
(** [has_metadata i] returns whether or not the instruction [i] has any
|
||||||
@@ -595,6 +667,10 @@ val const_int : lltype -> int -> llvalue
|
|||||||
[i]. See the method [llvm::ConstantInt::get]. *)
|
[i]. See the method [llvm::ConstantInt::get]. *)
|
||||||
val const_of_int64 : lltype -> Int64.t -> bool -> llvalue
|
val const_of_int64 : lltype -> Int64.t -> bool -> llvalue
|
||||||
|
|
||||||
|
(** [int64_of_const c] returns the int64 value of the [c] constant integer.
|
||||||
|
* None is returned if this is not an integer constant, or bitwidth exceeds 64.
|
||||||
|
* See the method [llvm::ConstantInt::getSExtValue].*)
|
||||||
|
val int64_of_const : llvalue -> Int64.t option
|
||||||
|
|
||||||
(** [const_int_of_string ty s r] returns the integer constant of type [ty] and
|
(** [const_int_of_string ty s r] returns the integer constant of type [ty] and
|
||||||
* value [s], with the radix [r]. See the method [llvm::ConstantInt::get]. *)
|
* value [s], with the radix [r]. See the method [llvm::ConstantInt::get]. *)
|
||||||
@@ -1439,6 +1515,7 @@ val instr_pred : llvalue -> (llbasicblock, llvalue) llrev_pos
|
|||||||
[f1,...,fN] are the instructions of basic block [bb]. Tail recursive. *)
|
[f1,...,fN] are the instructions of basic block [bb]. Tail recursive. *)
|
||||||
val fold_right_instrs: (llvalue -> 'a -> 'a) -> llbasicblock -> 'a -> 'a
|
val fold_right_instrs: (llvalue -> 'a -> 'a) -> llbasicblock -> 'a -> 'a
|
||||||
|
|
||||||
|
val instr_opcode : llvalue -> Opcode.t
|
||||||
|
|
||||||
val icmp_predicate : llvalue -> Icmp.t option
|
val icmp_predicate : llvalue -> Icmp.t option
|
||||||
|
|
||||||
|
@@ -427,6 +427,12 @@ CAMLprim value llvm_is_undef(LLVMValueRef Val) {
|
|||||||
return Val_bool(LLVMIsUndef(Val));
|
return Val_bool(LLVMIsUndef(Val));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* llvalue -> Opcode.t */
|
||||||
|
CAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
|
||||||
|
return LLVMIsAConstantExpr(Val) ?
|
||||||
|
Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
|
||||||
|
}
|
||||||
|
|
||||||
/*--... Operations on instructions .........................................--*/
|
/*--... Operations on instructions .........................................--*/
|
||||||
|
|
||||||
/* llvalue -> bool */
|
/* llvalue -> bool */
|
||||||
@@ -512,6 +518,19 @@ CAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
|
|||||||
return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
|
return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* llvalue -> Int64.t */
|
||||||
|
CAMLprim value llvm_int64_of_const(LLVMValueRef Const)
|
||||||
|
{
|
||||||
|
CAMLparam0();
|
||||||
|
if (LLVMIsAConstantInt(Const) &&
|
||||||
|
LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
|
||||||
|
value Option = alloc(1, 0);
|
||||||
|
Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
|
||||||
|
CAMLreturn(Option);
|
||||||
|
}
|
||||||
|
CAMLreturn(Val_int(0));
|
||||||
|
}
|
||||||
|
|
||||||
/* lltype -> string -> int -> llvalue */
|
/* lltype -> string -> int -> llvalue */
|
||||||
CAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
|
CAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
|
||||||
value Radix) {
|
value Radix) {
|
||||||
@@ -1013,6 +1032,12 @@ CAMLprim value llvm_value_is_block(LLVMValueRef Val) {
|
|||||||
DEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
|
DEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
|
||||||
LLVMGetInstructionParent)
|
LLVMGetInstructionParent)
|
||||||
|
|
||||||
|
/* llvalue -> Opcode.t */
|
||||||
|
CAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
|
||||||
|
LLVMOpcode o = LLVMGetInstructionOpcode(Inst);
|
||||||
|
assert (o <= LLVMUnwind );
|
||||||
|
return Val_int(o);
|
||||||
|
}
|
||||||
|
|
||||||
/* llvalue -> ICmp.t */
|
/* llvalue -> ICmp.t */
|
||||||
CAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
|
CAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
|
||||||
|
@@ -789,6 +789,7 @@ LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
|
|||||||
LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
|
LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
|
||||||
LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
|
LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
|
||||||
void LLVMInstructionEraseFromParent(LLVMValueRef Inst);
|
void LLVMInstructionEraseFromParent(LLVMValueRef Inst);
|
||||||
|
LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst);
|
||||||
LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst);
|
LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst);
|
||||||
|
|
||||||
/* Operations on call sites */
|
/* Operations on call sites */
|
||||||
|
@@ -1591,6 +1591,12 @@ LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst) {
|
|||||||
return (LLVMIntPredicate)0;
|
return (LLVMIntPredicate)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst) {
|
||||||
|
if (Instruction *C = dyn_cast<Instruction>(unwrap(Inst)))
|
||||||
|
return map_to_llvmopcode(C->getOpcode());
|
||||||
|
return (LLVMOpcode)0;
|
||||||
|
}
|
||||||
|
|
||||||
/*--.. Call and invoke instructions ........................................--*/
|
/*--.. Call and invoke instructions ........................................--*/
|
||||||
|
|
||||||
unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
|
unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
|
||||||
|
Reference in New Issue
Block a user