DWARFContext.h revision 234353
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 71 bool isLittleEndian() const { return IsLittleEndian; } 72 73 virtual StringRef getInfoSection() = 0; 74 virtual StringRef getAbbrevSection() = 0; 75 virtual StringRef getARangeSection() = 0; 76 virtual StringRef getLineSection() = 0; 77 virtual StringRef getStringSection() = 0; 78 79 static bool isSupportedVersion(unsigned version) { 80 return version == 2 || version == 3; 81 } 82}; 83 84 85/// DWARFContextInMemory is the simplest possible implementation of a 86/// DWARFContext. It assumes all content is available in memory and stores 87/// pointers to it. 88class DWARFContextInMemory : public DWARFContext { 89 virtual void anchor(); 90 StringRef InfoSection; 91 StringRef AbbrevSection; 92 StringRef ARangeSection; 93 StringRef LineSection; 94 StringRef StringSection; 95public: 96 DWARFContextInMemory(bool isLittleEndian, 97 StringRef infoSection, 98 StringRef abbrevSection, 99 StringRef aRangeSection, 100 StringRef lineSection, 101 StringRef stringSection) 102 : DWARFContext(isLittleEndian), 103 InfoSection(infoSection), 104 AbbrevSection(abbrevSection), 105 ARangeSection(aRangeSection), 106 LineSection(lineSection), 107 StringSection(stringSection) 108 {} 109 110 virtual StringRef getInfoSection() { return InfoSection; } 111 virtual StringRef getAbbrevSection() { return AbbrevSection; } 112 virtual StringRef getARangeSection() { return ARangeSection; } 113 virtual StringRef getLineSection() { return LineSection; } 114 virtual StringRef getStringSection() { return StringSection; } 115}; 116 117} 118 119#endif 120