Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- DWARFDebugAranges.h --------------------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8.  
  9. #ifndef LLVM_DEBUGINFO_DWARF_DWARFDEBUGARANGES_H
  10. #define LLVM_DEBUGINFO_DWARF_DWARFDEBUGARANGES_H
  11.  
  12. #include "llvm/ADT/DenseSet.h"
  13. #include "llvm/ADT/STLFunctionalExtras.h"
  14. #include <cstdint>
  15. #include <vector>
  16.  
  17. namespace llvm {
  18. class DWARFDataExtractor;
  19. class Error;
  20.  
  21. class DWARFContext;
  22.  
  23. class DWARFDebugAranges {
  24. public:
  25.   void generate(DWARFContext *CTX);
  26.   uint64_t findAddress(uint64_t Address) const;
  27.  
  28. private:
  29.   void clear();
  30.   void extract(DWARFDataExtractor DebugArangesData,
  31.                function_ref<void(Error)> RecoverableErrorHandler,
  32.                function_ref<void(Error)> WarningHandler);
  33.  
  34.   /// Call appendRange multiple times and then call construct.
  35.   void appendRange(uint64_t CUOffset, uint64_t LowPC, uint64_t HighPC);
  36.   void construct();
  37.  
  38.   struct Range {
  39.     explicit Range(uint64_t LowPC, uint64_t HighPC, uint64_t CUOffset)
  40.       : LowPC(LowPC), Length(HighPC - LowPC), CUOffset(CUOffset) {}
  41.  
  42.     void setHighPC(uint64_t HighPC) {
  43.       if (HighPC == -1ULL || HighPC <= LowPC)
  44.         Length = 0;
  45.       else
  46.         Length = HighPC - LowPC;
  47.     }
  48.  
  49.     uint64_t HighPC() const {
  50.       if (Length)
  51.         return LowPC + Length;
  52.       return -1ULL;
  53.     }
  54.  
  55.     bool operator<(const Range &other) const {
  56.       return LowPC < other.LowPC;
  57.     }
  58.  
  59.     uint64_t LowPC; /// Start of address range.
  60.     uint64_t Length; /// End of address range (not including this address).
  61.     uint64_t CUOffset; /// Offset of the compile unit or die.
  62.   };
  63.  
  64.   struct RangeEndpoint {
  65.     uint64_t Address;
  66.     uint64_t CUOffset;
  67.     bool IsRangeStart;
  68.  
  69.     RangeEndpoint(uint64_t Address, uint64_t CUOffset, bool IsRangeStart)
  70.         : Address(Address), CUOffset(CUOffset), IsRangeStart(IsRangeStart) {}
  71.  
  72.     bool operator<(const RangeEndpoint &Other) const {
  73.       return Address < Other.Address;
  74.     }
  75.   };
  76.  
  77.   using RangeColl = std::vector<Range>;
  78.   using RangeCollIterator = RangeColl::const_iterator;
  79.  
  80.   std::vector<RangeEndpoint> Endpoints;
  81.   RangeColl Aranges;
  82.   DenseSet<uint64_t> ParsedCUOffsets;
  83. };
  84.  
  85. } // end namespace llvm
  86.  
  87. #endif // LLVM_DEBUGINFO_DWARF_DWARFDEBUGARANGES_H
  88.