SymbolFile.h revision 75d8c2591f6c56a09338bf4967a41510165a907e
19318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien//===-- SymbolFile.h --------------------------------------------*- C++ -*-===// 29318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien// 39318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien// The LLVM Compiler Infrastructure 49318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien// 59318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien// This file is distributed under the University of Illinois Open Source 69318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien// License. See LICENSE.TXT for details. 79318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien// 89318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien//===----------------------------------------------------------------------===// 99318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 109318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien#ifndef liblldb_SymbolFile_h_ 119318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien#define liblldb_SymbolFile_h_ 129318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 139318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien#include "lldb/lldb-private.h" 149318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien#include "lldb/Core/PluginInterface.h" 159318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien#include "lldb/Symbol/ClangASTType.h" 169318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien#include "lldb/Symbol/ClangNamespaceDecl.h" 172123c1c0de9e6006dfffe9123b4b992703202e3eStephen Hines#include "lldb/Symbol/Type.h" 189151f6474c0c3c696e75a12a605c48f54da4665fStephen Hines 192123c1c0de9e6006dfffe9123b4b992703202e3eStephen Hinesnamespace lldb_private { 209318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 219318a38869458cef6806cf85a7d7d8157101fb9fLogan Chienclass SymbolFile : 229318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien public PluginInterface 239318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien{ 249318a38869458cef6806cf85a7d7d8157101fb9fLogan Chienpublic: 259318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien enum Abilities 269318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien { 279318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien Labels = (1 << 0), 289318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien AddressAcceleratorTable = (1 << 1), 299318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien FunctionAcceleratorTable = (1 << 2), 309318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien TypeAcceleratorTable = (1 << 3), 319318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien MacroInformation = (1 << 4), 329318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien CallFrameInformation = (1 << 5), 339318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien CompileUnits = (1 << 6), 349318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien LineTables = (1 << 7), 359318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien LineColumns = (1 << 8), 369318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien Functions = (1 << 9), 379318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien Blocks = (1 << 10), 389318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien GlobalVariables = (1 << 11), 399318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien LocalVariables = (1 << 12), 409318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien VariableTypes = (1 << 13) 419318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien }; 429318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 439318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien static SymbolFile * 442123c1c0de9e6006dfffe9123b4b992703202e3eStephen Hines FindPlugin (ObjectFile* obj_file); 459151f6474c0c3c696e75a12a605c48f54da4665fStephen Hines 462123c1c0de9e6006dfffe9123b4b992703202e3eStephen Hines //------------------------------------------------------------------ 479318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien // Constructors and Destructors 489318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien //------------------------------------------------------------------ 499318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien SymbolFile(ObjectFile* obj_file) : 509318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien m_obj_file(obj_file) 519318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien { 529318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien } 539318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 549318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual 559318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien ~SymbolFile() 569318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien { 579318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien } 589318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 599318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien //------------------------------------------------------------------ 609318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// Get a mask of what this symbol file supports for the object file 619318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// that it was constructed with. 629318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// 639318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// Each symbol file gets to respond with a mask of abilities that 649318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// it supports for each object file. This happens when we are 659318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// trying to figure out which symbol file plug-in will get used 669318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// for a given object file. The plug-in that resoonds with the 679318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// best mix of "SymbolFile::Abilities" bits set, will get chosen to 689318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// be the symbol file parser. This allows each plug-in to check for 699318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// sections that contain data a symbol file plug-in would need. For 709318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// example the DWARF plug-in requires DWARF sections in a file that 712123c1c0de9e6006dfffe9123b4b992703202e3eStephen Hines /// contain debug information. If the DWARF plug-in doesn't find 729151f6474c0c3c696e75a12a605c48f54da4665fStephen Hines /// these sections, it won't respond with many ability bits set, and 732123c1c0de9e6006dfffe9123b4b992703202e3eStephen Hines /// we will probably fall back to the symbol table SymbolFile plug-in 749318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// which uses any information in the symbol table. Also, plug-ins 759318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// might check for some specific symbols in a symbol table in the 769318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// case where the symbol table contains debug information (STABS 779318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// and COFF). Not a lot of work should happen in these functions 789318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// as the plug-in might not get selected due to another plug-in 799318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// having more abilities. Any initialization work should be saved 809318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// for "void SymbolFile::InitializeObject()" which will get called 819318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// on the SymbolFile object with the best set of abilities. 829318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// 839318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// @return 849318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// A uint32_t mask containing bits from the SymbolFile::Abilities 859318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// enumeration. Any bits that are set represent an ability that 869318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// this symbol plug-in can parse from the object file. 879318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien ///------------------------------------------------------------------ 889318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual uint32_t GetAbilities () = 0; 899318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 909318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien //------------------------------------------------------------------ 919318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien /// Initialize the SymbolFile object. 928aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray /// 938aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray /// The SymbolFile object with the best set of abilities (detected 948aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray /// in "uint32_t SymbolFile::GetAbilities()) will have this function 958aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray /// called if it is chosen to parse an object file. More complete 968aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray /// initialization can happen in this function which will get called 978aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray /// prior to any other functions in the SymbolFile protocol. 988aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray //------------------------------------------------------------------ 998aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual void InitializeObject() {} 1008aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray 1018aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray //------------------------------------------------------------------ 1028aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray // Compile Unit function calls 1038aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray //------------------------------------------------------------------ 1048aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray // Approach 1 - iterator 1058aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual uint32_t GetNumCompileUnits() = 0; 1068aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) = 0; 1078aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray 1088aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual size_t ParseCompileUnitFunctions (const SymbolContext& sc) = 0; 1098aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual bool ParseCompileUnitLineTable (const SymbolContext& sc) = 0; 1108aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual bool ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files) = 0; 1118aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual size_t ParseFunctionBlocks (const SymbolContext& sc) = 0; 1128aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual size_t ParseTypes (const SymbolContext& sc) = 0; 1138aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual size_t ParseVariablesForContext (const SymbolContext& sc) = 0; 1148aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual Type* ResolveTypeUID (lldb::user_id_t type_uid) = 0; 1158aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual lldb::clang_type_t ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type) = 0; 1168aa5ce8cbaa58d14493eb694f06c8a0fde23c509Tim Murray virtual clang::DeclContext* GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid) { return NULL; } 1179318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid) { return NULL; } 1189318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual uint32_t ResolveSymbolContext (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) = 0; 1199318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual uint32_t ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) = 0; 1209318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual uint32_t FindGlobalVariables (const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) = 0; 1219318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual uint32_t FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) = 0; 1229318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual uint32_t FindFunctions (const ConstString &name, const ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool append, SymbolContextList& sc_list) = 0; 1239318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual uint32_t FindFunctions (const RegularExpression& regex, bool append, SymbolContextList& sc_list) = 0; 1249318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual uint32_t FindTypes (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) = 0; 1259318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien// virtual uint32_t FindTypes (const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, TypeList& types) = 0; 1269318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual TypeList * GetTypeList (); 1279318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual ClangASTContext & 1289318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien GetClangASTContext (); 1299318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien virtual ClangNamespaceDecl 1309318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien FindNamespace (const SymbolContext& sc, 1319318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien const ConstString &name, 1329318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien const ClangNamespaceDecl *parent_namespace_decl) = 0; 1339318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 1349318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien ObjectFile* GetObjectFile() { return m_obj_file; } 1359318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien const ObjectFile* GetObjectFile() const { return m_obj_file; } 1369318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 1379318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien // Special error functions that can do printf style formatting that will prepend the message with 1389318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien // something appropriate for this symbol file (like the architecture, path and object name). This 1399318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien // centralizes code so that everyone doesn't need to format their error and log messages on their 1409318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien // own and keeps the output a bit more consistent. 1419318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien void LogMessage (Log *log, const char *format, ...) __attribute__ ((format (printf, 3, 4))); 1429318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien void ReportWarning (const char *format, ...) __attribute__ ((format (printf, 2, 3))); 1439318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien void ReportError (const char *format, ...) __attribute__ ((format (printf, 2, 3))); 1448a95734f9813e11664344a198af8c9203451e684Stephen Hinesprotected: 1459318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien ObjectFile* m_obj_file; // The object file that symbols can be extracted from. 1469318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 1479318a38869458cef6806cf85a7d7d8157101fb9fLogan Chienprivate: 1489318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien DISALLOW_COPY_AND_ASSIGN (SymbolFile); 1499318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien}; 1509318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 1519318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 1529318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien} // namespace lldb_private 1539318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien 1549318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien#endif // liblldb_SymbolFile_h_ 1559318a38869458cef6806cf85a7d7d8157101fb9fLogan Chien