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 {
24*e01e07b6SGreg Clayton     STD_UNIQUE_PTR(SymbolFile) best_symfile_ap;
2530fdc8d8SChris Lattner     if (obj_file != NULL)
2630fdc8d8SChris Lattner     {
2730fdc8d8SChris Lattner         // TODO: Load any plug-ins in the appropriate plug-in search paths and
2830fdc8d8SChris Lattner         // iterate over all of them to find the best one for the job.
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner         uint32_t best_symfile_abilities = 0;
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner         SymbolFileCreateInstance create_callback;
3330fdc8d8SChris Lattner         for (uint32_t idx = 0; (create_callback = PluginManager::GetSymbolFileCreateCallbackAtIndex(idx)) != NULL; ++idx)
3430fdc8d8SChris Lattner         {
35*e01e07b6SGreg Clayton             STD_UNIQUE_PTR(SymbolFile) curr_symfile_ap(create_callback(obj_file));
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner             if (curr_symfile_ap.get())
3830fdc8d8SChris Lattner             {
399efa076aSGreg Clayton                 const uint32_t sym_file_abilities = curr_symfile_ap->GetAbilities();
4030fdc8d8SChris Lattner                 if (sym_file_abilities > best_symfile_abilities)
4130fdc8d8SChris Lattner                 {
4230fdc8d8SChris Lattner                     best_symfile_abilities = sym_file_abilities;
43*e01e07b6SGreg Clayton                     best_symfile_ap.reset (curr_symfile_ap.release());
449efa076aSGreg Clayton                     // If any symbol file parser has all of the abilities, then
459efa076aSGreg Clayton                     // we should just stop looking.
469efa076aSGreg Clayton                     if ((kAllAbilities & sym_file_abilities) == kAllAbilities)
479efa076aSGreg Clayton                         break;
4830fdc8d8SChris Lattner                 }
4930fdc8d8SChris Lattner             }
5030fdc8d8SChris Lattner         }
516beaaa68SGreg Clayton         if (best_symfile_ap.get())
526beaaa68SGreg Clayton         {
536beaaa68SGreg Clayton             // Let the winning symbol file parser initialize itself more
546beaaa68SGreg Clayton             // completely now that it has been chosen
556beaaa68SGreg Clayton             best_symfile_ap->InitializeObject();
5630fdc8d8SChris Lattner         }
576beaaa68SGreg Clayton     }
586beaaa68SGreg Clayton     return best_symfile_ap.release();
5930fdc8d8SChris Lattner }
6030fdc8d8SChris Lattner 
612d95dc9bSGreg Clayton TypeList *
622d95dc9bSGreg Clayton SymbolFile::GetTypeList ()
632d95dc9bSGreg Clayton {
646beaaa68SGreg Clayton     if (m_obj_file)
652d95dc9bSGreg Clayton         return m_obj_file->GetModule()->GetTypeList();
666beaaa68SGreg Clayton     return NULL;
672d95dc9bSGreg Clayton }
686beaaa68SGreg Clayton 
696beaaa68SGreg Clayton lldb_private::ClangASTContext &
706beaaa68SGreg Clayton SymbolFile::GetClangASTContext ()
716beaaa68SGreg Clayton {
726beaaa68SGreg Clayton     return m_obj_file->GetModule()->GetClangASTContext();
736beaaa68SGreg Clayton }
74