summaryrefslogtreecommitdiffstats
path: root/lldb/source/Symbol/Symbol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Symbol/Symbol.cpp')
-rw-r--r--lldb/source/Symbol/Symbol.cpp43
1 files changed, 43 insertions, 0 deletions
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;
+}
+
OpenPOWER on IntegriCloud