Home | History | Annotate | Download | only in DWARF
      1 //===- DWARFDebugLoc.h ------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H
     11 #define LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H
     12 
     13 #include "llvm/ADT/Optional.h"
     14 #include "llvm/ADT/SmallVector.h"
     15 #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
     16 #include "llvm/DebugInfo/DWARF/DWARFRelocMap.h"
     17 #include <cstdint>
     18 
     19 namespace llvm {
     20 class DWARFUnit;
     21 class MCRegisterInfo;
     22 class raw_ostream;
     23 
     24 class DWARFDebugLoc {
     25 public:
     26   /// A single location within a location list.
     27   struct Entry {
     28     /// The beginning address of the instruction range.
     29     uint64_t Begin;
     30     /// The ending address of the instruction range.
     31     uint64_t End;
     32     /// The location of the variable within the specified range.
     33     SmallVector<char, 4> Loc;
     34   };
     35 
     36   /// A list of locations that contain one variable.
     37   struct LocationList {
     38     /// The beginning offset where this location list is stored in the debug_loc
     39     /// section.
     40     unsigned Offset;
     41     /// All the locations in which the variable is stored.
     42     SmallVector<Entry, 2> Entries;
     43     /// Dump this list on OS.
     44     void dump(raw_ostream &OS, bool IsLittleEndian, unsigned AddressSize,
     45               const MCRegisterInfo *MRI, unsigned Indent) const;
     46   };
     47 
     48 private:
     49   using LocationLists = SmallVector<LocationList, 4>;
     50 
     51   /// A list of all the variables in the debug_loc section, each one describing
     52   /// the locations in which the variable is stored.
     53   LocationLists Locations;
     54 
     55   unsigned AddressSize;
     56 
     57   bool IsLittleEndian;
     58 
     59 public:
     60   /// Print the location lists found within the debug_loc section.
     61   void dump(raw_ostream &OS, const MCRegisterInfo *RegInfo,
     62             Optional<uint64_t> Offset) const;
     63 
     64   /// Parse the debug_loc section accessible via the 'data' parameter using the
     65   /// address size also given in 'data' to interpret the address ranges.
     66   void parse(const DWARFDataExtractor &data);
     67 
     68   /// Return the location list at the given offset or nullptr.
     69   LocationList const *getLocationListAtOffset(uint64_t Offset) const;
     70 
     71   Optional<LocationList> parseOneLocationList(DWARFDataExtractor Data,
     72                                               uint32_t *Offset);
     73 };
     74 
     75 class DWARFDebugLocDWO {
     76 public:
     77   struct Entry {
     78     uint64_t Start;
     79     uint32_t Length;
     80     SmallVector<char, 4> Loc;
     81   };
     82 
     83   struct LocationList {
     84     unsigned Offset;
     85     SmallVector<Entry, 2> Entries;
     86     void dump(raw_ostream &OS, bool IsLittleEndian, unsigned AddressSize,
     87               const MCRegisterInfo *RegInfo, unsigned Indent) const;
     88   };
     89 
     90 private:
     91   using LocationLists = SmallVector<LocationList, 4>;
     92 
     93   LocationLists Locations;
     94 
     95   unsigned AddressSize;
     96 
     97   bool IsLittleEndian;
     98 
     99 public:
    100   void parse(DataExtractor data);
    101   void dump(raw_ostream &OS, const MCRegisterInfo *RegInfo,
    102             Optional<uint64_t> Offset) const;
    103 
    104   /// Return the location list at the given offset or nullptr.
    105   LocationList const *getLocationListAtOffset(uint64_t Offset) const;
    106 
    107   static Optional<LocationList> parseOneLocationList(DataExtractor Data,
    108                                                      uint32_t *Offset);
    109 };
    110 
    111 } // end namespace llvm
    112 
    113 #endif // LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H
    114