}
#endif
+value caml_alloc_tuple_uninit(mlsize_t wosize) {
+ if (wosize <= Max_young_wosize) {
+ return caml_alloc_small(wosize, 0);
+ } else {
+ return caml_alloc_shr(wosize, 0);
+ }
+}
+
value llvm_string_of_message(char* Message) {
value String = caml_copy_string(Message);
LLVMDisposeMessage(Message);
/* lltype -> lltype array */
CAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
- value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
- LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
+ value Tys = caml_alloc_tuple_uninit(LLVMCountParamTypes(FunTy));
+ LLVMGetParamTypes(FunTy, (LLVMTypeRef *)Op_val(Tys));
return Tys;
}
/* lltype -> lltype array */
CAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) {
- value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
- LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
+ value Tys = caml_alloc_tuple_uninit(LLVMCountStructElementTypes(StructTy));
+ LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *)Op_val(Tys));
return Tys;
}
/* lltype -> lltype array */
CAMLprim value llvm_subtypes(LLVMTypeRef Ty) {
- CAMLparam0();
- CAMLlocal1(Arr);
+ CAMLparam0();
+ CAMLlocal1(Arr);
- unsigned Size = LLVMGetNumContainedTypes(Ty);
+ unsigned Size = LLVMGetNumContainedTypes(Ty);
- Arr = caml_alloc(Size, 0);
+ Arr = caml_alloc_tuple_uninit(Size);
- LLVMGetSubtypes(Ty, (LLVMTypeRef *) Arr);
+ LLVMGetSubtypes(Ty, (LLVMTypeRef *)Op_val(Arr));
- CAMLreturn(Arr);
+ CAMLreturn(Arr);
}
/* lltype -> int -> lltype */
CAMLlocal1(indices);
unsigned n = LLVMGetNumIndices(Instr);
const unsigned *Indices = LLVMGetIndices(Instr);
- indices = caml_alloc(n, 0);
+ indices = caml_alloc_tuple_uninit(n);
for (unsigned i = 0; i < n; i++) {
Op_val(indices)[i] = Val_int(Indices[i]);
}
unsigned int n;
n = LLVMGetMDNodeNumOperands(V);
- Operands = alloc(n, 0);
- LLVMGetMDNodeOperands(V, (LLVMValueRef *) Operands);
+ Operands = caml_alloc_tuple_uninit(n);
+ LLVMGetMDNodeOperands(V, (LLVMValueRef *)Op_val(Operands));
CAMLreturn(Operands);
}
/* llmodule -> string -> llvalue array */
-CAMLprim value llvm_get_namedmd(LLVMModuleRef M, value Name)
-{
+CAMLprim value llvm_get_namedmd(LLVMModuleRef M, value Name) {
CAMLparam1(Name);
CAMLlocal1(Nodes);
- Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(Name)), 0);
- LLVMGetNamedMetadataOperands(M, String_val(Name), (LLVMValueRef *) Nodes);
+ Nodes = caml_alloc_tuple_uninit(
+ LLVMGetNamedMetadataNumOperands(M, String_val(Name)));
+ LLVMGetNamedMetadataOperands(M, String_val(Name),
+ (LLVMValueRef *)Op_val(Nodes));
CAMLreturn(Nodes);
}
LLVMGlobalCopyAllMetadata(Global, &NumEntries);
Array = caml_alloc_tuple(NumEntries);
for (int i = 0; i < NumEntries; i++) {
- Pair = caml_alloc_tuple(2);
- Store_field(Pair, 0, Val_int(LLVMValueMetadataEntriesGetKind(Entries, i)));
- Store_field(Pair, 1,
- (value)LLVMValueMetadataEntriesGetMetadata(Entries, i));
+ Pair = caml_alloc_small(2, 0);
+ Field(Pair, 0) = Val_int(LLVMValueMetadataEntriesGetKind(Entries, i));
+ Field(Pair, 1) = (value)LLVMValueMetadataEntriesGetMetadata(Entries, i);
Store_field(Array, i, Pair);
}
LLVMDisposeValueMetadataEntries(Entries);
/* llvalue -> int -> llattribute array */
CAMLprim value llvm_function_attrs(LLVMValueRef F, value Index) {
unsigned Length = LLVMGetAttributeCountAtIndex(F, Int_val(Index));
- value Array = caml_alloc(Length, 0);
+ value Array = caml_alloc_tuple_uninit(Length);
LLVMGetAttributesAtIndex(F, Int_val(Index),
(LLVMAttributeRef *) Op_val(Array));
return Array;
/* llvalue -> llvalue */
CAMLprim value llvm_params(LLVMValueRef Fn) {
- value Params = alloc(LLVMCountParams(Fn), 0);
- LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
+ value Params = caml_alloc_tuple_uninit(LLVMCountParams(Fn));
+ LLVMGetParams(Fn, (LLVMValueRef *)Op_val(Params));
return Params;
}
/* llvalue -> llbasicblock array */
CAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
- value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
- LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
+ value MLArray = caml_alloc_tuple_uninit(LLVMCountBasicBlocks(Fn));
+ LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *)Op_val(MLArray));
return MLArray;
}
/* llvalue -> int -> llattribute array */
CAMLprim value llvm_call_site_attrs(LLVMValueRef F, value Index) {
unsigned Count = LLVMGetCallSiteAttributeCount(F, Int_val(Index));
- value Array = caml_alloc(Count, 0);
+ value Array = caml_alloc_tuple_uninit(Count);
LLVMGetCallSiteAttributes(F, Int_val(Index),
(LLVMAttributeRef *)Op_val(Array));
return Array;
/* 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);
+ for (I = LLVMCountIncoming(PhiNode); I != 0;) {
+ Hd = caml_alloc_small(2, 0);
+ Field(Hd, 0) = (value)LLVMGetIncomingValue(PhiNode, --I);
+ Field(Hd, 1) = (value)LLVMGetIncomingBlock(PhiNode, I);
+
+ Tmp = caml_alloc_small(2, 0);
+ Field(Tmp, 0) = Hd;
+ Field(Tmp, 1) = Tl;
Tl = Tmp;
}