ObjectFile.cpp revision 3383c1741c6b0ea4648a019f89333ec73e632c5b
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ObjectFile.cpp ------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 11e40b6424d9e49306392bec4b44060da36414c382Greg Clayton#include "lldb/lldb-private-log.h" 12db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton#include "lldb/Core/DataBuffer.h" 13b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBufferHeap.h" 14e40b6424d9e49306392bec4b44060da36414c382Greg Clayton#include "lldb/Core/Log.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectContainer.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h" 22b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFileSP 28db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFile::FindPlugin (Module* module, const FileSpec* file, addr_t file_offset, addr_t file_size, DataBufferSP &file_data_sp) 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "ObjectFile::FindPlugin (module = %s/%s, file = %p, file_offset = 0x%z8.8x, file_size = 0x%z8.8x)", 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner module->GetFileSpec().GetDirectory().AsCString(), 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner module->GetFileSpec().GetFilename().AsCString(), 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file, file_offset, file_size); 35e40b6424d9e49306392bec4b44060da36414c382Greg Clayton ObjectFileSP object_file_sp; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (module != NULL) 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file) 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // Memory map the entire file contents 42db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (!file_data_sp) 43db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton { 44db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton assert (file_offset == 0); 45db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton file_data_sp = file->MemoryMapFileContents(file_offset, file_size); 46db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton } 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (!file_data_sp || file_data_sp->GetByteSize() == 0) 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check for archive file with format "/path/to/archive.a(object.o)" 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char path_with_object[PATH_MAX*2]; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner module->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object)); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$"); 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_object_regex.Execute (path_with_object, 2)) 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileSpec archive_file; 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string path; 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string object; 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) && 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_object_regex.GetMatchAtIndex (path_with_object, 2, object)) 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton archive_file.SetFile (path.c_str(), false); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_size = archive_file.GetByteSize(); 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_size > 0) 66db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton { 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner module->SetFileSpecAndObjectName (archive_file, ConstString(object.c_str())); 68db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton file_data_sp = archive_file.MemoryMapFileContents(file_offset, file_size); 69db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton } 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (file_data_sp && file_data_sp->GetByteSize() > 0) 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton uint32_t idx; 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // Check if this is a normal object file by iterating through 79db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // all object file plugin instances. 80db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton ObjectFileCreateInstance create_object_file_callback; 81db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton for (idx = 0; (create_object_file_callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) != NULL; ++idx) 82db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton { 83db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton object_file_sp.reset (create_object_file_callback(module, file_data_sp, file, file_offset, file_size)); 84db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (object_file_sp.get()) 85db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton return object_file_sp; 86db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton } 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // Check if this is a object container by iterating through 89db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // all object container plugin instances and then trying to get 90db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // an object file from the container. 91db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton ObjectContainerCreateInstance create_object_container_callback; 92db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton for (idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx) 93db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton { 94db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton std::auto_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module, file_data_sp, file, file_offset, file_size)); 95db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton 96db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (object_container_ap.get()) 97db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton object_file_sp = object_container_ap->GetObjectFile(file); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (object_file_sp.get()) 100db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton return object_file_sp; 101db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton } 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // We didn't find it, so clear our shared pointer in case it 106e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // contains anything and return an empty shared pointer 107e40b6424d9e49306392bec4b44060da36414c382Greg Clayton object_file_sp.reset(); 108e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return object_file_sp; 109e40b6424d9e49306392bec4b44060da36414c382Greg Clayton} 110e40b6424d9e49306392bec4b44060da36414c382Greg Clayton 111b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileSP 112b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::FindPlugin (Module* module, 113b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const ProcessSP &process_sp, 114b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton lldb::addr_t header_addr, 115b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DataBufferSP &file_data_sp) 116b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 117b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Timer scoped_timer (__PRETTY_FUNCTION__, 118b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton "ObjectFile::FindPlugin (module = %s/%s, process = %p, header_addr = 0x%llx)", 119b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton module->GetFileSpec().GetDirectory().AsCString(), 120b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton module->GetFileSpec().GetFilename().AsCString(), 121b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton process_sp.get(), header_addr); 122b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ObjectFileSP object_file_sp; 123b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 124b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (module != NULL) 125b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 126b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton uint32_t idx; 127b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 128b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Check if this is a normal object file by iterating through 129b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // all object file plugin instances. 130b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ObjectFileCreateMemoryInstance create_callback; 131b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton for (idx = 0; (create_callback = PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(idx)) != NULL; ++idx) 132b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 133b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton object_file_sp.reset (create_callback(module, file_data_sp, process_sp, header_addr)); 134b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (object_file_sp.get()) 135b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return object_file_sp; 136b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 137b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 138b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 139b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // We didn't find it, so clear our shared pointer in case it 140b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // contains anything and return an empty shared pointer 141b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton object_file_sp.reset(); 142b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return object_file_sp; 143b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 144b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 145e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::ObjectFile (Module* module, 146e40b6424d9e49306392bec4b44060da36414c382Greg Clayton const FileSpec *file_spec_ptr, 147db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton addr_t file_offset, 148db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton addr_t file_size, 149db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton DataBufferSP& file_data_sp) : 150e40b6424d9e49306392bec4b44060da36414c382Greg Clayton ModuleChild (module), 151e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_file (), // This file could be different from the original module's file 152e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_type (eTypeInvalid), 153e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_strata (eStrataInvalid), 154db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton m_offset (file_offset), 155db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton m_length (file_size), 156db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton m_data (), 157b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_unwind_table (*this), 158b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_process_wp(), 15946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_memory_addr (LLDB_INVALID_ADDRESS) 160e40b6424d9e49306392bec4b44060da36414c382Greg Clayton{ 161e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (file_spec_ptr) 162e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_file = *file_spec_ptr; 163db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (file_data_sp) 164db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton m_data.SetData (file_data_sp, file_offset, file_size); 165e40b6424d9e49306392bec4b44060da36414c382Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 166e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (log) 167e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 168e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (m_file) 169e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 170e40b6424d9e49306392bec4b44060da36414c382Greg Clayton log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = %s/%s, offset = 0x%8.8llx, size = %llu\n", 171e40b6424d9e49306392bec4b44060da36414c382Greg Clayton this, 172e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_module->GetFileSpec().GetDirectory().AsCString(), 173e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_module->GetFileSpec().GetFilename().AsCString(), 174e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_file.GetDirectory().AsCString(), 175e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_file.GetFilename().AsCString(), 176e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_offset, 177e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_length); 178e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 179e40b6424d9e49306392bec4b44060da36414c382Greg Clayton else 180e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 181e40b6424d9e49306392bec4b44060da36414c382Greg Clayton log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = <NULL>, offset = 0x%8.8llx, size = %llu\n", 182e40b6424d9e49306392bec4b44060da36414c382Greg Clayton this, 183e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_module->GetFileSpec().GetDirectory().AsCString(), 184e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_module->GetFileSpec().GetFilename().AsCString(), 185e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_offset, 186e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_length); 187e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 188e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 189e40b6424d9e49306392bec4b44060da36414c382Greg Clayton} 190e40b6424d9e49306392bec4b44060da36414c382Greg Clayton 191b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 192b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ObjectFile (Module* module, 193b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const ProcessSP &process_sp, 194b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton lldb::addr_t header_addr, 195b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DataBufferSP& header_data_sp) : 196b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ModuleChild (module), 197b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_file (), 198b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_type (eTypeInvalid), 199b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_strata (eStrataInvalid), 200b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_offset (header_addr), 201b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_length (0), 202b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_data (), 203b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_unwind_table (*this), 204b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_process_wp (process_sp), 20546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_memory_addr (header_addr) 206b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 207b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (header_data_sp) 208b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_data.SetData (header_data_sp, 0, header_data_sp->GetByteSize()); 209b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 210b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (log) 211b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 212b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, process = %p, header_addr = 0x%llx\n", 213b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton this, 214b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_module->GetFileSpec().GetDirectory().AsCString(), 215b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_module->GetFileSpec().GetFilename().AsCString(), 216b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton process_sp.get(), 217b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_offset); 218b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 219b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 220b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 221b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 222e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::~ObjectFile() 223e40b6424d9e49306392bec4b44060da36414c382Greg Clayton{ 224e40b6424d9e49306392bec4b44060da36414c382Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 225e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (log) 226e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 227e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (m_file) 228e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 229e40b6424d9e49306392bec4b44060da36414c382Greg Clayton log->Printf ("%p ObjectFile::~ObjectFile () module = %s/%s, file = %s/%s, offset = 0x%8.8llx, size = %llu\n", 230e40b6424d9e49306392bec4b44060da36414c382Greg Clayton this, 231e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_module->GetFileSpec().GetDirectory().AsCString(), 232e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_module->GetFileSpec().GetFilename().AsCString(), 233e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_file.GetDirectory().AsCString(), 234e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_file.GetFilename().AsCString(), 235e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_offset, 236e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_length); 237e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 238e40b6424d9e49306392bec4b44060da36414c382Greg Clayton else 239e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 240e40b6424d9e49306392bec4b44060da36414c382Greg Clayton log->Printf ("%p ObjectFile::~ObjectFile () module = %s/%s, file = <NULL>, offset = 0x%8.8llx, size = %llu\n", 241e40b6424d9e49306392bec4b44060da36414c382Greg Clayton this, 242e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_module->GetFileSpec().GetDirectory().AsCString(), 243e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_module->GetFileSpec().GetFilename().AsCString(), 244e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_offset, 245e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_length); 246e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 247e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2497508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 2507508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 2517508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFile::SetModulesArchitecture (const ArchSpec &new_arch) 2527508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 2537508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return m_module->SetArchitecture (new_arch); 2547508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 2557508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 256b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonAddressClass 257e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::GetAddressClass (addr_t file_addr) 258b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 259b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Symtab *symtab = GetSymtab(); 260b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (symtab) 261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 262b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr); 263b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (symbol) 264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 265b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const AddressRange *range_ptr = symbol->GetAddressRangePtr(); 266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (range_ptr) 267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const Section *section = range_ptr->GetBaseAddress().GetSection(); 269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (section) 270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 271b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const SectionType section_type = section->GetType(); 272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton switch (section_type) 273b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeInvalid: return eAddressClassUnknown; 275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeCode: return eAddressClassCode; 276b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeContainer: return eAddressClassUnknown; 27724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeData: 27824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataCString: 27924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataCStringPointers: 28024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataSymbolAddress: 28124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeData4: 28224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeData8: 28324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeData16: 28424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataPointers: 28524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeZeroFill: 28624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataObjCMessageRefs: 28724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataObjCCFStrings: 28824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton return eAddressClassData; 28924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDebug: 29024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugAbbrev: 29124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugAranges: 29224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugFrame: 29324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugInfo: 29424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugLine: 29524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugLoc: 29624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugMacInfo: 29724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugPubNames: 29824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugPubTypes: 29924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugRanges: 30024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugStr: 30124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFAppleNames: 30224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFAppleTypes: 30324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFAppleNamespaces: 30424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFAppleObjC: 30524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton return eAddressClassDebug; 306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeEHFrame: return eAddressClassRuntime; 307b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeOther: return eAddressClassUnknown; 308b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 309b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 310b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 311b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 312b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const SymbolType symbol_type = symbol->GetType(); 313b1888f24fa181489840b9acf193e224d125d0776Greg Clayton switch (symbol_type) 314b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 315b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAny: return eAddressClassUnknown; 316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAbsolute: return eAddressClassUnknown; 317b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCode: return eAddressClassCode; 318b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeTrampoline: return eAddressClassCode; 319b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeData: return eAddressClassData; 320b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeRuntime: return eAddressClassRuntime; 321b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeException: return eAddressClassRuntime; 322b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeSourceFile: return eAddressClassDebug; 323b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeHeaderFile: return eAddressClassDebug; 324b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeObjectFile: return eAddressClassDebug; 325b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCommonBlock: return eAddressClassDebug; 326b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeBlock: return eAddressClassDebug; 327b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLocal: return eAddressClassData; 328b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeParam: return eAddressClassData; 329b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeVariable: return eAddressClassData; 330b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeVariableType: return eAddressClassDebug; 331b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLineEntry: return eAddressClassDebug; 332b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLineHeader: return eAddressClassDebug; 333b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeScopeBegin: return eAddressClassDebug; 334b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeScopeEnd: return eAddressClassDebug; 335b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAdditional: return eAddressClassUnknown; 336b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCompiler: return eAddressClassDebug; 337b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeInstrumentation:return eAddressClassDebug; 338b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeUndefined: return eAddressClassUnknown; 3393f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCClass: return eAddressClassRuntime; 3403f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCMetaClass: return eAddressClassRuntime; 3413f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCIVar: return eAddressClassRuntime; 342b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 343b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 344b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 345b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return eAddressClassUnknown; 346b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 347b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 348b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonDataBufferSP 349b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadMemory (const ProcessSP &process_sp, lldb::addr_t addr, size_t byte_size) 350b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 351b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DataBufferSP data_sp; 352b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (process_sp) 353b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 354b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (byte_size, 0)); 355b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Error error; 356b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const size_t bytes_read = process_sp->ReadMemory (addr, 357b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_ap->GetBytes(), 358b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_ap->GetByteSize(), 359b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton error); 360b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (bytes_read == byte_size) 361b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_sp.reset (data_ap.release()); 362b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 363b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return data_sp; 364b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 365b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 366db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Claytonsize_t 367db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFile::GetData (off_t offset, size_t length, DataExtractor &data) const 368db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton{ 369db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // The entire file has already been mmap'ed into m_data, so just copy from there 370db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // as the back mmap buffer will be shared with shared pointers. 371db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton return data.SetData (m_data, offset, length); 372db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton} 373db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton 374db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Claytonsize_t 375db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFile::CopyData (off_t offset, size_t length, void *dst) const 376db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton{ 377db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // The entire file has already been mmap'ed into m_data, so just copy from there 378db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton return m_data.CopyByteOrderedData (offset, length, dst, length, lldb::endian::InlHostByteOrder()); 379db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton} 380b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 381b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 382b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t 383b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadSectionData (const Section *section, off_t section_offset, void *dst, size_t dst_len) const 384b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 38546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (IsInMemory()) 386b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 387b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ProcessSP process_sp (m_process_wp.lock()); 388b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (process_sp) 389b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 390b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Error error; 391b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return process_sp->ReadMemory (section->GetLoadBaseAddress (&process_sp->GetTarget()) + section_offset, dst, dst_len, error); 392b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 393b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 394b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 395b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3963383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton const uint64_t section_file_size = section->GetFileSize(); 3973383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton if (section_offset < section_file_size) 3983383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton { 3993383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton const uint64_t section_bytes_left = section_file_size - section_offset; 4003383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton uint64_t section_dst_len = dst_len; 4013383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton if (section_dst_len > section_bytes_left) 4023383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton section_dst_len = section_bytes_left; 4033383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton return CopyData (section->GetFileOffset() + section_offset, section_dst_len, dst); 4043383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton } 405b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 406b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return 0; 407b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 408b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 409b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton//---------------------------------------------------------------------- 410b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton// Get the section data the file on disk 411b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton//---------------------------------------------------------------------- 412b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t 413b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadSectionData (const Section *section, DataExtractor& section_data) const 414b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 41546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (IsInMemory()) 416b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 417b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ProcessSP process_sp (m_process_wp.lock()); 418b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (process_sp) 419b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 420b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DataBufferSP data_sp (ReadMemory (process_sp, section->GetLoadBaseAddress (&process_sp->GetTarget()), section->GetByteSize())); 421b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (data_sp) 422b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 423b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton section_data.SetData (data_sp, 0, data_sp->GetByteSize()); 424b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton section_data.SetByteOrder (process_sp->GetByteOrder()); 425b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton section_data.SetAddressByteSize (process_sp->GetAddressByteSize()); 426b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return section_data.GetByteSize(); 427b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 428b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 429b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 430b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 431b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 432b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // The object file now contains a full mmap'ed copy of the object file data, so just use this 433b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return MemoryMapSectionData (section, section_data); 434b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 435b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton section_data.Clear(); 436b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return 0; 437b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 438b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 439b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t 440b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::MemoryMapSectionData (const Section *section, DataExtractor& section_data) const 441b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 44246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (IsInMemory()) 443b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 444b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return ReadSectionData (section, section_data); 445b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 446b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 447b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 448b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // The object file now contains a full mmap'ed copy of the object file data, so just use this 449b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return GetData(section->GetFileOffset(), section->GetByteSize(), section_data); 450b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 451b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton section_data.Clear(); 452b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return 0; 453b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 454b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 455