@@ -184,8 +184,6 @@ void DebugRangesSectionWriter::appendToRangeBuffer(
184184 *RangesStream << CUBuffer;
185185}
186186
187- DebugAddrWriter *DebugRangeListsSectionWriter::AddrWriter = nullptr ;
188-
189187uint64_t DebugRangeListsSectionWriter::addRanges (
190188 DebugAddressRangesVector &&Ranges,
191189 std::map<DebugAddressRangesVector, uint64_t > &CachedRanges) {
@@ -390,7 +388,9 @@ void DebugARangesSectionWriter::writeARangesSection(
390388 }
391389}
392390
393- DebugAddrWriter::DebugAddrWriter (BinaryContext *BC) : BC(BC) {
391+ DebugAddrWriter::DebugAddrWriter (BinaryContext *BC,
392+ const uint8_t AddressByteSize)
393+ : BC(BC), AddressByteSize(AddressByteSize) {
394394 Buffer = std::make_unique<AddressSectionBuffer>();
395395 AddressStream = std::make_unique<raw_svector_ostream>(*Buffer);
396396}
@@ -405,11 +405,6 @@ void DebugAddrWriter::AddressForDWOCU::dump() {
405405}
406406uint32_t DebugAddrWriter::getIndexFromAddress (uint64_t Address, DWARFUnit &CU) {
407407 std::lock_guard<std::mutex> Lock (WriterMutex);
408- const uint64_t CUID = getCUID (CU);
409- if (!AddressMaps.count (CUID))
410- AddressMaps[CUID] = AddressForDWOCU ();
411-
412- AddressForDWOCU &Map = AddressMaps[CUID];
413408 auto Entry = Map.find (Address);
414409 if (Entry == Map.end ()) {
415410 auto Index = Map.getNextIndex ();
@@ -449,29 +444,23 @@ static void updateAddressBase(DIEBuilder &DIEBlder, DebugAddrWriter &AddrWriter,
449444 }
450445}
451446
452- void DebugAddrWriter::update (DIEBuilder &DIEBlder, DWARFUnit &CU) {
453- // Handling the case where debug information is a mix of Debug fission and
454- // monolithic.
455- if (!CU.getDWOId ())
456- return ;
457- const uint64_t CUID = getCUID (CU);
458- auto AM = AddressMaps.find (CUID);
459- // Adding to map even if it did not contribute to .debug_addr.
460- // The Skeleton CU might still have DW_AT_GNU_addr_base.
461- uint64_t Offset = Buffer->size ();
462- // If does not exist this CUs DWO section didn't contribute to .debug_addr.
463- if (AM == AddressMaps.end ())
464- return ;
465- std::vector<IndexAddressPair> SortedMap (AM->second .indexToAddressBegin (),
466- AM->second .indexToAdddessEnd ());
447+ void DebugAddrWriter::updateAddrBase (DIEBuilder &DIEBlder, DWARFUnit &CU,
448+ const uint64_t Offset) {
449+ updateAddressBase (DIEBlder, *this , CU, Offset);
450+ }
451+
452+ std::optional<uint64_t > DebugAddrWriter::finalize (const size_t BufferSize) {
453+ if (Map.begin () == Map.end ())
454+ return std::nullopt ;
455+ std::vector<IndexAddressPair> SortedMap (Map.indexToAddressBegin (),
456+ Map.indexToAdddessEnd ());
467457 // Sorting address in increasing order of indices.
468458 llvm::sort (SortedMap, llvm::less_first ());
469459
470- uint8_t AddrSize = CU.getAddressByteSize ();
471460 uint32_t Counter = 0 ;
472461 auto WriteAddress = [&](uint64_t Address) -> void {
473462 ++Counter;
474- switch (AddrSize ) {
463+ switch (AddressByteSize ) {
475464 default :
476465 assert (false && " Address Size is invalid." );
477466 break ;
@@ -490,10 +479,19 @@ void DebugAddrWriter::update(DIEBuilder &DIEBlder, DWARFUnit &CU) {
490479 WriteAddress (0 );
491480 WriteAddress (Val.second );
492481 }
493- updateAddressBase (DIEBlder, *this , CU, Offset);
482+ return std::nullopt ;
483+ }
484+
485+ void DebugAddrWriterDwarf5::updateAddrBase (DIEBuilder &DIEBlder, DWARFUnit &CU,
486+ const uint64_t Offset) {
487+ // / Header for DWARF5 has size 8, so we add it to the offset.
488+ updateAddressBase (DIEBlder, *this , CU, Offset + HeaderSize);
494489}
495490
496- void DebugAddrWriterDwarf5::update (DIEBuilder &DIEBlder, DWARFUnit &CU) {
491+ DenseMap<uint64_t , uint64_t > DebugAddrWriter::UnmodifiedAddressOffsets;
492+
493+ std::optional<uint64_t >
494+ DebugAddrWriterDwarf5::finalize (const size_t BufferSize) {
497495 // Need to layout all sections within .debug_addr
498496 // Within each section sort Address by index.
499497 const endianness Endian = BC->DwCtx ->isLittleEndian ()
@@ -504,55 +502,44 @@ void DebugAddrWriterDwarf5::update(DIEBuilder &DIEBlder, DWARFUnit &CU) {
504502 Endian == llvm::endianness::little, 0 );
505503 DWARFDebugAddrTable AddrTable;
506504 DIDumpOptions DumpOpts;
507- constexpr uint32_t HeaderSize = 8 ;
508- const uint64_t CUID = getCUID (CU);
509- const uint8_t AddrSize = CU.getAddressByteSize ();
510- auto AMIter = AddressMaps.find (CUID);
511505 // A case where CU has entry in .debug_addr, but we don't modify addresses
512506 // for it.
513- if (AMIter == AddressMaps.end ()) {
514- AMIter = AddressMaps.insert ({CUID, AddressForDWOCU ()}).first ;
515- std::optional<uint64_t > BaseOffset = CU.getAddrOffsetSectionBase ();
516- if (!BaseOffset)
517- return ;
507+ if (Map.begin () == Map.end ()) {
508+ if (!AddrOffsetSectionBase)
509+ return std::nullopt ;
518510 // Address base offset is to the first entry.
519511 // The size of header is 8 bytes.
520- uint64_t Offset = *BaseOffset - HeaderSize;
512+ uint64_t Offset = *AddrOffsetSectionBase - HeaderSize;
521513 auto Iter = UnmodifiedAddressOffsets.find (Offset);
522- if (Iter != UnmodifiedAddressOffsets.end ()) {
523- updateAddressBase (DIEBlder, *this , CU, Iter->getSecond ());
524- return ;
525- }
526- UnmodifiedAddressOffsets[Offset] = Buffer->size () + HeaderSize;
527- if (Error Err = AddrTable.extract (AddrData, &Offset, 5 , AddrSize,
514+ if (Iter != UnmodifiedAddressOffsets.end ())
515+ return Iter->second ;
516+ UnmodifiedAddressOffsets[Offset] = BufferSize;
517+ if (Error Err = AddrTable.extract (AddrData, &Offset, 5 , AddressByteSize,
528518 DumpOpts.WarningHandler )) {
529519 DumpOpts.RecoverableErrorHandler (std::move (Err));
530- return ;
520+ return std:: nullopt ;
531521 }
532-
533522 uint32_t Index = 0 ;
534523 for (uint64_t Addr : AddrTable.getAddressEntries ())
535- AMIter-> second .insert (Addr, Index++);
524+ Map .insert (Addr, Index++);
536525 }
537526
538- updateAddressBase (DIEBlder, *this , CU, Buffer->size () + HeaderSize);
539-
540- std::vector<IndexAddressPair> SortedMap (AMIter->second .indexToAddressBegin (),
541- AMIter->second .indexToAdddessEnd ());
527+ std::vector<IndexAddressPair> SortedMap (Map.indexToAddressBegin (),
528+ Map.indexToAdddessEnd ());
542529 // Sorting address in increasing order of indices.
543530 llvm::sort (SortedMap, llvm::less_first ());
544531 // Writing out Header
545- const uint32_t Length = SortedMap.size () * AddrSize + 4 ;
532+ const uint32_t Length = SortedMap.size () * AddressByteSize + 4 ;
546533 support::endian::write (*AddressStream, Length, Endian);
547534 support::endian::write (*AddressStream, static_cast <uint16_t >(5 ), Endian);
548- support::endian::write (*AddressStream, static_cast <uint8_t >(AddrSize ),
535+ support::endian::write (*AddressStream, static_cast <uint8_t >(AddressByteSize ),
549536 Endian);
550537 support::endian::write (*AddressStream, static_cast <uint8_t >(0 ), Endian);
551538
552539 uint32_t Counter = 0 ;
553540 auto writeAddress = [&](uint64_t Address) -> void {
554541 ++Counter;
555- switch (AddrSize ) {
542+ switch (AddressByteSize ) {
556543 default :
557544 llvm_unreachable (" Address Size is invalid." );
558545 break ;
@@ -571,6 +558,7 @@ void DebugAddrWriterDwarf5::update(DIEBuilder &DIEBlder, DWARFUnit &CU) {
571558 writeAddress (0 );
572559 writeAddress (Val.second );
573560 }
561+ return std::nullopt ;
574562}
575563
576564void DebugLocWriter::init () {
@@ -723,11 +711,11 @@ void DebugLoclistWriter::addList(DIEBuilder &DIEBldr, DIE &Die,
723711 DIEValue &AttrInfo,
724712 DebugLocationsVector &LocList) {
725713 if (DwarfVersion < 5 )
726- writeLegacyLocList (AttrInfo, LocList, DIEBldr, Die, * AddrWriter, *LocBuffer,
714+ writeLegacyLocList (AttrInfo, LocList, DIEBldr, Die, AddrWriter, *LocBuffer,
727715 CU, *LocStream);
728716 else
729717 writeDWARF5LocList (NumberOfEntries, AttrInfo, LocList, Die, DIEBldr,
730- * AddrWriter, *LocBodyBuffer, RelativeLocListOffsets, CU,
718+ AddrWriter, *LocBodyBuffer, RelativeLocListOffsets, CU,
731719 *LocBodyStream);
732720}
733721
@@ -789,8 +777,6 @@ void DebugLoclistWriter::finalize(DIEBuilder &DIEBldr, DIE &Die) {
789777 finalizeDWARF5 (DIEBldr, Die);
790778}
791779
792- DebugAddrWriter *DebugLoclistWriter::AddrWriter = nullptr ;
793-
794780static std::string encodeLE (size_t ByteSize, uint64_t NewValue) {
795781 std::string LE64 (ByteSize, 0 );
796782 for (size_t I = 0 ; I < ByteSize; ++I) {
0 commit comments