[llvm] r191781 - [DebugInfo] Simplify and speedup .debug_aranges parsing

Eric Christopher echristo at gmail.com
Tue Oct 1 14:32:13 PDT 2013


Cool deal. Thanks Alexey!

-eric

On Tue, Oct 1, 2013 at 9:52 AM, Alexey Samsonov <samsonov at google.com> wrote:
> Author: samsonov
> Date: Tue Oct  1 11:52:46 2013
> New Revision: 191781
>
> URL: http://llvm.org/viewvc/llvm-project?rev=191781&view=rev
> Log:
> [DebugInfo] Simplify and speedup .debug_aranges parsing
>
> Parsing .debug_aranges section now takes O(nlogn) operations instead
> of O(n^2), where "n" is the number of address ranges. With this change,
> the time required to symbolize an address from a random large
> Clang-generated binary drops from 165 seconds to 1.5 seconds.
>
> No functionality change.
>
> Modified:
>     llvm/trunk/lib/DebugInfo/DWARFDebugAranges.cpp
>
> Modified: llvm/trunk/lib/DebugInfo/DWARFDebugAranges.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFDebugAranges.cpp?rev=191781&r1=191780&r2=191781&view=diff
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARFDebugAranges.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARFDebugAranges.cpp Tue Oct  1 11:52:46 2013
> @@ -16,69 +16,36 @@
>  #include <cassert>
>  using namespace llvm;
>
> -namespace {
> -  class CountArangeDescriptors {
> -  public:
> -    CountArangeDescriptors(uint32_t &count_ref) : Count(count_ref) {}
> -    void operator()(const DWARFDebugArangeSet &Set) {
> -      Count += Set.getNumDescriptors();
> -    }
> -    uint32_t &Count;
> -  };
> -
> -  class AddArangeDescriptors {
> -  public:
> -    AddArangeDescriptors(DWARFDebugAranges::RangeColl &Ranges,
> -                         DWARFDebugAranges::ParsedCUOffsetColl &CUOffsets)
> -      : RangeCollection(Ranges),
> -        CUOffsetCollection(CUOffsets) {}
> -    void operator()(const DWARFDebugArangeSet &Set) {
> -      DWARFDebugAranges::Range Range;
> -      Range.CUOffset = Set.getCompileUnitDIEOffset();
> -      CUOffsetCollection.insert(Range.CUOffset);
> -
> -      for (uint32_t i = 0, n = Set.getNumDescriptors(); i < n; ++i) {
> -        const DWARFDebugArangeSet::Descriptor *ArangeDescPtr =
> -            Set.getDescriptor(i);
> -        Range.LowPC = ArangeDescPtr->Address;
> -        Range.Length = ArangeDescPtr->Length;
> -
> -        // Insert each item in increasing address order so binary searching
> -        // can later be done!
> -        DWARFDebugAranges::RangeColl::iterator InsertPos =
> -          std::lower_bound(RangeCollection.begin(), RangeCollection.end(),
> -                           Range);
> -        RangeCollection.insert(InsertPos, Range);
> -      }
> -
> -    }
> -    DWARFDebugAranges::RangeColl &RangeCollection;
> -    DWARFDebugAranges::ParsedCUOffsetColl &CUOffsetCollection;
> -  };
> -}
> -
>  void DWARFDebugAranges::extract(DataExtractor DebugArangesData) {
>    if (!DebugArangesData.isValidOffset(0))
>      return;
> -  uint32_t offset = 0;
> -
> -  typedef std::vector<DWARFDebugArangeSet> SetCollection;
> -  SetCollection sets;
> -
> -  DWARFDebugArangeSet set;
> -  Range range;
> -  while (set.extract(DebugArangesData, &offset))
> -    sets.push_back(set);
> -
> -  uint32_t count = 0;
> -
> -  std::for_each(sets.begin(), sets.end(), CountArangeDescriptors(count));
> +  uint32_t Offset = 0;
> +  typedef std::vector<DWARFDebugArangeSet> RangeSetColl;
> +  RangeSetColl Sets;
> +  DWARFDebugArangeSet Set;
> +  uint32_t TotalRanges = 0;
> +
> +  while (Set.extract(DebugArangesData, &Offset)) {
> +    Sets.push_back(Set);
> +    TotalRanges += Set.getNumDescriptors();
> +  }
> +  if (TotalRanges == 0)
> +    return;
>
> -  if (count > 0) {
> -    Aranges.reserve(count);
> -    AddArangeDescriptors range_adder(Aranges, ParsedCUOffsets);
> -    std::for_each(sets.begin(), sets.end(), range_adder);
> +  Aranges.reserve(TotalRanges);
> +  for (RangeSetColl::const_iterator I = Sets.begin(), E = Sets.end(); I != E;
> +       ++I) {
> +    uint32_t CUOffset = I->getCompileUnitDIEOffset();
> +
> +    for (uint32_t i = 0, n = I->getNumDescriptors(); i < n; ++i) {
> +      const DWARFDebugArangeSet::Descriptor *ArangeDescPtr =
> +          I->getDescriptor(i);
> +      uint64_t LowPC = ArangeDescPtr->Address;
> +      uint64_t HighPC = LowPC + ArangeDescPtr->Length;
> +      appendRange(CUOffset, LowPC, HighPC);
> +    }
>    }
> +  sortAndMinimize();
>  }
>
>  void DWARFDebugAranges::generate(DWARFContext *CTX) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list