authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-14 13:54:33-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-14 13:55:45-04:00
log639c3811288b65173b3d9706b8e2001ee2419233
tree7c800c2e3853280c2eafd44d0456feb4096e0b4f
parent82af31ce368d16cc5cadac80faa3d8a4d4b1f752
signaturelock-open Commit is signed but in an unrecognized format.

fix coroutine alignment

zig returned the wrong alignment for coroutine promises in some cases

3 files changed, 9 insertions(+), 10 deletions(-)

src/analyze.cpp+6-7
...@@ -3953,14 +3953,14 @@ bool type_is_codegen_pointer(ZigType *type) {...@@ -3953,14 +3953,14 @@ bool type_is_codegen_pointer(ZigType *type) {
3953 return get_codegen_ptr_type(type) == type;3953 return get_codegen_ptr_type(type) == type;
3954}3954}
39553955
3956uint32_t get_ptr_align(ZigType *type) {3956uint32_t get_ptr_align(CodeGen *g, ZigType *type) {
3957 ZigType *ptr_type = get_codegen_ptr_type(type);3957 ZigType *ptr_type = get_codegen_ptr_type(type);
3958 if (ptr_type->id == ZigTypeIdPointer) {3958 if (ptr_type->id == ZigTypeIdPointer) {
3959 return ptr_type->data.pointer.alignment;3959 return ptr_type->data.pointer.alignment;
3960 } else if (ptr_type->id == ZigTypeIdFn) {3960 } else if (ptr_type->id == ZigTypeIdFn) {
3961 return (ptr_type->data.fn.fn_type_id.alignment == 0) ? 1 : ptr_type->data.fn.fn_type_id.alignment;3961 return (ptr_type->data.fn.fn_type_id.alignment == 0) ? 1 : ptr_type->data.fn.fn_type_id.alignment;
3962 } else if (ptr_type->id == ZigTypeIdPromise) {3962 } else if (ptr_type->id == ZigTypeIdPromise) {
3963 return 1;3963 return get_coro_frame_align_bytes(g);
3964 } else {3964 } else {
3965 zig_unreachable();3965 zig_unreachable();
3966 }3966 }
...@@ -6277,10 +6277,6 @@ uint32_t get_abi_alignment(CodeGen *g, ZigType *type_entry) {...@@ -6277,10 +6277,6 @@ uint32_t get_abi_alignment(CodeGen *g, ZigType *type_entry) {
6277 return 1;6277 return 1;
6278 } else {6278 } else {
6279 uint32_t llvm_alignment = LLVMABIAlignmentOfType(g->target_data_ref, type_entry->type_ref);6279 uint32_t llvm_alignment = LLVMABIAlignmentOfType(g->target_data_ref, type_entry->type_ref);
6280 // promises have at least alignment 8 so that we can have 3 extra bits when doing atomicrmw
6281 if (type_entry->id == ZigTypeIdPromise && llvm_alignment < 8) {
6282 return 8;
6283 }
6284 return llvm_alignment;6280 return llvm_alignment;
6285 }6281 }
6286}6282}
...@@ -6318,7 +6314,10 @@ bool type_is_global_error_set(ZigType *err_set_type) {...@@ -6318,7 +6314,10 @@ bool type_is_global_error_set(ZigType *err_set_type) {
6318}6314}
63196315
6320uint32_t get_coro_frame_align_bytes(CodeGen *g) {6316uint32_t get_coro_frame_align_bytes(CodeGen *g) {
6321 return g->pointer_size_bytes * 2;6317 uint32_t a = g->pointer_size_bytes * 2;
6318 // promises have at least alignment 8 so that we can have 3 extra bits when doing atomicrmw
6319 if (a < 8) a = 8;
6320 return a;
6322}6321}
63236322
6324bool type_can_fail(ZigType *type_entry) {6323bool type_can_fail(ZigType *type_entry) {
src/analyze.hpp+1-1
...@@ -54,7 +54,7 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, bool pointer_only, AstNode *so...@@ -54,7 +54,7 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, bool pointer_only, AstNode *so
54bool type_is_codegen_pointer(ZigType *type);54bool type_is_codegen_pointer(ZigType *type);
5555
56ZigType *get_codegen_ptr_type(ZigType *type);56ZigType *get_codegen_ptr_type(ZigType *type);
57uint32_t get_ptr_align(ZigType *type);57uint32_t get_ptr_align(CodeGen *g, ZigType *type);
58bool get_ptr_const(ZigType *type);58bool get_ptr_const(ZigType *type);
59ZigType *validate_var_type(CodeGen *g, AstNode *source_node, ZigType *type_entry);59ZigType *validate_var_type(CodeGen *g, AstNode *source_node, ZigType *type_entry);
60ZigType *container_ref_type(ZigType *type_entry);60ZigType *container_ref_type(ZigType *type_entry);
src/ir.cpp+2-2
...@@ -20023,8 +20023,8 @@ static ZigType *ir_analyze_instruction_ptr_cast(IrAnalyze *ira, IrInstructionPtr...@@ -20023,8 +20023,8 @@ static ZigType *ir_analyze_instruction_ptr_cast(IrAnalyze *ira, IrInstructionPtr
20023 return dest_type;20023 return dest_type;
20024 }20024 }
2002520025
20026 uint32_t src_align_bytes = get_ptr_align(src_type);20026 uint32_t src_align_bytes = get_ptr_align(ira->codegen, src_type);
20027 uint32_t dest_align_bytes = get_ptr_align(dest_type);20027 uint32_t dest_align_bytes = get_ptr_align(ira->codegen, dest_type);
2002820028
20029 if (dest_align_bytes > src_align_bytes) {20029 if (dest_align_bytes > src_align_bytes) {
20030 ErrorMsg *msg = ir_add_error(ira, &instruction->base, buf_sprintf("cast increases pointer alignment"));20030 ErrorMsg *msg = ir_add_error(ira, &instruction->base, buf_sprintf("cast increases pointer alignment"));