1 //===-- Block.h -------------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_Block_h_
11 #define liblldb_Block_h_
13 #include "lldb/lldb-private.h"
14 #include "lldb/Core/AddressRange.h"
15 #include "lldb/Core/RangeMap.h"
16 #include "lldb/Core/Stream.h"
17 #include "lldb/Core/UserID.h"
18 #include "lldb/Symbol/LineEntry.h"
19 #include "lldb/Symbol/SymbolContext.h"
20 #include "lldb/Symbol/ClangASTType.h"
22 namespace lldb_private {
24 //----------------------------------------------------------------------
25 /// @class Block Block.h "lldb/Symbol/Block.h"
26 /// @brief A class that describes a single lexical block.
28 /// A Function object owns a BlockList object which owns one or more
29 /// Block objects. The BlockList object contains a section offset
30 /// address range, and Block objects contain one or more ranges
31 /// which are offsets into that range. Blocks are can have discontiguous
32 /// ranges within the BlockList adress range, and each block can
33 /// contain child blocks each with their own sets of ranges.
35 /// Each block has a variable list that represents local, argument, and
36 /// static variables that are scoped to the block.
38 /// Inlined functions are representated by attaching a
39 /// InlineFunctionInfo shared pointer object to a block. Inlined
40 /// functions are represented as named blocks.
41 //----------------------------------------------------------------------
44 public SymbolContextScope
47 typedef RangeArray<uint32_t, uint32_t, 1> RangeList;
48 typedef RangeList::Entry Range;
50 //------------------------------------------------------------------
51 /// Construct with a User ID \a uid, \a depth.
53 /// Initialize this block with the specified UID \a uid. The
54 /// \a depth in the \a block_list is used to represent the parent,
55 /// sibling, and child block information and also allows for partial
56 /// parsing at the block level.
59 /// The UID for a given block. This value is given by the
60 /// SymbolFile plug-in and can be any value that helps the
61 /// SymbolFile plug-in to match this block back to the debug
62 /// information data that it parses for further or more in
63 /// depth parsing. Common values would be the index into a
64 /// table, or an offset into the debug information.
67 /// The integer depth of this block in the block list hierarchy.
69 /// @param[in] block_list
70 /// The block list that this object belongs to.
73 //------------------------------------------------------------------
74 Block (lldb::user_id_t uid);
76 //------------------------------------------------------------------
78 //------------------------------------------------------------------
81 //------------------------------------------------------------------
82 /// Add a child to this object.
84 /// @param[in] child_block_sp
85 /// A shared pointer to a child block that will get added to
87 //------------------------------------------------------------------
89 AddChild (const lldb::BlockSP &child_block_sp);
91 //------------------------------------------------------------------
92 /// Add a new offset range to this block.
94 /// @param[in] start_offset
95 /// An offset into this Function's address range that
96 /// describes the start address of a range for this block.
98 /// @param[in] end_offset
99 /// An offset into this Function's address range that
100 /// describes the end address of a range for this block.
101 //------------------------------------------------------------------
103 AddRange (const Range& range);
108 //------------------------------------------------------------------
109 /// @copydoc SymbolContextScope::CalculateSymbolContext(SymbolContext*)
111 /// @see SymbolContextScope
112 //------------------------------------------------------------------
114 CalculateSymbolContext(SymbolContext* sc);
116 virtual lldb::ModuleSP
117 CalculateSymbolContextModule ();
119 virtual CompileUnit *
120 CalculateSymbolContextCompileUnit ();
123 CalculateSymbolContextFunction ();
126 CalculateSymbolContextBlock ();
128 //------------------------------------------------------------------
129 /// Check if an offset is in one of the block offset ranges.
131 /// @param[in] range_offset
132 /// An offset into the Function's address range.
135 /// Returns \b true if \a range_offset falls in one of this
136 /// block's ranges, \b false otherwise.
137 //------------------------------------------------------------------
139 Contains (lldb::addr_t range_offset) const;
141 //------------------------------------------------------------------
142 /// Check if a offset range is in one of the block offset ranges.
145 /// An offset range into the Function's address range.
148 /// Returns \b true if \a range falls in one of this
149 /// block's ranges, \b false otherwise.
150 //------------------------------------------------------------------
152 Contains (const Range& range) const;
154 //------------------------------------------------------------------
155 /// Check if this object contains "block" as a child block at any
159 /// A potential child block.
162 /// Returns \b true if \a block is a child of this block, \b
164 //------------------------------------------------------------------
166 Contains (const Block *block) const;
168 //------------------------------------------------------------------
169 /// Dump the block contents.
172 /// The stream to which to dump the object descripton.
174 /// @param[in] base_addr
175 /// The resolved start address of the Function's address
176 /// range. This should be resolved as the file or load address
177 /// prior to passing the value into this function for dumping.
180 /// Limit the number of levels deep that this function should
181 /// print as this block can contain child blocks. Specify
182 /// INT_MAX to dump all child blocks.
184 /// @param[in] show_context
185 /// If \b true, variables will dump their context information.
186 //------------------------------------------------------------------
188 Dump (Stream *s, lldb::addr_t base_addr, int32_t depth, bool show_context) const;
190 //------------------------------------------------------------------
191 /// @copydoc SymbolContextScope::DumpSymbolContext(Stream*)
193 /// @see SymbolContextScope
194 //------------------------------------------------------------------
196 DumpSymbolContext(Stream *s);
199 DumpAddressRanges (Stream *s,
200 lldb::addr_t base_addr);
203 GetDescription (Stream *s,
205 lldb::DescriptionLevel level,
206 Target *target) const;
208 //------------------------------------------------------------------
209 /// Get the parent block.
212 /// The parent block pointer, or NULL if this block has no
214 //------------------------------------------------------------------
219 //------------------------------------------------------------------
220 /// Get the inlined block that contains this block.
223 /// If this block contains inlined function info, it will return
224 /// this block, else parent blocks will be searched to see if
225 /// any contain this block. NULL will be returned if this block
226 /// nor any parent blocks are inlined function blocks.
227 //------------------------------------------------------------------
229 GetContainingInlinedBlock ();
231 //------------------------------------------------------------------
232 /// Get the inlined parent block for this block.
235 /// The parent block pointer, or NULL if this block has no
237 //------------------------------------------------------------------
241 //------------------------------------------------------------------
242 /// Get the sibling block for this block.
245 /// The sibling block pointer, or NULL if this block has no
247 //------------------------------------------------------------------
251 //------------------------------------------------------------------
252 /// Get the first child block.
255 /// The first child block pointer, or NULL if this block has no
257 //------------------------------------------------------------------
259 GetFirstChild () const
261 if (m_children.empty())
263 return m_children.front().get();
266 //------------------------------------------------------------------
267 /// Get the variable list for this block only.
269 /// @param[in] can_create
270 /// If \b true, the variables can be parsed if they already
271 /// haven't been, else the current state of the block will be
275 /// A variable list shared pointer that contains all variables
277 //------------------------------------------------------------------
279 GetBlockVariableList (bool can_create);
282 //------------------------------------------------------------------
283 /// Get the variable list for this block and optionally all child
284 /// blocks if \a get_child_variables is \b true.
286 /// @param[in] get_child_variables
287 /// If \b true, all variables from all child blocks will be
288 /// added to the variable list.
290 /// @param[in] can_create
291 /// If \b true, the variables can be parsed if they already
292 /// haven't been, else the current state of the block will be
293 /// returned. Passing \b true for this parameter can be used
294 /// to see the current state of what has been parsed up to this
297 /// @param[in] add_inline_child_block_variables
298 /// If this is \b false, no child variables of child blocks
299 /// that are inlined functions will be gotten. If \b true then
300 /// all child variables will be added regardless of whether they
301 /// come from inlined functions or not.
304 /// A variable list shared pointer that contains all variables
306 //------------------------------------------------------------------
308 AppendBlockVariables (bool can_create,
309 bool get_child_block_variables,
310 bool stop_if_child_block_is_inlined_function,
311 VariableList *variable_list);
313 //------------------------------------------------------------------
314 /// Appends the variables from this block, and optionally from all
315 /// parent blocks, to \a variable_list.
317 /// @param[in] can_create
318 /// If \b true, the variables can be parsed if they already
319 /// haven't been, else the current state of the block will be
320 /// returned. Passing \b true for this parameter can be used
321 /// to see the current state of what has been parsed up to this
324 /// @param[in] get_parent_variables
325 /// If \b true, all variables from all parent blocks will be
326 /// added to the variable list.
328 /// @param[in] stop_if_block_is_inlined_function
329 /// If \b true, all variables from all parent blocks will be
330 /// added to the variable list until there are no parent blocks
331 /// or the parent block has inlined function info.
333 /// @param[in/out] variable_list
334 /// All variables in this block, and optionally all parent
335 /// blocks will be added to this list.
338 /// The number of variable that were appended to \a
340 //------------------------------------------------------------------
342 AppendVariables (bool can_create,
343 bool get_parent_variables,
344 bool stop_if_block_is_inlined_function,
345 VariableList *variable_list);
347 //------------------------------------------------------------------
348 /// Get const accessor for any inlined function information.
351 /// A comst pointer to any inlined function information, or NULL
352 /// if this is a regular block.
353 //------------------------------------------------------------------
354 const InlineFunctionInfo*
355 GetInlinedFunctionInfo () const
357 return m_inlineInfoSP.get();
361 GetClangDeclContext();
363 //------------------------------------------------------------------
364 /// Get the memory cost of this object.
366 /// Returns the cost of this object plus any owned objects from the
367 /// ranges, variables, and inline function information.
370 /// The number of bytes that this object occupies in memory.
371 //------------------------------------------------------------------
375 //------------------------------------------------------------------
376 /// Set accessor for any inlined function information.
379 /// The method name for the inlined function. This value should
382 /// @param[in] mangled
383 /// The mangled method name for the inlined function. This can
384 /// be NULL if there is no mangled name for an inlined function
385 /// or if the name is the same as \a name.
387 /// @param[in] decl_ptr
388 /// A optional pointer to declaration information for the
389 /// inlined function information. This value can be NULL to
390 /// indicate that no declaration information is available.
392 /// @param[in] call_decl_ptr
393 /// Optional calling location declaration information that
394 /// describes from where this inlined function was called.
395 //------------------------------------------------------------------
397 SetInlinedFunctionInfo (const char *name,
399 const Declaration *decl_ptr,
400 const Declaration *call_decl_ptr);
404 SetParentScope (SymbolContextScope *parent_scope)
406 m_parent_scope = parent_scope;
409 //------------------------------------------------------------------
410 /// Set accessor for the variable list.
412 /// Called by the SymbolFile plug-ins after they have parsed the
413 /// variable lists and are ready to hand ownership of the list over
416 /// @param[in] variable_list_sp
417 /// A shared pointer to a VariableList.
418 //------------------------------------------------------------------
420 SetVariableList (lldb::VariableListSP& variable_list_sp)
422 m_variable_list_sp = variable_list_sp;
428 BlockInfoHasBeenParsed() const
430 return m_parsed_block_info;
434 SetBlockInfoHasBeenParsed (bool b, bool set_children);
437 FindBlockByID (lldb::user_id_t block_id);
440 GetNumRanges () const
442 return m_ranges.GetSize();
446 GetRangeContainingOffset (const lldb::addr_t offset, Range &range);
449 GetRangeContainingAddress (const Address& addr, AddressRange &range);
452 GetRangeContainingLoadAddress (lldb::addr_t load_addr, Target &target, AddressRange &range);
455 GetRangeIndexContainingAddress (const Address& addr);
457 //------------------------------------------------------------------
458 // Since blocks might have multiple discontiguous addresss ranges,
459 // we need to be able to get at any of the address ranges in a block.
460 //------------------------------------------------------------------
462 GetRangeAtIndex (uint32_t range_idx,
463 AddressRange &range);
466 GetStartAddress (Address &addr);
469 SetDidParseVariables (bool b, bool set_children);
472 typedef std::vector<lldb::BlockSP> collection;
473 //------------------------------------------------------------------
475 //------------------------------------------------------------------
476 SymbolContextScope *m_parent_scope;
477 collection m_children;
479 lldb::InlineFunctionInfoSP m_inlineInfoSP; ///< Inlined function information.
480 lldb::VariableListSP m_variable_list_sp; ///< The variable list for all local, static and paramter variables scoped to this block.
481 bool m_parsed_block_info:1, ///< Set to true if this block and it's children have all been parsed
482 m_parsed_block_variables:1,
483 m_parsed_child_blocks:1;
485 // A parent of child blocks can be asked to find a sibling block given
486 // one of its child blocks
488 GetSiblingForChild (const Block *child_block) const;
491 DISALLOW_COPY_AND_ASSIGN (Block);
495 } // namespace lldb_private
497 #endif // liblldb_Block_h_