@@ -1306,6 +1306,8 @@ static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type) {
1306
1306
TypeTableEntry *tag_type_entry = create_enum_tag_type (g, enum_type, tag_int_type);
1307
1307
enum_type->data .enumeration .tag_type = tag_type_entry;
1308
1308
1309
+ uint64_t align_of_tag_in_bits = 8 *LLVMPreferredAlignmentOfType (g->target_data_ref , tag_int_type->type_ref );
1310
+
1309
1311
if (most_aligned_union_member) {
1310
1312
// create llvm type for union
1311
1313
uint64_t padding_in_bits = biggest_size_in_bits - size_of_most_aligned_member_in_bits;
@@ -1329,11 +1331,18 @@ static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type) {
1329
1331
assert (8 *LLVMPreferredAlignmentOfType (g->target_data_ref , union_type_ref) >= biggest_align_in_bits);
1330
1332
assert (8 *LLVMStoreSizeOfType (g->target_data_ref , union_type_ref) >= biggest_size_in_bits);
1331
1333
1334
+ if (align_of_tag_in_bits >= biggest_align_in_bits) {
1335
+ enum_type->data .enumeration .gen_tag_index = 0 ;
1336
+ enum_type->data .enumeration .gen_union_index = 1 ;
1337
+ } else {
1338
+ enum_type->data .enumeration .gen_union_index = 0 ;
1339
+ enum_type->data .enumeration .gen_tag_index = 1 ;
1340
+ }
1341
+
1332
1342
// create llvm type for root struct
1333
- LLVMTypeRef root_struct_element_types[] = {
1334
- tag_type_entry->type_ref ,
1335
- union_type_ref,
1336
- };
1343
+ LLVMTypeRef root_struct_element_types[2 ];
1344
+ root_struct_element_types[enum_type->data .enumeration .gen_tag_index ] = tag_type_entry->type_ref ;
1345
+ root_struct_element_types[enum_type->data .enumeration .gen_union_index ] = union_type_ref;
1337
1346
LLVMStructSetBody (enum_type->type_ref , root_struct_element_types, 2 , false );
1338
1347
1339
1348
// create debug type for tag
@@ -1353,7 +1362,8 @@ static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type) {
1353
1362
gen_field_count, 0 , " " );
1354
1363
1355
1364
// create debug types for members of root struct
1356
- uint64_t tag_offset_in_bits = 8 *LLVMOffsetOfElement (g->target_data_ref , enum_type->type_ref , 0 );
1365
+ uint64_t tag_offset_in_bits = 8 *LLVMOffsetOfElement (g->target_data_ref , enum_type->type_ref ,
1366
+ enum_type->data .enumeration .gen_tag_index );
1357
1367
ZigLLVMDIType *tag_member_di_type = ZigLLVMCreateDebugMemberType (g->dbuilder ,
1358
1368
ZigLLVMTypeToScope (enum_type->di_type ), " tag_field" ,
1359
1369
import->di_file , (unsigned )(decl_node->line + 1 ),
@@ -1362,7 +1372,8 @@ static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type) {
1362
1372
tag_offset_in_bits,
1363
1373
0 , tag_di_type);
1364
1374
1365
- uint64_t union_offset_in_bits = 8 *LLVMOffsetOfElement (g->target_data_ref , enum_type->type_ref , 1 );
1375
+ uint64_t union_offset_in_bits = 8 *LLVMOffsetOfElement (g->target_data_ref , enum_type->type_ref ,
1376
+ enum_type->data .enumeration .gen_union_index );
1366
1377
ZigLLVMDIType *union_member_di_type = ZigLLVMCreateDebugMemberType (g->dbuilder ,
1367
1378
ZigLLVMTypeToScope (enum_type->di_type ), " union_field" ,
1368
1379
import->di_file , (unsigned )(decl_node->line + 1 ),
@@ -1372,11 +1383,9 @@ static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type) {
1372
1383
0 , union_di_type);
1373
1384
1374
1385
// create debug type for root struct
1375
- ZigLLVMDIType *di_root_members[] = {
1376
- tag_member_di_type,
1377
- union_member_di_type,
1378
- };
1379
-
1386
+ ZigLLVMDIType *di_root_members[2 ];
1387
+ di_root_members[enum_type->data .enumeration .gen_tag_index ] = tag_member_di_type;
1388
+ di_root_members[enum_type->data .enumeration .gen_union_index ] = union_member_di_type;
1380
1389
1381
1390
uint64_t debug_size_in_bits = 8 *LLVMStoreSizeOfType (g->target_data_ref , enum_type->type_ref );
1382
1391
uint64_t debug_align_in_bits = 8 *LLVMABISizeOfType (g->target_data_ref , enum_type->type_ref );
@@ -1396,7 +1405,7 @@ static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type) {
1396
1405
1397
1406
// create debug type for tag
1398
1407
uint64_t tag_debug_size_in_bits = 8 *LLVMStoreSizeOfType (g->target_data_ref , tag_type_entry->type_ref );
1399
- uint64_t tag_debug_align_in_bits = 8 *LLVMABISizeOfType (g->target_data_ref , tag_type_entry->type_ref );
1408
+ uint64_t tag_debug_align_in_bits = 8 *LLVMPreferredAlignmentOfType (g->target_data_ref , tag_type_entry->type_ref );
1400
1409
ZigLLVMDIType *tag_di_type = ZigLLVMCreateDebugEnumerationType (g->dbuilder ,
1401
1410
ZigLLVMFileToScope (import->di_file ), buf_ptr (&enum_type->name ),
1402
1411
import->di_file , (unsigned )(decl_node->line + 1 ),
0 commit comments