DWARFContext.h revision 239462
1//===-- DWARFContext.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_DWARFCONTEXT_H 11#define LLVM_DEBUGINFO_DWARFCONTEXT_H 12 13#include "DWARFCompileUnit.h" 14#include "DWARFDebugAranges.h" 15#include "DWARFDebugLine.h" 16#include "llvm/DebugInfo/DIContext.h" 17#include "llvm/ADT/OwningPtr.h" 18#include "llvm/ADT/SmallVector.h" 19 20namespace llvm { 21 22/// DWARFContext 23/// This data structure is the top level entity that deals with dwarf debug 24/// information parsing. The actual data is supplied through pure virtual 25/// methods that a concrete implementation provides. 26class DWARFContext : public DIContext { 27 bool IsLittleEndian; 28 29 SmallVector<DWARFCompileUnit, 1> CUs; 30 OwningPtr<DWARFDebugAbbrev> Abbrev; 31 OwningPtr<DWARFDebugAranges> Aranges; 32 OwningPtr<DWARFDebugLine> Line; 33 34 DWARFContext(DWARFContext &); // = delete 35 DWARFContext &operator=(DWARFContext &); // = delete 36 37 /// Read compile units from the debug_info section and store them in CUs. 38 void parseCompileUnits(); 39protected: 40 DWARFContext(bool isLittleEndian) : IsLittleEndian(isLittleEndian) {} 41public: 42 virtual void dump(raw_ostream &OS); 43 /// Get the number of compile units in this context. 44 unsigned getNumCompileUnits() { 45 if (CUs.empty()) 46 parseCompileUnits(); 47 return CUs.size(); 48 } 49 /// Get the compile unit at the specified index for this compile unit. 50 DWARFCompileUnit *getCompileUnitAtIndex(unsigned index) { 51 if (CUs.empty()) 52 parseCompileUnits(); 53 return &CUs[index]; 54 } 55 56 /// Return the compile unit that includes an offset (relative to .debug_info). 57 DWARFCompileUnit *getCompileUnitForOffset(uint32_t offset); 58 59 /// Get a pointer to the parsed DebugAbbrev object. 60 const DWARFDebugAbbrev *getDebugAbbrev(); 61 62 /// Get a pointer to the parsed DebugAranges object. 63 const DWARFDebugAranges *getDebugAranges(); 64 65 /// Get a pointer to a parsed line table corresponding to a compile unit. 66 const DWARFDebugLine::LineTable * 67 getLineTableForCompileUnit(DWARFCompileUnit *cu); 68 69 virtual DILineInfo getLineInfoForAddress(uint64_t address, 70 DILineInfoSpecifier specifier = DILineInfoSpecifier()); 71 72 bool isLittleEndian() const { return IsLittleEndian; } 73 74 virtual StringRef getInfoSection() = 0; 75 virtual StringRef getAbbrevSection() = 0; 76 virtual StringRef getARangeSection() = 0; 77 virtual StringRef getLineSection() = 0; 78 virtual StringRef getStringSection() = 0; 79 80 static bool isSupportedVersion(unsigned version) { 81 return version == 2 || version == 3; 82 } 83}; 84 85 86/// DWARFContextInMemory is the simplest possible implementation of a 87/// DWARFContext. It assumes all content is available in memory and stores 88/// pointers to it. 89class DWARFContextInMemory : public DWARFContext { 90 virtual void anchor(); 91 StringRef InfoSection; 92 StringRef AbbrevSection; 93 StringRef ARangeSection; 94 StringRef LineSection; 95 StringRef StringSection; 96public: 97 DWARFContextInMemory(bool isLittleEndian, 98 StringRef infoSection, 99 StringRef abbrevSection, 100 StringRef aRangeSection, 101 StringRef lineSection, 102 StringRef stringSection) 103 : DWARFContext(isLittleEndian), 104 InfoSection(infoSection), 105 AbbrevSection(abbrevSection), 106 ARangeSection(aRangeSection), 107 LineSection(lineSection), 108 StringSection(stringSection) 109 {} 110 111 virtual StringRef getInfoSection() { return InfoSection; } 112 virtual StringRef getAbbrevSection() { return AbbrevSection; } 113 virtual StringRef getARangeSection() { return ARangeSection; } 114 virtual StringRef getLineSection() { return LineSection; } 115 virtual StringRef getStringSection() { return StringSection; } 116}; 117 118} 119 120#endif 121