Home | History | Annotate | Download | only in DWARF
      1 //===-- DIContext.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 // This file defines DIContext, an abstract data structure that holds
     11 // debug information data.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_DEBUGINFO_DICONTEXT_H
     16 #define LLVM_DEBUGINFO_DICONTEXT_H
     17 
     18 #include "llvm/ADT/DenseMap.h"
     19 #include "llvm/ADT/SmallVector.h"
     20 #include "llvm/Object/ObjectFile.h"
     21 #include "llvm/Object/RelocVisitor.h"
     22 #include "llvm/Support/Casting.h"
     23 #include "llvm/Support/DataTypes.h"
     24 #include <string>
     25 
     26 namespace llvm {
     27 
     28 class raw_ostream;
     29 
     30 /// DILineInfo - a format-neutral container for source line information.
     31 struct DILineInfo {
     32   std::string FileName;
     33   std::string FunctionName;
     34   uint32_t Line;
     35   uint32_t Column;
     36 
     37   DILineInfo()
     38       : FileName("<invalid>"), FunctionName("<invalid>"), Line(0), Column(0) {}
     39 
     40   bool operator==(const DILineInfo &RHS) const {
     41     return Line == RHS.Line && Column == RHS.Column &&
     42            FileName == RHS.FileName && FunctionName == RHS.FunctionName;
     43   }
     44   bool operator!=(const DILineInfo &RHS) const {
     45     return !(*this == RHS);
     46   }
     47 };
     48 
     49 typedef SmallVector<std::pair<uint64_t, DILineInfo>, 16> DILineInfoTable;
     50 
     51 /// DIInliningInfo - a format-neutral container for inlined code description.
     52 class DIInliningInfo {
     53   SmallVector<DILineInfo, 4> Frames;
     54  public:
     55   DIInliningInfo() {}
     56   DILineInfo getFrame(unsigned Index) const {
     57     assert(Index < Frames.size());
     58     return Frames[Index];
     59   }
     60   uint32_t getNumberOfFrames() const {
     61     return Frames.size();
     62   }
     63   void addFrame(const DILineInfo &Frame) {
     64     Frames.push_back(Frame);
     65   }
     66 };
     67 
     68 /// A DINameKind is passed to name search methods to specify a
     69 /// preference regarding the type of name resolution the caller wants.
     70 enum class DINameKind { None, ShortName, LinkageName };
     71 
     72 /// DILineInfoSpecifier - controls which fields of DILineInfo container
     73 /// should be filled with data.
     74 struct DILineInfoSpecifier {
     75   enum class FileLineInfoKind { None, Default, AbsoluteFilePath };
     76   typedef DINameKind FunctionNameKind;
     77 
     78   FileLineInfoKind FLIKind;
     79   FunctionNameKind FNKind;
     80 
     81   DILineInfoSpecifier(FileLineInfoKind FLIKind = FileLineInfoKind::Default,
     82                       FunctionNameKind FNKind = FunctionNameKind::None)
     83       : FLIKind(FLIKind), FNKind(FNKind) {}
     84 };
     85 
     86 /// Selects which debug sections get dumped.
     87 enum DIDumpType {
     88   DIDT_Null,
     89   DIDT_All,
     90   DIDT_Abbrev,
     91   DIDT_AbbrevDwo,
     92   DIDT_Aranges,
     93   DIDT_Frames,
     94   DIDT_Info,
     95   DIDT_InfoDwo,
     96   DIDT_Types,
     97   DIDT_TypesDwo,
     98   DIDT_Line,
     99   DIDT_LineDwo,
    100   DIDT_Loc,
    101   DIDT_LocDwo,
    102   DIDT_Ranges,
    103   DIDT_Pubnames,
    104   DIDT_Pubtypes,
    105   DIDT_GnuPubnames,
    106   DIDT_GnuPubtypes,
    107   DIDT_Str,
    108   DIDT_StrDwo,
    109   DIDT_StrOffsetsDwo,
    110   DIDT_AppleNames,
    111   DIDT_AppleTypes,
    112   DIDT_AppleNamespaces,
    113   DIDT_AppleObjC
    114 };
    115 
    116 // In place of applying the relocations to the data we've read from disk we use
    117 // a separate mapping table to the side and checking that at locations in the
    118 // dwarf where we expect relocated values. This adds a bit of complexity to the
    119 // dwarf parsing/extraction at the benefit of not allocating memory for the
    120 // entire size of the debug info sections.
    121 typedef DenseMap<uint64_t, std::pair<uint8_t, int64_t> > RelocAddrMap;
    122 
    123 class DIContext {
    124 public:
    125   enum DIContextKind {
    126     CK_DWARF
    127   };
    128   DIContextKind getKind() const { return Kind; }
    129 
    130   DIContext(DIContextKind K) : Kind(K) {}
    131   virtual ~DIContext();
    132 
    133   /// getDWARFContext - get a context for binary DWARF data.
    134   static DIContext *getDWARFContext(const object::ObjectFile &Obj);
    135 
    136   virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All) = 0;
    137 
    138   virtual DILineInfo getLineInfoForAddress(uint64_t Address,
    139       DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
    140   virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address,
    141       uint64_t Size, DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
    142   virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address,
    143       DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
    144 private:
    145   const DIContextKind Kind;
    146 };
    147 
    148 }
    149 
    150 #endif
    151