mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 07:08:48 +00:00
Fix non-constant compound literals of slices
This commit is contained in:
@@ -131,6 +131,25 @@ gb_internal lbValue lb_const_ptr_cast(lbModule *m, lbValue value, Type *t) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gb_internal LLVMValueRef llvm_const_string_internal(lbModule *m, Type *t, LLVMValueRef data, LLVMValueRef len) {
|
||||||
|
if (build_context.metrics.ptr_size < build_context.metrics.int_size) {
|
||||||
|
LLVMValueRef values[3] = {
|
||||||
|
data,
|
||||||
|
LLVMConstNull(lb_type(m, t_i32)),
|
||||||
|
len,
|
||||||
|
};
|
||||||
|
return llvm_const_named_struct_internal(lb_type(m, t), values, 3);
|
||||||
|
} else {
|
||||||
|
LLVMValueRef values[2] = {
|
||||||
|
data,
|
||||||
|
len,
|
||||||
|
};
|
||||||
|
return llvm_const_named_struct_internal(lb_type(m, t), values, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
gb_internal LLVMValueRef llvm_const_named_struct(lbModule *m, Type *t, LLVMValueRef *values, isize value_count_) {
|
gb_internal LLVMValueRef llvm_const_named_struct(lbModule *m, Type *t, LLVMValueRef *values, isize value_count_) {
|
||||||
LLVMTypeRef struct_type = lb_type(m, t);
|
LLVMTypeRef struct_type = lb_type(m, t);
|
||||||
GB_ASSERT(LLVMGetTypeKind(struct_type) == LLVMStructTypeKind);
|
GB_ASSERT(LLVMGetTypeKind(struct_type) == LLVMStructTypeKind);
|
||||||
@@ -659,10 +678,9 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bo
|
|||||||
ptr = LLVMConstNull(lb_type(m, t_u8_ptr));
|
ptr = LLVMConstNull(lb_type(m, t_u8_ptr));
|
||||||
}
|
}
|
||||||
LLVMValueRef str_len = LLVMConstInt(lb_type(m, t_int), value.value_string.len, true);
|
LLVMValueRef str_len = LLVMConstInt(lb_type(m, t_int), value.value_string.len, true);
|
||||||
LLVMValueRef values[2] = {ptr, str_len};
|
|
||||||
GB_ASSERT(is_type_string(original_type));
|
GB_ASSERT(is_type_string(original_type));
|
||||||
|
|
||||||
res.value = llvm_const_named_struct(m, original_type, values, 2);
|
res.value = llvm_const_string_internal(m, original_type, ptr, str_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
@@ -4230,11 +4230,12 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) {
|
|||||||
lbValue count = {};
|
lbValue count = {};
|
||||||
count.type = t_int;
|
count.type = t_int;
|
||||||
|
|
||||||
|
unsigned len_index = lb_convert_struct_index(p->module, type, 1);
|
||||||
if (lb_is_const(slice)) {
|
if (lb_is_const(slice)) {
|
||||||
unsigned indices[1] = {1};
|
unsigned indices[1] = {len_index};
|
||||||
count.value = LLVMConstExtractValue(slice.value, indices, gb_count_of(indices));
|
count.value = LLVMConstExtractValue(slice.value, indices, gb_count_of(indices));
|
||||||
} else {
|
} else {
|
||||||
count.value = LLVMBuildExtractValue(p->builder, slice.value, 1, "");
|
count.value = LLVMBuildExtractValue(p->builder, slice.value, len_index, "");
|
||||||
}
|
}
|
||||||
lb_fill_slice(p, v, data, count);
|
lb_fill_slice(p, v, data, count);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
gb_internal void lb_add_debug_local_variable(lbProcedure *p, LLVMValueRef ptr, Type *type, Token const &token);
|
gb_internal void lb_add_debug_local_variable(lbProcedure *p, LLVMValueRef ptr, Type *type, Token const &token);
|
||||||
|
gb_internal LLVMValueRef llvm_const_string_internal(lbModule *m, Type *t, LLVMValueRef data, LLVMValueRef len);
|
||||||
|
|
||||||
gb_global Entity *lb_global_type_info_data_entity = {};
|
gb_global Entity *lb_global_type_info_data_entity = {};
|
||||||
gb_global lbAddr lb_global_type_info_member_types = {};
|
gb_global lbAddr lb_global_type_info_member_types = {};
|
||||||
@@ -1776,11 +1777,23 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
type = LLVMStructCreateNamed(ctx, name);
|
type = LLVMStructCreateNamed(ctx, name);
|
||||||
LLVMTypeRef fields[2] = {
|
|
||||||
LLVMPointerType(lb_type(m, t_u8), 0),
|
if (build_context.metrics.ptr_size < build_context.metrics.int_size) {
|
||||||
lb_type(m, t_int),
|
GB_ASSERT(build_context.metrics.ptr_size == 4);
|
||||||
};
|
GB_ASSERT(build_context.metrics.int_size == 8);
|
||||||
LLVMStructSetBody(type, fields, 2, false);
|
LLVMTypeRef fields[3] = {
|
||||||
|
LLVMPointerType(lb_type(m, t_u8), 0),
|
||||||
|
lb_type(m, t_i32),
|
||||||
|
lb_type(m, t_int),
|
||||||
|
};
|
||||||
|
LLVMStructSetBody(type, fields, 3, false);
|
||||||
|
} else {
|
||||||
|
LLVMTypeRef fields[2] = {
|
||||||
|
LLVMPointerType(lb_type(m, t_u8), 0),
|
||||||
|
lb_type(m, t_int),
|
||||||
|
};
|
||||||
|
LLVMStructSetBody(type, fields, 2, false);
|
||||||
|
}
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
case Basic_cstring: return LLVMPointerType(LLVMInt8TypeInContext(ctx), 0);
|
case Basic_cstring: return LLVMPointerType(LLVMInt8TypeInContext(ctx), 0);
|
||||||
@@ -2533,10 +2546,9 @@ gb_internal lbValue lb_find_or_add_entity_string(lbModule *m, String const &str)
|
|||||||
ptr = LLVMConstNull(lb_type(m, t_u8_ptr));
|
ptr = LLVMConstNull(lb_type(m, t_u8_ptr));
|
||||||
}
|
}
|
||||||
LLVMValueRef str_len = LLVMConstInt(lb_type(m, t_int), str.len, true);
|
LLVMValueRef str_len = LLVMConstInt(lb_type(m, t_int), str.len, true);
|
||||||
LLVMValueRef values[2] = {ptr, str_len};
|
|
||||||
|
|
||||||
lbValue res = {};
|
lbValue res = {};
|
||||||
res.value = llvm_const_named_struct(m, t_string, values, 2);
|
res.value = llvm_const_string_internal(m, t_string, ptr, str_len);
|
||||||
res.type = t_string;
|
res.type = t_string;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2471,6 +2471,7 @@ gb_internal void lb_build_stmt(lbProcedure *p, Ast *node) {
|
|||||||
}
|
}
|
||||||
GB_ASSERT(lval_index == lvals.count);
|
GB_ASSERT(lval_index == lvals.count);
|
||||||
|
|
||||||
|
|
||||||
for_array(i, vd->names) {
|
for_array(i, vd->names) {
|
||||||
Ast *name = vd->names[i];
|
Ast *name = vd->names[i];
|
||||||
if (!is_blank_ident(name) && !lvals_preused[i]) {
|
if (!is_blank_ident(name) && !lvals_preused[i]) {
|
||||||
|
|||||||
Reference in New Issue
Block a user