authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-14 00:35:51-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-14 00:35:51-04:00
log5749dc49d839ba607392ed0934008773d33f47d7
tree09f3ca1c587f13396dc0837b252db68cfbba54bb
parentdd8c8c080229c1f0e742fb8702687f4080d7714d
signaturelock-open Commit is signed but in an unrecognized format.

respect local variable alignment in async functions


3 files changed, 25 insertions(+), 5 deletions(-)

src/all_types.hpp+1
...@@ -1087,6 +1087,7 @@ struct TypeStructField {...@@ -1087,6 +1087,7 @@ struct TypeStructField {
1087 ConstExprValue *init_val; // null and then memoized1087 ConstExprValue *init_val; // null and then memoized
1088 uint32_t bit_offset_in_host; // offset from the memory at gen_index1088 uint32_t bit_offset_in_host; // offset from the memory at gen_index
1089 uint32_t host_int_bytes; // size of host integer1089 uint32_t host_int_bytes; // size of host integer
1090 uint32_t align;
1090};1091};
10911092
1092enum ResolveStatus {1093enum ResolveStatus {
src/analyze.cpp+13-5
...@@ -1524,10 +1524,11 @@ static ZigType *get_struct_type(CodeGen *g, const char *type_name, SrcField fiel...@@ -1524,10 +1524,11 @@ static ZigType *get_struct_type(CodeGen *g, const char *type_name, SrcField fiel
1524 field->name = buf_create_from_str(fields[i].name);1524 field->name = buf_create_from_str(fields[i].name);
1525 field->type_entry = fields[i].ty;1525 field->type_entry = fields[i].ty;
1526 field->src_index = i;1526 field->src_index = i;
1527 field->align = fields[i].align;
15271528
1528 if (type_has_bits(field->type_entry)) {1529 if (type_has_bits(field->type_entry)) {
1529 assert(type_is_resolved(field->type_entry, ResolveStatusSizeKnown));1530 assert(type_is_resolved(field->type_entry, ResolveStatusSizeKnown));
1530 unsigned field_abi_align = max(fields[i].align, field->type_entry->abi_align);1531 unsigned field_abi_align = max(field->align, field->type_entry->abi_align);
1531 if (field_abi_align > abi_align) {1532 if (field_abi_align > abi_align) {
1532 abi_align = field_abi_align;1533 abi_align = field_abi_align;
1533 }1534 }
...@@ -5325,7 +5326,7 @@ static Error resolve_async_frame(CodeGen *g, ZigType *frame_type) {...@@ -5325,7 +5326,7 @@ static Error resolve_async_frame(CodeGen *g, ZigType *frame_type) {
5325 }5326 }
5326 instruction->field_index = fields.length;5327 instruction->field_index = fields.length;
53275328
5328 fields.append({name, child_type, 0});5329 fields.append({name, child_type, instruction->align});
5329 }5330 }
53305331
53315332
...@@ -6900,9 +6901,16 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS...@@ -6900,9 +6901,16 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS
6900 if (type_has_bits(struct_type->data.structure.fields[next_src_field_index].type_entry))6901 if (type_has_bits(struct_type->data.structure.fields[next_src_field_index].type_entry))
6901 break;6902 break;
6902 }6903 }
6903 size_t next_abi_align = (next_src_field_index == field_count) ?6904 size_t next_abi_align;
6904 struct_type->abi_align :6905 if (next_src_field_index == field_count) {
6905 struct_type->data.structure.fields[next_src_field_index].type_entry->abi_align;6906 next_abi_align = struct_type->abi_align;
6907 } else {
6908 if (struct_type->data.structure.fields[next_src_field_index].align == 0) {
6909 next_abi_align = struct_type->data.structure.fields[next_src_field_index].type_entry->abi_align;
6910 } else {
6911 next_abi_align = struct_type->data.structure.fields[next_src_field_index].align;
6912 }
6913 }
6906 size_t llvm_next_abi_align = (next_src_field_index == field_count) ?6914 size_t llvm_next_abi_align = (next_src_field_index == field_count) ?
6907 llvm_struct_abi_align :6915 llvm_struct_abi_align :
6908 LLVMABIAlignmentOfType(g->target_data_ref,6916 LLVMABIAlignmentOfType(g->target_data_ref,
test/stage1/behavior/coroutines.zig+11
...@@ -766,3 +766,14 @@ fn testAsyncAwaitTypicalUsage(comptime simulate_fail_download: bool, comptime si...@@ -766,3 +766,14 @@ fn testAsyncAwaitTypicalUsage(comptime simulate_fail_download: bool, comptime si
766 }766 }
767 };767 };
768}768}
769
770test "alignment of local variables in async functions" {
771 const S = struct {
772 fn doTheTest() void {
773 var y: u8 = 123;
774 var x: u8 align(128) = 1;
775 expect(@ptrToInt(&x) % 128 == 0);
776 }
777 };
778 S.doTheTest();
779}