authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-13 11:33:01-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-13 11:33:01-04:00
log98183e47436699f6e5eab200061c46eec342806e
tree753e697edb9bca356a94598ff5cfb9282be5b2fe
parent3aed7de0c47af40e6ca00c0e969ad30b44af5a7c
signaturelock-open Commit is signed but in an unrecognized format.

flip the order of fields in error unions

to prepare for fixing u128 alignment issues

3 files changed, 13 insertions(+), 29 deletions(-)

src/all_types.hpp+2-2
......@@ -3772,8 +3772,8 @@ static const size_t slice_len_index = 1;
37723772static const size_t maybe_child_index = 0;
37733773static const size_t maybe_null_index = 1;
37743774
3775static const size_t err_union_err_index = 0;
3776static const size_t err_union_payload_index = 1;
3775static const size_t err_union_payload_index = 0;
3776static const size_t err_union_err_index = 1;
37773777
37783778// TODO call graph analysis to find out what this number needs to be for every function
37793779// MUST BE A POWER OF TWO.
src/analyze.cpp+7-6
......@@ -7017,20 +7017,21 @@ static void resolve_llvm_types_error_union(CodeGen *g, ZigType *type) {
70177017 uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, type->llvm_type);
70187018 uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, type->llvm_type);
70197019
7020 ZigLLVMDIType *di_element_types[] = {
7021 ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(type->llvm_di_type),
7020 ZigLLVMDIType *di_element_types[2];
7021 di_element_types[err_union_err_index] = ZigLLVMCreateDebugMemberType(g->dbuilder,
7022 ZigLLVMTypeToScope(type->llvm_di_type),
70227023 "tag", di_file, line,
70237024 tag_debug_size_in_bits,
70247025 tag_debug_align_in_bits,
70257026 tag_offset_in_bits,
7026 ZigLLVM_DIFlags_Zero, get_llvm_di_type(g, err_set_type)),
7027 ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(type->llvm_di_type),
7027 ZigLLVM_DIFlags_Zero, get_llvm_di_type(g, err_set_type));
7028 di_element_types[err_union_payload_index] = ZigLLVMCreateDebugMemberType(g->dbuilder,
7029 ZigLLVMTypeToScope(type->llvm_di_type),
70287030 "value", di_file, line,
70297031 value_debug_size_in_bits,
70307032 value_debug_align_in_bits,
70317033 value_offset_in_bits,
7032 ZigLLVM_DIFlags_Zero, get_llvm_di_type(g, payload_type)),
7033 };
7034 ZigLLVM_DIFlags_Zero, get_llvm_di_type(g, payload_type));
70347035
70357036 ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder,
70367037 compile_unit_scope,
src/codegen.cpp+4-21
......@@ -6437,29 +6437,12 @@ static LLVMValueRef gen_const_val(CodeGen *g, ConstExprValue *const_val, const c
64376437 err_payload_value = gen_const_val(g, payload_val, "");
64386438 make_unnamed_struct = is_llvm_value_unnamed_type(g, payload_val->type, err_payload_value);
64396439 }
6440 LLVMValueRef fields[2];
6441 fields[err_union_err_index] = err_tag_value;
6442 fields[err_union_payload_index] = err_payload_value;
64406443 if (make_unnamed_struct) {
6441 uint64_t payload_off = LLVMOffsetOfElement(g->target_data_ref, get_llvm_type(g, type_entry), 1);
6442 uint64_t err_sz = LLVMStoreSizeOfType(g->target_data_ref, LLVMTypeOf(err_tag_value));
6443 unsigned pad_sz = payload_off - err_sz;
6444 if (pad_sz == 0) {
6445 LLVMValueRef fields[] = {
6446 err_tag_value,
6447 err_payload_value,
6448 };
6449 return LLVMConstStruct(fields, 2, false);
6450 } else {
6451 LLVMValueRef fields[] = {
6452 err_tag_value,
6453 LLVMGetUndef(LLVMArrayType(LLVMInt8Type(), pad_sz)),
6454 err_payload_value,
6455 };
6456 return LLVMConstStruct(fields, 3, false);
6457 }
6444 return LLVMConstStruct(fields, 2, false);
64586445 } else {
6459 LLVMValueRef fields[] = {
6460 err_tag_value,
6461 err_payload_value,
6462 };
64636446 return LLVMConstNamedStruct(get_llvm_type(g, type_entry), fields, 2);
64646447 }
64656448 }