Files
clang-p2996/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
Greg Clayton c662ec8bd3 Fixed variable parsing to not parse block variables over and over due to an
issue in the way block variables are marked as parsed. In the DWARF parser we
always parse all blocks for a function at once, so we can mark all blocks as
having all variables parsed and avoid recursive function calls to try and
reparse things that have already been handled.

Fixed an issue with how variables get scoped into blocks. The DWARF parser can
now handle abtract class definitions that contain concrete static variables.
When the concrete instance of the class functions get instantiated, they will
track down the concrete block for the abtract block and add the variable to
each block.

llvm-svn: 133302
2011-06-17 22:10:16 +00:00

88 lines
3.4 KiB
C++

//===-- DWARFDebugInfo.h ----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_DWARFDebugInfo_h_
#define SymbolFileDWARF_DWARFDebugInfo_h_
#include <vector>
#include <map>
#include "lldb/lldb-private.h"
#include "lldb/lldb-private.h"
#include "SymbolFileDWARF.h"
typedef std::multimap<const char*, dw_offset_t, CStringCompareFunctionObject> CStringToDIEMap;
typedef CStringToDIEMap::iterator CStringToDIEMapIter;
typedef CStringToDIEMap::const_iterator CStringToDIEMapConstIter;
typedef lldb::SharedPtr<DWARFCompileUnit>::Type DWARFCompileUnitSP;
class DWARFDebugInfo
{
public:
typedef dw_offset_t (*Callback)(
SymbolFileDWARF* dwarf2Data,
DWARFCompileUnitSP& cu_shared_ptr,
DWARFDebugInfoEntry* die,
const dw_offset_t next_offset,
const uint32_t depth,
void* userData);
DWARFDebugInfo();
void SetDwarfData(SymbolFileDWARF* dwarf2Data);
bool BuildFunctionAddressRangeTable(DWARFDebugAranges* debug_aranges);
bool LookupAddress(
const dw_addr_t address,
const dw_offset_t cu_offset, // Can be valid (find in .debug_aranges), or DW_INVALID_OFFSET if we need to search manually
DWARFCompileUnitSP& cu_shared_ptr,
DWARFDebugInfoEntry** function_die,
DWARFDebugInfoEntry** block_die);
void AddCompileUnit(DWARFCompileUnitSP& cu);
uint32_t GetNumCompileUnits();
DWARFCompileUnit* GetCompileUnitAtIndex(uint32_t idx);
DWARFCompileUnitSP GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr = NULL);
DWARFCompileUnitSP GetCompileUnitContainingDIE(dw_offset_t die_offset);
DWARFDebugInfoEntry* GetDIEPtr(dw_offset_t die_offset, DWARFCompileUnitSP* cu_sp_ptr);
DWARFDebugInfoEntry* GetDIEPtrWithCompileUnitHint (dw_offset_t die_offset, DWARFCompileUnit**cu_handle);
const DWARFDebugInfoEntry* GetDIEPtrContainingOffset(dw_offset_t die_offset, DWARFCompileUnitSP* cu_sp_ptr);
void Dump(lldb_private::Stream *s, const uint32_t die_offset, const uint32_t recurse_depth);
static void Parse(SymbolFileDWARF* parser, Callback callback, void* userData);
static void Verify(lldb_private::Stream *s, SymbolFileDWARF* dwarf2Data);
static void Dump(lldb_private::Stream *s, SymbolFileDWARF* dwarf2Data, const uint32_t die_offset, const uint32_t recurse_depth);
bool Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offsets) const;
bool Find(lldb_private::RegularExpression& re, std::vector<dw_offset_t>& die_offsets) const;
enum
{
eDumpFlag_Verbose = (1<<0), // Verbose dumping
eDumpFlag_ShowForm = (1<<1), // Show the DW_form type
eDumpFlag_ShowAncestors = (1<<2) // Show all parent DIEs when dumping single DIEs
};
protected:
SymbolFileDWARF* m_dwarf2Data;
typedef std::vector<DWARFCompileUnitSP> CompileUnitColl;
CompileUnitColl m_compile_units;
private:
// All parsing needs to be done partially any managed by this class as accessors are called.
void ParseCompileUnitHeadersIfNeeded();
DISALLOW_COPY_AND_ASSIGN (DWARFDebugInfo);
};
#endif // SymbolFileDWARF_DWARFDebugInfo_h_