authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-21 22:42:58-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-21 22:42:58-05:00
logb4c2f7e31018cd2abc882221096a1fd1e71d5b88
treea2ae35a3ff49a4a6f6c20e8be4a26e8704c414de
parent9b616820370c08a97d95805ca31eae5f8ca554f3

get_error_type calls ensure_complete_type on child


1 files changed, 79 insertions(+), 79 deletions(-)

src/analyze.cpp+79-79
......@@ -393,78 +393,79 @@ TypeTableEntry *get_maybe_type(CodeGen *g, TypeTableEntry *child_type) {
393393}
394394
395395TypeTableEntry *get_error_type(CodeGen *g, TypeTableEntry *child_type) {
396 if (child_type->error_parent) {
396 if (child_type->error_parent)
397397 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);
429398
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);
433403
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));
436406
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;
451408
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;
460412
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, "");
464462
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;
467465 }
466
467 child_type->error_parent = entry;
468 return entry;
468469}
469470
470471TypeTableEntry *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) {
11041105
11051106 di_enumerators[i] = ZigLLVMCreateDebugEnumerator(g->dbuilder, buf_ptr(type_enum_field->name), i);
11061107
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) {
11121110 enum_type->data.enumeration.is_invalid = true;
11131111 continue;
1114 } else if (!type_has_bits(field_type)) {
1115 continue;
11161112 }
11171113
1114 if (!type_has_bits(field_type))
1115 continue;
1116
11181117 uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, field_type->type_ref);
11191118 uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, field_type->type_ref);
11201119
1120 assert(debug_size_in_bits > 0);
1121 assert(debug_align_in_bits > 0);
1122
11211123 union_inner_di_types[gen_field_index] = ZigLLVMCreateDebugMemberType(g->dbuilder,
11221124 ZigLLVMTypeToScope(enum_type->di_type), buf_ptr(type_enum_field->name),
11231125 import->di_file, field_node->line + 1,
......@@ -1288,17 +1290,15 @@ static void resolve_struct_type(CodeGen *g, TypeTableEntry *struct_type) {
12881290 type_struct_field->src_index = i;
12891291 type_struct_field->gen_index = SIZE_MAX;
12901292
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;
12991296 continue;
13001297 }
13011298
1299 if (!type_has_bits(field_type))
1300 continue;
1301
13021302 type_struct_field->gen_index = gen_field_index;
13031303
13041304 element_types[gen_field_index] = field_type->type_ref;