ObjectFile.cpp revision 24943d2ee8bfaa7cf5893e4709143924157a5c1e
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 { 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner archive_file.SetFile (path.c_str()); 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 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataBufferSP file_header_data_sp(file->ReadFileContents(file_offset, 512)); 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx; 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if this is a normal object file by iterating through 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all object file plugin instances. 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFileCreateInstance create_object_file_callback; 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; (create_object_file_callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) != NULL; ++idx) 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner object_file_ap.reset (create_object_file_callback(module, file_header_data_sp, file, file_offset, file_size)); 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_file_ap.get()) 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return object_file_ap.release(); 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if this is a object container by iterating through 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all object container plugin instances and then trying to get 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // an object file from the container. 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectContainerCreateInstance create_object_container_callback; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx) 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module, file_header_data_sp, file, file_offset, file_size)); 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_container_ap.get()) 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner object_file_ap.reset (object_container_ap->GetObjectFile(file)); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_file_ap.get()) 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return object_file_ap.release(); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93