diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 17 | 
3 files changed, 20 insertions, 5 deletions
| diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 8aa488f..f65d88a 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1443,7 +1443,7 @@ getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges,            MF.hasBBSections() && NumMBBSectionRanges > 1,            // Use static_cast to avoid breakage of tests on windows.            static_cast<bool>(BBAddrMapSkipEmitBBEntries), HasCalls, -          static_cast<bool>(EmitBBHash)}; +          static_cast<bool>(EmitBBHash), false};  }  void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) { diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 518121e..751d373 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -1793,9 +1793,13 @@ void DwarfCompileUnit::createBaseTypeDIEs() {                      "_" + Twine(Btr.BitSize)).toStringRef(Str));      addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding);      // Round up to smallest number of bytes that contains this number of bits. +    // ExprRefedBaseTypes is populated with types referenced by +    // DW_OP_LLVM_convert operations in location expressions. These are often +    // byte-sized, but one common counter-example is 1-bit sized conversions +    // from `i1` types. TODO: Should these use DW_AT_bit_size? See +    // DwarfUnit::constructTypeDIE.      addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt,              divideCeil(Btr.BitSize, 8)); -      Btr.Die = &Die;    }  } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index e40fb76..b16e1315 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); @@ -1109,7 +1120,7 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DICompositeType *CTy) {            constructMemberDIE(Buffer, DDTy);          }        } else if (auto *Property = dyn_cast<DIObjCProperty>(Element)) { -        DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer); +        DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer, Property);          StringRef PropertyName = Property->getName();          addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);          if (Property->getType()) | 
