ObjectFile.cpp revision b1888f24fa181489840b9acf193e224d125d0776
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" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectContainer.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile* 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile::FindPlugin (Module* module, const FileSpec* file, lldb::addr_t file_offset, lldb::addr_t file_size) 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "ObjectFile::FindPlugin (module = %s/%s, file = %p, file_offset = 0x%z8.8x, file_size = 0x%z8.8x)", 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner module->GetFileSpec().GetDirectory().AsCString(), 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner module->GetFileSpec().GetFilename().AsCString(), 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file, file_offset, file_size); 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<ObjectFile> object_file_ap; 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (module != NULL) 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file) 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_size == 0) 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_size = file->GetByteSize(); 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_size == 0) 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check for archive file with format "/path/to/archive.a(object.o)" 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char path_with_object[PATH_MAX*2]; 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner module->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object)); 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$"); 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_object_regex.Execute (path_with_object, 2)) 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileSpec archive_file; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string path; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string object; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) && 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_object_regex.GetMatchAtIndex (path_with_object, 2, object)) 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton archive_file.SetFile (path.c_str(), false); 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_size = archive_file.GetByteSize(); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_size > 0) 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner module->SetFileSpecAndObjectName (archive_file, ConstString(object.c_str())); 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6289e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen // No need to delegate further if (file_offset, file_size) exceeds the total file size. 6389e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen // This is the base case. 6489e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen if (file_offset + file_size > file->GetByteSize()) 6589e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen return NULL; 6689e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataBufferSP file_header_data_sp(file->ReadFileContents(file_offset, 512)); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx; 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if this is a normal object file by iterating through 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all object file plugin instances. 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFileCreateInstance create_object_file_callback; 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; (create_object_file_callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) != NULL; ++idx) 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner object_file_ap.reset (create_object_file_callback(module, file_header_data_sp, file, file_offset, file_size)); 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_file_ap.get()) 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return object_file_ap.release(); 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if this is a object container by iterating through 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all object container plugin instances and then trying to get 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // an object file from the container. 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectContainerCreateInstance create_object_container_callback; 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx) 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module, file_header_data_sp, file, file_offset, file_size)); 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_container_ap.get()) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner object_file_ap.reset (object_container_ap->GetObjectFile(file)); 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_file_ap.get()) 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return object_file_ap.release(); 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 987508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 997508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 1007508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFile::SetModulesArchitecture (const ArchSpec &new_arch) 1017508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 1027508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return m_module->SetArchitecture (new_arch); 1037508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 1047508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 105b1888f24fa181489840b9acf193e224d125d0776Greg Claytonlldb::AddressClass 106b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonObjectFile::GetAddressClass (lldb::addr_t file_addr) 107b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 108b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Symtab *symtab = GetSymtab(); 109b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (symtab) 110b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 111b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr); 112b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (symbol) 113b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 114b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const AddressRange *range_ptr = symbol->GetAddressRangePtr(); 115b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (range_ptr) 116b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 117b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const Section *section = range_ptr->GetBaseAddress().GetSection(); 118b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (section) 119b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 120b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const lldb::SectionType section_type = section->GetType(); 121b1888f24fa181489840b9acf193e224d125d0776Greg Clayton switch (section_type) 122b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 123b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeInvalid: return eAddressClassUnknown; 124b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeCode: return eAddressClassCode; 125b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeContainer: return eAddressClassUnknown; 126b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeData: return eAddressClassData; 127b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDataCString: return eAddressClassDataConst; 128b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDataCStringPointers: return eAddressClassData; 129b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDataSymbolAddress: return eAddressClassData; 130b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeData4: return eAddressClassData; 131b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeData8: return eAddressClassData; 132b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeData16: return eAddressClassData; 133b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDataPointers: return eAddressClassData; 134b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeZeroFill: return eAddressClassData; 135b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDataObjCMessageRefs: return eAddressClassDataConst; 136b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDataObjCCFStrings: return eAddressClassDataConst; 137b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDebug: return eAddressClassDebug; 138b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugAbbrev: return eAddressClassDebug; 139b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugAranges: return eAddressClassDebug; 140b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugFrame: return eAddressClassDebug; 141b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugInfo: return eAddressClassDebug; 142b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugLine: return eAddressClassDebug; 143b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugLoc: return eAddressClassDebug; 144b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugMacInfo: return eAddressClassDebug; 145b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugPubNames: return eAddressClassDebug; 146b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugPubTypes: return eAddressClassDebug; 147b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugRanges: return eAddressClassDebug; 148b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeDWARFDebugStr: return eAddressClassDebug; 149b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeEHFrame: return eAddressClassRuntime; 150b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSectionTypeOther: return eAddressClassUnknown; 151b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 152b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 153b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 154b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 155b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const lldb::SymbolType symbol_type = symbol->GetType(); 156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton switch (symbol_type) 157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 158b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAny: return eAddressClassUnknown; 159b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAbsolute: return eAddressClassUnknown; 160b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeExtern: return eAddressClassUnknown; 161b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCode: return eAddressClassCode; 162b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeTrampoline: return eAddressClassCode; 163b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeData: return eAddressClassData; 164b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeRuntime: return eAddressClassRuntime; 165b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeException: return eAddressClassRuntime; 166b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeSourceFile: return eAddressClassDebug; 167b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeHeaderFile: return eAddressClassDebug; 168b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeObjectFile: return eAddressClassDebug; 169b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCommonBlock: return eAddressClassDebug; 170b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeBlock: return eAddressClassDebug; 171b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLocal: return eAddressClassData; 172b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeParam: return eAddressClassData; 173b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeVariable: return eAddressClassData; 174b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeVariableType: return eAddressClassDebug; 175b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLineEntry: return eAddressClassDebug; 176b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeLineHeader: return eAddressClassDebug; 177b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeScopeBegin: return eAddressClassDebug; 178b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeScopeEnd: return eAddressClassDebug; 179b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeAdditional: return eAddressClassUnknown; 180b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeCompiler: return eAddressClassDebug; 181b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeInstrumentation:return eAddressClassDebug; 182b1888f24fa181489840b9acf193e224d125d0776Greg Clayton case eSymbolTypeUndefined: return eAddressClassUnknown; 183b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 184b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 185b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 186b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return eAddressClassUnknown; 187b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 188b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 189b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 190