diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 13 | ||||
-rw-r--r-- | llvm/lib/IR/DIBuilder.cpp | 13 | ||||
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 1 |
3 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 5f04e8b..5a1ac5d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1013,6 +1013,7 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DICompositeType *CTy) { constructEnumTypeDIE(Buffer, CTy); break; case dwarf::DW_TAG_variant_part: + case dwarf::DW_TAG_variant: case dwarf::DW_TAG_structure_type: case dwarf::DW_TAG_union_type: case dwarf::DW_TAG_class_type: @@ -1066,7 +1067,17 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DICompositeType *CTy) { addDiscriminant(Variant, CI, DD->isUnsignedDIType(Discriminator->getBaseType())); } - constructMemberDIE(Variant, DDTy); + // If the variant holds a composite type with tag + // DW_TAG_variant, inline those members into the variant + // DIE. + if (auto *Composite = + dyn_cast_or_null<DICompositeType>(DDTy->getBaseType()); + Composite != nullptr && + Composite->getTag() == dwarf::DW_TAG_variant) { + constructTypeDIE(Variant, Composite); + } else { + constructMemberDIE(Variant, DDTy); + } } else { constructMemberDIE(Buffer, DDTy); } diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index d9cc49f..90da9f3 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -444,6 +444,19 @@ DIDerivedType *DIBuilder::createVariantMemberType( std::nullopt, std::nullopt, Flags, getConstantOrNull(Discriminant)); } +DIDerivedType *DIBuilder::createVariantMemberType(DIScope *Scope, + DINodeArray Elements, + Constant *Discriminant, + DIType *Ty) { + auto *V = DICompositeType::get(VMContext, dwarf::DW_TAG_variant, {}, nullptr, + 0, getNonCompileUnitScope(Scope), {}, 0, 0, 0, + DINode::FlagZero, Elements, 0, {}, nullptr); + + trackIfUnresolved(V); + return createVariantMemberType(Scope, {}, nullptr, 0, 0, 0, 0, Discriminant, + DINode::FlagZero, V); +} + DIDerivedType *DIBuilder::createBitFieldMemberType( DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits, diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 83c1264..2cfd382 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -1343,6 +1343,7 @@ void Verifier::visitDICompositeType(const DICompositeType &N) { N.getTag() == dwarf::DW_TAG_enumeration_type || N.getTag() == dwarf::DW_TAG_class_type || N.getTag() == dwarf::DW_TAG_variant_part || + N.getTag() == dwarf::DW_TAG_variant || N.getTag() == dwarf::DW_TAG_namelist, "invalid tag", &N); |