commit
013c7b24d2
38
src/ir.cpp
38
src/ir.cpp
|
@ -14577,8 +14577,7 @@ static IrInstruction *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_
|
||||||
return ira->codegen->invalid_instruction;
|
return ira->codegen->invalid_instruction;
|
||||||
if (type_is_invalid(struct_val->type))
|
if (type_is_invalid(struct_val->type))
|
||||||
return ira->codegen->invalid_instruction;
|
return ira->codegen->invalid_instruction;
|
||||||
ConstExprValue *field_val = &struct_val->data.x_struct.fields[field->src_index];
|
ZigType *ptr_type = get_pointer_to_type_extra(ira->codegen, field->type_entry,
|
||||||
ZigType *ptr_type = get_pointer_to_type_extra(ira->codegen, field_val->type,
|
|
||||||
is_const, is_volatile, PtrLenSingle, align_bytes,
|
is_const, is_volatile, PtrLenSingle, align_bytes,
|
||||||
(uint32_t)(ptr_bit_offset + field->bit_offset_in_host),
|
(uint32_t)(ptr_bit_offset + field->bit_offset_in_host),
|
||||||
(uint32_t)host_int_bytes_for_result_type);
|
(uint32_t)host_int_bytes_for_result_type);
|
||||||
|
@ -16883,16 +16882,12 @@ static void ensure_field_index(ZigType *type, const char *field_name, size_t ind
|
||||||
|
|
||||||
static ZigType *ir_type_info_get_type(IrAnalyze *ira, const char *type_name, ZigType *root) {
|
static ZigType *ir_type_info_get_type(IrAnalyze *ira, const char *type_name, ZigType *root) {
|
||||||
Error err;
|
Error err;
|
||||||
static ConstExprValue *type_info_var = nullptr; // TODO oops this global variable made it past code review
|
ConstExprValue *type_info_var = get_builtin_value(ira->codegen, "TypeInfo");
|
||||||
static ZigType *type_info_type = nullptr; // TODO oops this global variable made it past code review
|
|
||||||
if (type_info_var == nullptr) {
|
|
||||||
type_info_var = get_builtin_value(ira->codegen, "TypeInfo");
|
|
||||||
assert(type_info_var->type->id == ZigTypeIdMetaType);
|
assert(type_info_var->type->id == ZigTypeIdMetaType);
|
||||||
|
|
||||||
assertNoError(ensure_complete_type(ira->codegen, type_info_var->data.x_type));
|
assertNoError(ensure_complete_type(ira->codegen, type_info_var->data.x_type));
|
||||||
type_info_type = type_info_var->data.x_type;
|
|
||||||
|
ZigType *type_info_type = type_info_var->data.x_type;
|
||||||
assert(type_info_type->id == ZigTypeIdUnion);
|
assert(type_info_type->id == ZigTypeIdUnion);
|
||||||
}
|
|
||||||
|
|
||||||
if (type_name == nullptr && root == nullptr)
|
if (type_name == nullptr && root == nullptr)
|
||||||
return type_info_type;
|
return type_info_type;
|
||||||
|
@ -20180,8 +20175,29 @@ static Error buf_read_value_bytes(IrAnalyze *ira, AstNode *source_node, uint8_t
|
||||||
val->data.x_ptr.data.hard_coded_addr.addr = bigint_as_unsigned(&bn);
|
val->data.x_ptr.data.hard_coded_addr.addr = bigint_as_unsigned(&bn);
|
||||||
return ErrorNone;
|
return ErrorNone;
|
||||||
}
|
}
|
||||||
case ZigTypeIdArray:
|
case ZigTypeIdArray: {
|
||||||
zig_panic("TODO buf_read_value_bytes array type");
|
uint64_t elem_size = type_size(ira->codegen, val->type->data.array.child_type);
|
||||||
|
size_t len = val->type->data.array.len;
|
||||||
|
|
||||||
|
switch (val->data.x_array.special) {
|
||||||
|
case ConstArraySpecialNone:
|
||||||
|
val->data.x_array.data.s_none.elements = create_const_vals(len);
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
ConstExprValue *elem = &val->data.x_array.data.s_none.elements[i];
|
||||||
|
elem->special = ConstValSpecialStatic;
|
||||||
|
elem->type = val->type->data.array.child_type;
|
||||||
|
if ((err = buf_read_value_bytes(ira, source_node, buf + (elem_size * i), elem)))
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ConstArraySpecialUndef:
|
||||||
|
zig_panic("TODO buf_read_value_bytes ConstArraySpecialUndef array type");
|
||||||
|
case ConstArraySpecialBuf:
|
||||||
|
zig_panic("TODO buf_read_value_bytes ConstArraySpecialBuf array type");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorNone;
|
||||||
|
}
|
||||||
case ZigTypeIdStruct:
|
case ZigTypeIdStruct:
|
||||||
switch (val->type->data.structure.layout) {
|
switch (val->type->data.structure.layout) {
|
||||||
case ContainerLayoutAuto: {
|
case ContainerLayoutAuto: {
|
||||||
|
|
|
@ -34,3 +34,19 @@ fn testReinterpretBytesAsExternStruct() void {
|
||||||
var val = ptr.c;
|
var val = ptr.c;
|
||||||
assertOrPanic(val == 5);
|
assertOrPanic(val == 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "reinterpret struct field at comptime" {
|
||||||
|
const numLittle = comptime Bytes.init(0x12345678);
|
||||||
|
assertOrPanic(std.mem.eql(u8, []u8{ 0x78, 0x56, 0x34, 0x12 }, numLittle.bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
const Bytes = struct {
|
||||||
|
bytes: [4]u8,
|
||||||
|
|
||||||
|
pub fn init(v: u32) Bytes {
|
||||||
|
var res: Bytes = undefined;
|
||||||
|
@ptrCast(*align(1) u32, &res.bytes).* = v;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue