<rdar://problem/13338643>
DWARF with .o files now uses 40-60% less memory!
Big fixes include:
- Change line table internal representation to contain "file addresses". Since each line table is owned by a compile unit that is owned by a module, it makes address translation into lldb_private::Address easy to do when needed.
- Removed linked address members/methods from lldb_private::Section and lldb_private::Address
- lldb_private::LineTable can now relink itself using a FileRangeMap to make it easier to re-link line tables in the future
- Added ObjectFile::ClearSymtab() so that we can get rid of the object file symbol tables after we parse them once since they are not needed and kept memory allocated for no reason
- Moved the m_sections_ap (std::auto_ptr to section list) and m_symtab_ap (std::auto_ptr to the lldb_private::Symtab) out of each of the ObjectFile subclasses and put it into lldb_private::ObjectFile.
- Changed how the debug map is parsed and stored to be able to:
- Lazily parse the debug map for each object file
- not require the address map for a .o file until debug information is linked for a .o file
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@176454 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Symbol/ObjectFile.cpp b/source/Symbol/ObjectFile.cpp
index a3574a5..4ad515b 100644
--- a/source/Symbol/ObjectFile.cpp
+++ b/source/Symbol/ObjectFile.cpp
@@ -200,8 +200,10 @@
m_data (),
m_unwind_table (*this),
m_process_wp(),
- m_memory_addr (LLDB_INVALID_ADDRESS)
-{
+ m_memory_addr (LLDB_INVALID_ADDRESS),
+ m_sections_ap (),
+ m_symtab_ap ()
+{
if (file_spec_ptr)
m_file = *file_spec_ptr;
if (data_sp)
@@ -209,12 +211,16 @@
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
if (log)
{
+ const ConstString object_name (module_sp->GetObjectName());
if (m_file)
{
- log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = %s/%s, file_offset = 0x%8.8" PRIx64 ", size = %" PRIu64 "\n",
+ log->Printf ("%p ObjectFile::ObjectFile() module = %p (%s%s%s%s), file = %s/%s, file_offset = 0x%8.8" PRIx64 ", size = %" PRIu64,
this,
- module_sp->GetFileSpec().GetDirectory().AsCString(),
+ module_sp.get(),
module_sp->GetFileSpec().GetFilename().AsCString(),
+ object_name ? "(" : "",
+ object_name ? object_name.GetCString() : "",
+ object_name ? ")" : "",
m_file.GetDirectory().AsCString(),
m_file.GetFilename().AsCString(),
m_file_offset,
@@ -222,10 +228,13 @@
}
else
{
- log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = <NULL>, file_offset = 0x%8.8" PRIx64 ", size = %" PRIu64 "\n",
+ log->Printf ("%p ObjectFile::ObjectFile() module = %p (%s%s%s%s), file = <NULL>, file_offset = 0x%8.8" PRIx64 ", size = %" PRIu64,
this,
- module_sp->GetFileSpec().GetDirectory().AsCString(),
+ module_sp.get(),
module_sp->GetFileSpec().GetFilename().AsCString(),
+ object_name ? "(" : "",
+ object_name ? object_name.GetCString() : "",
+ object_name ? ")" : "",
m_file_offset,
m_length);
}
@@ -246,17 +255,23 @@
m_data (),
m_unwind_table (*this),
m_process_wp (process_sp),
- m_memory_addr (header_addr)
-{
+ m_memory_addr (header_addr),
+ m_sections_ap (),
+ m_symtab_ap ()
+{
if (header_data_sp)
m_data.SetData (header_data_sp, 0, header_data_sp->GetByteSize());
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
if (log)
{
- log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, process = %p, header_addr = 0x%" PRIx64 "\n",
+ const ConstString object_name (module_sp->GetObjectName());
+ log->Printf ("%p ObjectFile::ObjectFile() module = %p (%s%s%s%s), process = %p, header_addr = 0x%" PRIx64,
this,
- module_sp->GetFileSpec().GetDirectory().AsCString(),
+ module_sp.get(),
module_sp->GetFileSpec().GetFilename().AsCString(),
+ object_name ? "(" : "",
+ object_name ? object_name.GetCString() : "",
+ object_name ? ")" : "",
process_sp.get(),
m_memory_addr);
}
@@ -519,3 +534,20 @@
return false;
}
+void
+ObjectFile::ClearSymtab ()
+{
+ ModuleSP module_sp(GetModule());
+ if (module_sp)
+ {
+ lldb_private::Mutex::Locker locker(module_sp->GetMutex());
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
+ if (log)
+ {
+ log->Printf ("%p ObjectFile::ClearSymtab () symtab = %p",
+ this,
+ m_symtab_ap.get());
+ }
+ m_symtab_ap.reset();
+ }
+}