| ... | ... | @@ -393,78 +393,79 @@ TypeTableEntry *get_maybe_type(CodeGen *g, TypeTableEntry *child_type) { |
| 393 | 393 | } |
| 394 | 394 | |
| 395 | 395 | TypeTableEntry *get_error_type(CodeGen *g, TypeTableEntry *child_type) { |
| 396 | | if (child_type->error_parent) { |
| 396 | if (child_type->error_parent) |
| 397 | 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); |
| 431 | | uint64_t value_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, child_type->type_ref); |
| 432 | | uint64_t value_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, 1); |
| 399 | TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdErrorUnion); |
| 400 | assert(child_type->type_ref); |
| 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); |
| 435 | | uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); |
| 404 | buf_resize(&entry->name, 0); |
| 405 | buf_appendf(&entry->name, "%%%s", buf_ptr(&child_type->name)); |
| 436 | 406 | |
| 437 | | ZigLLVMDIType *di_element_types[] = { |
| 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 | | }; |
| 407 | entry->data.error.child_type = child_type; |
| 451 | 408 | |
| 452 | | ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder, |
| 453 | | compile_unit_scope, |
| 454 | | buf_ptr(&entry->name), |
| 455 | | di_file, line, |
| 456 | | debug_size_in_bits, |
| 457 | | debug_align_in_bits, |
| 458 | | 0, |
| 459 | | nullptr, di_element_types, 2, 0, nullptr, ""); |
| 409 | if (!type_has_bits(child_type)) { |
| 410 | entry->type_ref = g->err_tag_type->type_ref; |
| 411 | entry->di_type = g->err_tag_type->di_type; |
| 460 | 412 | |
| 461 | | ZigLLVMReplaceTemporary(g->dbuilder, entry->di_type, replacement_di_type); |
| 462 | | entry->di_type = replacement_di_type; |
| 463 | | } |
| 413 | } else { |
| 414 | LLVMTypeRef elem_types[] = { |
| 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; |
| 466 | | return entry; |
| 463 | ZigLLVMReplaceTemporary(g->dbuilder, entry->di_type, replacement_di_type); |
| 464 | entry->di_type = replacement_di_type; |
| 467 | 465 | } |
| 466 | |
| 467 | child_type->error_parent = entry; |
| 468 | return entry; |
| 468 | 469 | } |
| 469 | 470 | |
| 470 | 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 | 1105 | |
| 1105 | 1106 | di_enumerators[i] = ZigLLVMCreateDebugEnumerator(g->dbuilder, buf_ptr(type_enum_field->name), i); |
| 1106 | 1107 | |
| 1107 | | if (field_type->id == TypeTableEntryIdStruct) { |
| 1108 | | resolve_struct_type(g, field_type); |
| 1109 | | } else if (field_type->id == TypeTableEntryIdEnum) { |
| 1110 | | resolve_enum_type(g, field_type); |
| 1111 | | } else if (field_type->id == TypeTableEntryIdInvalid) { |
| 1108 | ensure_complete_type(g, field_type); |
| 1109 | if (field_type->id == TypeTableEntryIdInvalid) { |
| 1112 | 1110 | enum_type->data.enumeration.is_invalid = true; |
| 1113 | 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 | 1117 | uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, field_type->type_ref); |
| 1119 | 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 | 1123 | union_inner_di_types[gen_field_index] = ZigLLVMCreateDebugMemberType(g->dbuilder, |
| 1122 | 1124 | ZigLLVMTypeToScope(enum_type->di_type), buf_ptr(type_enum_field->name), |
| 1123 | 1125 | import->di_file, field_node->line + 1, |
| ... | ... | @@ -1288,17 +1290,15 @@ static void resolve_struct_type(CodeGen *g, TypeTableEntry *struct_type) { |
| 1288 | 1290 | type_struct_field->src_index = i; |
| 1289 | 1291 | type_struct_field->gen_index = SIZE_MAX; |
| 1290 | 1292 | |
| 1291 | | if (field_type->id == TypeTableEntryIdStruct) { |
| 1292 | | resolve_struct_type(g, field_type); |
| 1293 | | } else if (field_type->id == TypeTableEntryIdEnum) { |
| 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)) { |
| 1293 | ensure_complete_type(g, field_type); |
| 1294 | if (field_type->id == TypeTableEntryIdInvalid) { |
| 1295 | struct_type->data.enumeration.is_invalid = true; |
| 1299 | 1296 | continue; |
| 1300 | 1297 | } |
| 1301 | 1298 | |
| 1299 | if (!type_has_bits(field_type)) |
| 1300 | continue; |
| 1301 | |
| 1302 | 1302 | type_struct_field->gen_index = gen_field_index; |
| 1303 | 1303 | |
| 1304 | 1304 | element_types[gen_field_index] = field_type->type_ref; |