216 lines
6.3 KiB
C++
216 lines
6.3 KiB
C++
//===-- DWARFCompileUnit.h --------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SymbolFileDWARF_DWARFCompileUnit_h_
|
|
#define SymbolFileDWARF_DWARFCompileUnit_h_
|
|
|
|
#include "DWARFDebugInfoEntry.h"
|
|
#include "SymbolFileDWARF.h"
|
|
|
|
class NameToDIE;
|
|
|
|
class DWARFCompileUnit
|
|
{
|
|
public:
|
|
enum Producer
|
|
{
|
|
eProducerInvalid = 0,
|
|
eProducerClang,
|
|
eProducerGCC,
|
|
eProducerLLVMGCC,
|
|
eProcucerOther
|
|
};
|
|
|
|
DWARFCompileUnit(SymbolFileDWARF* dwarf2Data);
|
|
|
|
bool Extract(const lldb_private::DWARFDataExtractor &debug_info, lldb::offset_t *offset_ptr);
|
|
size_t ExtractDIEsIfNeeded (bool cu_die_only);
|
|
bool LookupAddress(
|
|
const dw_addr_t address,
|
|
DWARFDebugInfoEntry** function_die,
|
|
DWARFDebugInfoEntry** block_die);
|
|
|
|
size_t AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT32_MAX) const;
|
|
void Clear();
|
|
bool Verify(lldb_private::Stream *s) const;
|
|
void Dump(lldb_private::Stream *s) const;
|
|
dw_offset_t GetOffset() const { return m_offset; }
|
|
uint32_t Size() const { return m_is_dwarf64 ? 23 : 11; /* Size in bytes of the compile unit header */ }
|
|
bool ContainsDIEOffset(dw_offset_t die_offset) const { return die_offset >= GetFirstDIEOffset() && die_offset < GetNextCompileUnitOffset(); }
|
|
dw_offset_t GetFirstDIEOffset() const { return m_offset + Size(); }
|
|
dw_offset_t GetNextCompileUnitOffset() const { return m_offset + m_length + (m_is_dwarf64 ? 12 : 4); }
|
|
size_t GetDebugInfoSize() const { return m_length + (m_is_dwarf64 ? 12 : 4) - Size(); /* Size in bytes of the .debug_info data associated with this compile unit. */ }
|
|
uint32_t GetLength() const { return m_length; }
|
|
uint16_t GetVersion() const { return m_version; }
|
|
const DWARFAbbreviationDeclarationSet* GetAbbreviations() const { return m_abbrevs; }
|
|
dw_offset_t GetAbbrevOffset() const;
|
|
uint8_t GetAddressByteSize() const { return m_addr_size; }
|
|
dw_addr_t GetBaseAddress() const { return m_base_addr; }
|
|
void ClearDIEs(bool keep_compile_unit_die);
|
|
void BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
|
|
DWARFDebugAranges* debug_aranges);
|
|
|
|
void
|
|
SetBaseAddress(dw_addr_t base_addr)
|
|
{
|
|
m_base_addr = base_addr;
|
|
}
|
|
|
|
const DWARFDebugInfoEntry*
|
|
GetCompileUnitDIEOnly()
|
|
{
|
|
ExtractDIEsIfNeeded (true);
|
|
if (m_die_array.empty())
|
|
return NULL;
|
|
return &m_die_array[0];
|
|
}
|
|
|
|
const DWARFDebugInfoEntry*
|
|
DIE()
|
|
{
|
|
ExtractDIEsIfNeeded (false);
|
|
if (m_die_array.empty())
|
|
return NULL;
|
|
return &m_die_array[0];
|
|
}
|
|
|
|
void
|
|
AddDIE (DWARFDebugInfoEntry& die)
|
|
{
|
|
// The average bytes per DIE entry has been seen to be
|
|
// around 14-20 so lets pre-reserve half of that since
|
|
// we are now stripping the NULL tags.
|
|
|
|
// Only reserve the memory if we are adding children of
|
|
// the main compile unit DIE. The compile unit DIE is always
|
|
// the first entry, so if our size is 1, then we are adding
|
|
// the first compile unit child DIE and should reserve
|
|
// the memory.
|
|
if (m_die_array.empty())
|
|
m_die_array.reserve(GetDebugInfoSize() / 24);
|
|
m_die_array.push_back(die);
|
|
}
|
|
|
|
bool
|
|
HasDIEsParsed () const
|
|
{
|
|
return m_die_array.size() > 1;
|
|
}
|
|
|
|
DWARFDebugInfoEntry*
|
|
GetDIEAtIndexUnchecked (uint32_t idx)
|
|
{
|
|
return &m_die_array[idx];
|
|
}
|
|
|
|
DWARFDebugInfoEntry*
|
|
GetDIEPtr (dw_offset_t die_offset);
|
|
|
|
const DWARFDebugInfoEntry*
|
|
GetDIEPtrContainingOffset (dw_offset_t die_offset);
|
|
|
|
static uint8_t
|
|
GetAddressByteSize(const DWARFCompileUnit* cu);
|
|
|
|
static bool
|
|
IsDWARF64(const DWARFCompileUnit* cu);
|
|
|
|
static uint8_t
|
|
GetDefaultAddressSize();
|
|
|
|
static void
|
|
SetDefaultAddressSize(uint8_t addr_size);
|
|
|
|
void *
|
|
GetUserData() const
|
|
{
|
|
return m_user_data;
|
|
}
|
|
|
|
void
|
|
SetUserData(void *d)
|
|
{
|
|
m_user_data = d;
|
|
}
|
|
|
|
bool
|
|
Supports_DW_AT_APPLE_objc_complete_type ();
|
|
|
|
bool
|
|
DW_AT_decl_file_attributes_are_invalid();
|
|
|
|
bool
|
|
Supports_unnamed_objc_bitfields ();
|
|
|
|
// void
|
|
// AddGlobalDIEByIndex (uint32_t die_idx);
|
|
//
|
|
// void
|
|
// AddGlobal (const DWARFDebugInfoEntry* die);
|
|
//
|
|
void
|
|
Index (const uint32_t cu_idx,
|
|
NameToDIE& func_basenames,
|
|
NameToDIE& func_fullnames,
|
|
NameToDIE& func_methods,
|
|
NameToDIE& func_selectors,
|
|
NameToDIE& objc_class_selectors,
|
|
NameToDIE& globals,
|
|
NameToDIE& types,
|
|
NameToDIE& namespaces);
|
|
|
|
const DWARFDebugAranges &
|
|
GetFunctionAranges ();
|
|
|
|
SymbolFileDWARF*
|
|
GetSymbolFileDWARF () const
|
|
{
|
|
return m_dwarf2Data;
|
|
}
|
|
|
|
Producer
|
|
GetProducer ();
|
|
|
|
uint32_t
|
|
GetProducerVersionMajor();
|
|
|
|
uint32_t
|
|
GetProducerVersionMinor();
|
|
|
|
uint32_t
|
|
GetProducerVersionUpdate();
|
|
|
|
bool
|
|
IsDWARF64() const;
|
|
|
|
protected:
|
|
SymbolFileDWARF* m_dwarf2Data;
|
|
const DWARFAbbreviationDeclarationSet *m_abbrevs;
|
|
void * m_user_data;
|
|
DWARFDebugInfoEntry::collection m_die_array; // The compile unit debug information entry item
|
|
std::unique_ptr<DWARFDebugAranges> m_func_aranges_ap; // A table similar to the .debug_aranges table, but this one points to the exact DW_TAG_subprogram DIEs
|
|
dw_addr_t m_base_addr;
|
|
dw_offset_t m_offset;
|
|
dw_offset_t m_length;
|
|
uint16_t m_version;
|
|
uint8_t m_addr_size;
|
|
Producer m_producer;
|
|
uint32_t m_producer_version_major;
|
|
uint32_t m_producer_version_minor;
|
|
uint32_t m_producer_version_update;
|
|
bool m_is_dwarf64;
|
|
|
|
void
|
|
ParseProducerInfo ();
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN (DWARFCompileUnit);
|
|
};
|
|
|
|
#endif // SymbolFileDWARF_DWARFCompileUnit_h_
|