| ... | @@ -393,78 +393,79 @@ TypeTableEntry *get_maybe_type(CodeGen *g, TypeTableEntry *child_type) { | ... | @@ -393,78 +393,79 @@ TypeTableEntry *get_maybe_type(CodeGen *g, TypeTableEntry *child_type) { |
| 393 | } | 393 | } |
| 394 | | 394 | |
| 395 | TypeTableEntry *get_error_type(CodeGen *g, TypeTableEntry *child_type) { | 395 | TypeTableEntry *get_error_type(CodeGen *g, TypeTableEntry *child_type) { |
| 396 | if (child_type->error_parent) { | 396 | if (child_type->error_parent) |
| 397 | return child_type->error_parent; | 397 | return child_type->error_parent; |
| 398 | } else { | | |
| 399 | TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdErrorUnion); | | |
| 400 | assert(child_type->type_ref); | | |
| 401 | assert(child_type->di_type); | | |
| 402 | | | |
| 403 | buf_resize(&entry->name, 0); | | |
| 404 | buf_appendf(&entry->name, "%%%s", buf_ptr(&child_type->name)); | | |
| 405 | | | |
| 406 | entry->data.error.child_type = child_type; | | |
| 407 | | | |
| 408 | if (!type_has_bits(child_type)) { | | |
| 409 | entry->type_ref = g->err_tag_type->type_ref; | | |
| 410 | entry->di_type = g->err_tag_type->di_type; | | |
| 411 | | | |
| 412 | } else { | | |
| 413 | LLVMTypeRef elem_types[] = { | | |
| 414 | g->err_tag_type->type_ref, | | |
| 415 | child_type->type_ref, | | |
| 416 | }; | | |
| 417 | entry->type_ref = LLVMStructType(elem_types, 2, false); | | |
| 418 | | | |
| 419 | ZigLLVMDIScope *compile_unit_scope = ZigLLVMCompileUnitToScope(g->compile_unit); | | |
| 420 | ZigLLVMDIFile *di_file = nullptr; | | |
| 421 | unsigned line = 0; | | |
| 422 | entry->di_type = ZigLLVMCreateReplaceableCompositeType(g->dbuilder, | | |
| 423 | ZigLLVMTag_DW_structure_type(), buf_ptr(&entry->name), | | |
| 424 | compile_unit_scope, di_file, line); | | |
| 425 | | | |
| 426 | uint64_t tag_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, g->err_tag_type->type_ref); | | |
| 427 | uint64_t tag_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, g->err_tag_type->type_ref); | | |
| 428 | uint64_t tag_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, 0); | | |
| 429 | | 398 | |
| 430 | uint64_t value_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, child_type->type_ref); | 399 | TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdErrorUnion); |
| 431 | uint64_t value_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, child_type->type_ref); | 400 | assert(child_type->type_ref); |
| 432 | uint64_t value_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, 1); | 401 | assert(child_type->di_type); |
| | 402 | ensure_complete_type(g, child_type); |
| 433 | | 403 | |
| 434 | uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); | 404 | buf_resize(&entry->name, 0); |
| 435 | uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); | 405 | buf_appendf(&entry->name, "%%%s", buf_ptr(&child_type->name)); |
| 436 | | 406 | |
| 437 | ZigLLVMDIType *di_element_types[] = { | 407 | entry->data.error.child_type = child_type; |
| 438 | ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(entry->di_type), | | |
| 439 | "tag", di_file, line, | | |
| 440 | tag_debug_size_in_bits, | | |
| 441 | tag_debug_align_in_bits, | | |
| 442 | tag_offset_in_bits, | | |
| 443 | 0, child_type->di_type), | | |
| 444 | ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(entry->di_type), | | |
| 445 | "value", di_file, line, | | |
| 446 | value_debug_size_in_bits, | | |
| 447 | value_debug_align_in_bits, | | |
| 448 | value_offset_in_bits, | | |
| 449 | 0, child_type->di_type), | | |
| 450 | }; | | |
| 451 | | 408 | |
| 452 | ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder, | 409 | if (!type_has_bits(child_type)) { |
| 453 | compile_unit_scope, | 410 | entry->type_ref = g->err_tag_type->type_ref; |
| 454 | buf_ptr(&entry->name), | 411 | entry->di_type = g->err_tag_type->di_type; |
| 455 | di_file, line, | | |
| 456 | debug_size_in_bits, | | |
| 457 | debug_align_in_bits, | | |
| 458 | 0, | | |
| 459 | nullptr, di_element_types, 2, 0, nullptr, ""); | | |
| 460 | | 412 | |
| 461 | ZigLLVMReplaceTemporary(g->dbuilder, entry->di_type, replacement_di_type); | 413 | } else { |
| 462 | entry->di_type = replacement_di_type; | 414 | LLVMTypeRef elem_types[] = { |
| 463 | } | 415 | g->err_tag_type->type_ref, |
| | 416 | child_type->type_ref, |
| | 417 | }; |
| | 418 | entry->type_ref = LLVMStructType(elem_types, 2, false); |
| | 419 | |
| | 420 | ZigLLVMDIScope *compile_unit_scope = ZigLLVMCompileUnitToScope(g->compile_unit); |
| | 421 | ZigLLVMDIFile *di_file = nullptr; |
| | 422 | unsigned line = 0; |
| | 423 | entry->di_type = ZigLLVMCreateReplaceableCompositeType(g->dbuilder, |
| | 424 | ZigLLVMTag_DW_structure_type(), buf_ptr(&entry->name), |
| | 425 | compile_unit_scope, di_file, line); |
| | 426 | |
| | 427 | uint64_t tag_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, g->err_tag_type->type_ref); |
| | 428 | uint64_t tag_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, g->err_tag_type->type_ref); |
| | 429 | uint64_t tag_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, err_union_err_index); |
| | 430 | |
| | 431 | uint64_t value_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, child_type->type_ref); |
| | 432 | uint64_t value_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, child_type->type_ref); |
| | 433 | uint64_t value_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, |
| | 434 | err_union_payload_index); |
| | 435 | |
| | 436 | uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); |
| | 437 | uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); |
| | 438 | |
| | 439 | ZigLLVMDIType *di_element_types[] = { |
| | 440 | ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(entry->di_type), |
| | 441 | "tag", di_file, line, |
| | 442 | tag_debug_size_in_bits, |
| | 443 | tag_debug_align_in_bits, |
| | 444 | tag_offset_in_bits, |
| | 445 | 0, child_type->di_type), |
| | 446 | ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(entry->di_type), |
| | 447 | "value", di_file, line, |
| | 448 | value_debug_size_in_bits, |
| | 449 | value_debug_align_in_bits, |
| | 450 | value_offset_in_bits, |
| | 451 | 0, child_type->di_type), |
| | 452 | }; |
| | 453 | |
| | 454 | ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder, |
| | 455 | compile_unit_scope, |
| | 456 | buf_ptr(&entry->name), |
| | 457 | di_file, line, |
| | 458 | debug_size_in_bits, |
| | 459 | debug_align_in_bits, |
| | 460 | 0, |
| | 461 | nullptr, di_element_types, 2, 0, nullptr, ""); |
| 464 | | 462 | |
| 465 | child_type->error_parent = entry; | 463 | ZigLLVMReplaceTemporary(g->dbuilder, entry->di_type, replacement_di_type); |
| 466 | return entry; | 464 | entry->di_type = replacement_di_type; |
| 467 | } | 465 | } |
| | 466 | |
| | 467 | child_type->error_parent = entry; |
| | 468 | return entry; |
| 468 | } | 469 | } |
| 469 | | 470 | |
| 470 | TypeTableEntry *get_array_type(CodeGen *g, TypeTableEntry *child_type, uint64_t array_size) { | 471 | TypeTableEntry *get_array_type(CodeGen *g, TypeTableEntry *child_type, uint64_t array_size) { |
| ... | @@ -1104,20 +1105,21 @@ static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type) { | ... | @@ -1104,20 +1105,21 @@ static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type) { |
| 1104 | | 1105 | |
| 1105 | di_enumerators[i] = ZigLLVMCreateDebugEnumerator(g->dbuilder, buf_ptr(type_enum_field->name), i); | 1106 | di_enumerators[i] = ZigLLVMCreateDebugEnumerator(g->dbuilder, buf_ptr(type_enum_field->name), i); |
| 1106 | | 1107 | |
| 1107 | if (field_type->id == TypeTableEntryIdStruct) { | 1108 | ensure_complete_type(g, field_type); |
| 1108 | resolve_struct_type(g, field_type); | 1109 | if (field_type->id == TypeTableEntryIdInvalid) { |
| 1109 | } else if (field_type->id == TypeTableEntryIdEnum) { | | |
| 1110 | resolve_enum_type(g, field_type); | | |
| 1111 | } else if (field_type->id == TypeTableEntryIdInvalid) { | | |
| 1112 | enum_type->data.enumeration.is_invalid = true; | 1110 | enum_type->data.enumeration.is_invalid = true; |
| 1113 | continue; | 1111 | continue; |
| 1114 | } else if (!type_has_bits(field_type)) { | | |
| 1115 | continue; | | |
| 1116 | } | 1112 | } |
| 1117 | | 1113 | |
| | 1114 | if (!type_has_bits(field_type)) |
| | 1115 | continue; |
| | 1116 | |
| 1118 | uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, field_type->type_ref); | 1117 | uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, field_type->type_ref); |
| 1119 | uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, field_type->type_ref); | 1118 | uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, field_type->type_ref); |
| 1120 | | 1119 | |
| | 1120 | assert(debug_size_in_bits > 0); |
| | 1121 | assert(debug_align_in_bits > 0); |
| | 1122 | |
| 1121 | union_inner_di_types[gen_field_index] = ZigLLVMCreateDebugMemberType(g->dbuilder, | 1123 | union_inner_di_types[gen_field_index] = ZigLLVMCreateDebugMemberType(g->dbuilder, |
| 1122 | ZigLLVMTypeToScope(enum_type->di_type), buf_ptr(type_enum_field->name), | 1124 | ZigLLVMTypeToScope(enum_type->di_type), buf_ptr(type_enum_field->name), |
| 1123 | import->di_file, field_node->line + 1, | 1125 | import->di_file, field_node->line + 1, |
| ... | @@ -1288,17 +1290,15 @@ static void resolve_struct_type(CodeGen *g, TypeTableEntry *struct_type) { | ... | @@ -1288,17 +1290,15 @@ static void resolve_struct_type(CodeGen *g, TypeTableEntry *struct_type) { |
| 1288 | type_struct_field->src_index = i; | 1290 | type_struct_field->src_index = i; |
| 1289 | type_struct_field->gen_index = SIZE_MAX; | 1291 | type_struct_field->gen_index = SIZE_MAX; |
| 1290 | | 1292 | |
| 1291 | if (field_type->id == TypeTableEntryIdStruct) { | 1293 | ensure_complete_type(g, field_type); |
| 1292 | resolve_struct_type(g, field_type); | 1294 | if (field_type->id == TypeTableEntryIdInvalid) { |
| 1293 | } else if (field_type->id == TypeTableEntryIdEnum) { | 1295 | struct_type->data.enumeration.is_invalid = true; |
| 1294 | resolve_enum_type(g, field_type); | | |
| 1295 | } else if (field_type->id == TypeTableEntryIdInvalid) { | | |
| 1296 | struct_type->data.structure.is_invalid = true; | | |
| 1297 | continue; | | |
| 1298 | } else if (!type_has_bits(field_type)) { | | |
| 1299 | continue; | 1296 | continue; |
| 1300 | } | 1297 | } |
| 1301 | | 1298 | |
| | 1299 | if (!type_has_bits(field_type)) |
| | 1300 | continue; |
| | 1301 | |
| 1302 | type_struct_field->gen_index = gen_field_index; | 1302 | type_struct_field->gen_index = gen_field_index; |
| 1303 | | 1303 | |
| 1304 | element_types[gen_field_index] = field_type->type_ref; | 1304 | element_types[gen_field_index] = field_type->type_ref; |