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"
184069730cSRavitheja Addepally #include "lldb/Symbol/TypeMap.h"
1956939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h"
2099558cc4SGreg Clayton #include "lldb/Symbol/VariableList.h"
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner using namespace lldb_private;
2330fdc8d8SChris Lattner 
2430fdc8d8SChris Lattner SymbolFile*
2530fdc8d8SChris Lattner SymbolFile::FindPlugin (ObjectFile* obj_file)
2630fdc8d8SChris Lattner {
277b0992d9SGreg Clayton     std::unique_ptr<SymbolFile> best_symfile_ap;
28d4612ad0SEd Maste     if (obj_file != nullptr)
2930fdc8d8SChris Lattner     {
303046e668SGreg Clayton 
313046e668SGreg Clayton         // We need to test the abilities of this section list. So create what it would
323046e668SGreg Clayton         // be with this new obj_file.
333046e668SGreg Clayton         lldb::ModuleSP module_sp(obj_file->GetModule());
343046e668SGreg Clayton         if (module_sp)
353046e668SGreg Clayton         {
363046e668SGreg Clayton             // Default to the main module section list.
373046e668SGreg Clayton             ObjectFile *module_obj_file = module_sp->GetObjectFile();
383046e668SGreg Clayton             if (module_obj_file != obj_file)
393046e668SGreg Clayton             {
403046e668SGreg Clayton                 // Make sure the main object file's sections are created
413046e668SGreg Clayton                 module_obj_file->GetSectionList();
423046e668SGreg Clayton                 obj_file->CreateSections (*module_sp->GetUnifiedSectionList());
433046e668SGreg Clayton             }
443046e668SGreg Clayton         }
453046e668SGreg Clayton 
4630fdc8d8SChris Lattner         // TODO: Load any plug-ins in the appropriate plug-in search paths and
4730fdc8d8SChris Lattner         // iterate over all of them to find the best one for the job.
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner         uint32_t best_symfile_abilities = 0;
5030fdc8d8SChris Lattner 
5130fdc8d8SChris Lattner         SymbolFileCreateInstance create_callback;
52d4612ad0SEd Maste         for (uint32_t idx = 0; (create_callback = PluginManager::GetSymbolFileCreateCallbackAtIndex(idx)) != nullptr; ++idx)
5330fdc8d8SChris Lattner         {
547b0992d9SGreg Clayton             std::unique_ptr<SymbolFile> curr_symfile_ap(create_callback(obj_file));
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner             if (curr_symfile_ap.get())
5730fdc8d8SChris Lattner             {
589efa076aSGreg Clayton                 const uint32_t sym_file_abilities = curr_symfile_ap->GetAbilities();
5930fdc8d8SChris Lattner                 if (sym_file_abilities > best_symfile_abilities)
6030fdc8d8SChris Lattner                 {
6130fdc8d8SChris Lattner                     best_symfile_abilities = sym_file_abilities;
62e01e07b6SGreg Clayton                     best_symfile_ap.reset (curr_symfile_ap.release());
639efa076aSGreg Clayton                     // If any symbol file parser has all of the abilities, then
649efa076aSGreg Clayton                     // we should just stop looking.
659efa076aSGreg Clayton                     if ((kAllAbilities & sym_file_abilities) == kAllAbilities)
669efa076aSGreg Clayton                         break;
6730fdc8d8SChris Lattner                 }
6830fdc8d8SChris Lattner             }
6930fdc8d8SChris Lattner         }
706beaaa68SGreg Clayton         if (best_symfile_ap.get())
716beaaa68SGreg Clayton         {
726beaaa68SGreg Clayton             // Let the winning symbol file parser initialize itself more
736beaaa68SGreg Clayton             // completely now that it has been chosen
746beaaa68SGreg Clayton             best_symfile_ap->InitializeObject();
7530fdc8d8SChris Lattner         }
766beaaa68SGreg Clayton     }
776beaaa68SGreg Clayton     return best_symfile_ap.release();
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner 
802d95dc9bSGreg Clayton TypeList *
812d95dc9bSGreg Clayton SymbolFile::GetTypeList ()
822d95dc9bSGreg Clayton {
836beaaa68SGreg Clayton     if (m_obj_file)
842d95dc9bSGreg Clayton         return m_obj_file->GetModule()->GetTypeList();
85d4612ad0SEd Maste     return nullptr;
862d95dc9bSGreg Clayton }
876beaaa68SGreg Clayton 
888b4edba9SGreg Clayton TypeSystem *
898b4edba9SGreg Clayton SymbolFile::GetTypeSystemForLanguage (lldb::LanguageType language)
908b4edba9SGreg Clayton {
9157bee1edSRyan Brown     TypeSystem *type_system = m_obj_file->GetModule()->GetTypeSystemForLanguage(language);
9257bee1edSRyan Brown     if (type_system)
9357bee1edSRyan Brown         type_system->SetSymbolFile(this);
9457bee1edSRyan Brown     return type_system;
958b4edba9SGreg Clayton }
968b4edba9SGreg Clayton 
9799558cc4SGreg Clayton uint32_t
9899558cc4SGreg Clayton SymbolFile::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
9999558cc4SGreg Clayton {
10099558cc4SGreg Clayton     return 0;
10199558cc4SGreg Clayton }
10299558cc4SGreg Clayton 
10399558cc4SGreg Clayton 
10499558cc4SGreg Clayton uint32_t
10599558cc4SGreg Clayton SymbolFile::FindGlobalVariables (const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, VariableList& variables)
10699558cc4SGreg Clayton {
10799558cc4SGreg Clayton     if (!append)
10899558cc4SGreg Clayton         variables.Clear();
10999558cc4SGreg Clayton     return 0;
11099558cc4SGreg Clayton }
11199558cc4SGreg Clayton 
11299558cc4SGreg Clayton 
11399558cc4SGreg Clayton uint32_t
11499558cc4SGreg Clayton SymbolFile::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
11599558cc4SGreg Clayton {
11699558cc4SGreg Clayton     if (!append)
11799558cc4SGreg Clayton         variables.Clear();
11899558cc4SGreg Clayton         return 0;
11999558cc4SGreg Clayton }
12099558cc4SGreg Clayton 
12199558cc4SGreg Clayton uint32_t
12299558cc4SGreg Clayton SymbolFile::FindFunctions (const ConstString &name, const CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list)
12399558cc4SGreg Clayton {
12499558cc4SGreg Clayton     if (!append)
12599558cc4SGreg Clayton         sc_list.Clear();
12699558cc4SGreg Clayton     return 0;
12799558cc4SGreg Clayton }
12899558cc4SGreg Clayton 
12999558cc4SGreg Clayton uint32_t
13099558cc4SGreg Clayton SymbolFile::FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list)
13199558cc4SGreg Clayton {
13299558cc4SGreg Clayton     if (!append)
13399558cc4SGreg Clayton         sc_list.Clear();
13499558cc4SGreg Clayton     return 0;
13599558cc4SGreg Clayton }
13699558cc4SGreg Clayton 
13799558cc4SGreg Clayton uint32_t
1384069730cSRavitheja Addepally SymbolFile::FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, TypeMap& types)
13999558cc4SGreg Clayton {
14099558cc4SGreg Clayton     if (!append)
14199558cc4SGreg Clayton         types.Clear();
14299558cc4SGreg Clayton     return 0;
14399558cc4SGreg Clayton }
14499558cc4SGreg Clayton 
145*e6b36cddSGreg Clayton 
146*e6b36cddSGreg Clayton size_t
147*e6b36cddSGreg Clayton SymbolFile::FindTypes (const std::vector<CompilerContext> &context, bool append, TypeMap& types)
148*e6b36cddSGreg Clayton {
149*e6b36cddSGreg Clayton     if (!append)
150*e6b36cddSGreg Clayton         types.Clear();
151*e6b36cddSGreg Clayton     return 0;
152*e6b36cddSGreg Clayton }
153