124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFExpression.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#ifndef liblldb_DWARFExpression_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_DWARFExpression_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Scalar.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20cc810f049dd284ddf63951fdfeb7441067c7b6c0Sean Callanannamespace lldb_private {
21cc810f049dd284ddf63951fdfeb7441067c7b6c0Sean Callanan
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangExpressionVariable;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangExpressionVariableList;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangExpressionDeclMap;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
283530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// @class DWARFExpression DWARFExpression.h "lldb/Expression/DWARFExpression.h"
293530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// @brief Encapsulates a DWARF location expression and interprets it.
303530022304599ed4a2f915454eaaf91e25d640feSean Callanan///
313530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// DWARF location expressions are used in two ways by LLDB.  The first
323530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// use is to find entities specified in the debug information, since
333530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// their locations are specified in precisely this language.  The second
343530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// is to interpret expressions without having to run the target in cases
353530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// where the overhead from copying JIT-compiled code into the target is
363530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// too high or where the target cannot be run.  This class encapsulates
373530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// a single DWARF location expression or a location list and interprets
383530022304599ed4a2f915454eaaf91e25d640feSean Callanan/// it.
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFExpression
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
443530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Constructor
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression();
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
483530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
493530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Constructor
503530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
513530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] data
523530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     A data extractor configured to read the DWARF location expression's
533530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     bytecode.
543530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
553530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] data_offset
563530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The offset of the location expression in the extractor.
573530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
583530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] data_length
593530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The byte length of the location expression.
603530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression(const DataExtractor& data,
6236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    lldb::offset_t data_offset,
6336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    lldb::offset_t data_length);
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
653530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
663530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Copy constructor
673530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression(const DWARFExpression& rhs);
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
703530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
713530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Destructor
723530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~DWARFExpression();
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
763530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
773530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Print the description of the expression to a stream
783530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
793530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] s
803530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The stream to print to.
813530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
823530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] level
833530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The level of verbosity to use.
84178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///
85178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    /// @param[in] location_list_base_addr
86178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     If this is a location list based expression, this is the
87178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     address of the object that owns it. NOTE: this value is
88178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     different from the DWARF version of the location list base
89178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     address which is compile unit relative. This base address
90178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     is the address of the object that owns the location list.
915c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    ///
925c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    /// @param[in] abi
935c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    ///     An optional ABI plug-in that can be used to resolve register
945c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    ///     names.
953530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
97178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    GetDescription (Stream *s,
98178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                    lldb::DescriptionLevel level,
995c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                    lldb::addr_t location_list_base_addr,
1005c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                    ABI *abi) const;
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1023530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
1033530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Return true if the location expression contains data
1043530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsValid() const;
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1083530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
1093530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Return true if a location list was provided
1103530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsLocationList() const;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1143530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
1153530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Search for a load address in the location list
1163530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
1173530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] process
1183530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The process to use when resolving the load address
1193530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
1203530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] addr
1213530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The address to resolve
1223530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
1233530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @return
1243530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     True if IsLocationList() is true and the address was found;
1253530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     false otherwise.
1263530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
127178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton//    bool
128178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton//    LocationListContainsLoadAddress (Process* process, const Address &addr) const;
129178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton//
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
131178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    LocationListContainsAddress (lldb::addr_t loclist_base_addr, lldb::addr_t addr) const;
132b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton
1333530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
134a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    /// If a location is not a location list, return true if the location
135a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    /// contains a DW_OP_addr () opcode in the stream that matches \a
136a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    /// file_addr. If file_addr is LLDB_INVALID_ADDRESS, the this
137a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    /// function will return true if the variable there is any DW_OP_addr
138a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    /// in a location that (yet still is NOT a location list). This helps
139a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    /// us detect if a variable is a global or static variable since
140a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    /// there is no other indication from DWARF debug info.
141a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    ///
142464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    /// @param[in] op_addr_idx
143464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    ///     The DW_OP_addr index to retrieve in case there is more than
144464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    ///     one DW_OP_addr opcode in the location byte stream.
145a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    ///
1462f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// @param[out] error
1472f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     If the location stream contains unknown DW_OP opcodes or the
1482f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     data is missing, \a error will be set to \b true.
1492f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///
150a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    /// @return
151464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    ///     LLDB_INVALID_ADDRESS if the location doesn't contain a
152464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    ///     DW_OP_addr for \a op_addr_idx, otherwise a valid file address
153a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    //------------------------------------------------------------------
154464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    lldb::addr_t
155464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    GetLocation_DW_OP_addr (uint32_t op_addr_idx, bool &error) const;
156a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton
157a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    bool
158a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    Update_DW_OP_addr (lldb::addr_t file_addr);
159a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton
160a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton    //------------------------------------------------------------------
1613530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Make the expression parser read its location information from a
1623530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// given data source.  Does not change the offset and length
1633530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
1643530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] data
1653530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     A data extractor configured to read the DWARF location expression's
1663530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     bytecode.
1673530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
169178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    SetOpcodeData(const DataExtractor& data);
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1713530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
1723530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Make the expression parser read its location information from a
1733530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// given data source
1743530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
1753530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] data
1763530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     A data extractor configured to read the DWARF location expression's
1773530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     bytecode.
1783530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
1793530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] data_offset
1803530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The offset of the location expression in the extractor.
1813530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
1823530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] data_length
1833530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The byte length of the location expression.
1843530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
18636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    SetOpcodeData(const DataExtractor& data, lldb::offset_t data_offset, lldb::offset_t data_length);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1883530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
1894fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// Copy the DWARF location expression into a local buffer.
1904fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    ///
1914fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// It is a good idea to copy the data so we don't keep the entire
1924fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// object file worth of data around just for a few bytes of location
1934fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// expression. LLDB typically will mmap the entire contents of debug
1944fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// information files, and if we use SetOpcodeData, it will get a
1954fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// shared reference to all of this data for the and cause the object
1964fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// file to have to stay around. Even worse, a very very large ".a"
1974fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// that contains one or more .o files could end up being referenced.
1984fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// Location lists are typically small so even though we are copying
1994fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// the data, it shouldn't amount to that much for the variables we
2004fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// end up parsing.
2014fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    ///
2024fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// @param[in] data
2034fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    ///     A data extractor configured to read and copy the DWARF
2044fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    ///     location expression's bytecode.
2054fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    ///
2064fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// @param[in] data_offset
2074fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    ///     The offset of the location expression in the extractor.
2084fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    ///
2094fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    /// @param[in] data_length
2104fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    ///     The byte length of the location expression.
2114fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    //------------------------------------------------------------------
2124fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    void
2134fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    CopyOpcodeData (const DataExtractor& data,
21436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    lldb::offset_t data_offset,
21536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    lldb::offset_t data_length);
2164fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton
2174fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton
2184fa86fef917b43f9573e5adfee4a4d005059dcaeGreg Clayton    //------------------------------------------------------------------
219178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    /// Tells the expression that it refers to a location list.
2203530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
221178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    /// @param[in] slide
222178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     This value should be a slide that is applied to any values
223178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     in the location list data so the values become zero based
224178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     offsets into the object that owns the location list. We need
225178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     to make location lists relative to the objects that own them
226178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    ///     so we can relink addresses on the fly.
2273530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
229178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    SetLocationListSlide (lldb::addr_t slide);
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2313530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
2323530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Return the call-frame-info style register kind
2333530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterKind ();
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2373530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
2383530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Set the call-frame-info style register kind
2393530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
2403530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] reg_kind
2413530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The register kind.
2423530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
2445c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    SetRegisterKind (lldb::RegisterKind reg_kind);
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2463530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
2473530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Wrapper for the static evaluate function that accepts an
2483530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// ExecutionContextScope instead of an ExecutionContext and uses
2493530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// member variables to populate many operands
2503530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Evaluate (ExecutionContextScope *exe_scope,
253bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton              ClangExpressionVariableList *expr_locals,
254bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton              ClangExpressionDeclMap *decl_map,
255178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton              lldb::addr_t loclist_base_load_addr,
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              const Value* initial_value_ptr,
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Value& result,
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Error *error_ptr) const;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2603530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
2613530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Wrapper for the static evaluate function that uses member
2623530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// variables to populate many operands
2633530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Evaluate (ExecutionContext *exe_ctx,
266bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton              ClangExpressionVariableList *expr_locals,
267bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton              ClangExpressionDeclMap *decl_map,
2688e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda              RegisterContext *reg_ctx,
269178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton              lldb::addr_t loclist_base_load_addr,
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              const Value* initial_value_ptr,
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Value& result,
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Error *error_ptr) const;
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2743530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
2753530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Evaluate a DWARF location expression in a particular context
2763530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
2773530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] exe_ctx
2783530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The execution context in which to evaluate the location
2793530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     expression.  The location expression may access the target's
2803530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     memory, especially if it comes from the expression parser.
2813530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
2823530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] opcodes
2833530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     This is a static method so the opcodes need to be provided
2843530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     explicitly.
2853530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
2863530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] expr_locals
2873530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     If the location expression was produced by the expression parser,
2883530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     the list of local variables referenced by the DWARF expression.
2893530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     This list should already have been populated during parsing;
2903530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     the DWARF expression refers to variables by index.  Can be NULL if
2913530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     the location expression uses no locals.
2923530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
2933530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] decl_map
2943530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     If the location expression was produced by the expression parser,
2953530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     the list of external variables referenced by the location
2963530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     expression.  Can be NULL if the location expression uses no
2973530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     external variables.
2983530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
2998e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    ///  @param[in] reg_ctx
3008e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    ///     An optional parameter which provides a RegisterContext for use
3018e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    ///     when evaluating the expression (i.e. for fetching register values).
3028e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    ///     Normally this will come from the ExecutionContext's StackFrame but
3038e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    ///     in the case where an expression needs to be evaluated while building
3048e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    ///     the stack frame list, this short-cut is available.
3058e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    ///
3063530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] offset
3073530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The offset of the location expression in the data extractor.
3083530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3093530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] length
3103530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The length in bytes of the location expression.
3113530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3123530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] reg_set
3133530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The call-frame-info style register kind.
3143530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3153530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] initial_value_ptr
3163530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     A value to put on top of the interpreter stack before evaluating
3173530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     the expression, if the expression is parametrized.  Can be NULL.
3183530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3193530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] result
3203530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     A value into which the result of evaluating the expression is
3213530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     to be placed.
3223530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3233530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] error_ptr
3243530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     If non-NULL, used to report errors in expression evaluation.
3253530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3263530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @return
3273530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     True on success; false otherwise.  If error_ptr is non-NULL,
3283530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     details of the failure are provided through it.
3293530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Evaluate (ExecutionContext *exe_ctx,
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              ClangExpressionVariableList *expr_locals,
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              ClangExpressionDeclMap *decl_map,
3348e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda              RegisterContext *reg_ctx,
335bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton              const DataExtractor& opcodes,
33636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton              const lldb::offset_t offset,
33736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton              const lldb::offset_t length,
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              const uint32_t reg_set,
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              const Value* initial_value_ptr,
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Value& result,
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Error *error_ptr);
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3433530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
3443530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Loads a ClangExpressionVariableList into the object
3453530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3463530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] locals
3473530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     If non-NULL, the list of locals used by this expression.
3483530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     See Evaluate().
3493530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetExpressionLocalVariableList (ClangExpressionVariableList *locals);
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3533530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
3543530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Loads a ClangExpressionDeclMap into the object
3553530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3563530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] locals
3573530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     If non-NULL, the list of external variables used by this
3583530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     expression.  See Evaluate().
3593530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetExpressionDeclMap (ClangExpressionDeclMap *decl_map);
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    bool
36482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    GetExpressionData (DataExtractor &data) const
36582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    {
36682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        data = m_data;
36782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        return data.GetByteSize() > 0;
36882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    }
3699b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton
3709b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    bool
3719b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    DumpLocationForAddress (Stream *s,
3729b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                            lldb::DescriptionLevel level,
3739b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                            lldb::addr_t loclist_base_load_addr,
3745c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                            lldb::addr_t address,
3755c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                            ABI *abi);
37682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3793530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Pretty-prints the location expression to a stream
3803530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3813530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] stream
3823530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The stream to use for pretty-printing.
3833530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3843530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] offset
3853530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The offset into the data buffer of the opcodes to be printed.
3863530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3873530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] length
3883530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The length in bytes of the opcodes to be printed.
3893530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///
3903530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// @param[in] level
3913530022304599ed4a2f915454eaaf91e25d640feSean Callanan    ///     The level of detail to use in pretty-printing.
3925c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    ///
3935c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    /// @param[in] abi
3945c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    ///     An optional ABI plug-in that can be used to resolve register
3955c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    ///     names.
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3973530022304599ed4a2f915454eaaf91e25d640feSean Callanan    void
3983530022304599ed4a2f915454eaaf91e25d640feSean Callanan    DumpLocation(Stream *s,
39936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                 lldb::offset_t offset,
40036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                 lldb::offset_t length,
4015c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                 lldb::DescriptionLevel level,
4025c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                 ABI *abi) const;
4033530022304599ed4a2f915454eaaf91e25d640feSean Callanan
4049b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    bool
4059b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    GetLocation (lldb::addr_t base_addr,
4069b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                 lldb::addr_t pc,
40736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                 lldb::offset_t &offset,
40836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                 lldb::offset_t &len);
4099b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton
4103530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
4113530022304599ed4a2f915454eaaf91e25d640feSean Callanan    /// Classes that inherit from DWARFExpression can see and modify these
4123530022304599ed4a2f915454eaaf91e25d640feSean Callanan    //------------------------------------------------------------------
4133530022304599ed4a2f915454eaaf91e25d640feSean Callanan
4143530022304599ed4a2f915454eaaf91e25d640feSean Callanan    DataExtractor m_data;                       ///< A data extractor capable of reading opcode bytes
4155c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton    lldb::RegisterKind m_reg_kind;              ///< One of the defines that starts with LLDB_REGKIND_
416178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t m_loclist_slide;               ///< A value used to slide the location list offsets so that
417178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                                                ///< they are relative to the object that owns the location list
418178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                                                ///< (the function for frame base and variable location lists)
419bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_DWARFExpression_h_
425