diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-09-21 13:46:13 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-21 13:46:13 -0400 |
| commit | f3a7c346ddfdac516cf82f5c0771fd07398a20ef (patch) | |
| tree | 67a36116490b97048e0a445712ea26f79e7e32ca /src/analyze.cpp | |
| parent | 533aff3a6a6a72ac09261c395c479570fe81d1d8 (diff) | |
| parent | 34d02f249b8c0742d5d575c439c38a3ed78f9583 (diff) | |
| download | zig-f3a7c346ddfdac516cf82f5c0771fd07398a20ef.tar.gz zig-f3a7c346ddfdac516cf82f5c0771fd07398a20ef.zip | |
Merge pull request #3278 from LemonBoy/struct-gen
A few steps towards AArch64 & ARM passing the behavior tests
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index 9a622d41a2..ebdf1e0605 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -7633,6 +7633,11 @@ static void resolve_llvm_types_slice(CodeGen *g, ZigType *type, ResolveStatus wa type->data.structure.resolve_status = ResolveStatusLLVMFull; } +static LLVMTypeRef get_llvm_array_type(unsigned byte_size) { + return byte_size == 1 ? + LLVMInt8Type() : LLVMArrayType(LLVMInt8Type(), byte_size); +} + static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveStatus wanted_resolve_status, ZigType *async_frame_type) { @@ -7730,9 +7735,8 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS size_t full_abi_size = get_abi_size_bytes(full_bit_count, g->pointer_size_bytes); if (full_abi_size * 8 == full_bit_count) { // next field recovers ABI alignment - element_types[gen_field_index] = LLVMIntType((unsigned)(full_bit_count)); + element_types[gen_field_index] = get_llvm_array_type(full_abi_size); gen_field_index += 1; - first_packed_bits_offset_misalign = SIZE_MAX; } } else if (get_abi_size_bytes(field_type->size_in_bits, g->pointer_size_bytes) * 8 != field_size_in_bits) { @@ -7740,6 +7744,8 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS } else { // This is a byte-aligned field (both start and end) in a packed struct. element_types[gen_field_index] = get_llvm_type(g, field_type); + assert(get_abi_size_bytes(field_type->size_in_bits, g->pointer_size_bytes) == + LLVMStoreSizeOfType(g->target_data_ref, element_types[gen_field_index])); gen_field_index += 1; } packed_bits_offset = next_packed_bits_offset; @@ -7802,11 +7808,12 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS if (first_packed_bits_offset_misalign != SIZE_MAX) { size_t full_bit_count = packed_bits_offset - first_packed_bits_offset_misalign; size_t full_abi_size = get_abi_size_bytes(full_bit_count, g->pointer_size_bytes); - element_types[gen_field_index] = LLVMIntType((unsigned)full_abi_size * 8); + element_types[gen_field_index] = get_llvm_array_type(full_abi_size); gen_field_index += 1; } if (type_has_bits(struct_type)) { + assert(struct_type->data.structure.gen_field_count == gen_field_index); LLVMStructSetBody(struct_type->llvm_type, element_types, (unsigned)struct_type->data.structure.gen_field_count, packed); } |
