130fdc8d8SChris Lattner //===-- SymbolFile.cpp ------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/Symbol/SymbolFile.h"
11c982b3d6SGreg Clayton 
12c982b3d6SGreg Clayton #include "lldb/lldb-private.h"
13c982b3d6SGreg Clayton #include "lldb/Core/Log.h"
142d95dc9bSGreg Clayton #include "lldb/Core/Module.h"
1530fdc8d8SChris Lattner #include "lldb/Core/PluginManager.h"
16c982b3d6SGreg Clayton #include "lldb/Core/StreamString.h"
172d95dc9bSGreg Clayton #include "lldb/Symbol/ObjectFile.h"
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner using namespace lldb_private;
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner SymbolFile*
2230fdc8d8SChris Lattner SymbolFile::FindPlugin (ObjectFile* obj_file)
2330fdc8d8SChris Lattner {
247b0992d9SGreg Clayton     std::unique_ptr<SymbolFile> best_symfile_ap;
25*d4612ad0SEd Maste     if (obj_file != nullptr)
2630fdc8d8SChris Lattner     {
273046e668SGreg Clayton 
283046e668SGreg Clayton         // We need to test the abilities of this section list. So create what it would
293046e668SGreg Clayton         // be with this new obj_file.
303046e668SGreg Clayton         lldb::ModuleSP module_sp(obj_file->GetModule());
313046e668SGreg Clayton         if (module_sp)
323046e668SGreg Clayton         {
333046e668SGreg Clayton             // Default to the main module section list.
343046e668SGreg Clayton             ObjectFile *module_obj_file = module_sp->GetObjectFile();
353046e668SGreg Clayton             if (module_obj_file != obj_file)
363046e668SGreg Clayton             {
373046e668SGreg Clayton                 // Make sure the main object file's sections are created
383046e668SGreg Clayton                 module_obj_file->GetSectionList();
393046e668SGreg Clayton                 obj_file->CreateSections (*module_sp->GetUnifiedSectionList());
403046e668SGreg Clayton             }
413046e668SGreg Clayton         }
423046e668SGreg Clayton 
4330fdc8d8SChris Lattner         // TODO: Load any plug-ins in the appropriate plug-in search paths and
4430fdc8d8SChris Lattner         // iterate over all of them to find the best one for the job.
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner         uint32_t best_symfile_abilities = 0;
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner         SymbolFileCreateInstance create_callback;
49*d4612ad0SEd Maste         for (uint32_t idx = 0; (create_callback = PluginManager::GetSymbolFileCreateCallbackAtIndex(idx)) != nullptr; ++idx)
5030fdc8d8SChris Lattner         {
517b0992d9SGreg Clayton             std::unique_ptr<SymbolFile> curr_symfile_ap(create_callback(obj_file));
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner             if (curr_symfile_ap.get())
5430fdc8d8SChris Lattner             {
559efa076aSGreg Clayton                 const uint32_t sym_file_abilities = curr_symfile_ap->GetAbilities();
5630fdc8d8SChris Lattner                 if (sym_file_abilities > best_symfile_abilities)
5730fdc8d8SChris Lattner                 {
5830fdc8d8SChris Lattner                     best_symfile_abilities = sym_file_abilities;
59e01e07b6SGreg Clayton                     best_symfile_ap.reset (curr_symfile_ap.release());
609efa076aSGreg Clayton                     // If any symbol file parser has all of the abilities, then
619efa076aSGreg Clayton                     // we should just stop looking.
629efa076aSGreg Clayton                     if ((kAllAbilities & sym_file_abilities) == kAllAbilities)
639efa076aSGreg Clayton                         break;
6430fdc8d8SChris Lattner                 }
6530fdc8d8SChris Lattner             }
6630fdc8d8SChris Lattner         }
676beaaa68SGreg Clayton         if (best_symfile_ap.get())
686beaaa68SGreg Clayton         {
696beaaa68SGreg Clayton             // Let the winning symbol file parser initialize itself more
706beaaa68SGreg Clayton             // completely now that it has been chosen
716beaaa68SGreg Clayton             best_symfile_ap->InitializeObject();
7230fdc8d8SChris Lattner         }
736beaaa68SGreg Clayton     }
746beaaa68SGreg Clayton     return best_symfile_ap.release();
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
772d95dc9bSGreg Clayton TypeList *
782d95dc9bSGreg Clayton SymbolFile::GetTypeList ()
792d95dc9bSGreg Clayton {
806beaaa68SGreg Clayton     if (m_obj_file)
812d95dc9bSGreg Clayton         return m_obj_file->GetModule()->GetTypeList();
82*d4612ad0SEd Maste     return nullptr;
832d95dc9bSGreg Clayton }
846beaaa68SGreg Clayton 
856beaaa68SGreg Clayton lldb_private::ClangASTContext &
866beaaa68SGreg Clayton SymbolFile::GetClangASTContext ()
876beaaa68SGreg Clayton {
886beaaa68SGreg Clayton     return m_obj_file->GetModule()->GetClangASTContext();
896beaaa68SGreg Clayton }
90