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