@@ -496,111 +496,108 @@ void DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) {
496496}
497497
498498Error DWARFUnit::tryExtractDIEsIfNeeded (bool  CUDieOnly) {
499-   return  Context.doWorkThreadSafely ([&]() -> Error {
500-     if  ((CUDieOnly && !DieArray.empty ()) || DieArray.size () > 1 )
501-       return  Error::success (); //  Already parsed.
502- 
503-     bool  HasCUDie = !DieArray.empty ();
504-     extractDIEsToVector (!HasCUDie, !CUDieOnly, DieArray);
505- 
506-     if  (DieArray.empty ())
507-       return  Error::success ();
508- 
509-     //  If CU DIE was just parsed, copy several attribute values from it.
510-     if  (HasCUDie)
511-       return  Error::success ();
512- 
513-     DWARFDie UnitDie (this , &DieArray[0 ]);
514-     if  (std::optional<uint64_t > DWOId =
515-             toUnsigned (UnitDie.find (DW_AT_GNU_dwo_id)))
516-       Header.setDWOId (*DWOId);
517-     if  (!IsDWO) {
518-       assert (AddrOffsetSectionBase == std::nullopt );
519-       assert (RangeSectionBase == 0 );
520-       assert (LocSectionBase == 0 );
521-       AddrOffsetSectionBase = toSectionOffset (UnitDie.find (DW_AT_addr_base));
522-       if  (!AddrOffsetSectionBase)
523-         AddrOffsetSectionBase =
524-             toSectionOffset (UnitDie.find (DW_AT_GNU_addr_base));
525-       RangeSectionBase = toSectionOffset (UnitDie.find (DW_AT_rnglists_base), 0 );
526-       LocSectionBase = toSectionOffset (UnitDie.find (DW_AT_loclists_base), 0 );
527-     }
499+   if  ((CUDieOnly && !DieArray.empty ()) ||
500+       DieArray.size () > 1 )
501+     return  Error::success (); //  Already parsed.
528502
529-     //  In general, in DWARF v5 and beyond we derive the start of the unit's
530-     //  contribution to the string offsets table from the unit DIE's
531-     //  DW_AT_str_offsets_base attribute. Split DWARF units do not use this
532-     //  attribute, so we assume that there is a contribution to the string
533-     //  offsets table starting at offset 0 of the debug_str_offsets.dwo section.
534-     //  In both cases we need to determine the format of the contribution,
535-     //  which may differ from the unit's format.
536-     DWARFDataExtractor DA (Context.getDWARFObj (), StringOffsetSection,
537-                           IsLittleEndian, 0 );
538-     if  (IsDWO || getVersion () >= 5 ) {
539-       auto  StringOffsetOrError =
540-           IsDWO ? determineStringOffsetsTableContributionDWO (DA)
541-                 : determineStringOffsetsTableContribution (DA);
542-       if  (!StringOffsetOrError) {
543-         return  createStringError (errc::invalid_argument,
544-                                  " invalid reference to or invalid content in " 
545-                                  " .debug_str_offsets[.dwo]: "   +
546-                                      toString (StringOffsetOrError.takeError ()));
547-       }
503+   bool  HasCUDie = !DieArray.empty ();
504+   extractDIEsToVector (!HasCUDie, !CUDieOnly, DieArray);
548505
549-       StringOffsetsTableContribution = *StringOffsetOrError; 
550-     } 
506+   if  (DieArray. empty ()) 
507+     return   Error::success (); 
551508
552-     //  DWARF v5 uses the .debug_rnglists and .debug_rnglists.dwo sections to
553-     //  describe address ranges.
554-     if  (getVersion () >= 5 ) {
555-       //  In case of DWP, the base offset from the index has to be added.
556-       if  (IsDWO) {
557-         uint64_t  ContributionBaseOffset = 0 ;
558-         if  (auto  *IndexEntry = Header.getIndexEntry ())
559-           if  (auto  *Contrib = IndexEntry->getContribution (DW_SECT_RNGLISTS))
560-             ContributionBaseOffset = Contrib->getOffset ();
561-         setRangesSection (
562-             &Context.getDWARFObj ().getRnglistsDWOSection (),
563-             ContributionBaseOffset +
564-                 DWARFListTableHeader::getHeaderSize (Header.getFormat ()));
565-       } else 
566-         setRangesSection (&Context.getDWARFObj ().getRnglistsSection (),
567-                          toSectionOffset (UnitDie.find (DW_AT_rnglists_base),
568-                                          DWARFListTableHeader::getHeaderSize (
569-                                              Header.getFormat ())));
570-     }
509+   //  If CU DIE was just parsed, copy several attribute values from it.
510+   if  (HasCUDie)
511+     return  Error::success ();
512+ 
513+   DWARFDie UnitDie (this , &DieArray[0 ]);
514+   if  (std::optional<uint64_t > DWOId =
515+           toUnsigned (UnitDie.find (DW_AT_GNU_dwo_id)))
516+     Header.setDWOId (*DWOId);
517+   if  (!IsDWO) {
518+     assert (AddrOffsetSectionBase == std::nullopt );
519+     assert (RangeSectionBase == 0 );
520+     assert (LocSectionBase == 0 );
521+     AddrOffsetSectionBase = toSectionOffset (UnitDie.find (DW_AT_addr_base));
522+     if  (!AddrOffsetSectionBase)
523+       AddrOffsetSectionBase =
524+           toSectionOffset (UnitDie.find (DW_AT_GNU_addr_base));
525+     RangeSectionBase = toSectionOffset (UnitDie.find (DW_AT_rnglists_base), 0 );
526+     LocSectionBase = toSectionOffset (UnitDie.find (DW_AT_loclists_base), 0 );
527+   }
528+ 
529+   //  In general, in DWARF v5 and beyond we derive the start of the unit's
530+   //  contribution to the string offsets table from the unit DIE's
531+   //  DW_AT_str_offsets_base attribute. Split DWARF units do not use this
532+   //  attribute, so we assume that there is a contribution to the string
533+   //  offsets table starting at offset 0 of the debug_str_offsets.dwo section.
534+   //  In both cases we need to determine the format of the contribution,
535+   //  which may differ from the unit's format.
536+   DWARFDataExtractor DA (Context.getDWARFObj (), StringOffsetSection,
537+                         IsLittleEndian, 0 );
538+   if  (IsDWO || getVersion () >= 5 ) {
539+     auto  StringOffsetOrError =
540+         IsDWO ? determineStringOffsetsTableContributionDWO (DA)
541+               : determineStringOffsetsTableContribution (DA);
542+     if  (!StringOffsetOrError)
543+       return  createStringError (errc::invalid_argument,
544+                                " invalid reference to or invalid content in " 
545+                                " .debug_str_offsets[.dwo]: "   +
546+                                    toString (StringOffsetOrError.takeError ()));
547+ 
548+     StringOffsetsTableContribution = *StringOffsetOrError;
549+   }
571550
551+   //  DWARF v5 uses the .debug_rnglists and .debug_rnglists.dwo sections to
552+   //  describe address ranges.
553+   if  (getVersion () >= 5 ) {
554+     //  In case of DWP, the base offset from the index has to be added.
572555    if  (IsDWO) {
573-       //  If we are reading a package file, we need to adjust the location list
574-       //  data based on the index entries.
575-       StringRef Data = Header.getVersion () >= 5 
576-                            ? Context.getDWARFObj ().getLoclistsDWOSection ().Data 
577-                            : Context.getDWARFObj ().getLocDWOSection ().Data ;
556+       uint64_t  ContributionBaseOffset = 0 ;
578557      if  (auto  *IndexEntry = Header.getIndexEntry ())
579-         if  (const  auto  *C = IndexEntry->getContribution (
580-                 Header.getVersion () >= 5  ? DW_SECT_LOCLISTS : DW_SECT_EXT_LOC))
581-           Data = Data.substr (C->getOffset (), C->getLength ());
582- 
583-       DWARFDataExtractor DWARFData (Data, IsLittleEndian, getAddressByteSize ());
584-       LocTable =
585-           std::make_unique<DWARFDebugLoclists>(DWARFData, Header.getVersion ());
586-       LocSectionBase = DWARFListTableHeader::getHeaderSize (Header.getFormat ());
587-     } else  if  (getVersion () >= 5 ) {
588-       LocTable = std::make_unique<DWARFDebugLoclists>(
589-           DWARFDataExtractor (Context.getDWARFObj (),
590-                              Context.getDWARFObj ().getLoclistsSection (),
591-                              IsLittleEndian, getAddressByteSize ()),
592-           getVersion ());
593-     } else  {
594-       LocTable = std::make_unique<DWARFDebugLoc>(DWARFDataExtractor (
595-           Context.getDWARFObj (), Context.getDWARFObj ().getLocSection (),
596-           IsLittleEndian, getAddressByteSize ()));
597-     }
558+         if  (auto  *Contrib = IndexEntry->getContribution (DW_SECT_RNGLISTS))
559+           ContributionBaseOffset = Contrib->getOffset ();
560+       setRangesSection (
561+           &Context.getDWARFObj ().getRnglistsDWOSection (),
562+           ContributionBaseOffset +
563+               DWARFListTableHeader::getHeaderSize (Header.getFormat ()));
564+     } else 
565+       setRangesSection (&Context.getDWARFObj ().getRnglistsSection (),
566+                        toSectionOffset (UnitDie.find (DW_AT_rnglists_base),
567+                                        DWARFListTableHeader::getHeaderSize (
568+                                            Header.getFormat ())));
569+   }
598570
599-     //  Don't fall back to DW_AT_GNU_ranges_base: it should be ignored for
600-     //  skeleton CU DIE, so that DWARF users not aware of it are not broken.
571+   if  (IsDWO) {
572+     //  If we are reading a package file, we need to adjust the location list
573+     //  data based on the index entries.
574+     StringRef Data = Header.getVersion () >= 5 
575+                          ? Context.getDWARFObj ().getLoclistsDWOSection ().Data 
576+                          : Context.getDWARFObj ().getLocDWOSection ().Data ;
577+     if  (auto  *IndexEntry = Header.getIndexEntry ())
578+       if  (const  auto  *C = IndexEntry->getContribution (
579+               Header.getVersion () >= 5  ? DW_SECT_LOCLISTS : DW_SECT_EXT_LOC))
580+         Data = Data.substr (C->getOffset (), C->getLength ());
581+ 
582+     DWARFDataExtractor DWARFData (Data, IsLittleEndian, getAddressByteSize ());
583+     LocTable =
584+         std::make_unique<DWARFDebugLoclists>(DWARFData, Header.getVersion ());
585+     LocSectionBase = DWARFListTableHeader::getHeaderSize (Header.getFormat ());
586+   } else  if  (getVersion () >= 5 ) {
587+     LocTable = std::make_unique<DWARFDebugLoclists>(
588+         DWARFDataExtractor (Context.getDWARFObj (),
589+                            Context.getDWARFObj ().getLoclistsSection (),
590+                            IsLittleEndian, getAddressByteSize ()),
591+         getVersion ());
592+   } else  {
593+     LocTable = std::make_unique<DWARFDebugLoc>(DWARFDataExtractor (
594+         Context.getDWARFObj (), Context.getDWARFObj ().getLocSection (),
595+         IsLittleEndian, getAddressByteSize ()));
596+   }
601597
602-     return  Error::success ();
603-   });
598+   //  Don't fall back to DW_AT_GNU_ranges_base: it should be ignored for
599+   //  skeleton CU DIE, so that DWARF users not aware of it are not broken.
600+   return  Error::success ();
604601}
605602
606603bool  DWARFUnit::parseDWO (StringRef DWOAlternativeLocation) {
@@ -655,26 +652,15 @@ bool DWARFUnit::parseDWO(StringRef DWOAlternativeLocation) {
655652  return  true ;
656653}
657654
658- void  DWARFUnit::clearDIEs (bool  KeepCUDie, bool  KeepDWODies) {
659-   cantFail (Context.doWorkThreadSafely ([&] {
660-     if  (!KeepDWODies && DWO) {
661-       DWO->clearDIEs (KeepCUDie, KeepDWODies);
662-     }
663-     if  (!IsDWO) {
664-       RangeSectionBase = 0 ;
665-       LocSectionBase = 0 ;
666-       AddrOffsetSectionBase = std::nullopt ;
667-     }
668-     //  Do not use resize() + shrink_to_fit() to free memory occupied by dies.
669-     //  shrink_to_fit() is a *non-binding* request to reduce capacity() to
670-     //  size(). It depends on the implementation whether the request is
671-     //  fulfilled. Create a new vector with a small capacity and assign it to the
672-     //  DieArray to have previous contents freed.
673-     DieArray = (KeepCUDie && !DieArray.empty ())
674-                    ? std::vector<DWARFDebugInfoEntry>({DieArray[0 ]})
675-                    : std::vector<DWARFDebugInfoEntry>();
676-     return  Error::success ();
677-   }));
655+ void  DWARFUnit::clearDIEs (bool  KeepCUDie) {
656+   //  Do not use resize() + shrink_to_fit() to free memory occupied by dies.
657+   //  shrink_to_fit() is a *non-binding* request to reduce capacity() to size().
658+   //  It depends on the implementation whether the request is fulfilled.
659+   //  Create a new vector with a small capacity and assign it to the DieArray to
660+   //  have previous contents freed.
661+   DieArray = (KeepCUDie && !DieArray.empty ())
662+                  ? std::vector<DWARFDebugInfoEntry>({DieArray[0 ]})
663+                  : std::vector<DWARFDebugInfoEntry>();
678664}
679665
680666Expected<DWARFAddressRangesVector>
0 commit comments