|
@@ -421,9 +421,9 @@ llvm::AllocaInst *VariableRegisters::GetRegisterForAlignedOffset(
|
|
|
return it->second;
|
|
|
}
|
|
|
|
|
|
-// DITypePeelConstAndTypedef peels const and typedef types off of Ty,
|
|
|
+// DITypePeelTypeAlias peels const, typedef, and other alias types off of Ty,
|
|
|
// returning the unalised type.
|
|
|
-static llvm::DIType *DITypePeelConstAndTypedef(
|
|
|
+static llvm::DIType *DITypePeelTypeAlias(
|
|
|
llvm::DIType* Ty
|
|
|
)
|
|
|
{
|
|
@@ -432,9 +432,11 @@ static llvm::DIType *DITypePeelConstAndTypedef(
|
|
|
const llvm::DITypeIdentifierMap EmptyMap;
|
|
|
switch (DerivedTy->getTag())
|
|
|
{
|
|
|
+ case llvm::dwarf::DW_TAG_restrict_type:
|
|
|
+ case llvm::dwarf::DW_TAG_reference_type:
|
|
|
case llvm::dwarf::DW_TAG_const_type:
|
|
|
case llvm::dwarf::DW_TAG_typedef:
|
|
|
- return DITypePeelConstAndTypedef(
|
|
|
+ return DITypePeelTypeAlias(
|
|
|
DerivedTy->getBaseType().resolve(EmptyMap));
|
|
|
}
|
|
|
}
|
|
@@ -455,7 +457,7 @@ VariableRegisters::VariableRegisters(
|
|
|
|
|
|
PopulateAllocaMap(Ty);
|
|
|
assert(m_Offsets.GetCurrentPackedOffset() ==
|
|
|
- DITypePeelConstAndTypedef(Ty)->getSizeInBits());
|
|
|
+ DITypePeelTypeAlias(Ty)->getSizeInBits());
|
|
|
}
|
|
|
|
|
|
void VariableRegisters::PopulateAllocaMap(
|
|
@@ -471,6 +473,8 @@ void VariableRegisters::PopulateAllocaMap(
|
|
|
assert(!"Unhandled DIDerivedType");
|
|
|
m_Offsets.AlignToAndAddUnhandledType(DerivedTy);
|
|
|
return;
|
|
|
+ case llvm::dwarf::DW_TAG_restrict_type:
|
|
|
+ case llvm::dwarf::DW_TAG_reference_type:
|
|
|
case llvm::dwarf::DW_TAG_const_type:
|
|
|
case llvm::dwarf::DW_TAG_typedef:
|
|
|
PopulateAllocaMap(
|
|
@@ -648,11 +652,13 @@ static bool SortMembers(
|
|
|
case llvm::dwarf::DW_TAG_member: {
|
|
|
if (auto *Member = llvm::dyn_cast<llvm::DIDerivedType>(Element))
|
|
|
{
|
|
|
- auto it = SortedMembers->emplace(std::make_pair(Member->getOffsetInBits(), Member));
|
|
|
- (void)it;
|
|
|
- assert(it.second &&
|
|
|
- "Invalid DIStructType"
|
|
|
- " - members with the same offset -- are unions possible?");
|
|
|
+ if (Member->getSizeInBits()) {
|
|
|
+ auto it = SortedMembers->emplace(std::make_pair(Member->getOffsetInBits(), Member));
|
|
|
+ (void)it;
|
|
|
+ assert(it.second &&
|
|
|
+ "Invalid DIStructType"
|
|
|
+ " - members with the same offset -- are unions possible?");
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
// FALLTHROUGH
|