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) {...@@ -393,78 +393,79 @@ TypeTableEntry *get_maybe_type(CodeGen *g, TypeTableEntry *child_type) {
393}393}
394394
395TypeTableEntry *get_error_type(CodeGen *g, TypeTableEntry *child_type) {395TypeTableEntry *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);
429398
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);
433403
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));
436406
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 };
451408
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, "");
460412
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, "");
464462
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}
469470
470TypeTableEntry *get_array_type(CodeGen *g, TypeTableEntry *child_type, uint64_t array_size) {471TypeTableEntry *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) {
11041105
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);
11061107
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 }
11171113
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);
11201119
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;
12901292
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 }
13011298
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;
13031303
1304 element_types[gen_field_index] = field_type->type_ref;1304 element_types[gen_field_index] = field_type->type_ref;