124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolContext.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
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_SymbolContext_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_SymbolContext_h_
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
18a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham#include "lldb/Core/Mangled.h"
196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangASTType.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineEntry.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SymbolContextScope;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class SymbolContext SymbolContext.h "lldb/Symbol/SymbolContext.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief Defines a symbol context baton that can be handed other debug
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// core functions.
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Many debugger functions require a context when doing lookups. This
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// class provides a common structure that can be used as the result
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// of a query that can contain a single result. Examples of such
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// queries include
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     @li Looking up a load address.
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SymbolContext
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Default constructor.
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Initialize all pointer members to NULL and all struct members
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// to their default state.
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext ();
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with an object that knows how to reconstruct its
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// symbol context.
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] sc_scope
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A symbol context scope object that knows how to reconstruct
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     it's context.
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    explicit
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext (SymbolContextScope *sc_scope);
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with module, and optional compile unit, function,
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// block, line table, line entry and symbol.
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Initialize all pointer to the specified values.
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] module
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A Module pointer to the module for this context.
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] comp_unit
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A CompileUnit pointer to the compile unit for this context.
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] function
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A Function pointer to the function for this context.
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] block
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A Block pointer to the deepest block for this context.
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] line_entry
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A LineEntry pointer to the line entry for this context.
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] symbol
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A Symbol pointer to the symbol for this context.
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    explicit
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext (const lldb::TargetSP &target_sp,
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   const lldb::ModuleSP &module_sp,
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   CompileUnit *comp_unit = NULL,
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   Function *function = NULL,
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   Block *block = NULL,
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   LineEntry *line_entry = NULL,
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   Symbol *symbol = NULL);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This version sets the target to a NULL TargetSP if you don't know it.
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    explicit
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext (const lldb::ModuleSP &module_sp,
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   CompileUnit *comp_unit = NULL,
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   Function *function = NULL,
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   Block *block = NULL,
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   LineEntry *line_entry = NULL,
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   Symbol *symbol = NULL);
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1016e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    ~SymbolContext ();
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Copy constructor
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Makes a copy of the another SymbolContext object \a rhs.
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] rhs
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const SymbolContext object reference to copy.
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext (const SymbolContext& rhs);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Assignment operator.
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Copies the address value from another SymbolContext object \a
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// rhs into \a this object.
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] rhs
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const SymbolContext object reference to copy.
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const SymbolContext object reference to \a this.
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolContext&
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator= (const SymbolContext& rhs);
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Clear the object's state.
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Resets all pointer members to NULL, and clears any class objects
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// to their default state.
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
134a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton    Clear (bool clear_target);
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of this object to a Stream.
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of this object to the
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// supplied stream \a s.
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
146eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    Dump (Stream *s, Target *target) const;
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump the stop context in this object to a Stream.
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump the best description of this object to the stream. The
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// information displayed depends on the amount and quality of the
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// information in this context. If a module, function, file and
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// line number are available, they will be dumped. If only a
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// module and function or symbol name with offset is available,
15692025da7418093d2de2d7ba61717eaa802371f1dSylvestre Ledru    /// that will be output. Else just the address at which the target
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// was stopped will be displayed.
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] so_addr
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The resolved section offset address.
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
165fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    bool
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpStopContext (Stream *s,
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ExecutionContextScope *exe_scope,
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     const Address &so_addr,
16972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton                     bool show_fullpaths,
17033ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton                     bool show_module,
17133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton                     bool show_inlined_frames) const;
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the address range contained within a symbol context.
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Address range priority is as follows:
177ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     - line_entry address range if line_entry is valid and eSymbolContextLineEntry is set in \a scope
178ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     - block address range if block is not NULL and eSymbolContextBlock is set in \a scope
179ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     - function address range if function is not NULL and eSymbolContextFunction is set in \a scope
180ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     - symbol address range if symbol is not NULL and eSymbolContextSymbol is set in \a scope
181ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///
182ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    /// @param[in] scope
183ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     A mask of symbol context bits telling this function which
184ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     address ranges it can use when trying to extract one from
185ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     the valid (non-NULL) symbol context classes.
186ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///
187ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    /// @param[in] range_idx
188ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     The address range index to grab. Since many functions and
189ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     blocks are not always contiguous, they may have more than
190ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     one address range.
191ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///
192ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    /// @param[in] use_inline_block_range
193ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     If \a scope has the eSymbolContextBlock bit set, and there
194ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     is a valid block in the symbol context, return the block
195ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     address range for the containing inline function block, not
196ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     the deepest most block. This allows us to extract information
197ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     for the address range of the inlined function block, not
198ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///     the deepest lexical block.
199ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    ///
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] range
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     An address range object that will be filled in if \b true
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     is returned.
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b True if this symbol context contains items that describe
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     an address range, \b false otherwise.
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
209ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    GetAddressRange (uint32_t scope,
210ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton                     uint32_t range_idx,
211ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton                     bool use_inline_block_range,
212ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton                     AddressRange &range) const;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
21512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    void
21612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    GetDescription(Stream *s,
21712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                   lldb::DescriptionLevel level,
218eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton                   Target *target) const;
21912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
22033ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    uint32_t
22133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    GetResolvedMask () const;
22233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
223b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
224b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    //------------------------------------------------------------------
225b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// Find a block that defines the function represented by this
226b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// symbol context.
227b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///
228b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// If this symbol context points to a block that is an inlined
229b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// function, or is contained within an inlined function, the block
230b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// that defines the inlined function is returned.
231b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///
232b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// If this symbol context has no block in it, or the block is not
233b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// itself an inlined function block or contained within one, we
234b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// return the top level function block.
235b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///
236b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// This is a handy function to call when you want to get the block
237b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// whose variable list will include the arguments for the function
238b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// that is represented by this symbol context (whether the function
239b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// is an inline function or not).
240b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///
241b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// @return
242b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     The block object pointer that defines the function that is
243b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     represented by this symbol context object, NULL otherwise.
244b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    //------------------------------------------------------------------
245b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    Block *
246b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    GetFunctionBlock ();
247b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
248b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
249b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    //------------------------------------------------------------------
250b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// If this symbol context represents a function that is a method,
251b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// return true and provide information about the method.
252b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///
253b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// @param[out] language
254b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     If \b true is returned, the language for the method.
255b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///
256b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// @param[out] is_instance_method
257b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     If \b true is returned, \b true if this is a instance method,
258b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     \b false if this is a static/class function.
259b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///
260b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// @param[out] language_object_name
261b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     If \b true is returned, the name of the artificial variable
262b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     for the language ("this" for C++, "self" for ObjC).
263b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///
264b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    /// @return
265b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     \b True if this symbol context represents a function that
266b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    ///     is a method of a class, \b false otherwise.
267b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    //------------------------------------------------------------------
268b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    bool
269b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    GetFunctionMethodInfo (lldb::LanguageType &language,
270b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                           bool &is_instance_method,
271b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                           ConstString &language_object_name);
272b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
273a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    //------------------------------------------------------------------
274a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    /// Find a name of the innermost function for the symbol context.
275a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    ///
276a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    /// For instance, if the symbol context contains an inlined block,
277a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    /// it will return the inlined function name.
278a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    ///
279a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    /// @param[in] prefer_mangled
280a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    ///    if \btrue, then the mangled name will be returned if there
281a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    ///    is one.  Otherwise the unmangled name will be returned if it
282a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    ///    is available.
283a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    ///
284a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    /// @return
285a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    ///     The name of the function represented by this symbol context.
286a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    //------------------------------------------------------------------
287a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    ConstString
28823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    GetFunctionName (Mangled::NamePreference preference = Mangled::ePreferDemangled) const;
28923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton
29023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton
29123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    //------------------------------------------------------------------
29223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// Get the line entry that corresponds to the function.
29323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    ///
29423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// If the symbol context contains an inlined block, the line entry
29523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// for the start address of the inlined function will be returned,
29623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// otherwise the line entry for the start address of the function
29723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// will be returned. This can be used after doing a
29823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// Module::FindFunctions(...) or ModuleList::FindFunctions(...)
29923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// call in order to get the correct line table information for
30023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// the symbol context.
30123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// it will return the inlined function name.
30223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    ///
30323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// @param[in] prefer_mangled
30423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    ///    if \btrue, then the mangled name will be returned if there
30523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    ///    is one.  Otherwise the unmangled name will be returned if it
30623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    ///    is available.
30723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    ///
30823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    /// @return
30923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    ///     The name of the function represented by this symbol context.
31023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    //------------------------------------------------------------------
31123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    LineEntry
31223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    GetFunctionStartLineEntry () const;
313a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham
3142f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    //------------------------------------------------------------------
3152f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    /// Find the block containing the inlined block that contains this block.
3162f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///
3172f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    /// For instance, if the symbol context contains an inlined block,
3182f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    /// it will return the inlined function name.
3192f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///
3202f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    /// @param[in] curr_frame_pc
3212f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///    The address within the block of this object.
3222f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///
3232f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    /// @param[out] next_frame_sc
3242f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///     A new symbol context that does what the title says it does.
3252f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///
3262f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    /// @param[out] next_frame_addr
3272f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///     This is what you should report as the PC in \a next_frame_sc.
3282f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///
3292f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    /// @return
3302f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///     \b true if this SymbolContext specifies a block contained in an
3312f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///     inlined block.  If this returns \b true, \a next_frame_sc and
3322f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    ///     \a next_frame_addr will be filled in correctly.
3332f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    //------------------------------------------------------------------
33423b8abbe214c252028f6e09f79169529c846409dGreg Clayton    bool
3352f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    GetParentOfInlinedScope (const Address &curr_frame_pc,
3362f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                             SymbolContext &next_frame_sc,
3372f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                             Address &inlined_frame_addr) const;
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    lldb::TargetSP  target_sp;  ///< The Target for a given query
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::ModuleSP  module_sp;  ///< The Module for a given query
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnit *   comp_unit;  ///< The CompileUnit for a given query
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Function *      function;   ///< The Function for a given query
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Block *         block;      ///< The Block for a given query
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LineEntry       line_entry; ///< The LineEntry for a given query
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symbol *        symbol;     ///< The Symbol for a given query
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
351d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
352d60d94a5126b93fda98678a68322abc2164073dbJim Inghamclass SymbolContextSpecifier
353d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{
354d60d94a5126b93fda98678a68322abc2164073dbJim Inghampublic:
355d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    typedef enum SpecificationType
356d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
357d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        eNothingSpecified          = 0,
358d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        eModuleSpecified           = 1 << 0,
359d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        eFileSpecified             = 1 << 1,
360d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        eLineStartSpecified        = 1 << 2,
361d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        eLineEndSpecified          = 1 << 3,
362d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        eFunctionSpecified         = 1 << 4,
363d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        eClassOrNamespaceSpecified = 1 << 5,
364d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        eAddressRangeSpecified     = 1 << 6
365d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    } SpecificationType;
366d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
367d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    // This one produces a specifier that matches everything...
3686e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    SymbolContextSpecifier (const lldb::TargetSP& target_sp);
3696e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton
3706e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    ~SymbolContextSpecifier();
371d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
372d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    bool
373d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    AddSpecification (const char *spec_string, SpecificationType type);
374d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
375d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    bool
376d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    AddLineSpecification (uint32_t line_no, SpecificationType type);
377d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
378d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    void
379d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    Clear();
380d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
381d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    bool
382d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    SymbolContextMatches(SymbolContext &sc);
383d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
384d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    bool
385d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    AddressMatches(lldb::addr_t addr);
386d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
387d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    void
388d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    GetDescription (Stream *s, lldb::DescriptionLevel level) const;
389d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
390d60d94a5126b93fda98678a68322abc2164073dbJim Inghamprivate:
391d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    lldb::TargetSP                 m_target_sp;
392d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    std::string                    m_module_spec;
393d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    lldb::ModuleSP                 m_module_sp;
394102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<FileSpec>       m_file_spec_ap;
395d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    size_t                         m_start_line;
396d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    size_t                         m_end_line;
397d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    std::string                    m_function_spec;
398d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    std::string                    m_class_name;
399102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<AddressRange>   m_address_range_ap;
400d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    uint32_t                       m_type; // Or'ed bits from SpecificationType
401d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
402d60d94a5126b93fda98678a68322abc2164073dbJim Ingham};
403d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class SymbolContextList SymbolContext.h "lldb/Symbol/SymbolContext.h"
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief Defines a list of symbol context objects.
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// This class provides a common structure that can be used to contain
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// the result of a query that can contain a multiple results. Examples
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// of such queries include:
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     @li Looking up a function by name.
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     @li Finding all addressses for a specified file and line number.
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SymbolContextList
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Default constructor.
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Initialize with an empty list.
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextList ();
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~SymbolContextList ();
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Append a new symbol context to the list.
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] sc
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A symbol context to append to the list.
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
43628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    Append (const SymbolContext& sc);
43728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
4387dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    void
4397dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    Append (const SymbolContextList& sc_list);
4407dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton
44128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    bool
4427dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    AppendIfUnique (const SymbolContext& sc,
4437dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton                    bool merge_symbol_into_function);
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
445ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    bool
446ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    MergeSymbolContextIntoFunctionContext (const SymbolContext& symbol_sc,
447ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                           uint32_t start_idx = 0,
448ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                           uint32_t stop_idx = UINT32_MAX);
449ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton
4507dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    uint32_t
4517dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    AppendIfUnique (const SymbolContextList& sc_list,
4527dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton                    bool merge_symbol_into_function);
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Clear the object's state.
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Clears the symbol context list.
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of this object to a Stream.
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of each symbol context in
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// the list to the supplied stream \a s.
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
471eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    Dump(Stream *s, Target *target) const;
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for a symbol context at index \a idx.
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of each symbol context in
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// the list to the supplied stream \a s.
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] idx
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The zero based index into the symbol context list.
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] sc
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A reference to the symbol context to fill in.
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns \b true if \a idx was a valid index into this
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     symbol context list and \a sc was filled in, \b false
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     otherwise.
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
49136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetContextAtIndex(size_t idx, SymbolContext& sc) const;
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
493296b06d325413723f5aac5988eed977b278a7807Greg Clayton    //------------------------------------------------------------------
494ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    /// Direct reference accessor for a symbol context at index \a idx.
495ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    ///
496ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    /// The index \a idx must be a valid index, no error checking will
497ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    /// be done to ensure that it is valid.
498ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    ///
499ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    /// @param[in] idx
500ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    ///     The zero based index into the symbol context list.
501ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    ///
502ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    /// @return
503ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    ///     A const reference to the symbol context to fill in.
504ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    //------------------------------------------------------------------
505ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    SymbolContext&
506ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    operator [] (size_t idx)
507ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    {
508ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        return m_symbol_contexts[idx];
509ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    }
510ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton
511ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    const SymbolContext&
512ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    operator [] (size_t idx) const
513ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    {
514ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        return m_symbol_contexts[idx];
515ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    }
516ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton
517ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    //------------------------------------------------------------------
518296b06d325413723f5aac5988eed977b278a7807Greg Clayton    /// Get accessor for the last symbol context in the list.
519296b06d325413723f5aac5988eed977b278a7807Greg Clayton    ///
520296b06d325413723f5aac5988eed977b278a7807Greg Clayton    /// @param[out] sc
521296b06d325413723f5aac5988eed977b278a7807Greg Clayton    ///     A reference to the symbol context to fill in.
522296b06d325413723f5aac5988eed977b278a7807Greg Clayton    ///
523296b06d325413723f5aac5988eed977b278a7807Greg Clayton    /// @return
524296b06d325413723f5aac5988eed977b278a7807Greg Clayton    ///     Returns \b true if \a sc was filled in, \b false if the
525296b06d325413723f5aac5988eed977b278a7807Greg Clayton    ///     list is empty.
526296b06d325413723f5aac5988eed977b278a7807Greg Clayton    //------------------------------------------------------------------
527296b06d325413723f5aac5988eed977b278a7807Greg Clayton    bool
528296b06d325413723f5aac5988eed977b278a7807Greg Clayton    GetLastContext(SymbolContext& sc) const;
529296b06d325413723f5aac5988eed977b278a7807Greg Clayton
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
53136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    RemoveContextAtIndex (size_t idx);
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for a symbol context list size.
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns the number of symbol context objects in the list.
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSize() const;
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    uint32_t
54252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    NumLineEntriesWithLine (uint32_t line) const;
54352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
5447dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    void
5457dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    GetDescription(Stream *s,
5467dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton                   lldb::DescriptionLevel level,
5477dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton                   Target *target) const;
5487dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<SymbolContext> collection; ///< The collection type for the list.
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables.
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection m_symbol_contexts; ///< The list of symbol contexts.
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool operator== (const SymbolContext& lhs, const SymbolContext& rhs);
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool operator!= (const SymbolContext& lhs, const SymbolContext& rhs);
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5619a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Claytonbool operator== (const SymbolContextList& lhs, const SymbolContextList& rhs);
5629a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Claytonbool operator!= (const SymbolContextList& lhs, const SymbolContextList& rhs);
5639a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_SymbolContext_h_
567