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"
21 namespace lldb_private {
23 //----------------------------------------------------------------------
24 /// @class Block Block.h "lldb/Symbol/Block.h"
25 /// @brief A class that describes a single lexical block.
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.
34 /// Each block has a variable list that represents local, argument, and
35 /// static variables that are scoped to the block.
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 //----------------------------------------------------------------------
43 public SymbolContextScope
46 typedef RangeArray<uint32_t, uint32_t, 1> RangeList;
47 typedef RangeList::Entry Range;
49 //------------------------------------------------------------------
50 /// Construct with a User ID \a uid, \a depth.
52 /// Initialize this block with the specified UID \a uid. The
53 /// \a depth in the \a block_list is used to represent the parent,
54 /// sibling, and child block information and also allows for partial
55 /// parsing at the block level.
58 /// The UID for a given block. This value is given by the
59 /// SymbolFile plug-in and can be any value that helps the
60 /// SymbolFile plug-in to match this block back to the debug
61 /// information data that it parses for further or more in
62 /// depth parsing. Common values would be the index into a
63 /// table, or an offset into the debug information.
66 /// The integer depth of this block in the block list hierarchy.
68 /// @param[in] block_list
69 /// The block list that this object belongs to.
72 //------------------------------------------------------------------
73 Block (lldb::user_id_t uid);
75 //------------------------------------------------------------------
77 //------------------------------------------------------------------
80 //------------------------------------------------------------------
81 /// Add a child to this object.
83 /// @param[in] child_block_sp
84 /// A shared pointer to a child block that will get added to
86 //------------------------------------------------------------------
88 AddChild (const lldb::BlockSP &child_block_sp);
90 //------------------------------------------------------------------
91 /// Add a new offset range to this block.
93 /// @param[in] start_offset
94 /// An offset into this Function's address range that
95 /// describes the start address of a range for this block.
97 /// @param[in] end_offset
98 /// An offset into this Function's address range that
99 /// describes the end address of a range for this block.
100 //------------------------------------------------------------------
102 AddRange (const Range& range);
107 //------------------------------------------------------------------
108 /// @copydoc SymbolContextScope::CalculateSymbolContext(SymbolContext*)
110 /// @see SymbolContextScope
111 //------------------------------------------------------------------
113 CalculateSymbolContext(SymbolContext* sc);
115 virtual lldb::ModuleSP
116 CalculateSymbolContextModule ();
118 virtual CompileUnit *
119 CalculateSymbolContextCompileUnit ();
122 CalculateSymbolContextFunction ();
125 CalculateSymbolContextBlock ();
127 //------------------------------------------------------------------
128 /// Check if an offset is in one of the block offset ranges.
130 /// @param[in] range_offset
131 /// An offset into the Function's address range.
134 /// Returns \b true if \a range_offset falls in one of this
135 /// block's ranges, \b false otherwise.
136 //------------------------------------------------------------------
138 Contains (lldb::addr_t range_offset) const;
140 //------------------------------------------------------------------
141 /// Check if a offset range is in one of the block offset ranges.
144 /// An offset range into the Function's address range.
147 /// Returns \b true if \a range falls in one of this
148 /// block's ranges, \b false otherwise.
149 //------------------------------------------------------------------
151 Contains (const Range& range) const;
153 //------------------------------------------------------------------
154 /// Check if this object contains "block" as a child block at any
158 /// A potential child block.
161 /// Returns \b true if \a block is a child of this block, \b
163 //------------------------------------------------------------------
165 Contains (const Block *block) const;
167 //------------------------------------------------------------------
168 /// Dump the block contents.
171 /// The stream to which to dump the object descripton.
173 /// @param[in] base_addr
174 /// The resolved start address of the Function's address
175 /// range. This should be resolved as the file or load address
176 /// prior to passing the value into this function for dumping.
179 /// Limit the number of levels deep that this function should
180 /// print as this block can contain child blocks. Specify
181 /// INT_MAX to dump all child blocks.
183 /// @param[in] show_context
184 /// If \b true, variables will dump their context information.
185 //------------------------------------------------------------------
187 Dump (Stream *s, lldb::addr_t base_addr, int32_t depth, bool show_context) const;
189 //------------------------------------------------------------------
190 /// @copydoc SymbolContextScope::DumpSymbolContext(Stream*)
192 /// @see SymbolContextScope
193 //------------------------------------------------------------------
195 DumpSymbolContext(Stream *s);
198 DumpAddressRanges (Stream *s,
199 lldb::addr_t base_addr);
202 GetDescription (Stream *s,
204 lldb::DescriptionLevel level,
205 Target *target) const;
207 //------------------------------------------------------------------
208 /// Get the parent block.
211 /// The parent block pointer, or NULL if this block has no
213 //------------------------------------------------------------------
218 //------------------------------------------------------------------
219 /// Get the inlined block that contains this block.
222 /// If this block contains inlined function info, it will return
223 /// this block, else parent blocks will be searched to see if
224 /// any contain this block. NULL will be returned if this block
225 /// nor any parent blocks are inlined function blocks.
226 //------------------------------------------------------------------
228 GetContainingInlinedBlock ();
230 //------------------------------------------------------------------
231 /// Get the inlined parent block for this block.
234 /// The parent block pointer, or NULL if this block has no
236 //------------------------------------------------------------------
240 //------------------------------------------------------------------
241 /// Get the sibling block for this block.
244 /// The sibling block pointer, or NULL if this block has no
246 //------------------------------------------------------------------
250 //------------------------------------------------------------------
251 /// Get the first child block.
254 /// The first child block pointer, or NULL if this block has no
256 //------------------------------------------------------------------
258 GetFirstChild () const
260 if (m_children.empty())
262 return m_children.front().get();
265 //------------------------------------------------------------------
266 /// Get the variable list for this block only.
268 /// @param[in] can_create
269 /// If \b true, the variables can be parsed if they already
270 /// haven't been, else the current state of the block will be
274 /// A variable list shared pointer that contains all variables
276 //------------------------------------------------------------------
278 GetBlockVariableList (bool can_create);
281 //------------------------------------------------------------------
282 /// Get the variable list for this block and optionally all child
283 /// blocks if \a get_child_variables is \b true.
285 /// @param[in] get_child_variables
286 /// If \b true, all variables from all child blocks will be
287 /// added to the variable list.
289 /// @param[in] can_create
290 /// If \b true, the variables can be parsed if they already
291 /// haven't been, else the current state of the block will be
292 /// returned. Passing \b true for this parameter can be used
293 /// to see the current state of what has been parsed up to this
296 /// @param[in] add_inline_child_block_variables
297 /// If this is \b false, no child variables of child blocks
298 /// that are inlined functions will be gotten. If \b true then
299 /// all child variables will be added regardless of whether they
300 /// come from inlined functions or not.
303 /// A variable list shared pointer that contains all variables
305 //------------------------------------------------------------------
307 AppendBlockVariables (bool can_create,
308 bool get_child_block_variables,
309 bool stop_if_child_block_is_inlined_function,
310 VariableList *variable_list);
312 //------------------------------------------------------------------
313 /// Appends the variables from this block, and optionally from all
314 /// parent blocks, to \a variable_list.
316 /// @param[in] can_create
317 /// If \b true, the variables can be parsed if they already
318 /// haven't been, else the current state of the block will be
319 /// returned. Passing \b true for this parameter can be used
320 /// to see the current state of what has been parsed up to this
323 /// @param[in] get_parent_variables
324 /// If \b true, all variables from all parent blocks will be
325 /// added to the variable list.
327 /// @param[in] stop_if_block_is_inlined_function
328 /// If \b true, all variables from all parent blocks will be
329 /// added to the variable list until there are no parent blocks
330 /// or the parent block has inlined function info.
332 /// @param[in/out] variable_list
333 /// All variables in this block, and optionally all parent
334 /// blocks will be added to this list.
337 /// The number of variable that were appended to \a
339 //------------------------------------------------------------------
341 AppendVariables (bool can_create,
342 bool get_parent_variables,
343 bool stop_if_block_is_inlined_function,
344 VariableList *variable_list);
346 //------------------------------------------------------------------
347 /// Get const accessor for any inlined function information.
350 /// A comst pointer to any inlined function information, or NULL
351 /// if this is a regular block.
352 //------------------------------------------------------------------
353 const InlineFunctionInfo*
354 GetInlinedFunctionInfo () const
356 return m_inlineInfoSP.get();
360 GetClangDeclContext();
362 //------------------------------------------------------------------
363 /// Get the memory cost of this object.
365 /// Returns the cost of this object plus any owned objects from the
366 /// ranges, variables, and inline function information.
369 /// The number of bytes that this object occupies in memory.
370 //------------------------------------------------------------------
374 //------------------------------------------------------------------
375 /// Set accessor for any inlined function information.
378 /// The method name for the inlined function. This value should
381 /// @param[in] mangled
382 /// The mangled method name for the inlined function. This can
383 /// be NULL if there is no mangled name for an inlined function
384 /// or if the name is the same as \a name.
386 /// @param[in] decl_ptr
387 /// A optional pointer to declaration information for the
388 /// inlined function information. This value can be NULL to
389 /// indicate that no declaration information is available.
391 /// @param[in] call_decl_ptr
392 /// Optional calling location declaration information that
393 /// describes from where this inlined function was called.
394 //------------------------------------------------------------------
396 SetInlinedFunctionInfo (const char *name,
398 const Declaration *decl_ptr,
399 const Declaration *call_decl_ptr);
403 SetParentScope (SymbolContextScope *parent_scope)
405 m_parent_scope = parent_scope;
408 //------------------------------------------------------------------
409 /// Set accessor for the variable list.
411 /// Called by the SymbolFile plug-ins after they have parsed the
412 /// variable lists and are ready to hand ownership of the list over
415 /// @param[in] variable_list_sp
416 /// A shared pointer to a VariableList.
417 //------------------------------------------------------------------
419 SetVariableList (lldb::VariableListSP& variable_list_sp)
421 m_variable_list_sp = variable_list_sp;
427 BlockInfoHasBeenParsed() const
429 return m_parsed_block_info;
433 SetBlockInfoHasBeenParsed (bool b, bool set_children);
436 FindBlockByID (lldb::user_id_t block_id);
439 GetNumRanges () const
441 return m_ranges.GetSize();
445 GetRangeContainingOffset (const lldb::addr_t offset, Range &range);
448 GetRangeContainingAddress (const Address& addr, AddressRange &range);
451 GetRangeContainingLoadAddress (lldb::addr_t load_addr, Target &target, AddressRange &range);
454 GetRangeIndexContainingAddress (const Address& addr);
456 //------------------------------------------------------------------
457 // Since blocks might have multiple discontiguous addresss ranges,
458 // we need to be able to get at any of the address ranges in a block.
459 //------------------------------------------------------------------
461 GetRangeAtIndex (uint32_t range_idx,
462 AddressRange &range);
465 GetStartAddress (Address &addr);
468 SetDidParseVariables (bool b, bool set_children);
471 typedef std::vector<lldb::BlockSP> collection;
472 //------------------------------------------------------------------
474 //------------------------------------------------------------------
475 SymbolContextScope *m_parent_scope;
476 collection m_children;
478 lldb::InlineFunctionInfoSP m_inlineInfoSP; ///< Inlined function information.
479 lldb::VariableListSP m_variable_list_sp; ///< The variable list for all local, static and paramter variables scoped to this block.
480 bool m_parsed_block_info:1, ///< Set to true if this block and it's children have all been parsed
481 m_parsed_block_variables:1,
482 m_parsed_child_blocks:1;
484 // A parent of child blocks can be asked to find a sibling block given
485 // one of its child blocks
487 GetSiblingForChild (const Block *child_block) const;
490 DISALLOW_COPY_AND_ASSIGN (Block);
494 } // namespace lldb_private
496 #endif // liblldb_Block_h_