diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 15 | 
1 files changed, 13 insertions, 2 deletions
| diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index e40fb76..555c56f 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -766,8 +766,19 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIBasicType *BTy) {      addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,              BTy->getEncoding()); -  uint64_t Size = BTy->getSizeInBits() >> 3; -  addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt, Size); +  uint64_t SizeInBytes = divideCeil(BTy->getSizeInBits(), 8); +  addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt, SizeInBytes); +  if (BTy->getTag() == dwarf::Tag::DW_TAG_base_type) { +    // DW_TAG_base_type: +    // If the value of an object of the given type does not fully occupy the +    // storage described by a byte size attribute, the base type entry may also +    // have a DW_AT_bit_size [...] attribute. +    // TODO: Do big endian targets need DW_AT_data_bit_offset? See discussion in +    // pull request #164372. +    if (uint64_t DataSizeInBits = BTy->getDataSizeInBits(); +        DataSizeInBits && DataSizeInBits != SizeInBytes * 8) +      addUInt(Buffer, dwarf::DW_AT_bit_size, std::nullopt, DataSizeInBits); +  }    if (BTy->isBigEndian())      addUInt(Buffer, dwarf::DW_AT_endianity, std::nullopt, dwarf::DW_END_big); | 
