mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Add indirect br support to llvm-c and ocaml.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97376 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
46c80e0c56
commit
c59286bff1
@ -351,6 +351,7 @@ external const_extractvalue : llvalue -> int array -> llvalue
|
|||||||
= "llvm_const_extractvalue"
|
= "llvm_const_extractvalue"
|
||||||
external const_insertvalue : llvalue -> llvalue -> int array -> llvalue
|
external const_insertvalue : llvalue -> llvalue -> int array -> llvalue
|
||||||
= "llvm_const_insertvalue"
|
= "llvm_const_insertvalue"
|
||||||
|
external block_address : llvalue -> llbasicblock -> llvalue = "LLVMBlockAddress"
|
||||||
|
|
||||||
(*--... Operations on global variables, functions, and aliases (globals) ...--*)
|
(*--... Operations on global variables, functions, and aliases (globals) ...--*)
|
||||||
external global_parent : llvalue -> llmodule = "LLVMGetGlobalParent"
|
external global_parent : llvalue -> llmodule = "LLVMGetGlobalParent"
|
||||||
@ -729,6 +730,10 @@ external build_switch : llvalue -> llbasicblock -> int -> llbuilder -> llvalue
|
|||||||
= "llvm_build_switch"
|
= "llvm_build_switch"
|
||||||
external add_case : llvalue -> llvalue -> llbasicblock -> unit
|
external add_case : llvalue -> llvalue -> llbasicblock -> unit
|
||||||
= "llvm_add_case"
|
= "llvm_add_case"
|
||||||
|
external build_indirect_br : llvalue -> int -> llbuilder -> llvalue
|
||||||
|
= "llvm_build_indirect_br"
|
||||||
|
external add_destination : llvalue -> llbasicblock -> unit
|
||||||
|
= "llvm_add_destination"
|
||||||
external build_invoke : llvalue -> llvalue array -> llbasicblock ->
|
external build_invoke : llvalue -> llvalue array -> llbasicblock ->
|
||||||
llbasicblock -> string -> llbuilder -> llvalue
|
llbasicblock -> string -> llbuilder -> llvalue
|
||||||
= "llvm_build_invoke_bc" "llvm_build_invoke_nat"
|
= "llvm_build_invoke_bc" "llvm_build_invoke_nat"
|
||||||
|
@ -950,6 +950,10 @@ external const_extractvalue : llvalue -> int array -> llvalue
|
|||||||
external const_insertvalue : llvalue -> llvalue -> int array -> llvalue
|
external const_insertvalue : llvalue -> llvalue -> int array -> llvalue
|
||||||
= "llvm_const_insertvalue"
|
= "llvm_const_insertvalue"
|
||||||
|
|
||||||
|
(** [block_address f bb] returns the address of the basic block [bb] in the
|
||||||
|
function [f]. See the method [llvm::BasicBlock::get]. *)
|
||||||
|
external block_address : llvalue -> llbasicblock -> llvalue = "LLVMBlockAddress"
|
||||||
|
|
||||||
|
|
||||||
(** {7 Operations on global variables, functions, and aliases (globals)} *)
|
(** {7 Operations on global variables, functions, and aliases (globals)} *)
|
||||||
|
|
||||||
@ -1562,6 +1566,20 @@ external build_switch : llvalue -> llbasicblock -> int -> llbuilder -> llvalue
|
|||||||
external add_case : llvalue -> llvalue -> llbasicblock -> unit
|
external add_case : llvalue -> llvalue -> llbasicblock -> unit
|
||||||
= "llvm_add_case"
|
= "llvm_add_case"
|
||||||
|
|
||||||
|
(** [build_indirect_br addr count b] creates a
|
||||||
|
[indirectbr %addr]
|
||||||
|
instruction at the position specified by the instruction builder [b] with
|
||||||
|
space reserved for [count] destinations.
|
||||||
|
See the method [llvm::LLVMBuilder::CreateIndirectBr]. *)
|
||||||
|
external build_indirect_br : llvalue -> int -> llbuilder -> llvalue
|
||||||
|
= "llvm_build_indirect_br"
|
||||||
|
|
||||||
|
(** [add_destination br bb] adds the basic block [bb] as a possible branch
|
||||||
|
location for the indirectbr instruction [br].
|
||||||
|
See the method [llvm::IndirectBrInst::addDestination]. **)
|
||||||
|
external add_destination : llvalue -> llbasicblock -> unit
|
||||||
|
= "llvm_add_destination"
|
||||||
|
|
||||||
(** [build_invoke fn args tobb unwindbb name b] creates an
|
(** [build_invoke fn args tobb unwindbb name b] creates an
|
||||||
[%name = invoke %fn(args) to %tobb unwind %unwindbb]
|
[%name = invoke %fn(args) to %tobb unwind %unwindbb]
|
||||||
instruction at the position specified by the instruction builder [b].
|
instruction at the position specified by the instruction builder [b].
|
||||||
|
@ -1138,6 +1138,20 @@ CAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
|
|||||||
return Val_unit;
|
return Val_unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* llvalue -> llbasicblock -> llbuilder -> llvalue */
|
||||||
|
CAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
|
||||||
|
value EstimatedDests,
|
||||||
|
value B) {
|
||||||
|
return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* llvalue -> llvalue -> llbasicblock -> unit */
|
||||||
|
CAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
|
||||||
|
LLVMBasicBlockRef Dest) {
|
||||||
|
LLVMAddDestination(IndirectBr, Dest);
|
||||||
|
return Val_unit;
|
||||||
|
}
|
||||||
|
|
||||||
/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
|
/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
|
||||||
llbuilder -> llvalue */
|
llbuilder -> llvalue */
|
||||||
CAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
|
CAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
|
||||||
|
@ -655,6 +655,7 @@ LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
|
|||||||
LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
|
LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
|
||||||
const char *AsmString, const char *Constraints,
|
const char *AsmString, const char *Constraints,
|
||||||
LLVMBool HasSideEffects, LLVMBool IsAlignStack);
|
LLVMBool HasSideEffects, LLVMBool IsAlignStack);
|
||||||
|
LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB);
|
||||||
|
|
||||||
/* Operations on global variables, functions, and aliases (globals) */
|
/* Operations on global variables, functions, and aliases (globals) */
|
||||||
LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
|
LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
|
||||||
@ -805,6 +806,8 @@ LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
|
|||||||
LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
|
LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
|
||||||
LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
|
LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
|
||||||
LLVMBasicBlockRef Else, unsigned NumCases);
|
LLVMBasicBlockRef Else, unsigned NumCases);
|
||||||
|
LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
|
||||||
|
unsigned NumDests);
|
||||||
LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
|
LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
|
||||||
LLVMValueRef *Args, unsigned NumArgs,
|
LLVMValueRef *Args, unsigned NumArgs,
|
||||||
LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
|
LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
|
||||||
@ -816,6 +819,9 @@ LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
|
|||||||
void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
|
void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
|
||||||
LLVMBasicBlockRef Dest);
|
LLVMBasicBlockRef Dest);
|
||||||
|
|
||||||
|
/* Add a destination to the indirectbr instruction */
|
||||||
|
void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest);
|
||||||
|
|
||||||
/* Arithmetic */
|
/* Arithmetic */
|
||||||
LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
|
LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
|
||||||
const char *Name);
|
const char *Name);
|
||||||
|
@ -1013,6 +1013,10 @@ LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
|
|||||||
Constraints, HasSideEffects, IsAlignStack));
|
Constraints, HasSideEffects, IsAlignStack));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB) {
|
||||||
|
return wrap(BlockAddress::get(unwrap<Function>(F), unwrap(BB)));
|
||||||
|
}
|
||||||
|
|
||||||
/*--.. Operations on global variables, functions, and aliases (globals) ....--*/
|
/*--.. Operations on global variables, functions, and aliases (globals) ....--*/
|
||||||
|
|
||||||
LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
|
LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
|
||||||
@ -1696,6 +1700,11 @@ LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V,
|
|||||||
return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
|
return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
|
||||||
|
unsigned NumDests) {
|
||||||
|
return wrap(unwrap(B)->CreateIndirectBr(unwrap(Addr), NumDests));
|
||||||
|
}
|
||||||
|
|
||||||
LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
|
LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
|
||||||
LLVMValueRef *Args, unsigned NumArgs,
|
LLVMValueRef *Args, unsigned NumArgs,
|
||||||
LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
|
LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
|
||||||
@ -1718,6 +1727,10 @@ void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
|
|||||||
unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
|
unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest) {
|
||||||
|
unwrap<IndirectBrInst>(IndirectBr)->addDestination(unwrap(Dest));
|
||||||
|
}
|
||||||
|
|
||||||
/*--.. Arithmetic ..........................................................--*/
|
/*--.. Arithmetic ..........................................................--*/
|
||||||
|
|
||||||
LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
|
LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
|
||||||
|
@ -897,6 +897,23 @@ let test_builder () =
|
|||||||
let si = build_switch p1 bb3 1 (builder_at_end context bb1) in
|
let si = build_switch p1 bb3 1 (builder_at_end context bb1) in
|
||||||
ignore (add_case si (const_int i32_type 2) bb2)
|
ignore (add_case si (const_int i32_type 2) bb2)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
group "indirectbr"; begin
|
||||||
|
(* RUN: grep {indirectbr i8\\* blockaddress(@X7, %IBRBlock2), \\\[label %IBRBlock2, label %IBRBlock3\\\]} < %t.ll
|
||||||
|
*)
|
||||||
|
let bb1 = append_block context "IBRBlock1" fn in
|
||||||
|
|
||||||
|
let bb2 = append_block context "IBRBlock2" fn in
|
||||||
|
ignore (build_unreachable (builder_at_end context bb2));
|
||||||
|
|
||||||
|
let bb3 = append_block context "IBRBlock3" fn in
|
||||||
|
ignore (build_unreachable (builder_at_end context bb3));
|
||||||
|
|
||||||
|
let addr = block_address fn bb2 in
|
||||||
|
let ibr = build_indirect_br addr 2 (builder_at_end context bb1) in
|
||||||
|
ignore (add_destination ibr bb2);
|
||||||
|
ignore (add_destination ibr bb3)
|
||||||
|
end;
|
||||||
|
|
||||||
group "invoke"; begin
|
group "invoke"; begin
|
||||||
(* RUN: grep {build_invoke.*invoke.*P1.*P2} < %t.ll
|
(* RUN: grep {build_invoke.*invoke.*P1.*P2} < %t.ll
|
||||||
|
Loading…
Reference in New Issue
Block a user