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" 1636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton#include "lldb/Core/ModuleSpec.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectContainer.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h" 24b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h" 2549ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFileSP 31cbe61bd26db663fa3036866dc33315c6ffc37910Greg ClaytonObjectFile::FindPlugin (const lldb::ModuleSP &module_sp, 32cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton const FileSpec* file, 33cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t file_offset, 34cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t file_size, 35cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton DataBufferSP &data_sp, 36cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t &data_offset) 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38e40b6424d9e49306392bec4b44060da36414c382Greg Clayton ObjectFileSP object_file_sp; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 423508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Timer scoped_timer (__PRETTY_FUNCTION__, 4397a19b21dacd9063bb5475812df7781777262198Greg Clayton "ObjectFile::FindPlugin (module = %s, file = %p, file_offset = 0x%8.8" PRIx64 ", file_size = 0x%8.8" PRIx64 ")", 4497a19b21dacd9063bb5475812df7781777262198Greg Clayton module_sp->GetFileSpec().GetPath().c_str(), 45ef9eb809246491a7a9db1f2bd35d854924525ba6Jason Molenda file, (uint64_t) file_offset, (uint64_t) file_size); 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file) 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton FileSpec archive_file; 49cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton ObjectContainerCreateInstance create_object_container_callback; 50cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton 51cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton const bool file_exists = file->Exists(); 52cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (!data_sp) 53db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton { 54cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // We have an object name which most likely means we have 55cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // a .o file in a static archive (.a file). Try and see if 56cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // we have a cached archive first without reading any data 57cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // first 58cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (file_exists && module_sp->GetObjectName()) 59cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton { 60cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton for (uint32_t idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx) 61cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton { 62102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module_sp, data_sp, data_offset, file, file_offset, file_size)); 63cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton 64cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (object_container_ap.get()) 65cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton object_file_sp = object_container_ap->GetObjectFile(file); 66cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton 67cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (object_file_sp.get()) 68cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton return object_file_sp; 69cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton } 70cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton } 71cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // Ok, we didn't find any containers that have a named object, now 72cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // lets read the first 512 bytes from the file so the object file 73cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // and object container plug-ins can use these bytes to see if they 74cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // can parse this file. 75cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (file_size > 0) 76cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton { 77cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_sp = file->ReadFileContents(file_offset, std::min<size_t>(512, file_size)); 78cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_offset = 0; 79cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton } 80db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton } 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (!data_sp || data_sp->GetByteSize() == 0) 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check for archive file with format "/path/to/archive.a(object.o)" 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char path_with_object[PATH_MAX*2]; 863508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton module_sp->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object)); 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8849ce8969d3154e1560106cfe530444c09410f217Greg Clayton ConstString archive_object; 893cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton const bool must_exist = true; 903cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (ObjectFile::SplitArchivePathWithObject (path_with_object, archive_file, archive_object, must_exist)) 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9249ce8969d3154e1560106cfe530444c09410f217Greg Clayton file_size = archive_file.GetByteSize(); 9349ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (file_size > 0) 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton file = &archive_file; 9649ce8969d3154e1560106cfe530444c09410f217Greg Clayton module_sp->SetFileSpecAndObjectName (archive_file, archive_object); 97cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // Check if this is a object container by iterating through all object 98cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // container plugin instances and then trying to get an object file 99cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // from the container plugins since we had a name. Also, don't read 100cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // ANY data in case there is data cached in the container plug-ins 101cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // (like BSD archives caching the contained objects within an file). 102cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton for (uint32_t idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx) 103cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton { 104102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module_sp, data_sp, data_offset, file, file_offset, file_size)); 105cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton 106cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (object_container_ap.get()) 107cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton object_file_sp = object_container_ap->GetObjectFile(file); 108cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton 109cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (object_file_sp.get()) 110cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton return object_file_sp; 111cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton } 112cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // We failed to find any cached object files in the container 113cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // plug-ins, so lets read the first 512 bytes and try again below... 114cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_sp = archive_file.ReadFileContents(file_offset, 512); 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (data_sp && data_sp->GetByteSize() > 0) 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 121db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // Check if this is a normal object file by iterating through 122db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // all object file plugin instances. 123db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton ObjectFileCreateInstance create_object_file_callback; 124cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton for (uint32_t idx = 0; (create_object_file_callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) != NULL; ++idx) 125db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton { 126cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton object_file_sp.reset (create_object_file_callback(module_sp, data_sp, data_offset, file, file_offset, file_size)); 127db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (object_file_sp.get()) 128db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton return object_file_sp; 129db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton } 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // Check if this is a object container by iterating through 132db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // all object container plugin instances and then trying to get 133db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // an object file from the container. 134cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton for (uint32_t idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx) 135db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton { 136102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module_sp, data_sp, data_offset, file, file_offset, file_size)); 137db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton 138db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (object_container_ap.get()) 139db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton object_file_sp = object_container_ap->GetObjectFile(file); 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (object_file_sp.get()) 142db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton return object_file_sp; 143db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton } 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 147e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // We didn't find it, so clear our shared pointer in case it 148e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // contains anything and return an empty shared pointer 149e40b6424d9e49306392bec4b44060da36414c382Greg Clayton object_file_sp.reset(); 150e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return object_file_sp; 151e40b6424d9e49306392bec4b44060da36414c382Greg Clayton} 152e40b6424d9e49306392bec4b44060da36414c382Greg Clayton 153b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileSP 1543508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFile::FindPlugin (const lldb::ModuleSP &module_sp, 155b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const ProcessSP &process_sp, 156b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton lldb::addr_t header_addr, 157cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton DataBufferSP &data_sp) 158b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 159b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ObjectFileSP object_file_sp; 160b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 1613508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 162b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1633508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Timer scoped_timer (__PRETTY_FUNCTION__, 16497a19b21dacd9063bb5475812df7781777262198Greg Clayton "ObjectFile::FindPlugin (module = %s, process = %p, header_addr = 0x%" PRIx64 ")", 16597a19b21dacd9063bb5475812df7781777262198Greg Clayton module_sp->GetFileSpec().GetPath().c_str(), 1663508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton process_sp.get(), header_addr); 167b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton uint32_t idx; 168b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 169b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Check if this is a normal object file by iterating through 170b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // all object file plugin instances. 171b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ObjectFileCreateMemoryInstance create_callback; 172b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton for (idx = 0; (create_callback = PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(idx)) != NULL; ++idx) 173b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 174cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton object_file_sp.reset (create_callback(module_sp, data_sp, process_sp, header_addr)); 175b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (object_file_sp.get()) 176b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return object_file_sp; 177b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 178b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 179b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 180b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // We didn't find it, so clear our shared pointer in case it 181b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // contains anything and return an empty shared pointer 182b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton object_file_sp.reset(); 183b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return object_file_sp; 184b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 185b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 18636b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonsize_t 18736b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFile::GetModuleSpecifications (const FileSpec &file, 18836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t file_offset, 1897980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton lldb::offset_t file_size, 19036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton ModuleSpecList &specs) 19136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{ 19236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton DataBufferSP data_sp (file.ReadFileContents(file_offset, 512)); 19336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton if (data_sp) 1947980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton { 1957980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton if (file_size == 0) 1967980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton { 1977980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton const lldb::offset_t actual_file_size = file.GetByteSize(); 1987980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton if (actual_file_size > file_offset) 1997980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton file_size = actual_file_size - file_offset; 2007980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton } 2017980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton return ObjectFile::GetModuleSpecifications (file, // file spec 2027980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton data_sp, // data bytes 2037980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton 0, // data offset 2047980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton file_offset,// file offset 2057980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton file_size, // file length 20636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton specs); 2077980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton } 20836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton return 0; 20936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton} 21036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton 21136b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonsize_t 21236b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFile::GetModuleSpecifications (const lldb_private::FileSpec& file, 21336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::DataBufferSP& data_sp, 21436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t data_offset, 21536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t file_offset, 2167980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton lldb::offset_t file_size, 21736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb_private::ModuleSpecList &specs) 21836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{ 21936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton const size_t initial_count = specs.GetSize(); 22036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton ObjectFileGetModuleSpecifications callback; 22136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton uint32_t i; 22236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton // Try the ObjectFile plug-ins 22336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton for (i = 0; (callback = PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(i)) != NULL; ++i) 22436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton { 2257980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton if (callback (file, data_sp, data_offset, file_offset, file_size, specs) > 0) 22636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton return specs.GetSize() - initial_count; 22736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton } 22836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton 22936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton // Try the ObjectContainer plug-ins 23036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton for (i = 0; (callback = PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex(i)) != NULL; ++i) 23136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton { 2327980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton if (callback (file, data_sp, data_offset, file_offset, file_size, specs) > 0) 23336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton return specs.GetSize() - initial_count; 23436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton } 23536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton return 0; 23636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton} 23736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton 23836b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFile::ObjectFile (const lldb::ModuleSP &module_sp, 23936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton const FileSpec *file_spec_ptr, 240cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t file_offset, 241cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t length, 242cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::DataBufferSP& data_sp, 243cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset 244cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton) : 2453508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleChild (module_sp), 246e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_file (), // This file could be different from the original module's file 247e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_type (eTypeInvalid), 248e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_strata (eStrataInvalid), 249cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_file_offset (file_offset), 250cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_length (length), 251db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton m_data (), 252b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_unwind_table (*this), 253b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_process_wp(), 254464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_memory_addr (LLDB_INVALID_ADDRESS), 2557940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_sections_ap(), 2567940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_symtab_ap () 257464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 258e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (file_spec_ptr) 259e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_file = *file_spec_ptr; 260cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (data_sp) 261cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_data.SetData (data_sp, data_offset, length); 262952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 263e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (log) 264e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 265e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (m_file) 266e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 26797a19b21dacd9063bb5475812df7781777262198Greg Clayton log->Printf ("%p ObjectFile::ObjectFile() module = %p (%s), file = %s, file_offset = 0x%8.8" PRIx64 ", size = %" PRIu64, 268e40b6424d9e49306392bec4b44060da36414c382Greg Clayton this, 269464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton module_sp.get(), 27097a19b21dacd9063bb5475812df7781777262198Greg Clayton module_sp->GetSpecificationDescription().c_str(), 27197a19b21dacd9063bb5475812df7781777262198Greg Clayton m_file.GetPath().c_str(), 272cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_file_offset, 273e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_length); 274e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 275e40b6424d9e49306392bec4b44060da36414c382Greg Clayton else 276e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 27797a19b21dacd9063bb5475812df7781777262198Greg Clayton log->Printf ("%p ObjectFile::ObjectFile() module = %p (%s), file = <NULL>, file_offset = 0x%8.8" PRIx64 ", size = %" PRIu64, 278e40b6424d9e49306392bec4b44060da36414c382Greg Clayton this, 279464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton module_sp.get(), 28097a19b21dacd9063bb5475812df7781777262198Greg Clayton module_sp->GetSpecificationDescription().c_str(), 281cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_file_offset, 282e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_length); 283e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 284e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 285e40b6424d9e49306392bec4b44060da36414c382Greg Clayton} 286e40b6424d9e49306392bec4b44060da36414c382Greg Clayton 287b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 2883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFile::ObjectFile (const lldb::ModuleSP &module_sp, 289b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const ProcessSP &process_sp, 290b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton lldb::addr_t header_addr, 291b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DataBufferSP& header_data_sp) : 2923508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleChild (module_sp), 293b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_file (), 294b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_type (eTypeInvalid), 295b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_strata (eStrataInvalid), 296cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_file_offset (0), 297b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_length (0), 298b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_data (), 299b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_unwind_table (*this), 300b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_process_wp (process_sp), 301464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_memory_addr (header_addr), 3027940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_sections_ap(), 3037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_symtab_ap () 304464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 305b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (header_data_sp) 306b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_data.SetData (header_data_sp, 0, header_data_sp->GetByteSize()); 307952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 308b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (log) 309b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 31097a19b21dacd9063bb5475812df7781777262198Greg Clayton log->Printf ("%p ObjectFile::ObjectFile() module = %p (%s), process = %p, header_addr = 0x%" PRIx64, 311b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton this, 312464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton module_sp.get(), 31397a19b21dacd9063bb5475812df7781777262198Greg Clayton module_sp->GetSpecificationDescription().c_str(), 314b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton process_sp.get(), 315cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_memory_addr); 316b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 317b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 318b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 319b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 320e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::~ObjectFile() 321e40b6424d9e49306392bec4b44060da36414c382Greg Clayton{ 322952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 323e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (log) 324c9b798c06458466c818efc6b385f538a22fae022Greg Clayton log->Printf ("%p ObjectFile::~ObjectFile ()\n", this); 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3267508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 3277508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 3287508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFile::SetModulesArchitecture (const ArchSpec &new_arch) 3297508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 3303508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (GetModule()); 3313508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 3323508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton return module_sp->SetArchitecture (new_arch); 3333508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton return false; 3347508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 3357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 336b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonAddressClass 337e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::GetAddressClass (addr_t file_addr) 338b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 3397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Symtab *symtab = GetSymtab(); 340b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (symtab) 341b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 342b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr); 343b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (symbol) 344b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 3450c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton if (symbol->ValueIsAddress()) 346b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 3470c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton const SectionSP section_sp (symbol->GetAddress().GetSection()); 3483508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (section_sp) 349b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 3503508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const SectionType section_type = section_sp->GetType(); 351b1888f24fa181489840b9acf193e224d125d0776Greg Clayton switch (section_type) 352b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 353b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeInvalid: return eAddressClassUnknown; 354b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeCode: return eAddressClassCode; 355b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeContainer: return eAddressClassUnknown; 35624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeData: 35724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataCString: 35824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataCStringPointers: 35924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataSymbolAddress: 36024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeData4: 36124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeData8: 36224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeData16: 36324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataPointers: 36424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeZeroFill: 36524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataObjCMessageRefs: 36624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDataObjCCFStrings: 36724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton return eAddressClassData; 36824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDebug: 36924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugAbbrev: 37024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugAranges: 37124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugFrame: 37224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugInfo: 37324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugLine: 37424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugLoc: 37524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugMacInfo: 37624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugPubNames: 37724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugPubTypes: 37824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugRanges: 37924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFDebugStr: 38024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFAppleNames: 38124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFAppleTypes: 38224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFAppleNamespaces: 38324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eSectionTypeDWARFAppleObjC: 38424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton return eAddressClassDebug; 385b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeEHFrame: return eAddressClassRuntime; 386a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case eSectionTypeELFSymbolTable: 387a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case eSectionTypeELFDynamicSymbols: 388a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case eSectionTypeELFRelocationEntries: 389a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case eSectionTypeELFDynamicLinkInfo: 390b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeOther: return eAddressClassUnknown; 391b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 392b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 393b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 394b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 395b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const SymbolType symbol_type = symbol->GetType(); 396b1888f24fa181489840b9acf193e224d125d0776Greg Clayton switch (symbol_type) 397b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 398b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAny: return eAddressClassUnknown; 399b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAbsolute: return eAddressClassUnknown; 400b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCode: return eAddressClassCode; 401b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeTrampoline: return eAddressClassCode; 4020688435f443de94c82a1ec3b33451beaf2f0b43dGreg Clayton case eSymbolTypeResolver: return eAddressClassCode; 403b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeData: return eAddressClassData; 404b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeRuntime: return eAddressClassRuntime; 405b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeException: return eAddressClassRuntime; 406b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeSourceFile: return eAddressClassDebug; 407b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeHeaderFile: return eAddressClassDebug; 408b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeObjectFile: return eAddressClassDebug; 409b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCommonBlock: return eAddressClassDebug; 410b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeBlock: return eAddressClassDebug; 411b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLocal: return eAddressClassData; 412b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeParam: return eAddressClassData; 413b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeVariable: return eAddressClassData; 414b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeVariableType: return eAddressClassDebug; 415b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLineEntry: return eAddressClassDebug; 416b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLineHeader: return eAddressClassDebug; 417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeScopeBegin: return eAddressClassDebug; 418b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeScopeEnd: return eAddressClassDebug; 419b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAdditional: return eAddressClassUnknown; 420b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCompiler: return eAddressClassDebug; 421b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeInstrumentation:return eAddressClassDebug; 422b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeUndefined: return eAddressClassUnknown; 4233f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCClass: return eAddressClassRuntime; 4243f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCMetaClass: return eAddressClassRuntime; 4253f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCIVar: return eAddressClassRuntime; 426b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 427b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 428b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 429b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return eAddressClassUnknown; 430b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 431b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 432b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonDataBufferSP 433b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadMemory (const ProcessSP &process_sp, lldb::addr_t addr, size_t byte_size) 434b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 435b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DataBufferSP data_sp; 436b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (process_sp) 437b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 438102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<DataBufferHeap> data_ap (new DataBufferHeap (byte_size, 0)); 439b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Error error; 440b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const size_t bytes_read = process_sp->ReadMemory (addr, 441b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_ap->GetBytes(), 442b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_ap->GetByteSize(), 443b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton error); 444b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (bytes_read == byte_size) 445b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_sp.reset (data_ap.release()); 446b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 447b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return data_sp; 448b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 449b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 450db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Claytonsize_t 451db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFile::GetData (off_t offset, size_t length, DataExtractor &data) const 452db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton{ 453db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // The entire file has already been mmap'ed into m_data, so just copy from there 454db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // as the back mmap buffer will be shared with shared pointers. 455db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton return data.SetData (m_data, offset, length); 456db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton} 457db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton 458db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Claytonsize_t 459db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFile::CopyData (off_t offset, size_t length, void *dst) const 460db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton{ 461db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton // The entire file has already been mmap'ed into m_data, so just copy from there 462db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton return m_data.CopyByteOrderedData (offset, length, dst, length, lldb::endian::InlHostByteOrder()); 463db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton} 464b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 465b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 466b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t 467b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadSectionData (const Section *section, off_t section_offset, void *dst, size_t dst_len) const 468b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 469a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // If some other objectfile owns this data, pass this to them. 470a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section->GetObjectFile() != this) 471a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return section->GetObjectFile()->ReadSectionData (section, section_offset, dst, dst_len); 472a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 47346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (IsInMemory()) 474b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 475b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ProcessSP process_sp (m_process_wp.lock()); 476b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (process_sp) 477b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 478b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Error error; 4792ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton const addr_t base_load_addr = section->GetLoadBaseAddress (&process_sp->GetTarget()); 4802ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton if (base_load_addr != LLDB_INVALID_ADDRESS) 4812ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton return process_sp->ReadMemory (base_load_addr + section_offset, dst, dst_len, error); 482b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 483b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 484b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 485b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 4863383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton const uint64_t section_file_size = section->GetFileSize(); 4873383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton if (section_offset < section_file_size) 4883383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton { 4893383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton const uint64_t section_bytes_left = section_file_size - section_offset; 4903383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton uint64_t section_dst_len = dst_len; 4913383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton if (section_dst_len > section_bytes_left) 4923383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton section_dst_len = section_bytes_left; 4933383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton return CopyData (section->GetFileOffset() + section_offset, section_dst_len, dst); 4943383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton } 4951e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan else 4961e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan { 4971e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan if (section->GetType() == eSectionTypeZeroFill) 4981e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan { 4991e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan const uint64_t section_size = section->GetByteSize(); 5001e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan const uint64_t section_bytes_left = section_size - section_offset; 5011e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan uint64_t section_dst_len = dst_len; 5021e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan if (section_dst_len > section_bytes_left) 5031e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan section_dst_len = section_bytes_left; 5041e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan bzero(dst, section_dst_len); 5051e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan return section_dst_len; 5061e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan } 5071e52600c9f14bc28b27e816d84b5f73ec01b392eSean Callanan } 508b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 509b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return 0; 510b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 511b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 512b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton//---------------------------------------------------------------------- 513b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton// Get the section data the file on disk 514b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton//---------------------------------------------------------------------- 515b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t 516b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadSectionData (const Section *section, DataExtractor& section_data) const 517b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 518a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // If some other objectfile owns this data, pass this to them. 519a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section->GetObjectFile() != this) 520a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return section->GetObjectFile()->ReadSectionData (section, section_data); 521a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 52246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (IsInMemory()) 523b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 524b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ProcessSP process_sp (m_process_wp.lock()); 525b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (process_sp) 526b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 5272ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton const addr_t base_load_addr = section->GetLoadBaseAddress (&process_sp->GetTarget()); 5282ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton if (base_load_addr != LLDB_INVALID_ADDRESS) 529b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 5302ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton DataBufferSP data_sp (ReadMemory (process_sp, base_load_addr, section->GetByteSize())); 5312ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton if (data_sp) 5322ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton { 5332ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton section_data.SetData (data_sp, 0, data_sp->GetByteSize()); 5342ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton section_data.SetByteOrder (process_sp->GetByteOrder()); 5352ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton section_data.SetAddressByteSize (process_sp->GetAddressByteSize()); 5362ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton return section_data.GetByteSize(); 5372ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton } 538b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 539b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 540b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 541b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 542b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 543b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // The object file now contains a full mmap'ed copy of the object file data, so just use this 544b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return MemoryMapSectionData (section, section_data); 545b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 546b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton section_data.Clear(); 547b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return 0; 548b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 549b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 550b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t 551b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::MemoryMapSectionData (const Section *section, DataExtractor& section_data) const 552b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 553a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // If some other objectfile owns this data, pass this to them. 554a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section->GetObjectFile() != this) 555a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return section->GetObjectFile()->MemoryMapSectionData (section, section_data); 556a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 55746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (IsInMemory()) 558b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 559b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return ReadSectionData (section, section_data); 560b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 561b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 562b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 563b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // The object file now contains a full mmap'ed copy of the object file data, so just use this 56423d90aea32663f114ffee323775b02dad09f2f18Greg Clayton return GetData(section->GetFileOffset(), section->GetFileSize(), section_data); 565b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 566b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton section_data.Clear(); 567b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return 0; 568b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 569b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 57049ce8969d3154e1560106cfe530444c09410f217Greg Clayton 57149ce8969d3154e1560106cfe530444c09410f217Greg Claytonbool 5723cf7ab5462467121b4ac6cde09ee994030dad0c5Greg ClaytonObjectFile::SplitArchivePathWithObject (const char *path_with_object, FileSpec &archive_file, ConstString &archive_object, bool must_exist) 57349ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 57449ce8969d3154e1560106cfe530444c09410f217Greg Clayton RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$"); 57500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton RegularExpression::Match regex_match(2); 57600af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (g_object_regex.Execute (path_with_object, ®ex_match)) 57749ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 57849ce8969d3154e1560106cfe530444c09410f217Greg Clayton std::string path; 57949ce8969d3154e1560106cfe530444c09410f217Greg Clayton std::string obj; 58000af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (regex_match.GetMatchAtIndex (path_with_object, 1, path) && 58100af72e395d138f459192b7f5450fa4c7854f135Greg Clayton regex_match.GetMatchAtIndex (path_with_object, 2, obj)) 58249ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 58349ce8969d3154e1560106cfe530444c09410f217Greg Clayton archive_file.SetFile (path.c_str(), false); 58449ce8969d3154e1560106cfe530444c09410f217Greg Clayton archive_object.SetCString(obj.c_str()); 5853cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (must_exist && !archive_file.Exists()) 5863cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton return false; 58749ce8969d3154e1560106cfe530444c09410f217Greg Clayton return true; 58849ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 58949ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 59049ce8969d3154e1560106cfe530444c09410f217Greg Clayton return false; 59149ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 59249ce8969d3154e1560106cfe530444c09410f217Greg Clayton 593464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonvoid 5947940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFile::ClearSymtab () 595464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 596464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton ModuleSP module_sp(GetModule()); 597464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (module_sp) 598464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 599464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb_private::Mutex::Locker locker(module_sp->GetMutex()); 600952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 601464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (log) 602464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 6037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton log->Printf ("%p ObjectFile::ClearSymtab () symtab = %p", 604464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton this, 6057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_symtab_ap.get()); 606464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 6077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_symtab_ap.reset(); 6087940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 6097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton} 6107940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 6117940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonSectionList * 6127940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFile::GetSectionList() 6137940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton{ 6147940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (m_sections_ap.get() == NULL) 6157940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 6167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton ModuleSP module_sp(GetModule()); 6177940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (module_sp) 6187940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton CreateSections(*module_sp->GetUnifiedSectionList()); 619464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 6207940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return m_sections_ap.get(); 621464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 622