diff options
| author | Greg Clayton <gclayton@apple.com> | 2012-03-02 03:01:16 +0000 |
|---|---|---|
| committer | Greg Clayton <gclayton@apple.com> | 2012-03-02 03:01:16 +0000 |
| commit | da171f11763c75dd173ad56e04508bbe5ae6d7e8 (patch) | |
| tree | 4eca2cd020f8c5cea2eeb7d1c6409c62c2425efe | |
| parent | f5e086f18e4db14af225ae078db0439e4dfdb145 (diff) | |
| download | bcm5719-llvm-da171f11763c75dd173ad56e04508bbe5ae6d7e8.tar.gz bcm5719-llvm-da171f11763c75dd173ad56e04508bbe5ae6d7e8.zip | |
Fixed Symbol objects being able to get their byte size.
llvm-svn: 151878
| -rw-r--r-- | lldb/include/lldb/Symbol/Symbol.h | 3 | ||||
| -rw-r--r-- | lldb/source/Symbol/Symbol.cpp | 43 | ||||
| -rw-r--r-- | lldb/source/Symbol/SymbolContext.cpp | 20 | ||||
| -rw-r--r-- | lldb/source/Symbol/Symtab.cpp | 2 |
4 files changed, 51 insertions, 17 deletions
diff --git a/lldb/include/lldb/Symbol/Symbol.h b/lldb/include/lldb/Symbol/Symbol.h index 66573312120..8554f309ec1 100644 --- a/lldb/include/lldb/Symbol/Symbol.h +++ b/lldb/include/lldb/Symbol/Symbol.h @@ -108,7 +108,7 @@ public: GetSiblingIndex () const; lldb::addr_t - GetByteSize () const { return m_addr_range.GetByteSize(); } + GetByteSize () const; lldb::SymbolType GetType () const { return (lldb::SymbolType)m_type; } @@ -211,6 +211,7 @@ protected: m_is_external:1, // non-zero if this symbol is globally visible m_size_is_sibling:1, // m_size contains the index of this symbol's sibling m_size_is_synthesized:1,// non-zero if this symbol's size was calculated using a delta between this symbol and the next + m_calculated_size:1, m_type:8; uint32_t m_flags; // A copy of the flags from the original symbol table, the ObjectFile plug-in can interpret these AddressRange m_addr_range; // Contains the value, or the section offset address when the value is an address in a section, and the size (if any) diff --git a/lldb/source/Symbol/Symbol.cpp b/lldb/source/Symbol/Symbol.cpp index 8a3211373d1..636670d994f 100644 --- a/lldb/source/Symbol/Symbol.cpp +++ b/lldb/source/Symbol/Symbol.cpp @@ -30,6 +30,7 @@ Symbol::Symbol() : m_is_external (false), m_size_is_sibling (false), m_size_is_synthesized (false), + m_calculated_size (false), m_type (eSymbolTypeInvalid), m_flags (), m_addr_range () @@ -61,6 +62,7 @@ Symbol::Symbol m_is_external (external), m_size_is_sibling (false), m_size_is_synthesized (false), + m_calculated_size (size > 0), m_type (type), m_flags (flags), m_addr_range (section_sp, offset, size) @@ -90,6 +92,7 @@ Symbol::Symbol m_is_external (external), m_size_is_sibling (false), m_size_is_synthesized (false), + m_calculated_size (range.GetByteSize() > 0), m_type (type), m_flags (flags), m_addr_range (range) @@ -107,6 +110,7 @@ Symbol::Symbol(const Symbol& rhs): m_is_external (rhs.m_is_external), m_size_is_sibling (rhs.m_size_is_sibling), m_size_is_synthesized (false), + m_calculated_size (rhs.m_calculated_size), m_type (rhs.m_type), m_flags (rhs.m_flags), m_addr_range (rhs.m_addr_range) @@ -128,6 +132,7 @@ Symbol::operator= (const Symbol& rhs) m_is_external = rhs.m_is_external; m_size_is_sibling = rhs.m_size_is_sibling; m_size_is_synthesized = rhs.m_size_is_sibling; + m_calculated_size = rhs.m_calculated_size; m_type = rhs.m_type; m_flags = rhs.m_flags; m_addr_range = rhs.m_addr_range; @@ -147,6 +152,7 @@ Symbol::Clear() m_is_external = false; m_size_is_sibling = false; m_size_is_synthesized = false; + m_calculated_size = false; m_type = eSymbolTypeInvalid; m_flags = 0; m_addr_range.Clear(); @@ -156,7 +162,11 @@ AddressRange * Symbol::GetAddressRangePtr() { if (m_addr_range.GetBaseAddress().GetSection()) + { + if (!m_calculated_size) + GetByteSize(); return &m_addr_range; + } return NULL; } @@ -164,7 +174,11 @@ const AddressRange * Symbol::GetAddressRangePtr() const { if (m_addr_range.GetBaseAddress().GetSection()) + { + if (!m_calculated_size) + GetByteSize(); return &m_addr_range; + } return NULL; } @@ -395,3 +409,32 @@ Symbol::DumpSymbolContext (Stream *s) } +lldb::addr_t +Symbol::GetByteSize () const +{ + addr_t byte_size = m_addr_range.GetByteSize(); + if (byte_size == 0 && !m_calculated_size) + { + const_cast<Symbol*>(this)->m_calculated_size = true; + const AddressRange *range = GetAddressRangePtr(); + if (range) + { + ModuleSP module_sp (range->GetBaseAddress().GetModule()); + if (module_sp) + { + ObjectFile *objfile = module_sp->GetObjectFile(); + if (objfile) + { + Symtab *symtab = objfile->GetSymtab(); + if (symtab) + { + const_cast<AddressRange &>(m_addr_range).SetByteSize(symtab->CalculateSymbolSize (const_cast<Symbol *>(this))); + byte_size = m_addr_range.GetByteSize(); + } + } + } + } + } + return byte_size; +} + diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index 7fca260702b..1c764e89ef5 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/source/Symbol/SymbolContext.cpp @@ -427,26 +427,16 @@ SymbolContext::GetAddressRange (uint32_t scope, } } - if ((scope & eSymbolContextSymbol) && (symbol != NULL) && (symbol->GetAddressRangePtr() != NULL)) + if ((scope & eSymbolContextSymbol) && (symbol != NULL)) { if (range_idx == 0) { - range = *symbol->GetAddressRangePtr(); - - if (range.GetByteSize() == 0) + const AddressRange *range_ptr = symbol->GetAddressRangePtr(); + if (range_ptr) { - if (module_sp) - { - ObjectFile *objfile = module_sp->GetObjectFile(); - if (objfile) - { - Symtab *symtab = objfile->GetSymtab(); - if (symtab) - range.SetByteSize(symtab->CalculateSymbolSize (symbol)); - } - } + range = *range_ptr; + return true; } - return true; } } range.Clear(); diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp index feda4d166f5..ea4ff608cb5 100644 --- a/lldb/source/Symbol/Symtab.cpp +++ b/lldb/source/Symbol/Symtab.cpp @@ -929,7 +929,7 @@ Symtab::FindSymbolContainingFileAddress (addr_t file_addr, const uint32_t* index return info.match_symbol; } - const size_t symbol_byte_size = CalculateSymbolSize(info.match_symbol); + const size_t symbol_byte_size = info.match_symbol->GetByteSize(); if (symbol_byte_size == 0) { |

