diff --git a/llvm/bindings/ocaml/debuginfo/debuginfo_ocaml.c b/llvm/bindings/ocaml/debuginfo/debuginfo_ocaml.c --- a/llvm/bindings/ocaml/debuginfo/debuginfo_ocaml.c +++ b/llvm/bindings/ocaml/debuginfo/debuginfo_ocaml.c @@ -362,7 +362,7 @@ value llvm_dibuild_get_or_create_type_array(value Builder, value Data) { unsigned int Count = Wosize_val(Data); - LLVMMetadataRef *Temp = alloc_temp(Data); + LLVMMetadataRef *Temp = from_val_array(Data); LLVMMetadataRef Metadata = LLVMDIBuilderGetOrCreateTypeArray(DIBuilder_val(Builder), Temp, Count); free(Temp); @@ -371,7 +371,7 @@ value llvm_dibuild_get_or_create_array(value Builder, value Data) { unsigned int Count = Wosize_val(Data); - LLVMMetadataRef *Temp = alloc_temp(Data); + LLVMMetadataRef *Temp = from_val_array(Data); LLVMMetadataRef Metadata = LLVMDIBuilderGetOrCreateArray(DIBuilder_val(Builder), Temp, Count); free(Temp); @@ -381,7 +381,7 @@ value llvm_dibuild_create_subroutine_type(value Builder, value File, value ParameterTypes, value Flags) { unsigned int Count = Wosize_val(ParameterTypes); - LLVMMetadataRef *Temp = alloc_temp(ParameterTypes); + LLVMMetadataRef *Temp = from_val_array(ParameterTypes); LLVMMetadataRef Metadata = LLVMDIBuilderCreateSubroutineType( DIBuilder_val(Builder), Metadata_val(File), Temp, Wosize_val(ParameterTypes), DIFlags_val(Flags)); @@ -400,7 +400,7 @@ value Builder, value Scope, value Name, value File, value LineNumber, value SizeInBits, value AlignInBits, value Elements, value ClassTy) { unsigned int Count = Wosize_val(Elements); - LLVMMetadataRef *Temp = alloc_temp(Elements); + LLVMMetadataRef *Temp = from_val_array(Elements); LLVMMetadataRef Metadata = LLVMDIBuilderCreateEnumerationType( DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name), caml_string_length(Name), Metadata_val(File), Int_val(LineNumber), @@ -427,7 +427,7 @@ value Builder, value Scope, value Name, value File, value LineNumber, value SizeInBits, value AlignInBits, value Flags, value Elements, value RunTimeLanguage, value UniqueId) { - LLVMMetadataRef *Temp = alloc_temp(Elements); + LLVMMetadataRef *Temp = from_val_array(Elements); LLVMMetadataRef Metadata = LLVMDIBuilderCreateUnionType( DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name), caml_string_length(Name), Metadata_val(File), Int_val(LineNumber), @@ -456,7 +456,7 @@ value llvm_dibuild_create_array_type(value Builder, value Size, value AlignInBits, value Ty, value Subscripts) { - LLVMMetadataRef *Temp = alloc_temp(Subscripts); + LLVMMetadataRef *Temp = from_val_array(Subscripts); LLVMMetadataRef Metadata = LLVMDIBuilderCreateArrayType( DIBuilder_val(Builder), (uint64_t)Int_val(Size), Int_val(AlignInBits), Metadata_val(Ty), Temp, Wosize_val(Subscripts)); @@ -467,7 +467,7 @@ value llvm_dibuild_create_vector_type(value Builder, value Size, value AlignInBits, value Ty, value Subscripts) { - LLVMMetadataRef *Temp = alloc_temp(Subscripts); + LLVMMetadataRef *Temp = from_val_array(Subscripts); LLVMMetadataRef Metadata = LLVMDIBuilderCreateVectorType( DIBuilder_val(Builder), (uint64_t)Int_val(Size), Int_val(AlignInBits), Metadata_val(Ty), Temp, Wosize_val(Subscripts)); @@ -515,7 +515,7 @@ value Builder, value Scope, value Name, value File, value LineNumber, value SizeInBits, value AlignInBits, value Flags, value DerivedFrom, value Elements, value RunTimeLanguage, value VTableHolder, value UniqueId) { - LLVMMetadataRef *Temp = alloc_temp(Elements); + LLVMMetadataRef *Temp = from_val_array(Elements); LLVMMetadataRef Metadata = LLVMDIBuilderCreateStructType( DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name), caml_string_length(Name), Metadata_val(File), Int_val(LineNumber), @@ -772,7 +772,7 @@ value SizeInBits, value AlignInBits, value OffsetInBits, value Flags, value DerivedFrom, value Elements, value VTableHolder, value TemplateParamsNode, value UniqueIdentifier) { - LLVMMetadataRef *Temp = alloc_temp(Elements); + LLVMMetadataRef *Temp = from_val_array(Elements); LLVMMetadataRef Metadata = LLVMDIBuilderCreateClassType( DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name), caml_string_length(Name), Metadata_val(File), Int_val(LineNumber), diff --git a/llvm/bindings/ocaml/debuginfo/llvm_debuginfo.ml b/llvm/bindings/ocaml/debuginfo/llvm_debuginfo.ml --- a/llvm/bindings/ocaml/debuginfo/llvm_debuginfo.ml +++ b/llvm/bindings/ocaml/debuginfo/llvm_debuginfo.ml @@ -231,7 +231,7 @@ let dibuild_create_debug_location ?(inlined_at = llmetadata_null ()) llctx ~line ~column ~scope = - dibuild_create_debug_location_helper llctx line column scope inlined_at + dibuild_create_debug_location_helper llctx ~line ~column ~scope ~inlined_at external di_location_get_line : location:Llvm.llmetadata -> int = "llvm_di_location_get_line" diff --git a/llvm/bindings/ocaml/llvm/llvm_ocaml.h b/llvm/bindings/ocaml/llvm/llvm_ocaml.h --- a/llvm/bindings/ocaml/llvm/llvm_ocaml.h +++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.h @@ -41,7 +41,11 @@ void *from_val(value v); -void *alloc_temp(value Elements); +/* from_val_array takes an OCaml array value of LLVM references encoded with + the representation described above and returns a malloc'd array + of unencoded LLVM references. The returned array must be deallocated using + free. */ +void *from_val_array(value Elements); #define DiagnosticInfo_val(v) ((LLVMDiagnosticInfoRef)from_val(v)) #define Context_val(v) ((LLVMContextRef)from_val(v)) diff --git a/llvm/bindings/ocaml/llvm/llvm_ocaml.c b/llvm/bindings/ocaml/llvm/llvm_ocaml.c --- a/llvm/bindings/ocaml/llvm/llvm_ocaml.c +++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.c @@ -52,7 +52,7 @@ void *from_val(value v) { assert(Is_long(v) && "OCaml values representing LLVM objects should have the " "low bit set so that the OCaml GC " - "treats them as integers"); + "treats them as tagged integers"); return (void *)(v ^ 1); } @@ -125,8 +125,8 @@ return Val_unit; } -void *alloc_temp(value Elements) { - unsigned Length = Wosize_val(Elements); +void *from_val_array(value Elements) { + mlsize_t Length = Wosize_val(Elements); void **Temp = malloc(sizeof(void *) * Length); if (Temp == NULL) caml_raise_out_of_memory(); @@ -367,12 +367,6 @@ return ModuleStr; } -/* llmodule -> string -> unit */ -value llvm_set_module_inline_asm(value M, value Asm) { - LLVMSetModuleInlineAsm(Module_val(M), String_val(Asm)); - return Val_unit; -} - /* llmodule -> llcontext */ value llvm_get_module_context(value M) { LLVMContextRef C = LLVMGetModuleContext(Module_val(M)); @@ -393,6 +387,12 @@ return Val_unit; } +/* llmodule -> string -> unit */ +value llvm_set_module_inline_asm(value M, value Asm) { + LLVMSetModuleInlineAsm(Module_val(M), String_val(Asm)); + return Val_unit; +} + /* llmodule -> string -> llmetadata option */ value llvm_get_module_flag(value M, value Key) { return ptr_to_option(LLVMGetModuleFlag(Module_val(M), String_val(Key), @@ -511,22 +511,20 @@ /* lltype -> lltype array -> lltype */ value llvm_function_type(value RetTy, value ParamTys) { - CAMLparam1(ParamTys); - size_t len = Wosize_val(ParamTys); - LLVMTypeRef *Temp = alloc_temp(ParamTys); + mlsize_t len = Wosize_val(ParamTys); + LLVMTypeRef *Temp = from_val_array(ParamTys); LLVMTypeRef Type = LLVMFunctionType(Type_val(RetTy), Temp, len, 0); free(Temp); - CAMLreturn(to_val(Type)); + return to_val(Type); } /* lltype -> lltype array -> lltype */ value llvm_var_arg_function_type(value RetTy, value ParamTys) { - CAMLparam1(ParamTys); - size_t len = Wosize_val(ParamTys); - LLVMTypeRef *Temp = alloc_temp(ParamTys); + mlsize_t len = Wosize_val(ParamTys); + LLVMTypeRef *Temp = from_val_array(ParamTys); LLVMTypeRef Type = LLVMFunctionType(Type_val(RetTy), Temp, len, 1); free(Temp); - CAMLreturn(to_val(Type)); + return to_val(Type); } /* lltype -> bool */ @@ -555,22 +553,20 @@ /* llcontext -> lltype array -> lltype */ value llvm_struct_type(value C, value ElementTypes) { - CAMLparam1(ElementTypes); - size_t Length = Wosize_val(ElementTypes); - LLVMTypeRef *Temp = alloc_temp(ElementTypes); + mlsize_t Length = Wosize_val(ElementTypes); + LLVMTypeRef *Temp = from_val_array(ElementTypes); LLVMTypeRef Type = LLVMStructTypeInContext(Context_val(C), Temp, Length, 0); free(Temp); - CAMLreturn(to_val(Type)); + return to_val(Type); } /* llcontext -> lltype array -> lltype */ value llvm_packed_struct_type(value C, value ElementTypes) { - CAMLparam1(ElementTypes); - size_t Length = Wosize_val(ElementTypes); - LLVMTypeRef *Temp = alloc_temp(ElementTypes); + mlsize_t Length = Wosize_val(ElementTypes); + LLVMTypeRef *Temp = from_val_array(ElementTypes); LLVMTypeRef Type = LLVMStructTypeInContext(Context_val(C), Temp, Length, 1); free(Temp); - CAMLreturn(to_val(Type)); + return to_val(Type); } /* llcontext -> string -> lltype */ @@ -580,11 +576,10 @@ /* lltype -> lltype array -> bool -> unit */ value llvm_struct_set_body(value Ty, value ElementTypes, value Packed) { - CAMLparam1(ElementTypes); - unsigned Length = Wosize_val(ElementTypes); - LLVMTypeRef *Temp = alloc_temp(ElementTypes); + mlsize_t Length = Wosize_val(ElementTypes); + LLVMTypeRef *Temp = from_val_array(ElementTypes); LLVMStructSetBody(Type_val(Ty), Temp, Length, Bool_val(Packed)); - CAMLreturn(Val_unit); + return Val_unit; } /* lltype -> string option */ @@ -936,8 +931,8 @@ /* llcontext -> llvalue array -> llvalue */ value llvm_mdnode(value C, value ElementVals) { - unsigned Length = Wosize_val(ElementVals); - LLVMValueRef *Temp = alloc_temp(ElementVals); + mlsize_t Length = Wosize_val(ElementVals); + LLVMValueRef *Temp = from_val_array(ElementVals); LLVMValueRef Value = LLVMMDNodeInContext(Context_val(C), Temp, Length); free(Temp); return to_val(Value); @@ -1061,8 +1056,8 @@ /* lltype -> llvalue array -> llvalue */ value llvm_const_array(value ElementTy, value ElementVals) { - unsigned Length = Wosize_val(ElementVals); - LLVMValueRef *Temp = alloc_temp(ElementVals); + mlsize_t Length = Wosize_val(ElementVals); + LLVMValueRef *Temp = from_val_array(ElementVals); LLVMValueRef Value = LLVMConstArray(Type_val(ElementTy), Temp, Length); free(Temp); return to_val(Value); @@ -1070,8 +1065,8 @@ /* llcontext -> llvalue array -> llvalue */ value llvm_const_struct(value C, value ElementVals) { - unsigned Length = Wosize_val(ElementVals); - LLVMValueRef *Temp = alloc_temp(ElementVals); + mlsize_t Length = Wosize_val(ElementVals); + LLVMValueRef *Temp = from_val_array(ElementVals); LLVMValueRef Value = LLVMConstStructInContext(Context_val(C), Temp, Length, 0); free(Temp); @@ -1080,8 +1075,8 @@ /* lltype -> llvalue array -> llvalue */ value llvm_const_named_struct(value Ty, value ElementVals) { - unsigned Length = Wosize_val(ElementVals); - LLVMValueRef *Temp = alloc_temp(ElementVals); + mlsize_t Length = Wosize_val(ElementVals); + LLVMValueRef *Temp = from_val_array(ElementVals); LLVMValueRef Value = LLVMConstNamedStruct(Type_val(Ty), (LLVMValueRef *)Temp, Length); free(Temp); @@ -1090,8 +1085,8 @@ /* llcontext -> llvalue array -> llvalue */ value llvm_const_packed_struct(value C, value ElementVals) { - unsigned Length = Wosize_val(ElementVals); - LLVMValueRef *Temp = alloc_temp(ElementVals); + mlsize_t Length = Wosize_val(ElementVals); + LLVMValueRef *Temp = from_val_array(ElementVals); LLVMValueRef Value = LLVMConstStructInContext(Context_val(C), Temp, Length, 1); free(Temp); @@ -1100,8 +1095,8 @@ /* llvalue array -> llvalue */ value llvm_const_vector(value ElementVals) { - unsigned Length = Wosize_val(ElementVals); - LLVMValueRef *Temp = alloc_temp(ElementVals); + mlsize_t Length = Wosize_val(ElementVals); + LLVMValueRef *Temp = from_val_array(ElementVals); LLVMValueRef Value = LLVMConstVector(Temp, Length); free(Temp); return to_val(Value); @@ -1265,8 +1260,8 @@ /* lltype -> llvalue -> llvalue array -> llvalue */ value llvm_const_gep(value Ty, value ConstantVal, value Indices) { - unsigned Length = Wosize_val(Indices); - LLVMValueRef *Temp = alloc_temp(Indices); + mlsize_t Length = Wosize_val(Indices); + LLVMValueRef *Temp = from_val_array(Indices); LLVMValueRef Value = LLVMConstGEP2(Type_val(Ty), Value_val(ConstantVal), Temp, Length); free(Temp); @@ -1275,8 +1270,8 @@ /* lltype -> llvalue -> llvalue array -> llvalue */ value llvm_const_in_bounds_gep(value Ty, value ConstantVal, value Indices) { - unsigned Length = Wosize_val(Indices); - LLVMValueRef *Temp = alloc_temp(Indices); + mlsize_t Length = Wosize_val(Indices); + LLVMValueRef *Temp = from_val_array(Indices); LLVMValueRef Value = LLVMConstInBoundsGEP2(Type_val(Ty), Value_val(ConstantVal), Temp, Length); free(Temp); @@ -1807,24 +1802,12 @@ /*--... Operations on basic blocks .........................................--*/ -/* llbasicblock -> llvalue */ -value llvm_value_of_block(value BB) { - return to_val(LLVMBasicBlockAsValue(BasicBlock_val(BB))); -} - -/* llvalue -> bool */ -value llvm_value_is_block(value Val) { - return Val_bool(LLVMValueIsBasicBlock(Value_val(Val))); -} - -/* llbasicblock -> llvalue */ -value llvm_block_of_value(value Val) { - return to_val(LLVMValueAsBasicBlock(Value_val(Val))); -} +DEFINE_ITERATORS(block, BasicBlock, Value_val, LLVMBasicBlockRef, + BasicBlock_val, LLVMGetBasicBlockParent) -/* llbasicblock -> llvalue */ -value llvm_block_parent(value BB) { - return to_val(LLVMGetBasicBlockParent(BasicBlock_val(BB))); +/* llbasicblock -> llvalue option */ +value llvm_block_terminator(value Block) { + return ptr_to_option(LLVMGetBasicBlockTerminator(BasicBlock_val(Block))); } /* llvalue -> llbasicblock array */ @@ -1838,20 +1821,6 @@ return MLArray; } -/* llvalue -> llbasicblock */ -value llvm_entry_block(value Val) { - LLVMBasicBlockRef BB = LLVMGetEntryBasicBlock(Value_val(Val)); - return to_val(BB); -} - -DEFINE_ITERATORS(block, BasicBlock, Value_val, LLVMBasicBlockRef, - BasicBlock_val, LLVMGetBasicBlockParent) - -/* llbasicblock -> llvalue option */ -value llvm_block_terminator(value Block) { - return ptr_to_option(LLVMGetBasicBlockTerminator(BasicBlock_val(Block))); -} - /* llbasicblock -> unit */ value llvm_delete_block(value BB) { LLVMDeleteBasicBlock(BasicBlock_val(BB)); @@ -1888,6 +1857,32 @@ Context_val(Context), BasicBlock_val(BB), String_val(Name))); } +/* llbasicblock -> llvalue */ +value llvm_value_of_block(value BB) { + return to_val(LLVMBasicBlockAsValue(BasicBlock_val(BB))); +} + +/* llvalue -> bool */ +value llvm_value_is_block(value Val) { + return Val_bool(LLVMValueIsBasicBlock(Value_val(Val))); +} + +/* llbasicblock -> llvalue */ +value llvm_block_of_value(value Val) { + return to_val(LLVMValueAsBasicBlock(Value_val(Val))); +} + +/* llbasicblock -> llvalue */ +value llvm_block_parent(value BB) { + return to_val(LLVMGetBasicBlockParent(BasicBlock_val(BB))); +} + +/* llvalue -> llbasicblock */ +value llvm_entry_block(value Val) { + LLVMBasicBlockRef BB = LLVMGetEntryBasicBlock(Value_val(Val)); + return to_val(BB); +} + /*--... Operations on instructions .........................................--*/ /* llvalue -> llbasicblock */ @@ -2133,11 +2128,10 @@ /* llbuilder -> llbasicblock */ value llvm_insertion_block(value B) { - CAMLparam1(B); LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B)); if (!InsertBlock) caml_raise_not_found(); - CAMLreturn(to_val(InsertBlock)); + return to_val(InsertBlock); } /* llvalue -> string -> llbuilder -> unit */ @@ -2185,8 +2179,8 @@ /* llvalue array -> llbuilder -> llvalue */ value llvm_build_aggregate_ret(value RetVals, value B) { - unsigned Length = Wosize_val(RetVals); - LLVMValueRef *Temp = alloc_temp(RetVals); + mlsize_t Length = Wosize_val(RetVals); + LLVMValueRef *Temp = from_val_array(RetVals); LLVMValueRef Value = LLVMBuildAggregateRet(Builder_val(B), Temp, Length); free(Temp); return to_val(Value); @@ -2254,8 +2248,8 @@ string -> llbuilder -> llvalue */ value llvm_build_invoke_nat(value FnTy, value Fn, value Args, value Then, value Catch, value Name, value B) { - unsigned Length = Wosize_val(Args); - LLVMValueRef *Temp = alloc_temp(Args); + mlsize_t Length = Wosize_val(Args); + LLVMValueRef *Temp = from_val_array(Args); LLVMValueRef Value = LLVMBuildInvoke2( Builder_val(B), Type_val(FnTy), Value_val(Fn), Temp, Length, BasicBlock_val(Then), BasicBlock_val(Catch), String_val(Name)); @@ -2529,8 +2523,8 @@ /* lltype -> llvalue -> llvalue array -> string -> llbuilder -> llvalue */ value llvm_build_gep(value Ty, value Pointer, value Indices, value Name, value B) { - unsigned Length = Wosize_val(Indices); - LLVMValueRef *Temp = alloc_temp(Indices); + mlsize_t Length = Wosize_val(Indices); + LLVMValueRef *Temp = from_val_array(Indices); LLVMValueRef Value = LLVMBuildGEP2(Builder_val(B), Type_val(Ty), Value_val(Pointer), Temp, Length, String_val(Name)); @@ -2541,8 +2535,8 @@ /* lltype -> llvalue -> llvalue array -> string -> llbuilder -> llvalue */ value llvm_build_in_bounds_gep(value Ty, value Pointer, value Indices, value Name, value B) { - unsigned Length = Wosize_val(Indices); - LLVMValueRef *Temp = alloc_temp(Indices); + mlsize_t Length = Wosize_val(Indices); + LLVMValueRef *Temp = from_val_array(Indices); LLVMValueRef Value = LLVMBuildInBoundsGEP2(Builder_val(B), Type_val(Ty), Value_val(Pointer), Temp, Length, String_val(Name)); @@ -2726,8 +2720,8 @@ /* lltype -> llvalue -> llvalue array -> string -> llbuilder -> llvalue */ value llvm_build_call(value FnTy, value Fn, value Params, value Name, value B) { - unsigned Length = Wosize_val(Params); - LLVMValueRef *Temp = alloc_temp(Params); + mlsize_t Length = Wosize_val(Params); + LLVMValueRef *Temp = from_val_array(Params); LLVMValueRef Value = LLVMBuildCall2(Builder_val(B), Type_val(FnTy), Value_val(Fn), Temp, Length, String_val(Name));