SymbolFileDWARF.h revision 0be1edd34ff46e017b1b973c5a57e3de9f613baf
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolFileDWARF.h --------------------------------------*- 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
10144188bc458a35997d2f2e52206ab69747439073Greg Clayton#ifndef SymbolFileDWARF_SymbolFileDWARF_h_
11144188bc458a35997d2f2e52206ab69747439073Greg Clayton#define SymbolFileDWARF_SymbolFileDWARF_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <list>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <memory>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
213fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton#include "clang/AST/CharUnits.h"
22e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton#include "clang/AST/ExternalASTSource.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "llvm/ADT/DenseMap.h"
2403fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton#include "llvm/ADT/SmallPtrSet.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton#include "lldb/lldb-private.h"
27e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton#include "lldb/Core/ClangForward.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h"
29ccfba727178bb919cdff3365839bed9584df2560Jason Molenda#include "lldb/Core/dwarf.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Flags.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UniqueCStringMap.h"
33f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton#include "lldb/Symbol/ClangASTContext.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDefines.h"
39d74270e83908066c946d150faec9516349e1118bGreg Clayton#include "HashedNameToDIE.h"
4074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton#include "NameToDIE.h"
41a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton#include "UniqueDWARFASTType.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Forward Declarations for this DWARF plugin
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFAbbreviationDeclaration;
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFAbbreviationDeclarationSet;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFCompileUnit;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugAbbrev;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugAranges;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugInfo;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugInfoEntry;
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugLine;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugPubnames;
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugRanges;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDIECollection;
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFFormValue;
59ad60bf486dee699dd524225b63271ddc5b6329b9Greg Claytonclass SymbolFileDWARFDebugMap;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclass SymbolFileDWARF : public lldb_private::SymbolFile, public lldb_private::UserID
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
64f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    friend class SymbolFileDWARFDebugMap;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Static Functions
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Initialize();
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Terminate();
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginNameStatic();
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginDescriptionStatic();
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static lldb_private::SymbolFile*
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CreateInstance (lldb_private::ObjectFile* obj_file);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            SymbolFileDWARF(lldb_private::ObjectFile* ofile);
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual                 ~SymbolFileDWARF();
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89d0b7cfa22722fdaf4111a61d6eeb02a587710e16Sean Callanan    virtual uint32_t        CalculateAbilities ();
90b01000fd063629facd45044f137446fb748ee179Greg Clayton    virtual void            InitializeObject();
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Compile Unit function calls
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t        GetNumCompileUnits();
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index);
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t          ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc);
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, lldb_private::FileSpecList& support_files);
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t          ParseFunctionBlocks (const lldb_private::SymbolContext& sc);
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t          ParseTypes (const lldb_private::SymbolContext& sc);
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t          ParseVariablesForContext (const lldb_private::SymbolContext& sc);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    virtual lldb_private::Type* ResolveTypeUID(lldb::user_id_t type_uid);
106462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    virtual lldb::clang_type_t ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_opaque_type);
107462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
1080be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton    virtual lldb_private::Type* ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed = true);
109c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    virtual clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid);
110c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    virtual clang::DeclContext* GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t        ResolveSymbolContext (const lldb_private::Address& so_addr, uint32_t resolve_scope, lldb_private::SymbolContext& sc);
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t        ResolveSymbolContext (const lldb_private::FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, lldb_private::SymbolContextList& sc_list);
1140fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    virtual uint32_t        FindGlobalVariables(const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t        FindGlobalVariables(const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
116302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan    virtual uint32_t        FindFunctions(const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list);
117302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan    virtual uint32_t        FindFunctions(const lldb_private::RegularExpression& regex, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list);
1180fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    virtual uint32_t        FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::TypeList& types);
119b01000fd063629facd45044f137446fb748ee179Greg Clayton    virtual lldb_private::TypeList *
120b01000fd063629facd45044f137446fb748ee179Greg Clayton                            GetTypeList ();
121b01000fd063629facd45044f137446fb748ee179Greg Clayton    virtual lldb_private::ClangASTContext &
122b01000fd063629facd45044f137446fb748ee179Greg Clayton                            GetClangASTContext ();
123b01000fd063629facd45044f137446fb748ee179Greg Clayton
1246916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    virtual lldb_private::ClangNamespaceDecl
125d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton            FindNamespace (const lldb_private::SymbolContext& sc,
1260fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                           const lldb_private::ConstString &name,
1270fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                           const lldb_private::ClangNamespaceDecl *parent_namespace_decl);
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129b01000fd063629facd45044f137446fb748ee179Greg Clayton
130b01000fd063629facd45044f137446fb748ee179Greg Clayton    //------------------------------------------------------------------
131b01000fd063629facd45044f137446fb748ee179Greg Clayton    // ClangASTContext callbacks for external source lookups.
132b01000fd063629facd45044f137446fb748ee179Greg Clayton    //------------------------------------------------------------------
133b01000fd063629facd45044f137446fb748ee179Greg Clayton    static void
134b01000fd063629facd45044f137446fb748ee179Greg Clayton    CompleteTagDecl (void *baton, clang::TagDecl *);
135b01000fd063629facd45044f137446fb748ee179Greg Clayton
136b01000fd063629facd45044f137446fb748ee179Greg Clayton    static void
137b01000fd063629facd45044f137446fb748ee179Greg Clayton    CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *);
138e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
139e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    static void
140e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    FindExternalVisibleDeclsByName (void *baton,
141e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                    const clang::DeclContext *DC,
142e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                    clang::DeclarationName Name,
143e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                    llvm::SmallVectorImpl <clang::NamedDecl *> *results);
144b01000fd063629facd45044f137446fb748ee179Greg Clayton
1453fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    static bool
1463fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    LayoutRecordType (void *baton,
1473fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      const clang::RecordDecl *record_decl,
1483fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      uint64_t &size,
1493fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      uint64_t &alignment,
1503fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
1513fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
1523fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets);
1533fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton
1543fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    bool
1553fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    LayoutRecordType (const clang::RecordDecl *record_decl,
1563fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      uint64_t &size,
1573fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      uint64_t &alignment,
1583fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
1593fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
1603fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                      llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets);
1613fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton
1623fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    struct LayoutInfo
1633fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    {
1643fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton        LayoutInfo () :
1653fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton            bit_size(0),
1663fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton            alignment(0),
1673fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton            field_offsets()//,
1683fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton            //base_offsets(), // We don't need to fill in the base classes, this can be done automatically
1693fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton            //vbase_offsets() // We don't need to fill in the virtual base classes, this can be done automatically
1703fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton        {
1713fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton        }
1723fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton        uint64_t bit_size;
1733fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton        uint64_t alignment;
1743fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton        llvm::DenseMap <const clang::FieldDecl *, uint64_t> field_offsets;
1753fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton//        llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> base_offsets;
1763fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton//        llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> vbase_offsets;
1773fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    };
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // PluginInterface protocol
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginName();
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetShortPluginName();
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginVersion();
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Approach 2 - count + accessor
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Index compile units would scan the initial compile units and register
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // them with the module. This would only be done on demand if and only if
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the compile units were needed.
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //virtual size_t        GetCompUnitCount() = 0;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //virtual CompUnitSP    GetCompUnitAtIndex(size_t cu_idx) = 0;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
197144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const lldb_private::DataExtractor&      get_debug_abbrev_data ();
198144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const lldb_private::DataExtractor&      get_debug_aranges_data ();
199144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const lldb_private::DataExtractor&      get_debug_frame_data ();
200144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const lldb_private::DataExtractor&      get_debug_info_data ();
201144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const lldb_private::DataExtractor&      get_debug_line_data ();
202144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const lldb_private::DataExtractor&      get_debug_loc_data ();
203144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const lldb_private::DataExtractor&      get_debug_ranges_data ();
204144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const lldb_private::DataExtractor&      get_debug_str_data ();
205f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton    const lldb_private::DataExtractor&      get_apple_names_data ();
206f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton    const lldb_private::DataExtractor&      get_apple_types_data ();
20700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    const lldb_private::DataExtractor&      get_apple_namespaces_data ();
20824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton    const lldb_private::DataExtractor&      get_apple_objc_data ();
20900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugAbbrev*       DebugAbbrev();
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFDebugAbbrev* DebugAbbrev() const;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfo*         DebugInfo();
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFDebugInfo*   DebugInfo() const;
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugRanges*       DebugRanges();
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFDebugRanges* DebugRanges() const;
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb_private::DataExtractor&
221b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    GetCachedSectionData (uint32_t got_flag,
222b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton                          lldb::SectionType sect_type,
223b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton                          lldb_private::DataExtractor &data);
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22532a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton    static bool
22632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton    SupportedVersion(uint16_t version);
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::DeclContext *
229b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton    GetCachedClangDeclContextForDIE (const DWARFDebugInfoEntry *die)
230b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton    {
231b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton        DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find(die);
232b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton        if (pos != m_die_to_decl_ctx.end())
233b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton            return pos->second;
234b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton        else
235b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton            return NULL;
236b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton    }
237b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton
238b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton    clang::DeclContext *
239c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    GetClangDeclContextForDIE (const lldb_private::SymbolContext &sc, DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die);
240c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
241c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    clang::DeclContext *
242c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    GetClangDeclContextForDIEOffset (const lldb_private::SymbolContext &sc, dw_offset_t die_offset);
243c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
244c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    clang::DeclContext *
24503fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton    GetClangDeclContextContainingDIE (DWARFCompileUnit *cu,
24603fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton                                      const DWARFDebugInfoEntry *die,
24703fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton                                      const DWARFDebugInfoEntry **decl_ctx_die);
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::DeclContext *
250c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    GetClangDeclContextContainingDIEOffset (dw_offset_t die_offset);
2516c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
2526c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton    const DWARFDebugInfoEntry *
2536c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton    GetDeclContextDIEContainingDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die);
2546c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
255e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    void
2569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    SearchDeclContext (const clang::DeclContext *decl_context,
2579b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                       const char *name,
2589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                       llvm::SmallVectorImpl <clang::NamedDecl *> *results);
2599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Flags&
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFlags ()
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_flags;
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb_private::Flags&
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFlags () const
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_flags;
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272b01000fd063629facd45044f137446fb748ee179Greg Clayton    bool
273b01000fd063629facd45044f137446fb748ee179Greg Clayton    HasForwardDeclForClangType (lldb::clang_type_t clang_type);
274b01000fd063629facd45044f137446fb748ee179Greg Clayton
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugAbbrevData     = (1 << 0),
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugArangesData    = (1 << 1),
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugFrameData      = (1 << 2),
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugInfoData       = (1 << 3),
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugLineData       = (1 << 4),
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugLocData        = (1 << 5),
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugMacInfoData    = (1 << 6),
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugPubNamesData   = (1 << 7),
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugPubTypesData   = (1 << 8),
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsGotDebugRangesData     = (1 << 9),
289c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton        flagsGotDebugStrData        = (1 << 10),
29024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton        flagsGotAppleNamesData      = (1 << 11),
29124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton        flagsGotAppleTypesData      = (1 << 12),
29224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton        flagsGotAppleNamespacesData = (1 << 13),
29324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton        flagsGotAppleObjCData       = (1 << 14)
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
29582770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton
296db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton    bool                    NamespaceDeclMatchesThisSymbolFile (const lldb_private::ClangNamespaceDecl *namespace_decl);
297db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton
29882770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton    bool                    DIEIsInNamespace (const lldb_private::ClangNamespaceDecl *namespace_decl,
2990be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton                                              DWARFCompileUnit* dwarf_cu,
30082770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton                                              const DWARFDebugInfoEntry* die);
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
3030be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton    lldb::CompUnitSP        ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx);
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFCompileUnit*       GetDWARFCompileUnitForUID(lldb::user_id_t cu_uid);
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFCompileUnit*       GetNextUnparsedDWARFCompileUnit(DWARFCompileUnit* prev_cu);
3060be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton    lldb_private::CompileUnit*      GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx = UINT32_MAX);
3070be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton    bool                    GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, lldb_private::SymbolContext& sc);
3081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    lldb_private::Function *        ParseCompileUnitFunction (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t                  ParseFunctionBlocks (const lldb_private::SymbolContext& sc,
31075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton                                                 lldb_private::Block *parent_block,
3111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                 DWARFCompileUnit* dwarf_cu,
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 const DWARFDebugInfoEntry *die,
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 lldb::addr_t subprogram_low_pc,
3142e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton                                                 uint32_t depth);
3151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    size_t                  ParseTypes (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool parse_siblings, bool parse_children);
316462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::TypeSP            ParseType (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool *type_is_new);
3170be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton    lldb_private::Type*     ResolveTypeUID (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* die, bool assert_not_being_parsed);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::VariableSP        ParseVariableDIE(
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb_private::SymbolContext& sc,
3211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                DWARFCompileUnit* dwarf_cu,
322178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                                const DWARFDebugInfoEntry *die,
323178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                                const lldb::addr_t func_low_pc);
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t                  ParseVariables(
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb_private::SymbolContext& sc,
3271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                DWARFCompileUnit* dwarf_cu,
328178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                                const lldb::addr_t func_low_pc,
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const DWARFDebugInfoEntry *die,
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bool parse_siblings,
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bool parse_children,
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                lldb_private::VariableList* cc_variable_list = NULL);
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t                  ParseChildMembers(
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb_private::SymbolContext& sc,
3361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                DWARFCompileUnit* dwarf_cu,
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const DWARFDebugInfoEntry *die,
338462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                lldb::clang_type_t class_clang_type,
3399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                const lldb::LanguageType class_language,
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                std::vector<clang::CXXBaseSpecifier *>& base_classes,
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                std::vector<int>& member_accessibilities,
342b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton                                DWARFDIECollection& member_function_dies,
34370a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan                                lldb::AccessType &default_accessibility,
3443fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                bool &is_a_class,
3453fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                LayoutInfo &layout_info);
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t                  ParseChildParameters(
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb_private::SymbolContext& sc,
349c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton                                clang::DeclContext *containing_decl_ctx,
3501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                DWARFCompileUnit* dwarf_cu,
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const DWARFDebugInfoEntry *parent_die,
352412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton                                bool skip_artificial,
35399309909259eacf4693458bfe44f913c316a09c6Sean Callanan                                bool &is_static,
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                lldb_private::TypeList* type_list,
355462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                std::vector<lldb::clang_type_t>& function_args,
3562403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                                std::vector<clang::ParmVarDecl*>& function_param_decls,
357b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                unsigned &type_quals,
358b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t                  ParseChildEnumerators(
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb_private::SymbolContext& sc,
362462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                lldb::clang_type_t enumerator_qual_type,
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                uint32_t enumerator_byte_size,
3641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                DWARFCompileUnit* dwarf_cu,
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const DWARFDebugInfoEntry *enum_die);
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void                    ParseChildArrayInfo(
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb_private::SymbolContext& sc,
3691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                DWARFCompileUnit* dwarf_cu,
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const DWARFDebugInfoEntry *parent_die,
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                int64_t& first_index,
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                std::vector<uint64_t>& element_orders,
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                uint32_t& byte_stride,
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                uint32_t& bit_stride);
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3768b7b2276132c7353cabd22000287b42badc26613Jim Ingham                            // Given a die_offset, figure out the symbol context representing that die.
3777a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton    bool                    ResolveFunction (dw_offset_t offset,
3787a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton                                             DWARFCompileUnit *&dwarf_cu,
3797a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton                                             lldb_private::SymbolContextList& sc_list);
3807a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton
3817a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton    bool                    ResolveFunction (DWARFCompileUnit *cu,
3827a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton                                             const DWARFDebugInfoEntry *die,
3837a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton                                             lldb_private::SymbolContextList& sc_list);
3847a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton
3858b7b2276132c7353cabd22000287b42badc26613Jim Ingham    bool                    FunctionDieMatchesPartialName (
3868b7b2276132c7353cabd22000287b42badc26613Jim Ingham                                const DWARFDebugInfoEntry* die,
3878b7b2276132c7353cabd22000287b42badc26613Jim Ingham                                const DWARFCompileUnit *dwarf_cu,
3888b7b2276132c7353cabd22000287b42badc26613Jim Ingham                                uint32_t name_type_mask,
3898b7b2276132c7353cabd22000287b42badc26613Jim Ingham                                const char *partial_name,
3908b7b2276132c7353cabd22000287b42badc26613Jim Ingham                                const char *base_name_start,
3918b7b2276132c7353cabd22000287b42badc26613Jim Ingham                                const char *base_name_end);
392d74270e83908066c946d150faec9516349e1118bGreg Clayton
39312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    void                    FindFunctions(
39412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                const lldb_private::ConstString &name,
39574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton                                const NameToDIE &name_to_die,
39674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton                                lldb_private::SymbolContextList& sc_list);
39774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton
39874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    void                    FindFunctions (
39974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton                                const lldb_private::RegularExpression &regex,
40074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton                                const NameToDIE &name_to_die,
40112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                lldb_private::SymbolContextList& sc_list);
40212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
40300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    void                    FindFunctions (
40400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton                                const lldb_private::RegularExpression &regex,
40500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton                                const DWARFMappedHash::MemoryTable &memory_table,
40600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton                                lldb_private::SymbolContextList& sc_list);
40700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton
40895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    lldb::TypeSP            FindDefinitionTypeForDIE (
4090be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton                                DWARFCompileUnit* dwarf_cu,
41095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton                                const DWARFDebugInfoEntry *die,
41195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton                                const lldb_private::ConstString &type_name);
41277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton
41377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    lldb::TypeSP            FindCompleteObjCDefinitionTypeForDIE (
41477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton                                const DWARFDebugInfoEntry *die,
415e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                const lldb_private::ConstString &type_name,
416e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                bool must_be_implementation);
417e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
418e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    bool                    Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu);
419e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
420e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    lldb::TypeSP            FindCompleteObjCDefinitionType (const lldb_private::ConstString &type_name,
421e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                                            bool header_definition_ok);
42277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton
42377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    lldb_private::Symbol *  GetObjCClassSymbol (const lldb_private::ConstString &objc_class_name);
42477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton
42500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    void                    ParseFunctions (const DIEArray &die_offsets,
42600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton                                            lldb_private::SymbolContextList& sc_list);
4274fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton    lldb::TypeSP            GetTypeForDIE (DWARFCompileUnit *cu,
428462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                           const DWARFDebugInfoEntry* die);
4294fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton
430960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    uint32_t                FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_matches, lldb_private::TypeList& types);
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void                    Index();
4339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
4349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    void                    DumpIndexes();
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
436ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    void                    SetDebugMapSymfile (SymbolFileDWARFDebugMap *debug_map_symfile)
437ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                            {
438ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                                m_debug_map_symfile = debug_map_symfile;
439ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                            }
440ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
4411bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    const DWARFDebugInfoEntry *
4421bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                            FindBlockContainingSpecification (dw_offset_t func_die_offset,
4431bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                                                              dw_offset_t spec_block_die_offset,
4441bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                                                              DWARFCompileUnit **dwarf_cu_handle);
4451bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton
4461bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    const DWARFDebugInfoEntry *
4471bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                            FindBlockContainingSpecification (DWARFCompileUnit* dwarf_cu,
4481bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                                                              const DWARFDebugInfoEntry *die,
4491bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                                                              dw_offset_t spec_block_die_offset,
4501bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                                                              DWARFCompileUnit **dwarf_cu_handle);
4511bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton
452d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    clang::NamespaceDecl *
453d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    ResolveNamespaceDIE (DWARFCompileUnit *curr_cu, const DWARFDebugInfoEntry *die);
454d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
455c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton    UniqueDWARFASTTypeMap &
456c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton    GetUniqueDWARFASTTypeMap ();
457c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton
458e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    void                    LinkDeclContextToDIE (clang::DeclContext *decl_ctx,
459e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                                  const DWARFDebugInfoEntry *die)
460e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                            {
461e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                m_die_to_decl_ctx[die] = decl_ctx;
46203fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton                                // There can be many DIEs for a single decl context
46303fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton                                m_decl_ctx_to_die[decl_ctx].insert(die);
464e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                            }
465e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
466444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    bool
467444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    UserIDMatches (lldb::user_id_t uid) const
468444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    {
469444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        const lldb::user_id_t high_uid = uid & 0xffffffff00000000ull;
470444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        if (high_uid)
471444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton            return high_uid == GetID();
472444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        return true;
473444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    }
474b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton
475444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    lldb::user_id_t
476444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    MakeUserID (dw_offset_t die_offset) const
477444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    {
478444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        return GetID() | die_offset;
479444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    }
480444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
481f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    static bool
482f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    DeclKindIsCXXClass (clang::Decl::Kind decl_kind)
483f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    {
484f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        switch (decl_kind)
485f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        {
486f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            case clang::Decl::CXXRecord:
487f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            case clang::Decl::ClassTemplateSpecialization:
488f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                return true;
489f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            default:
490f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                break;
491f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        }
492f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        return false;
493f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    }
494f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
495f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    bool
496f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    ParseTemplateParameterInfos (DWARFCompileUnit* dwarf_cu,
497f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                 const DWARFDebugInfoEntry *parent_die,
498f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                 lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
499f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
500b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    bool
501b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    ParseTemplateDIE (DWARFCompileUnit* dwarf_cu,
502b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                      const DWARFDebugInfoEntry *die,
503b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                      lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
504b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
505f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    clang::ClassTemplateDecl *
506f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
5075e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton                            lldb::AccessType access_type,
508f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                            const char *parent_name,
509f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                            int tag_decl_kind,
510f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                            const lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
511f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
512b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton    bool
513b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton    DIEDeclContextsMatch (DWARFCompileUnit* cu1, const DWARFDebugInfoEntry *die1,
514b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton                          DWARFCompileUnit* cu2, const DWARFDebugInfoEntry *die2);
515f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
516e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolFileDWARFDebugMap *       m_debug_map_symfile;
517e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    clang::TranslationUnitDecl *    m_clang_tu_decl;
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Flags             m_flags;
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor     m_dwarf_data;
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor     m_data_debug_abbrev;
521144188bc458a35997d2f2e52206ab69747439073Greg Clayton    lldb_private::DataExtractor     m_data_debug_aranges;
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor     m_data_debug_frame;
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor     m_data_debug_info;
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor     m_data_debug_line;
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor     m_data_debug_loc;
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor     m_data_debug_ranges;
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor     m_data_debug_str;
528f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton    lldb_private::DataExtractor     m_data_apple_names;
529f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton    lldb_private::DataExtractor     m_data_apple_types;
53000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    lldb_private::DataExtractor     m_data_apple_namespaces;
53124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton    lldb_private::DataExtractor     m_data_apple_objc;
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The auto_ptr items below are generated on demand if and when someone accesses
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // them through a non const version of this class.
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<DWARFDebugAbbrev>     m_abbr;
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<DWARFDebugInfo>       m_info;
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<DWARFDebugLine>       m_line;
53800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    std::auto_ptr<DWARFMappedHash::MemoryTable> m_apple_names_ap;
53900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    std::auto_ptr<DWARFMappedHash::MemoryTable> m_apple_types_ap;
54000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    std::auto_ptr<DWARFMappedHash::MemoryTable> m_apple_namespaces_ap;
54124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton    std::auto_ptr<DWARFMappedHash::MemoryTable> m_apple_objc_ap;
54274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    NameToDIE                           m_function_basename_index;  // All concrete functions
54374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    NameToDIE                           m_function_fullname_index;  // All concrete functions
54474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    NameToDIE                           m_function_method_index;    // All inlined functions
54574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    NameToDIE                           m_function_selector_index;  // All method names for functions of classes
546ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    NameToDIE                           m_objc_class_selectors_index; // Given a class name, find all selectors for the class
54700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    NameToDIE                           m_global_index;             // Global and static variables
54800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    NameToDIE                           m_type_index;               // All type DIE offsets
54900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton    NameToDIE                           m_namespace_index;          // All type DIE offsets
550e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    bool                                m_indexed:1,
551e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                        m_is_external_ast_source:1,
552e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                        m_using_apple_tables:1;
553e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    lldb_private::LazyBool              m_supports_DW_AT_APPLE_objc_complete_type;
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<DWARFDebugRanges>     m_ranges;
556a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton    UniqueDWARFASTTypeMap m_unique_ast_type_map;
55703fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton    typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet;
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap;
55903fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton    typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet> DeclContextToDIEMap;
5604fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr;
5614fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP;
562462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::clang_type_t> DIEToClangType;
563462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    typedef llvm::DenseMap<lldb::clang_type_t, const DWARFDebugInfoEntry *> ClangTypeToDIE;
5643fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    typedef llvm::DenseMap<const clang::RecordDecl *, LayoutInfo> RecordDeclToLayoutMap;
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DIEToDeclContextMap m_die_to_decl_ctx;
566e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    DeclContextToDIEMap m_decl_ctx_to_die;
5674fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton    DIEToTypePtr m_die_to_type;
5684fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton    DIEToVariableSP m_die_to_variable_sp;
569462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    DIEToClangType m_forward_decl_die_to_clang_type;
570462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ClangTypeToDIE m_forward_decl_clang_type_to_die;
5713fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    RecordDeclToLayoutMap m_record_decl_to_layout_map;
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
574144188bc458a35997d2f2e52206ab69747439073Greg Clayton#endif  // SymbolFileDWARF_SymbolFileDWARF_h_
575