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"
1899558cc4SGreg Clayton #include "lldb/Symbol/TypeList.h"
1999558cc4SGreg Clayton #include "lldb/Symbol/VariableList.h"
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner using namespace lldb_private;
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner SymbolFile*
2430fdc8d8SChris Lattner SymbolFile::FindPlugin (ObjectFile* obj_file)
2530fdc8d8SChris Lattner {
267b0992d9SGreg Clayton     std::unique_ptr<SymbolFile> best_symfile_ap;
27d4612ad0SEd Maste     if (obj_file != nullptr)
2830fdc8d8SChris Lattner     {
293046e668SGreg Clayton 
303046e668SGreg Clayton         // We need to test the abilities of this section list. So create what it would
313046e668SGreg Clayton         // be with this new obj_file.
323046e668SGreg Clayton         lldb::ModuleSP module_sp(obj_file->GetModule());
333046e668SGreg Clayton         if (module_sp)
343046e668SGreg Clayton         {
353046e668SGreg Clayton             // Default to the main module section list.
363046e668SGreg Clayton             ObjectFile *module_obj_file = module_sp->GetObjectFile();
373046e668SGreg Clayton             if (module_obj_file != obj_file)
383046e668SGreg Clayton             {
393046e668SGreg Clayton                 // Make sure the main object file's sections are created
403046e668SGreg Clayton                 module_obj_file->GetSectionList();
413046e668SGreg Clayton                 obj_file->CreateSections (*module_sp->GetUnifiedSectionList());
423046e668SGreg Clayton             }
433046e668SGreg Clayton         }
443046e668SGreg Clayton 
4530fdc8d8SChris Lattner         // TODO: Load any plug-ins in the appropriate plug-in search paths and
4630fdc8d8SChris Lattner         // iterate over all of them to find the best one for the job.
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner         uint32_t best_symfile_abilities = 0;
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner         SymbolFileCreateInstance create_callback;
51d4612ad0SEd Maste         for (uint32_t idx = 0; (create_callback = PluginManager::GetSymbolFileCreateCallbackAtIndex(idx)) != nullptr; ++idx)
5230fdc8d8SChris Lattner         {
537b0992d9SGreg Clayton             std::unique_ptr<SymbolFile> curr_symfile_ap(create_callback(obj_file));
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner             if (curr_symfile_ap.get())
5630fdc8d8SChris Lattner             {
579efa076aSGreg Clayton                 const uint32_t sym_file_abilities = curr_symfile_ap->GetAbilities();
5830fdc8d8SChris Lattner                 if (sym_file_abilities > best_symfile_abilities)
5930fdc8d8SChris Lattner                 {
6030fdc8d8SChris Lattner                     best_symfile_abilities = sym_file_abilities;
61e01e07b6SGreg Clayton                     best_symfile_ap.reset (curr_symfile_ap.release());
629efa076aSGreg Clayton                     // If any symbol file parser has all of the abilities, then
639efa076aSGreg Clayton                     // we should just stop looking.
649efa076aSGreg Clayton                     if ((kAllAbilities & sym_file_abilities) == kAllAbilities)
659efa076aSGreg Clayton                         break;
6630fdc8d8SChris Lattner                 }
6730fdc8d8SChris Lattner             }
6830fdc8d8SChris Lattner         }
696beaaa68SGreg Clayton         if (best_symfile_ap.get())
706beaaa68SGreg Clayton         {
716beaaa68SGreg Clayton             // Let the winning symbol file parser initialize itself more
726beaaa68SGreg Clayton             // completely now that it has been chosen
736beaaa68SGreg Clayton             best_symfile_ap->InitializeObject();
7430fdc8d8SChris Lattner         }
756beaaa68SGreg Clayton     }
766beaaa68SGreg Clayton     return best_symfile_ap.release();
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
792d95dc9bSGreg Clayton TypeList *
802d95dc9bSGreg Clayton SymbolFile::GetTypeList ()
812d95dc9bSGreg Clayton {
826beaaa68SGreg Clayton     if (m_obj_file)
832d95dc9bSGreg Clayton         return m_obj_file->GetModule()->GetTypeList();
84d4612ad0SEd Maste     return nullptr;
852d95dc9bSGreg Clayton }
866beaaa68SGreg Clayton 
878b4edba9SGreg Clayton ClangASTContext &
886beaaa68SGreg Clayton SymbolFile::GetClangASTContext ()
896beaaa68SGreg Clayton {
906beaaa68SGreg Clayton     return m_obj_file->GetModule()->GetClangASTContext();
916beaaa68SGreg Clayton }
928b4edba9SGreg Clayton 
938b4edba9SGreg Clayton TypeSystem *
948b4edba9SGreg Clayton SymbolFile::GetTypeSystemForLanguage (lldb::LanguageType language)
958b4edba9SGreg Clayton {
96*57bee1edSRyan Brown     TypeSystem *type_system = m_obj_file->GetModule()->GetTypeSystemForLanguage(language);
97*57bee1edSRyan Brown     if (type_system)
98*57bee1edSRyan Brown         type_system->SetSymbolFile(this);
99*57bee1edSRyan Brown     return type_system;
1008b4edba9SGreg Clayton }
1018b4edba9SGreg Clayton 
10299558cc4SGreg Clayton uint32_t
10399558cc4SGreg Clayton SymbolFile::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
10499558cc4SGreg Clayton {
10599558cc4SGreg Clayton     return 0;
10699558cc4SGreg Clayton }
10799558cc4SGreg Clayton 
10899558cc4SGreg Clayton 
10999558cc4SGreg Clayton uint32_t
11099558cc4SGreg Clayton SymbolFile::FindGlobalVariables (const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, VariableList& variables)
11199558cc4SGreg Clayton {
11299558cc4SGreg Clayton     if (!append)
11399558cc4SGreg Clayton         variables.Clear();
11499558cc4SGreg Clayton     return 0;
11599558cc4SGreg Clayton }
11699558cc4SGreg Clayton 
11799558cc4SGreg Clayton 
11899558cc4SGreg Clayton uint32_t
11999558cc4SGreg Clayton SymbolFile::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
12099558cc4SGreg Clayton {
12199558cc4SGreg Clayton     if (!append)
12299558cc4SGreg Clayton         variables.Clear();
12399558cc4SGreg Clayton         return 0;
12499558cc4SGreg Clayton }
12599558cc4SGreg Clayton 
12699558cc4SGreg Clayton uint32_t
12799558cc4SGreg Clayton SymbolFile::FindFunctions (const ConstString &name, const CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list)
12899558cc4SGreg Clayton {
12999558cc4SGreg Clayton     if (!append)
13099558cc4SGreg Clayton         sc_list.Clear();
13199558cc4SGreg Clayton     return 0;
13299558cc4SGreg Clayton }
13399558cc4SGreg Clayton 
13499558cc4SGreg Clayton uint32_t
13599558cc4SGreg Clayton SymbolFile::FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list)
13699558cc4SGreg Clayton {
13799558cc4SGreg Clayton     if (!append)
13899558cc4SGreg Clayton         sc_list.Clear();
13999558cc4SGreg Clayton     return 0;
14099558cc4SGreg Clayton }
14199558cc4SGreg Clayton 
14299558cc4SGreg Clayton uint32_t
14399558cc4SGreg Clayton SymbolFile::FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, TypeList& types)
14499558cc4SGreg Clayton {
14599558cc4SGreg Clayton     if (!append)
14699558cc4SGreg Clayton         types.Clear();
14799558cc4SGreg Clayton     return 0;
14899558cc4SGreg Clayton }
14999558cc4SGreg Clayton 
150