| author | |
| committer | |
| log | 98183e47436699f6e5eab200061c46eec342806e |
| tree | 753e697edb9bca356a94598ff5cfb9282be5b2fe |
| parent | 3aed7de0c47af40e6ca00c0e969ad30b44af5a7c |
| signature |
to prepare for fixing u128 alignment issues3 files changed, 13 insertions(+), 29 deletions(-)
src/all_types.hpp+2-2| ... | ... | @@ -3772,8 +3772,8 @@ static const size_t slice_len_index = 1; |
| 3772 | 3772 | static const size_t maybe_child_index = 0; |
| 3773 | 3773 | static const size_t maybe_null_index = 1; |
| 3774 | 3774 | |
| 3775 | static const size_t err_union_err_index = 0; | |
| 3776 | static const size_t err_union_payload_index = 1; | |
| 3775 | static const size_t err_union_payload_index = 0; | |
| 3776 | static const size_t err_union_err_index = 1; | |
| 3777 | 3777 | |
| 3778 | 3778 | // TODO call graph analysis to find out what this number needs to be for every function |
| 3779 | 3779 | // 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) { |
| 7017 | 7017 | uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, type->llvm_type); |
| 7018 | 7018 | uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, type->llvm_type); |
| 7019 | 7019 | |
| 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), | |
| 7022 | 7023 | "tag", di_file, line, |
| 7023 | 7024 | tag_debug_size_in_bits, |
| 7024 | 7025 | tag_debug_align_in_bits, |
| 7025 | 7026 | 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), | |
| 7028 | 7030 | "value", di_file, line, |
| 7029 | 7031 | value_debug_size_in_bits, |
| 7030 | 7032 | value_debug_align_in_bits, |
| 7031 | 7033 | 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)); | |
| 7034 | 7035 | |
| 7035 | 7036 | ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder, |
| 7036 | 7037 | compile_unit_scope, |
src/codegen.cpp+4-21| ... | ... | @@ -6437,29 +6437,12 @@ static LLVMValueRef gen_const_val(CodeGen *g, ConstExprValue *const_val, const c |
| 6437 | 6437 | err_payload_value = gen_const_val(g, payload_val, ""); |
| 6438 | 6438 | make_unnamed_struct = is_llvm_value_unnamed_type(g, payload_val->type, err_payload_value); |
| 6439 | 6439 | } |
| 6440 | LLVMValueRef fields[2]; | |
| 6441 | fields[err_union_err_index] = err_tag_value; | |
| 6442 | fields[err_union_payload_index] = err_payload_value; | |
| 6440 | 6443 | 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); | |
| 6458 | 6445 | } else { |
| 6459 | LLVMValueRef fields[] = { | |
| 6460 | err_tag_value, | |
| 6461 | err_payload_value, | |
| 6462 | }; | |
| 6463 | 6446 | return LLVMConstNamedStruct(get_llvm_type(g, type_entry), fields, 2); |
| 6464 | 6447 | } |
| 6465 | 6448 | } |