diff options
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp')
| -rw-r--r-- | lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp | 462 |
1 files changed, 0 insertions, 462 deletions
diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp deleted file mode 100644 index b21343dc6d81..000000000000 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp +++ /dev/null @@ -1,462 +0,0 @@ -//===-- SymbolFileSymtab.cpp ------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "SymbolFileSymtab.h" -#include "lldb/Core/Module.h" -#include "lldb/Core/PluginManager.h" -#include "lldb/Core/RegularExpression.h" -#include "lldb/Core/Timer.h" -#include "lldb/Symbol/ObjectFile.h" -#include "lldb/Symbol/Symtab.h" -#include "lldb/Symbol/ObjectFile.h" -#include "lldb/Symbol/Symbol.h" -#include "lldb/Symbol/CompileUnit.h" -#include "lldb/Symbol/SymbolContext.h" -#include "lldb/Symbol/Function.h" - -using namespace lldb; -using namespace lldb_private; - -void -SymbolFileSymtab::Initialize() -{ - PluginManager::RegisterPlugin (GetPluginNameStatic(), - GetPluginDescriptionStatic(), - CreateInstance); -} - -void -SymbolFileSymtab::Terminate() -{ - PluginManager::UnregisterPlugin (CreateInstance); -} - - -const char * -SymbolFileSymtab::GetPluginNameStatic() -{ - return "symbol-file.symtab"; -} - -const char * -SymbolFileSymtab::GetPluginDescriptionStatic() -{ - return "Reads debug symbols from an object file's symbol table."; -} - - -SymbolFile* -SymbolFileSymtab::CreateInstance (ObjectFile* obj_file) -{ - return new SymbolFileSymtab(obj_file); -} - -SymbolFileSymtab::SymbolFileSymtab(ObjectFile* obj_file) : - SymbolFile(obj_file), - m_source_indexes(), - m_func_indexes(), - m_code_indexes(), - m_objc_class_name_to_index () -{ -} - -SymbolFileSymtab::~SymbolFileSymtab() -{ -} - -ClangASTContext & -SymbolFileSymtab::GetClangASTContext () -{ - ClangASTContext &ast = m_obj_file->GetModule()->GetClangASTContext(); - - return ast; -} - -uint32_t -SymbolFileSymtab::CalculateAbilities () -{ - uint32_t abilities = 0; - if (m_obj_file) - { - const Symtab *symtab = m_obj_file->GetSymtab(); - if (symtab) - { - //---------------------------------------------------------------------- - // The snippet of code below will get the indexes the module symbol - // table entries that are code, data, or function related (debug info), - // sort them by value (address) and dump the sorted symbols. - //---------------------------------------------------------------------- - if (symtab->AppendSymbolIndexesWithType(eSymbolTypeSourceFile, m_source_indexes)) - { - abilities |= CompileUnits; - } - - if (symtab->AppendSymbolIndexesWithType(eSymbolTypeCode, Symtab::eDebugYes, Symtab::eVisibilityAny, m_func_indexes)) - { - symtab->SortSymbolIndexesByValue(m_func_indexes, true); - abilities |= Functions; - } - - if (symtab->AppendSymbolIndexesWithType(eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny, m_code_indexes)) - { - symtab->SortSymbolIndexesByValue(m_code_indexes, true); - abilities |= Labels; - } - - if (symtab->AppendSymbolIndexesWithType(eSymbolTypeData, m_data_indexes)) - { - symtab->SortSymbolIndexesByValue(m_data_indexes, true); - abilities |= GlobalVariables; - } - - lldb_private::Symtab::IndexCollection objc_class_indexes; - if (symtab->AppendSymbolIndexesWithType (eSymbolTypeObjCClass, objc_class_indexes)) - { - abilities |= RuntimeTypes; - symtab->AppendSymbolNamesToMap (objc_class_indexes, - true, - true, - m_objc_class_name_to_index); - m_objc_class_name_to_index.Sort(); - } - } - } - return abilities; -} - -uint32_t -SymbolFileSymtab::GetNumCompileUnits() -{ - // If we don't have any source file symbols we will just have one compile unit for - // the entire object file - if (m_source_indexes.empty()) - return 0; - - // If we have any source file symbols we will logically orgnize the object symbols - // using these. - return m_source_indexes.size(); -} - -CompUnitSP -SymbolFileSymtab::ParseCompileUnitAtIndex(uint32_t idx) -{ - CompUnitSP cu_sp; - - // If we don't have any source file symbols we will just have one compile unit for - // the entire object file -// if (m_source_indexes.empty()) -// { -// const FileSpec &obj_file_spec = m_obj_file->GetFileSpec(); -// if (obj_file_spec) -// cu_sp.reset(new CompileUnit(m_obj_file->GetModule(), NULL, obj_file_spec, 0, eLanguageTypeUnknown)); -// -// } - /* else */ if (idx < m_source_indexes.size()) - { - const Symbol *cu_symbol = m_obj_file->GetSymtab()->SymbolAtIndex(m_source_indexes[idx]); - if (cu_symbol) - cu_sp.reset(new CompileUnit (m_obj_file->GetModule(), NULL, cu_symbol->GetMangled().GetName().AsCString(), 0, eLanguageTypeUnknown)); - } - return cu_sp; -} - -size_t -SymbolFileSymtab::ParseCompileUnitFunctions (const SymbolContext &sc) -{ - size_t num_added = 0; - // We must at least have a valid compile unit - assert (sc.comp_unit != NULL); - const Symtab *symtab = m_obj_file->GetSymtab(); - const Symbol *curr_symbol = NULL; - const Symbol *next_symbol = NULL; -// const char *prefix = m_obj_file->SymbolPrefix(); -// if (prefix == NULL) -// prefix == ""; -// -// const uint32_t prefix_len = strlen(prefix); - - // If we don't have any source file symbols we will just have one compile unit for - // the entire object file - if (m_source_indexes.empty()) - { - // The only time we will have a user ID of zero is when we don't have - // and source file symbols and we declare one compile unit for the - // entire object file - if (!m_func_indexes.empty()) - { - - } - - if (!m_code_indexes.empty()) - { -// StreamFile s(stdout); -// symtab->Dump(&s, m_code_indexes); - - uint32_t idx = 0; // Index into the indexes - const uint32_t num_indexes = m_code_indexes.size(); - for (idx = 0; idx < num_indexes; ++idx) - { - uint32_t symbol_idx = m_code_indexes[idx]; - curr_symbol = symtab->SymbolAtIndex(symbol_idx); - if (curr_symbol) - { - // Union of all ranges in the function DIE (if the function is discontiguous) - AddressRange func_range(curr_symbol->GetAddress(), 0); - if (func_range.GetBaseAddress().IsSectionOffset()) - { - uint32_t symbol_size = curr_symbol->GetByteSize(); - if (symbol_size != 0 && !curr_symbol->GetSizeIsSibling()) - func_range.SetByteSize(symbol_size); - else if (idx + 1 < num_indexes) - { - next_symbol = symtab->SymbolAtIndex(m_code_indexes[idx + 1]); - if (next_symbol) - { - func_range.SetByteSize(next_symbol->GetAddress().GetOffset() - curr_symbol->GetAddress().GetOffset()); - } - } - - FunctionSP func_sp(new Function(sc.comp_unit, - symbol_idx, // UserID is the DIE offset - LLDB_INVALID_UID, // We don't have any type info for this function - curr_symbol->GetMangled(), // Linker/mangled name - NULL, // no return type for a code symbol... - func_range)); // first address range - - if (func_sp.get() != NULL) - { - sc.comp_unit->AddFunction(func_sp); - ++num_added; - } - } - } - } - - } - } - else - { - // We assume we - } - return num_added; -} - -bool -SymbolFileSymtab::ParseCompileUnitLineTable (const SymbolContext &sc) -{ - return false; -} - -bool -SymbolFileSymtab::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files) -{ - return false; -} - -size_t -SymbolFileSymtab::ParseFunctionBlocks (const SymbolContext &sc) -{ - return 0; -} - - -size_t -SymbolFileSymtab::ParseTypes (const SymbolContext &sc) -{ - return 0; -} - - -size_t -SymbolFileSymtab::ParseVariablesForContext (const SymbolContext& sc) -{ - return 0; -} - -Type* -SymbolFileSymtab::ResolveTypeUID(lldb::user_id_t type_uid) -{ - return NULL; -} - -lldb::clang_type_t -SymbolFileSymtab::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_Type) -{ - return NULL; -} - -ClangNamespaceDecl -SymbolFileSymtab::FindNamespace (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl) -{ - return ClangNamespaceDecl(); -} - -uint32_t -SymbolFileSymtab::ResolveSymbolContext (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) -{ - if (m_obj_file->GetSymtab() == NULL) - return 0; - - uint32_t resolved_flags = 0; - if (resolve_scope & eSymbolContextSymbol) - { - sc.symbol = m_obj_file->GetSymtab()->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); - if (sc.symbol) - resolved_flags |= eSymbolContextSymbol; - } - return resolved_flags; -} - -uint32_t -SymbolFileSymtab::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) -{ - return 0; -} - -uint32_t -SymbolFileSymtab::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) -{ - return 0; -} - -uint32_t -SymbolFileSymtab::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) -{ - return 0; -} - -uint32_t -SymbolFileSymtab::FindFunctions(const ConstString &name, const ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list) -{ - Timer scoped_timer (__PRETTY_FUNCTION__, - "SymbolFileSymtab::FindFunctions (name = '%s')", - name.GetCString()); - // If we ever support finding STABS or COFF debug info symbols, - // we will need to add support here. We are not trying to find symbols - // here, just "lldb_private::Function" objects that come from complete - // debug information. Any symbol queries should go through the symbol - // table itself in the module's object file. - return 0; -} - -uint32_t -SymbolFileSymtab::FindFunctions(const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list) -{ - Timer scoped_timer (__PRETTY_FUNCTION__, - "SymbolFileSymtab::FindFunctions (regex = '%s')", - regex.GetText()); - // If we ever support finding STABS or COFF debug info symbols, - // we will need to add support here. We are not trying to find symbols - // here, just "lldb_private::Function" objects that come from complete - // debug information. Any symbol queries should go through the symbol - // table itself in the module's object file. - return 0; -} - -static int CountMethodArgs(const char *method_signature) -{ - int num_args = 0; - - for (const char *colon_pos = strchr(method_signature, ':'); - colon_pos != NULL; - colon_pos = strchr(colon_pos + 1, ':')) - { - num_args++; - } - - return num_args; -} - -uint32_t -SymbolFileSymtab::FindTypes (const lldb_private::SymbolContext& sc, - const lldb_private::ConstString &name, - const ClangNamespaceDecl *namespace_decl, - bool append, - uint32_t max_matches, - lldb_private::TypeList& types) -{ - if (!append) - types.Clear(); - - if (!m_objc_class_name_to_index.IsEmpty()) - { - TypeMap::iterator iter = m_objc_class_types.find(name); - - if (iter != m_objc_class_types.end()) - { - types.Insert(iter->second); - return 1; - } - - const Symtab::NameToIndexMap::Entry *match = m_objc_class_name_to_index.FindFirstValueForName(name.GetCString()); - - if (match == NULL) - return 0; - - const bool isForwardDecl = false; - const bool isInternal = true; - - ClangASTContext &ast = GetClangASTContext(); - - lldb::clang_type_t objc_object_type = ast.CreateObjCClass (name.AsCString(), - ast.GetTranslationUnitDecl(), - isForwardDecl, - isInternal, - 0xffaaffaaffaaffaall); - - Declaration decl; - - lldb::TypeSP type(new Type (match->value, - this, - name, - 0, // byte_size - don't change this from 0, we currently use that to identify these "synthetic" ObjC class types. - NULL, // SymbolContextScope* - 0, // encoding_uid - Type::eEncodingInvalid, - decl, - objc_object_type, - Type::eResolveStateFull)); - - m_objc_class_types[name] = type; - - types.Insert(type); - - return 1; - } - - return 0; -} -// -//uint32_t -//SymbolFileSymtab::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, TypeList& types) -//{ -// return 0; -//} - - -//------------------------------------------------------------------ -// PluginInterface protocol -//------------------------------------------------------------------ -const char * -SymbolFileSymtab::GetPluginName() -{ - return "SymbolFileSymtab"; -} - -const char * -SymbolFileSymtab::GetShortPluginName() -{ - return GetPluginNameStatic(); -} - -uint32_t -SymbolFileSymtab::GetPluginVersion() -{ - return 1; -} |
