@@ -184,8 +184,6 @@ void DebugRangesSectionWriter::appendToRangeBuffer(
184
184
*RangesStream << CUBuffer;
185
185
}
186
186
187
- DebugAddrWriter *DebugRangeListsSectionWriter::AddrWriter = nullptr ;
188
-
189
187
uint64_t DebugRangeListsSectionWriter::addRanges (
190
188
DebugAddressRangesVector &&Ranges,
191
189
std::map<DebugAddressRangesVector, uint64_t > &CachedRanges) {
@@ -390,7 +388,9 @@ void DebugARangesSectionWriter::writeARangesSection(
390
388
}
391
389
}
392
390
393
- DebugAddrWriter::DebugAddrWriter (BinaryContext *BC) : BC(BC) {
391
+ DebugAddrWriter::DebugAddrWriter (BinaryContext *BC,
392
+ const uint8_t AddressByteSize)
393
+ : BC(BC), AddressByteSize(AddressByteSize) {
394
394
Buffer = std::make_unique<AddressSectionBuffer>();
395
395
AddressStream = std::make_unique<raw_svector_ostream>(*Buffer);
396
396
}
@@ -405,11 +405,6 @@ void DebugAddrWriter::AddressForDWOCU::dump() {
405
405
}
406
406
uint32_t DebugAddrWriter::getIndexFromAddress (uint64_t Address, DWARFUnit &CU) {
407
407
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];
413
408
auto Entry = Map.find (Address);
414
409
if (Entry == Map.end ()) {
415
410
auto Index = Map.getNextIndex ();
@@ -449,29 +444,23 @@ static void updateAddressBase(DIEBuilder &DIEBlder, DebugAddrWriter &AddrWriter,
449
444
}
450
445
}
451
446
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 ());
467
457
// Sorting address in increasing order of indices.
468
458
llvm::sort (SortedMap, llvm::less_first ());
469
459
470
- uint8_t AddrSize = CU.getAddressByteSize ();
471
460
uint32_t Counter = 0 ;
472
461
auto WriteAddress = [&](uint64_t Address) -> void {
473
462
++Counter;
474
- switch (AddrSize ) {
463
+ switch (AddressByteSize ) {
475
464
default :
476
465
assert (false && " Address Size is invalid." );
477
466
break ;
@@ -490,10 +479,19 @@ void DebugAddrWriter::update(DIEBuilder &DIEBlder, DWARFUnit &CU) {
490
479
WriteAddress (0 );
491
480
WriteAddress (Val.second );
492
481
}
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);
494
489
}
495
490
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) {
497
495
// Need to layout all sections within .debug_addr
498
496
// Within each section sort Address by index.
499
497
const endianness Endian = BC->DwCtx ->isLittleEndian ()
@@ -504,55 +502,44 @@ void DebugAddrWriterDwarf5::update(DIEBuilder &DIEBlder, DWARFUnit &CU) {
504
502
Endian == llvm::endianness::little, 0 );
505
503
DWARFDebugAddrTable AddrTable;
506
504
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);
511
505
// A case where CU has entry in .debug_addr, but we don't modify addresses
512
506
// 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;
518
510
// Address base offset is to the first entry.
519
511
// The size of header is 8 bytes.
520
- uint64_t Offset = *BaseOffset - HeaderSize;
512
+ uint64_t Offset = *AddrOffsetSectionBase - HeaderSize;
521
513
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,
528
518
DumpOpts.WarningHandler )) {
529
519
DumpOpts.RecoverableErrorHandler (std::move (Err));
530
- return ;
520
+ return std::nullopt ;
531
521
}
532
-
533
522
uint32_t Index = 0 ;
534
523
for (uint64_t Addr : AddrTable.getAddressEntries ())
535
- AMIter-> second .insert (Addr, Index++);
524
+ Map .insert (Addr, Index++);
536
525
}
537
526
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 ());
542
529
// Sorting address in increasing order of indices.
543
530
llvm::sort (SortedMap, llvm::less_first ());
544
531
// Writing out Header
545
- const uint32_t Length = SortedMap.size () * AddrSize + 4 ;
532
+ const uint32_t Length = SortedMap.size () * AddressByteSize + 4 ;
546
533
support::endian::write (*AddressStream, Length, Endian);
547
534
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 ),
549
536
Endian);
550
537
support::endian::write (*AddressStream, static_cast <uint8_t >(0 ), Endian);
551
538
552
539
uint32_t Counter = 0 ;
553
540
auto writeAddress = [&](uint64_t Address) -> void {
554
541
++Counter;
555
- switch (AddrSize ) {
542
+ switch (AddressByteSize ) {
556
543
default :
557
544
llvm_unreachable (" Address Size is invalid." );
558
545
break ;
@@ -571,6 +558,7 @@ void DebugAddrWriterDwarf5::update(DIEBuilder &DIEBlder, DWARFUnit &CU) {
571
558
writeAddress (0 );
572
559
writeAddress (Val.second );
573
560
}
561
+ return std::nullopt;
574
562
}
575
563
576
564
void DebugLocWriter::init () {
@@ -723,11 +711,11 @@ void DebugLoclistWriter::addList(DIEBuilder &DIEBldr, DIE &Die,
723
711
DIEValue &AttrInfo,
724
712
DebugLocationsVector &LocList) {
725
713
if (DwarfVersion < 5 )
726
- writeLegacyLocList (AttrInfo, LocList, DIEBldr, Die, * AddrWriter, *LocBuffer,
714
+ writeLegacyLocList (AttrInfo, LocList, DIEBldr, Die, AddrWriter, *LocBuffer,
727
715
CU, *LocStream);
728
716
else
729
717
writeDWARF5LocList (NumberOfEntries, AttrInfo, LocList, Die, DIEBldr,
730
- * AddrWriter, *LocBodyBuffer, RelativeLocListOffsets, CU,
718
+ AddrWriter, *LocBodyBuffer, RelativeLocListOffsets, CU,
731
719
*LocBodyStream);
732
720
}
733
721
@@ -789,8 +777,6 @@ void DebugLoclistWriter::finalize(DIEBuilder &DIEBldr, DIE &Die) {
789
777
finalizeDWARF5 (DIEBldr, Die);
790
778
}
791
779
792
- DebugAddrWriter *DebugLoclistWriter::AddrWriter = nullptr ;
793
-
794
780
static std::string encodeLE (size_t ByteSize, uint64_t NewValue) {
795
781
std::string LE64 (ByteSize, 0 );
796
782
for (size_t I = 0 ; I < ByteSize; ++I) {
0 commit comments