124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolFile.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/Symbol/SymbolFile.h" 1175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 1275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/lldb-private.h" 1375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/Log.h" 14e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton#include "lldb/Core/Module.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 1675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h" 17e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton#include "lldb/Symbol/ObjectFile.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile* 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile::FindPlugin (ObjectFile* obj_file) 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<SymbolFile> best_symfile_ap; 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // We need to test the abilities of this section list. So create what it would 297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // be with this new obj_file. 307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton lldb::ModuleSP module_sp(obj_file->GetModule()); 317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (module_sp) 327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 337940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Default to the main module section list. 347940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton ObjectFile *module_obj_file = module_sp->GetObjectFile(); 357940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (module_obj_file != obj_file) 367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Make sure the main object file's sections are created 387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton module_obj_file->GetSectionList(); 397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton obj_file->CreateSections (*module_sp->GetUnifiedSectionList()); 407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Load any plug-ins in the appropriate plug-in search paths and 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // iterate over all of them to find the best one for the job. 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t best_symfile_abilities = 0; 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileCreateInstance create_callback; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t idx = 0; (create_callback = PluginManager::GetSymbolFileCreateCallbackAtIndex(idx)) != NULL; ++idx) 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<SymbolFile> curr_symfile_ap(create_callback(obj_file)); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_symfile_ap.get()) 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 559e8865ee73f1c3decad554809368e8779b8c3e98Greg Clayton const uint32_t sym_file_abilities = curr_symfile_ap->GetAbilities(); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sym_file_abilities > best_symfile_abilities) 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner best_symfile_abilities = sym_file_abilities; 5981a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton best_symfile_ap.reset (curr_symfile_ap.release()); 609e8865ee73f1c3decad554809368e8779b8c3e98Greg Clayton // If any symbol file parser has all of the abilities, then 619e8865ee73f1c3decad554809368e8779b8c3e98Greg Clayton // we should just stop looking. 629e8865ee73f1c3decad554809368e8779b8c3e98Greg Clayton if ((kAllAbilities & sym_file_abilities) == kAllAbilities) 639e8865ee73f1c3decad554809368e8779b8c3e98Greg Clayton break; 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67b01000fd063629facd45044f137446fb748ee179Greg Clayton if (best_symfile_ap.get()) 68b01000fd063629facd45044f137446fb748ee179Greg Clayton { 69b01000fd063629facd45044f137446fb748ee179Greg Clayton // Let the winning symbol file parser initialize itself more 70b01000fd063629facd45044f137446fb748ee179Greg Clayton // completely now that it has been chosen 71b01000fd063629facd45044f137446fb748ee179Greg Clayton best_symfile_ap->InitializeObject(); 72b01000fd063629facd45044f137446fb748ee179Greg Clayton } 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74b01000fd063629facd45044f137446fb748ee179Greg Clayton return best_symfile_ap.release(); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77e98ac25604b3d967158917f6fdd5289b3096fd80Greg ClaytonTypeList * 78e98ac25604b3d967158917f6fdd5289b3096fd80Greg ClaytonSymbolFile::GetTypeList () 79e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{ 80b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_obj_file) 81b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_obj_file->GetModule()->GetTypeList(); 82b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 83b01000fd063629facd45044f137446fb748ee179Greg Clayton} 84b01000fd063629facd45044f137446fb748ee179Greg Clayton 85b01000fd063629facd45044f137446fb748ee179Greg Claytonlldb_private::ClangASTContext & 86b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFile::GetClangASTContext () 87b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 88b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_obj_file->GetModule()->GetClangASTContext(); 89e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton} 90