Block.h revision 75ccf50c3371d8c8e293af25461705b86fb10a46
1//===-- Block.h -------------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_Block_h_ 11#define liblldb_Block_h_ 12 13#include "lldb/lldb-private.h" 14#include "lldb/Core/AddressRange.h" 15#include "lldb/Core/Stream.h" 16#include "lldb/Core/UserID.h" 17#include "lldb/Core/VMRange.h" 18#include "lldb/Symbol/LineEntry.h" 19#include "lldb/Symbol/SymbolContext.h" 20 21namespace lldb_private { 22 23//---------------------------------------------------------------------- 24/// @class Block Block.h "lldb/Symbol/Block.h" 25/// @brief A class that describes a single lexical block. 26/// 27/// A Function object owns a BlockList object which owns one or more 28/// Block objects. The BlockList object contains a section offset 29/// address range, and Block objects contain one or more ranges 30/// which are offsets into that range. Blocks are can have discontiguous 31/// ranges within the BlockList adress range, and each block can 32/// contain child blocks each with their own sets of ranges. 33/// 34/// Each block has a variable list that represents local, argument, and 35/// static variables that are scoped to the block. 36/// 37/// Inlined functions are representated by attaching a 38/// InlineFunctionInfo shared pointer object to a block. Inlined 39/// functions are represented as named blocks. 40//---------------------------------------------------------------------- 41class Block : 42 public UserID, 43 public SymbolContextScope 44{ 45public: 46 47 //------------------------------------------------------------------ 48 /// Construct with a User ID \a uid, \a depth. 49 /// 50 /// Initialize this block with the specified UID \a uid. The 51 /// \a depth in the \a block_list is used to represent the parent, 52 /// sibling, and child block information and also allows for partial 53 /// parsing at the block level. 54 /// 55 /// @param[in] uid 56 /// The UID for a given block. This value is given by the 57 /// SymbolFile plug-in and can be any value that helps the 58 /// SymbolFile plug-in to match this block back to the debug 59 /// information data that it parses for further or more in 60 /// depth parsing. Common values would be the index into a 61 /// table, or an offset into the debug information. 62 /// 63 /// @param[in] depth 64 /// The integer depth of this block in the block list hierarchy. 65 /// 66 /// @param[in] block_list 67 /// The block list that this object belongs to. 68 /// 69 /// @see BlockList 70 //------------------------------------------------------------------ 71 Block (lldb::user_id_t uid); 72 73 //------------------------------------------------------------------ 74 /// Destructor. 75 //------------------------------------------------------------------ 76 ~Block (); 77 78 //------------------------------------------------------------------ 79 /// Add a child to this object. 80 /// 81 /// @param[in] child_block_sp 82 /// A shared pointer to a child block that will get added to 83 /// this block. 84 //------------------------------------------------------------------ 85 void 86 AddChild (const lldb::BlockSP &child_block_sp); 87 88 //------------------------------------------------------------------ 89 /// Add a new offset range to this block. 90 /// 91 /// @param[in] start_offset 92 /// An offset into this Function's address range that 93 /// describes the start address of a range for this block. 94 /// 95 /// @param[in] end_offset 96 /// An offset into this Function's address range that 97 /// describes the end address of a range for this block. 98 //------------------------------------------------------------------ 99 void 100 AddRange(lldb::addr_t start_offset, lldb::addr_t end_offset); 101 102 //------------------------------------------------------------------ 103 /// @copydoc SymbolContextScope::CalculateSymbolContext(SymbolContext*) 104 /// 105 /// @see SymbolContextScope 106 //------------------------------------------------------------------ 107 virtual void 108 CalculateSymbolContext(SymbolContext* sc); 109 110 //------------------------------------------------------------------ 111 /// Check if an offset is in one of the block offset ranges. 112 /// 113 /// @param[in] range_offset 114 /// An offset into the Function's address range. 115 /// 116 /// @return 117 /// Returns \b true if \a range_offset falls in one of this 118 /// block's ranges, \b false otherwise. 119 //------------------------------------------------------------------ 120 bool 121 Contains (lldb::addr_t range_offset) const; 122 123 //------------------------------------------------------------------ 124 /// Check if a offset range is in one of the block offset ranges. 125 /// 126 /// @param[in] range 127 /// An offset range into the Function's address range. 128 /// 129 /// @return 130 /// Returns \b true if \a range falls in one of this 131 /// block's ranges, \b false otherwise. 132 //------------------------------------------------------------------ 133 bool 134 Contains (const VMRange& range) const; 135 136 //------------------------------------------------------------------ 137 /// Dump the block contents. 138 /// 139 /// @param[in] s 140 /// The stream to which to dump the object descripton. 141 /// 142 /// @param[in] base_addr 143 /// The resolved start address of the Function's address 144 /// range. This should be resolved as the file or load address 145 /// prior to passing the value into this function for dumping. 146 /// 147 /// @param[in] depth 148 /// Limit the number of levels deep that this function should 149 /// print as this block can contain child blocks. Specify 150 /// INT_MAX to dump all child blocks. 151 /// 152 /// @param[in] show_context 153 /// If \b true, variables will dump their context information. 154 //------------------------------------------------------------------ 155 void 156 Dump (Stream *s, lldb::addr_t base_addr, int32_t depth, bool show_context) const; 157 158 void 159 DumpStopContext (Stream *s, const SymbolContext *sc); 160 161 //------------------------------------------------------------------ 162 /// @copydoc SymbolContextScope::DumpSymbolContext(Stream*) 163 /// 164 /// @see SymbolContextScope 165 //------------------------------------------------------------------ 166 virtual void 167 DumpSymbolContext(Stream *s); 168 169 void 170 GetDescription (Stream *s, 171 Function *function, 172 lldb::DescriptionLevel level, 173 Process *process) const; 174 175 //------------------------------------------------------------------ 176 /// Get the parent block. 177 /// 178 /// @return 179 /// The parent block pointer, or NULL if this block has no 180 /// parent. 181 //------------------------------------------------------------------ 182 Block * 183 GetParent () const; 184 185 //------------------------------------------------------------------ 186 /// Get the sibling block for this block. 187 /// 188 /// @return 189 /// The sibling block pointer, or NULL if this block has no 190 /// sibling. 191 //------------------------------------------------------------------ 192 Block * 193 GetSibling () const 194 { 195 return m_sibling; 196 } 197 198 //------------------------------------------------------------------ 199 /// Get the first child block. 200 /// 201 /// @return 202 /// The first child block pointer, or NULL if this block has no 203 /// children. 204 //------------------------------------------------------------------ 205 Block * 206 GetFirstChild () const; 207 208 //------------------------------------------------------------------ 209 /// Get the variable list for this block and optionally all child 210 /// blocks if \a get_child_variables is \b true. 211 /// 212 /// @param[in] get_child_variables 213 /// If \b true, all variables from all child blocks will be 214 /// added to the variable list. 215 /// 216 /// @param[in] can_create 217 /// If \b true, the variables can be parsed if they already 218 /// haven't been, else the current state of the block will be 219 /// returned. Passing \b true for this parameter can be used 220 /// to see the current state of what has been parsed up to this 221 /// point. 222 /// 223 /// @return 224 /// A variable list shared pointer that contains all variables 225 /// for this block. 226 //------------------------------------------------------------------ 227 lldb::VariableListSP 228 GetVariableList (bool get_child_variables, bool can_create); 229 230 231 //------------------------------------------------------------------ 232 /// Appends the variables from this block, and optionally from all 233 /// parent blocks, to \a variable_list. 234 /// 235 /// @param[in] can_create 236 /// If \b true, the variables can be parsed if they already 237 /// haven't been, else the current state of the block will be 238 /// returned. Passing \b true for this parameter can be used 239 /// to see the current state of what has been parsed up to this 240 /// point. 241 /// 242 /// @param[in] get_parent_variables 243 /// If \b true, all variables from all parent blocks will be 244 /// added to the variable list. 245 /// 246 /// @param[in/out] variable_list 247 /// All variables in this block, and optionally all parent 248 /// blocks will be added to this list. 249 /// 250 /// @return 251 /// The number of variable that were appended to \a 252 /// variable_list. 253 //------------------------------------------------------------------ 254 uint32_t 255 AppendVariables(bool can_create, bool get_parent_variables, VariableList *variable_list); 256 257 //------------------------------------------------------------------ 258 /// Get accessor for any inlined function information. 259 /// 260 /// @return 261 /// A pointer to any inlined function information, or NULL if 262 /// this is a regular block. 263 //------------------------------------------------------------------ 264 InlineFunctionInfo* 265 InlinedFunctionInfo (); 266 267 //------------------------------------------------------------------ 268 /// Get const accessor for any inlined function information. 269 /// 270 /// @return 271 /// A cpmst pointer to any inlined function information, or NULL 272 /// if this is a regular block. 273 //------------------------------------------------------------------ 274 const InlineFunctionInfo* 275 InlinedFunctionInfo () const; 276 277 //------------------------------------------------------------------ 278 /// Get the memory cost of this object. 279 /// 280 /// Returns the cost of this object plus any owned objects from the 281 /// ranges, variables, and inline function information. 282 /// 283 /// @return 284 /// The number of bytes that this object occupies in memory. 285 //------------------------------------------------------------------ 286 size_t 287 MemorySize() const; 288 289 //------------------------------------------------------------------ 290 /// Set accessor for any inlined function information. 291 /// 292 /// @param[in] name 293 /// The method name for the inlined function. This value should 294 /// not be NULL. 295 /// 296 /// @param[in] mangled 297 /// The mangled method name for the inlined function. This can 298 /// be NULL if there is no mangled name for an inlined function 299 /// or if the name is the same as \a name. 300 /// 301 /// @param[in] decl_ptr 302 /// A optional pointer to declaration information for the 303 /// inlined function information. This value can be NULL to 304 /// indicate that no declaration information is available. 305 /// 306 /// @param[in] call_decl_ptr 307 /// Optional calling location declaration information that 308 /// describes from where this inlined function was called. 309 //------------------------------------------------------------------ 310 void 311 SetInlinedFunctionInfo (const char *name, 312 const char *mangled, 313 const Declaration *decl_ptr, 314 const Declaration *call_decl_ptr); 315 316 317 void 318 SetParentScope (SymbolContextScope *parent_scope) 319 { 320 m_parent_scope = parent_scope; 321 } 322 323 void 324 SetSibling (Block *block) 325 { 326 m_sibling = block; 327 } 328 329 //------------------------------------------------------------------ 330 /// Set accessor for the variable list. 331 /// 332 /// Called by the SymbolFile plug-ins after they have parsed the 333 /// variable lists and are ready to hand ownership of the list over 334 /// to this object. 335 /// 336 /// @param[in] variable_list_sp 337 /// A shared pointer to a VariableList. 338 //------------------------------------------------------------------ 339 void 340 SetVariableList (lldb::VariableListSP& variable_list_sp); 341 342 343 bool 344 BlockInfoHasBeenParsed() const 345 { 346 return m_parsed_block_info; 347 } 348 349 void 350 SetBlockInfoHasBeenParsed (bool b, bool set_children); 351 352 Block * 353 FindBlockByID (lldb::user_id_t block_id); 354 355protected: 356 typedef std::vector<lldb::BlockSP> collection; 357 //------------------------------------------------------------------ 358 // Member variables. 359 //------------------------------------------------------------------ 360 SymbolContextScope *m_parent_scope; 361 Block *m_sibling; 362 collection m_children; 363 VMRange::collection m_ranges; ///< A list of address offset ranges relative to the function's section/offset address. 364 lldb::InlineFunctionInfoSP m_inlineInfoSP; ///< Inlined function information. 365 lldb::VariableListSP m_variables; ///< The variable list for all local, static and paramter variables scoped to this block. 366 bool m_parsed_block_info:1, ///< Set to true if this block and it's children have all been parsed 367 m_parsed_block_variables:1, 368 m_parsed_child_blocks:1; 369 370private: 371 DISALLOW_COPY_AND_ASSIGN (Block); 372}; 373 374 375} // namespace lldb_private 376 377#endif // liblldb_Block_h_ 378