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