Bindings for instruction calling conventions.
authorGordon Henriksen <gordonhenriksen@mac.com>
Sat, 29 Dec 2007 20:45:00 +0000 (20:45 +0000)
committerGordon Henriksen <gordonhenriksen@mac.com>
Sat, 29 Dec 2007 20:45:00 +0000 (20:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45422 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/ocaml/llvm/llvm.ml
bindings/ocaml/llvm/llvm.mli
bindings/ocaml/llvm/llvm_ocaml.c
include/llvm-c/Core.h
test/Bindings/Ocaml/vmcore.ml

index 457677b493a301b8f54dd978f469a98a8f57b56b..fa4db0e81148b1e8f4bb271a4992361a4b254642 100644 (file)
@@ -328,6 +328,12 @@ external value_of_block : llbasicblock -> llvalue = "LLVMBasicBlockAsValue"
 external value_is_block : llvalue -> bool = "llvm_value_is_block"
 external block_of_value : llvalue -> llbasicblock = "LLVMValueAsBasicBlock"
 
+(*--... Operations on call sites ...........................................--*)
+external instruction_call_conv: llvalue -> int
+                              = "llvm_instruction_call_conv"
+external set_instruction_call_conv: int -> llvalue -> unit
+                                  = "llvm_set_instruction_call_conv"
+
 (*--... Operations on phi nodes ............................................--*)
 external add_incoming : (llvalue * llbasicblock) -> llvalue -> unit
                       = "llvm_add_incoming"
index 8f2c9219e369470062de1c13bfef3a27134ed430..6d980a14709e80d0066aad81df2bfd12e2192b3a 100644 (file)
@@ -854,6 +854,20 @@ external value_is_block : llvalue -> bool = "llvm_value_is_block"
 (** [block_of_value v] losslessly casts [v] to an [llbasicblock]. **)
 external block_of_value : llvalue -> llbasicblock = "LLVMValueAsBasicBlock"
 
+(*--... Operations on call sites ...........................................--*)
+
+(** [inst_call_conv ci] is the calling convention for the call or invoke
+    instruction [ci], which may be one of the values from the module [CallConv].
+    See the method [CallSite:: **)
+external instruction_call_conv: llvalue -> int
+                              = "llvm_instruction_call_conv"
+
+(** [set_inst_call_conv cc ci] sets the calling convention for the call or
+    invoke instruction [ci] to the integer [cc], which can be one of the values
+    from the module [CallConv]. See the method [CallSite::]. **)
+external set_instruction_call_conv: int -> llvalue -> unit
+                                  = "llvm_set_instruction_call_conv"
+
 (*--... Operations on phi nodes ............................................--*)
 
 (** [add_incoming (v, bb) pn] adds the value [v] to the phi node [pn] for use
index d095550962297737f29e6fa720bd8d92f4f4d028..35c2c8da4be9313d9020a1110d2a58c17cddf3e8 100644 (file)
@@ -652,6 +652,19 @@ CAMLprim value llvm_value_is_block(LLVMValueRef Val) {
   return Val_bool(LLVMValueIsBasicBlock(Val));
 }
 
+/*--... Operations on call sites ...........................................--*/
+
+/* llvalue -> int */
+CAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
+  return Val_int(LLVMGetInstructionCallConv(Inst));
+}
+
+/* int -> llvalue -> unit */
+CAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
+  LLVMSetInstructionCallConv(Inst, Int_val(CC));
+  return Val_unit;
+}
+
 /*--... Operations on phi nodes ............................................--*/
 
 /* (llvalue * llbasicblock) -> llvalue -> unit */
index 21c319c6ec310f962572b3817b5841fa288d3276..b286e6fca28e6f5ef33ad82ea8c39c578b519b40 100644 (file)
@@ -378,6 +378,10 @@ LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
                                        const char *Name);
 void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
 
+/* Operations on call sites */
+void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
+unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
+
 /* Operations on phi nodes */
 void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
                      LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
index 6b103cb8fc985c51987c1550e8a5cc14a832d978..457e7664efae35225723192debe0a4213721e056 100644 (file)
@@ -768,14 +768,19 @@ let test_builder () =
   end;
   
   group "miscellaneous"; begin
-    (* RUN: grep {Inst45.*call.*P2.*P1} < %t.ll
+    (* RUN: grep {CallInst.*call.*P2.*P1} < %t.ll
+     * RUN: grep {CallInst.*cc63} < %t.ll
      * RUN: grep {Inst47.*select.*Inst46.*P1.*P2} < %t.ll
      * RUN: grep {Inst48.*va_arg.*null.*i32} < %t.ll
      * RUN: grep {Inst49.*extractelement.*Vec1.*P2} < %t.ll
      * RUN: grep {Inst50.*insertelement.*Vec1.*P1.*P2} < %t.ll
      * RUN: grep {Inst51.*shufflevector.*Vec1.*Vec2.*1.*1.*0.*0} < %t.ll
      *)
-         ignore (build_call fn [| p2; p1 |] "Inst45" atentry);
+    let ci = build_call fn [| p2; p1 |] "CallInst" atentry in
+    insist (CallConv.c = instruction_call_conv ci);
+    set_instruction_call_conv 63 ci;
+    insist (63 = instruction_call_conv ci);
+    
     let inst46 = build_icmp Icmp.Eq p1 p2 "Inst46" atentry in
          ignore (build_select inst46 p1 p2 "Inst47" atentry);
          ignore (build_va_arg