aboutsummaryrefslogtreecommitdiffstats
path: root/bindings/ocaml/llvm/llvm_ocaml.c
diff options
context:
space:
mode:
authorGordon Henriksen <gordonhenriksen@mac.com>2007-10-08 18:14:39 +0000
committerGordon Henriksen <gordonhenriksen@mac.com>2007-10-08 18:14:39 +0000
commit18d123939226f795f632e1caa03c892fe69e92c9 (patch)
tree34c07e87ce874abaa9ad3d2ef27c0f72c5773c3d /bindings/ocaml/llvm/llvm_ocaml.c
parent6c89ea78bcceb54fdf347bb2df19d42e0c98d9bd (diff)
downloadexternal_llvm-18d123939226f795f632e1caa03c892fe69e92c9.zip
external_llvm-18d123939226f795f632e1caa03c892fe69e92c9.tar.gz
external_llvm-18d123939226f795f632e1caa03c892fe69e92c9.tar.bz2
C and Objective Caml bindings for PHINode::addIncoming etc.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42760 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'bindings/ocaml/llvm/llvm_ocaml.c')
-rw-r--r--bindings/ocaml/llvm/llvm_ocaml.c57
1 files changed, 53 insertions, 4 deletions
diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c
index 98354fc..ddf577a 100644
--- a/bindings/ocaml/llvm/llvm_ocaml.c
+++ b/bindings/ocaml/llvm/llvm_ocaml.c
@@ -21,6 +21,7 @@
#include "caml/mlvalues.h"
#include "caml/memory.h"
#include "llvm/Config/config.h"
+#include <assert.h>
/*===-- Modules -----------------------------------------------------------===*/
@@ -572,6 +573,39 @@ CAMLprim value llvm_value_is_block(LLVMValueRef Val) {
return Val_bool(LLVMValueIsBasicBlock(Val));
}
+/*--... Operations on phi nodes ............................................--*/
+
+/* (llvalue * llbasicblock) -> llvalue -> unit */
+CAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
+ LLVMAddIncoming(PhiNode,
+ (LLVMValueRef*) &Field(Incoming, 0),
+ (LLVMBasicBlockRef*) &Field(Incoming, 1),
+ 1);
+ return Val_unit;
+}
+
+/* llvalue -> (llvalue * llbasicblock) list */
+CAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
+ unsigned I;
+ CAMLparam0();
+ CAMLlocal3(Hd, Tl, Tmp);
+
+ /* Build a tuple list of them. */
+ Tl = Val_int(0);
+ for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
+ Hd = alloc(2, 0);
+ Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
+ Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
+
+ Tmp = alloc(2, 0);
+ Store_field(Tmp, 0, Hd);
+ Store_field(Tmp, 1, Tl);
+ Tl = Tmp;
+ }
+
+ CAMLreturn(Tl);
+}
+
/*===-- Instruction builders ----------------------------------------------===*/
@@ -933,10 +967,25 @@ CAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
/*--... Miscellaneous instructions .........................................--*/
-/* lltype -> string -> llbuilder -> llvalue */
-CAMLprim LLVMValueRef llvm_build_phi(LLVMTypeRef Ty,
- value Name, value B) {
- return LLVMBuildPhi(Builder_val(B), Ty, String_val(Name));
+/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
+CAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
+ value Hd, Tl;
+ LLVMValueRef FirstValue, PhiNode;
+
+ assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
+
+ Hd = Field(Incoming, 0);
+ FirstValue = (LLVMValueRef) Field(Hd, 0);
+ PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
+ String_val(Name));
+
+ for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
+ value Hd = Field(Tl, 0);
+ LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
+ (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
+ }
+
+ return PhiNode;
}
/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */