summaryrefslogtreecommitdiff
path: root/lldb/source/Symbol/ObjectFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Symbol/ObjectFile.cpp')
-rw-r--r--lldb/source/Symbol/ObjectFile.cpp457
1 files changed, 0 insertions, 457 deletions
diff --git a/lldb/source/Symbol/ObjectFile.cpp b/lldb/source/Symbol/ObjectFile.cpp
deleted file mode 100644
index 7469b10e2aee..000000000000
--- a/lldb/source/Symbol/ObjectFile.cpp
+++ /dev/null
@@ -1,457 +0,0 @@
-//===-- ObjectFile.cpp ------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/lldb-private.h"
-#include "lldb/lldb-private-log.h"
-#include "lldb/Core/DataBuffer.h"
-#include "lldb/Core/DataBufferHeap.h"
-#include "lldb/Core/Log.h"
-#include "lldb/Core/Module.h"
-#include "lldb/Core/PluginManager.h"
-#include "lldb/Core/RegularExpression.h"
-#include "lldb/Core/Timer.h"
-#include "lldb/Symbol/ObjectFile.h"
-#include "lldb/Symbol/ObjectContainer.h"
-#include "lldb/Symbol/SymbolFile.h"
-#include "lldb/Target/Process.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-ObjectFileSP
-ObjectFile::FindPlugin (const lldb::ModuleSP &module_sp, const FileSpec* file, addr_t file_offset, addr_t file_size, DataBufferSP &file_data_sp)
-{
- ObjectFileSP object_file_sp;
-
- if (module_sp)
- {
- Timer scoped_timer (__PRETTY_FUNCTION__,
- "ObjectFile::FindPlugin (module = %s/%s, file = %p, file_offset = 0x%z8.8x, file_size = 0x%z8.8x)",
- module_sp->GetFileSpec().GetDirectory().AsCString(),
- module_sp->GetFileSpec().GetFilename().AsCString(),
- file, file_offset, file_size);
- if (file)
- {
- // Memory map the entire file contents
- if (!file_data_sp)
- {
- assert (file_offset == 0);
- file_data_sp = file->MemoryMapFileContents(file_offset, file_size);
- }
-
- if (!file_data_sp || file_data_sp->GetByteSize() == 0)
- {
- // Check for archive file with format "/path/to/archive.a(object.o)"
- char path_with_object[PATH_MAX*2];
- module_sp->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object));
-
- RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$");
- if (g_object_regex.Execute (path_with_object, 2))
- {
- FileSpec archive_file;
- std::string path;
- std::string object;
- if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) &&
- g_object_regex.GetMatchAtIndex (path_with_object, 2, object))
- {
- archive_file.SetFile (path.c_str(), false);
- file_size = archive_file.GetByteSize();
- if (file_size > 0)
- {
- module_sp->SetFileSpecAndObjectName (archive_file, ConstString(object.c_str()));
- file_data_sp = archive_file.MemoryMapFileContents(file_offset, file_size);
- }
- }
- }
- }
-
- if (file_data_sp && file_data_sp->GetByteSize() > 0)
- {
- uint32_t idx;
-
- // Check if this is a normal object file by iterating through
- // all object file plugin instances.
- ObjectFileCreateInstance create_object_file_callback;
- for (idx = 0; (create_object_file_callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) != NULL; ++idx)
- {
- object_file_sp.reset (create_object_file_callback(module_sp, file_data_sp, file, file_offset, file_size));
- if (object_file_sp.get())
- return object_file_sp;
- }
-
- // Check if this is a object container by iterating through
- // all object container plugin instances and then trying to get
- // an object file from the container.
- ObjectContainerCreateInstance create_object_container_callback;
- for (idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx)
- {
- std::auto_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module_sp, file_data_sp, file, file_offset, file_size));
-
- if (object_container_ap.get())
- object_file_sp = object_container_ap->GetObjectFile(file);
-
- if (object_file_sp.get())
- return object_file_sp;
- }
- }
- }
- }
- // We didn't find it, so clear our shared pointer in case it
- // contains anything and return an empty shared pointer
- object_file_sp.reset();
- return object_file_sp;
-}
-
-ObjectFileSP
-ObjectFile::FindPlugin (const lldb::ModuleSP &module_sp,
- const ProcessSP &process_sp,
- lldb::addr_t header_addr,
- DataBufferSP &file_data_sp)
-{
- ObjectFileSP object_file_sp;
-
- if (module_sp)
- {
- Timer scoped_timer (__PRETTY_FUNCTION__,
- "ObjectFile::FindPlugin (module = %s/%s, process = %p, header_addr = 0x%llx)",
- module_sp->GetFileSpec().GetDirectory().AsCString(),
- module_sp->GetFileSpec().GetFilename().AsCString(),
- process_sp.get(), header_addr);
- uint32_t idx;
-
- // Check if this is a normal object file by iterating through
- // all object file plugin instances.
- ObjectFileCreateMemoryInstance create_callback;
- for (idx = 0; (create_callback = PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(idx)) != NULL; ++idx)
- {
- object_file_sp.reset (create_callback(module_sp, file_data_sp, process_sp, header_addr));
- if (object_file_sp.get())
- return object_file_sp;
- }
-
- }
- // We didn't find it, so clear our shared pointer in case it
- // contains anything and return an empty shared pointer
- object_file_sp.reset();
- return object_file_sp;
-}
-
-ObjectFile::ObjectFile (const lldb::ModuleSP &module_sp,
- const FileSpec *file_spec_ptr,
- addr_t file_offset,
- addr_t file_size,
- DataBufferSP& file_data_sp) :
- ModuleChild (module_sp),
- m_file (), // This file could be different from the original module's file
- m_type (eTypeInvalid),
- m_strata (eStrataInvalid),
- m_offset (file_offset),
- m_length (file_size),
- m_data (),
- m_unwind_table (*this),
- m_process_wp(),
- m_memory_addr (LLDB_INVALID_ADDRESS)
-{
- if (file_spec_ptr)
- m_file = *file_spec_ptr;
- if (file_data_sp)
- m_data.SetData (file_data_sp, file_offset, file_size);
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
- if (log)
- {
- if (m_file)
- {
- log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = %s/%s, offset = 0x%8.8llx, size = %llu\n",
- this,
- module_sp->GetFileSpec().GetDirectory().AsCString(),
- module_sp->GetFileSpec().GetFilename().AsCString(),
- m_file.GetDirectory().AsCString(),
- m_file.GetFilename().AsCString(),
- m_offset,
- m_length);
- }
- else
- {
- log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = <NULL>, offset = 0x%8.8llx, size = %llu\n",
- this,
- module_sp->GetFileSpec().GetDirectory().AsCString(),
- module_sp->GetFileSpec().GetFilename().AsCString(),
- m_offset,
- m_length);
- }
- }
-}
-
-
-ObjectFile::ObjectFile (const lldb::ModuleSP &module_sp,
- const ProcessSP &process_sp,
- lldb::addr_t header_addr,
- DataBufferSP& header_data_sp) :
- ModuleChild (module_sp),
- m_file (),
- m_type (eTypeInvalid),
- m_strata (eStrataInvalid),
- m_offset (header_addr),
- m_length (0),
- m_data (),
- m_unwind_table (*this),
- m_process_wp (process_sp),
- m_memory_addr (header_addr)
-{
- 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%llx\n",
- this,
- module_sp->GetFileSpec().GetDirectory().AsCString(),
- module_sp->GetFileSpec().GetFilename().AsCString(),
- process_sp.get(),
- m_offset);
- }
-}
-
-
-ObjectFile::~ObjectFile()
-{
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
- if (log)
- {
- ModuleSP module_sp (GetModule());
- if (m_file)
- {
- log->Printf ("%p ObjectFile::~ObjectFile () module = %s/%s, file = %s/%s, offset = 0x%8.8llx, size = %llu\n",
- this,
- module_sp->GetFileSpec().GetDirectory().AsCString(),
- module_sp->GetFileSpec().GetFilename().AsCString(),
- m_file.GetDirectory().AsCString(),
- m_file.GetFilename().AsCString(),
- m_offset,
- m_length);
- }
- else
- {
- log->Printf ("%p ObjectFile::~ObjectFile () module = %s/%s, file = <NULL>, offset = 0x%8.8llx, size = %llu\n",
- this,
- module_sp->GetFileSpec().GetDirectory().AsCString(),
- module_sp->GetFileSpec().GetFilename().AsCString(),
- m_offset,
- m_length);
- }
- }
-}
-
-bool
-ObjectFile::SetModulesArchitecture (const ArchSpec &new_arch)
-{
- ModuleSP module_sp (GetModule());
- if (module_sp)
- return module_sp->SetArchitecture (new_arch);
- return false;
-}
-
-AddressClass
-ObjectFile::GetAddressClass (addr_t file_addr)
-{
- Symtab *symtab = GetSymtab();
- if (symtab)
- {
- Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
- if (symbol)
- {
- if (symbol->ValueIsAddress())
- {
- const SectionSP section_sp (symbol->GetAddress().GetSection());
- if (section_sp)
- {
- const SectionType section_type = section_sp->GetType();
- switch (section_type)
- {
- case eSectionTypeInvalid: return eAddressClassUnknown;
- case eSectionTypeCode: return eAddressClassCode;
- case eSectionTypeContainer: return eAddressClassUnknown;
- case eSectionTypeData:
- case eSectionTypeDataCString:
- case eSectionTypeDataCStringPointers:
- case eSectionTypeDataSymbolAddress:
- case eSectionTypeData4:
- case eSectionTypeData8:
- case eSectionTypeData16:
- case eSectionTypeDataPointers:
- case eSectionTypeZeroFill:
- case eSectionTypeDataObjCMessageRefs:
- case eSectionTypeDataObjCCFStrings:
- return eAddressClassData;
- case eSectionTypeDebug:
- case eSectionTypeDWARFDebugAbbrev:
- case eSectionTypeDWARFDebugAranges:
- case eSectionTypeDWARFDebugFrame:
- case eSectionTypeDWARFDebugInfo:
- case eSectionTypeDWARFDebugLine:
- case eSectionTypeDWARFDebugLoc:
- case eSectionTypeDWARFDebugMacInfo:
- case eSectionTypeDWARFDebugPubNames:
- case eSectionTypeDWARFDebugPubTypes:
- case eSectionTypeDWARFDebugRanges:
- case eSectionTypeDWARFDebugStr:
- case eSectionTypeDWARFAppleNames:
- case eSectionTypeDWARFAppleTypes:
- case eSectionTypeDWARFAppleNamespaces:
- case eSectionTypeDWARFAppleObjC:
- return eAddressClassDebug;
- case eSectionTypeEHFrame: return eAddressClassRuntime;
- case eSectionTypeOther: return eAddressClassUnknown;
- }
- }
- }
-
- const SymbolType symbol_type = symbol->GetType();
- switch (symbol_type)
- {
- case eSymbolTypeAny: return eAddressClassUnknown;
- case eSymbolTypeAbsolute: return eAddressClassUnknown;
- case eSymbolTypeCode: return eAddressClassCode;
- case eSymbolTypeTrampoline: return eAddressClassCode;
- case eSymbolTypeData: return eAddressClassData;
- case eSymbolTypeRuntime: return eAddressClassRuntime;
- case eSymbolTypeException: return eAddressClassRuntime;
- case eSymbolTypeSourceFile: return eAddressClassDebug;
- case eSymbolTypeHeaderFile: return eAddressClassDebug;
- case eSymbolTypeObjectFile: return eAddressClassDebug;
- case eSymbolTypeCommonBlock: return eAddressClassDebug;
- case eSymbolTypeBlock: return eAddressClassDebug;
- case eSymbolTypeLocal: return eAddressClassData;
- case eSymbolTypeParam: return eAddressClassData;
- case eSymbolTypeVariable: return eAddressClassData;
- case eSymbolTypeVariableType: return eAddressClassDebug;
- case eSymbolTypeLineEntry: return eAddressClassDebug;
- case eSymbolTypeLineHeader: return eAddressClassDebug;
- case eSymbolTypeScopeBegin: return eAddressClassDebug;
- case eSymbolTypeScopeEnd: return eAddressClassDebug;
- case eSymbolTypeAdditional: return eAddressClassUnknown;
- case eSymbolTypeCompiler: return eAddressClassDebug;
- case eSymbolTypeInstrumentation:return eAddressClassDebug;
- case eSymbolTypeUndefined: return eAddressClassUnknown;
- case eSymbolTypeObjCClass: return eAddressClassRuntime;
- case eSymbolTypeObjCMetaClass: return eAddressClassRuntime;
- case eSymbolTypeObjCIVar: return eAddressClassRuntime;
- }
- }
- }
- return eAddressClassUnknown;
-}
-
-DataBufferSP
-ObjectFile::ReadMemory (const ProcessSP &process_sp, lldb::addr_t addr, size_t byte_size)
-{
- DataBufferSP data_sp;
- if (process_sp)
- {
- std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (byte_size, 0));
- Error error;
- const size_t bytes_read = process_sp->ReadMemory (addr,
- data_ap->GetBytes(),
- data_ap->GetByteSize(),
- error);
- if (bytes_read == byte_size)
- data_sp.reset (data_ap.release());
- }
- return data_sp;
-}
-
-size_t
-ObjectFile::GetData (off_t offset, size_t length, DataExtractor &data) const
-{
- // The entire file has already been mmap'ed into m_data, so just copy from there
- // as the back mmap buffer will be shared with shared pointers.
- return data.SetData (m_data, offset, length);
-}
-
-size_t
-ObjectFile::CopyData (off_t offset, size_t length, void *dst) const
-{
- // The entire file has already been mmap'ed into m_data, so just copy from there
- return m_data.CopyByteOrderedData (offset, length, dst, length, lldb::endian::InlHostByteOrder());
-}
-
-
-size_t
-ObjectFile::ReadSectionData (const Section *section, off_t section_offset, void *dst, size_t dst_len) const
-{
- if (IsInMemory())
- {
- ProcessSP process_sp (m_process_wp.lock());
- if (process_sp)
- {
- Error error;
- return process_sp->ReadMemory (section->GetLoadBaseAddress (&process_sp->GetTarget()) + section_offset, dst, dst_len, error);
- }
- }
- else
- {
- const uint64_t section_file_size = section->GetFileSize();
- if (section_offset < section_file_size)
- {
- const uint64_t section_bytes_left = section_file_size - section_offset;
- uint64_t section_dst_len = dst_len;
- if (section_dst_len > section_bytes_left)
- section_dst_len = section_bytes_left;
- return CopyData (section->GetFileOffset() + section_offset, section_dst_len, dst);
- }
- }
- return 0;
-}
-
-//----------------------------------------------------------------------
-// Get the section data the file on disk
-//----------------------------------------------------------------------
-size_t
-ObjectFile::ReadSectionData (const Section *section, DataExtractor& section_data) const
-{
- if (IsInMemory())
- {
- ProcessSP process_sp (m_process_wp.lock());
- if (process_sp)
- {
- DataBufferSP data_sp (ReadMemory (process_sp, section->GetLoadBaseAddress (&process_sp->GetTarget()), section->GetByteSize()));
- if (data_sp)
- {
- section_data.SetData (data_sp, 0, data_sp->GetByteSize());
- section_data.SetByteOrder (process_sp->GetByteOrder());
- section_data.SetAddressByteSize (process_sp->GetAddressByteSize());
- return section_data.GetByteSize();
- }
- }
- }
- else
- {
- // The object file now contains a full mmap'ed copy of the object file data, so just use this
- return MemoryMapSectionData (section, section_data);
- }
- section_data.Clear();
- return 0;
-}
-
-size_t
-ObjectFile::MemoryMapSectionData (const Section *section, DataExtractor& section_data) const
-{
- if (IsInMemory())
- {
- return ReadSectionData (section, section_data);
- }
- else
- {
- // The object file now contains a full mmap'ed copy of the object file data, so just use this
- return GetData(section->GetFileOffset(), section->GetFileSize(), section_data);
- }
- section_data.Clear();
- return 0;
-}
-