From: Peter Zotov Date: Fri, 17 Oct 2014 01:02:40 +0000 (+0000) Subject: [OCaml] Add Llvm.instr_clone. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9e4043010232933117e608c22126c4af8f462f93;p=platform%2Fupstream%2Fllvm.git [OCaml] Add Llvm.instr_clone. llvm-svn: 220008 --- diff --git a/llvm/bindings/ocaml/llvm/llvm.ml b/llvm/bindings/ocaml/llvm/llvm.ml index 470511a..dae5bda 100644 --- a/llvm/bindings/ocaml/llvm/llvm.ml +++ b/llvm/bindings/ocaml/llvm/llvm.ml @@ -955,6 +955,7 @@ external instr_pred : llvalue -> (llbasicblock, llvalue) llrev_pos external instr_opcode : llvalue -> Opcode.t = "llvm_instr_get_opcode" external icmp_predicate : llvalue -> Icmp.t option = "llvm_instr_icmp_predicate" +external instr_clone : llvalue -> llvalue = "llvm_instr_clone" let rec iter_instrs_range f i e = if i = e then () else diff --git a/llvm/bindings/ocaml/llvm/llvm.mli b/llvm/bindings/ocaml/llvm/llvm.mli index 9f34def..54d070f 100644 --- a/llvm/bindings/ocaml/llvm/llvm.mli +++ b/llvm/bindings/ocaml/llvm/llvm.mli @@ -1699,6 +1699,11 @@ val instr_opcode : llvalue -> Opcode.t instruction [i]. *) val icmp_predicate : llvalue -> Icmp.t option +(** [inst_clone i] returns a copy of instruction [i], + The instruction has no parent, and no name. + See the method [llvm::Instruction::clone]. *) +val instr_clone : llvalue -> llvalue + (** {7 Operations on call sites} *) diff --git a/llvm/bindings/ocaml/llvm/llvm_ocaml.c b/llvm/bindings/ocaml/llvm/llvm_ocaml.c index f0143a0..a8f7b78 100644 --- a/llvm/bindings/ocaml/llvm/llvm_ocaml.c +++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.c @@ -1358,6 +1358,13 @@ CAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) { CAMLreturn(Val_int(0)); } +/* llvalue -> llvalue */ +CAMLprim LLVMValueRef llvm_instr_clone(LLVMValueRef Inst) { + if (!LLVMIsAInstruction(Inst)) + failwith("Not an instruction"); + return LLVMInstructionClone(Inst); +} + /*--... Operations on call sites ...........................................--*/ diff --git a/llvm/test/Bindings/Ocaml/vmcore.ml b/llvm/test/Bindings/Ocaml/vmcore.ml index 1ce2852..3c94897 100644 --- a/llvm/test/Bindings/Ocaml/vmcore.ml +++ b/llvm/test/Bindings/Ocaml/vmcore.ml @@ -842,6 +842,24 @@ let test_instructions () = insist ("One<-Two<-" = fold_right_instrs rf bb ""); dispose_module m + end; + + group "clone instr"; + begin + (* CHECK: %clone = add i32 %0, 2 + *) + let fty = function_type void_type [| i32_type |] in + let fn = define_function "BuilderParent" fty m in + let bb = entry_block fn in + let b = builder_at_end context bb in + let p = param fn 0 in + let sum = build_add p p "sum" b in + let y = const_int i32_type 2 in + let clone = instr_clone sum in + set_operand clone 0 p; + set_operand clone 1 y; + insert_into_builder clone "clone" b; + ignore (build_ret_void b) end