Adding an uninitialized builder constructor to the Ocaml bindings.
authorGordon Henriksen <gordonhenriksen@mac.com>
Wed, 26 Dec 2007 21:21:51 +0000 (21:21 +0000)
committerGordon Henriksen <gordonhenriksen@mac.com>
Wed, 26 Dec 2007 21:21:51 +0000 (21:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45362 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/ocaml/llvm/llvm.ml
bindings/ocaml/llvm/llvm.mli
bindings/ocaml/llvm/llvm_ocaml.c

index ef63e13..b5d1d3d 100644 (file)
@@ -327,6 +327,8 @@ external incoming : llvalue -> (llvalue * llbasicblock) list = "llvm_incoming"
 
 
 (*===-- Instruction builders ----------------------------------------------===*)
+external builder: unit-> llbuilder
+                = "llvm_builder"
 external builder_before : llvalue -> llbuilder = "llvm_builder_before"
 external builder_at_end : llbasicblock -> llbuilder = "llvm_builder_at_end"
 external position_before : llvalue -> llbuilder -> unit = "llvm_position_before"
index 22d3591..8d9d212 100644 (file)
@@ -847,6 +847,12 @@ external incoming : llvalue -> (llvalue * llbasicblock) list = "llvm_incoming"
 
 (*===-- Instruction builders ----------------------------------------------===*)
 
+(** [builder] creates an instruction builder with no position. It is invalid to
+    use this builder until its position is set with [position_before] or
+    [position_at_end]. See the constructor for [llvm::LLVMBuilder]. **)
+external builder: unit-> llbuilder
+                = "llvm_builder"
+
 (** [builder_before ins] creates an instruction builder positioned before the
     instruction [isn]. See the constructor for [llvm::LLVMBuilder]. **)
 external builder_before : llvalue -> llbuilder = "llvm_builder_before"
index 7224439..d8856e7 100644 (file)
@@ -668,7 +668,7 @@ CAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
 
 #define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
 
-void llvm_finalize_builder(value B) {
+static void llvm_finalize_builder(value B) {
   LLVMDisposeBuilder(Builder_val(B));
 }
 
@@ -681,24 +681,29 @@ static struct custom_operations builder_ops = {
   custom_deserialize_default
 };
 
+static value alloc_builder(LLVMBuilderRef B) {
+  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
+  Builder_val(V) = B;
+  return V;
+}
+
+/* unit-> llbuilder */
+CAMLprim value llvm_builder(value Unit) {
+  return alloc_builder(LLVMCreateBuilder());
+}
+
 /* llvalue -> llbuilder */
 CAMLprim value llvm_builder_before(LLVMValueRef Inst) {
-  value V;
   LLVMBuilderRef B = LLVMCreateBuilder();
   LLVMPositionBuilderBefore(B, Inst);
-  V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
-  Builder_val(V) = B;
-  return V;
+  return alloc_builder(B);
 }
 
 /* llbasicblock -> llbuilder */
 CAMLprim value llvm_builder_at_end(LLVMBasicBlockRef BB) {
-  value V;
   LLVMBuilderRef B = LLVMCreateBuilder();
   LLVMPositionBuilderAtEnd(B, BB);
-  V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
-  Builder_val(V) = B;
-  return V;
+  return alloc_builder(B);
 }
 
 /* llvalue -> llbuilder -> unit */