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/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 
21 namespace 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 //----------------------------------------------------------------------
41 class Block :
42     public UserID,
43     public SymbolContextScope
44 {
45 public:
46     typedef RangeArray<uint32_t, uint32_t, 1> RangeList;
47     typedef RangeList::Entry Range;
48 
49     //------------------------------------------------------------------
50     /// Construct with a User ID \a uid, \a depth.
51     ///
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.
56     ///
57     /// @param[in] uid
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.
64     ///
65     /// @param[in] depth
66     ///     The integer depth of this block in the block list hierarchy.
67     ///
68     /// @param[in] block_list
69     ///     The block list that this object belongs to.
70     ///
71     /// @see BlockList
72     //------------------------------------------------------------------
73     Block (lldb::user_id_t uid);
74 
75     //------------------------------------------------------------------
76     /// Destructor.
77     //------------------------------------------------------------------
78     virtual ~Block ();
79 
80     //------------------------------------------------------------------
81     /// Add a child to this object.
82     ///
83     /// @param[in] child_block_sp
84     ///     A shared pointer to a child block that will get added to
85     ///     this block.
86     //------------------------------------------------------------------
87     void
88     AddChild (const lldb::BlockSP &child_block_sp);
89 
90     //------------------------------------------------------------------
91     /// Add a new offset range to this block.
92     ///
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.
96     ///
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     //------------------------------------------------------------------
101     void
102     AddRange (const Range& range);
103 
104     void
105     FinalizeRanges ();
106 
107     //------------------------------------------------------------------
108     /// @copydoc SymbolContextScope::CalculateSymbolContext(SymbolContext*)
109     ///
110     /// @see SymbolContextScope
111     //------------------------------------------------------------------
112     virtual void
113     CalculateSymbolContext(SymbolContext* sc);
114 
115     virtual lldb::ModuleSP
116     CalculateSymbolContextModule ();
117 
118     virtual CompileUnit *
119     CalculateSymbolContextCompileUnit ();
120 
121     virtual Function *
122     CalculateSymbolContextFunction ();
123 
124     virtual Block *
125     CalculateSymbolContextBlock ();
126 
127     //------------------------------------------------------------------
128     /// Check if an offset is in one of the block offset ranges.
129     ///
130     /// @param[in] range_offset
131     ///     An offset into the Function's address range.
132     ///
133     /// @return
134     ///     Returns \b true if \a range_offset falls in one of this
135     ///     block's ranges, \b false otherwise.
136     //------------------------------------------------------------------
137     bool
138     Contains (lldb::addr_t range_offset) const;
139 
140     //------------------------------------------------------------------
141     /// Check if a offset range is in one of the block offset ranges.
142     ///
143     /// @param[in] range
144     ///     An offset range into the Function's address range.
145     ///
146     /// @return
147     ///     Returns \b true if \a range falls in one of this
148     ///     block's ranges, \b false otherwise.
149     //------------------------------------------------------------------
150     bool
151     Contains (const Range& range) const;
152 
153     //------------------------------------------------------------------
154     /// Check if this object contains "block" as a child block at any
155     /// depth.
156     ///
157     /// @param[in] block
158     ///     A potential child block.
159     ///
160     /// @return
161     ///     Returns \b true if \a block is a child of this block, \b
162     ///     false otherwise.
163     //------------------------------------------------------------------
164     bool
165     Contains (const Block *block) const;
166 
167     //------------------------------------------------------------------
168     /// Dump the block contents.
169     ///
170     /// @param[in] s
171     ///     The stream to which to dump the object descripton.
172     ///
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.
177     ///
178     /// @param[in] depth
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.
182     ///
183     /// @param[in] show_context
184     ///     If \b true, variables will dump their context information.
185     //------------------------------------------------------------------
186     void
187     Dump (Stream *s, lldb::addr_t base_addr, int32_t depth, bool show_context) const;
188 
189     //------------------------------------------------------------------
190     /// @copydoc SymbolContextScope::DumpSymbolContext(Stream*)
191     ///
192     /// @see SymbolContextScope
193     //------------------------------------------------------------------
194     virtual void
195     DumpSymbolContext(Stream *s);
196 
197     void
198     DumpAddressRanges (Stream *s,
199                        lldb::addr_t base_addr);
200 
201     void
202     GetDescription (Stream *s,
203                     Function *function,
204                     lldb::DescriptionLevel level,
205                     Target *target) const;
206 
207     //------------------------------------------------------------------
208     /// Get the parent block.
209     ///
210     /// @return
211     ///     The parent block pointer, or NULL if this block has no
212     ///     parent.
213     //------------------------------------------------------------------
214     Block *
215     GetParent () const;
216 
217 
218     //------------------------------------------------------------------
219     /// Get the inlined block that contains this block.
220     ///
221     /// @return
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     //------------------------------------------------------------------
227     Block *
228     GetContainingInlinedBlock ();
229 
230     //------------------------------------------------------------------
231     /// Get the inlined parent block for this block.
232     ///
233     /// @return
234     ///     The parent block pointer, or NULL if this block has no
235     ///     parent.
236     //------------------------------------------------------------------
237     Block *
238     GetInlinedParent ();
239 
240     //------------------------------------------------------------------
241     /// Get the sibling block for this block.
242     ///
243     /// @return
244     ///     The sibling block pointer, or NULL if this block has no
245     ///     sibling.
246     //------------------------------------------------------------------
247     Block *
248     GetSibling () const;
249 
250     //------------------------------------------------------------------
251     /// Get the first child block.
252     ///
253     /// @return
254     ///     The first child block pointer, or NULL if this block has no
255     ///     children.
256     //------------------------------------------------------------------
257     Block *
GetFirstChild()258     GetFirstChild () const
259     {
260         if (m_children.empty())
261             return NULL;
262         return m_children.front().get();
263     }
264 
265     //------------------------------------------------------------------
266     /// Get the variable list for this block only.
267     ///
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
271     ///     returned.
272     ///
273     /// @return
274     ///     A variable list shared pointer that contains all variables
275     ///     for this block.
276     //------------------------------------------------------------------
277     lldb::VariableListSP
278     GetBlockVariableList (bool can_create);
279 
280 
281     //------------------------------------------------------------------
282     /// Get the variable list for this block and optionally all child
283     /// blocks if \a get_child_variables is \b true.
284     ///
285     /// @param[in] get_child_variables
286     ///     If \b true, all variables from all child blocks will be
287     ///     added to the variable list.
288     ///
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
294     ///     point.
295     ///
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.
301     ///
302     /// @return
303     ///     A variable list shared pointer that contains all variables
304     ///     for this block.
305     //------------------------------------------------------------------
306     uint32_t
307     AppendBlockVariables (bool can_create,
308                           bool get_child_block_variables,
309                           bool stop_if_child_block_is_inlined_function,
310                           VariableList *variable_list);
311 
312     //------------------------------------------------------------------
313     /// Appends the variables from this block, and optionally from all
314     /// parent blocks, to \a variable_list.
315     ///
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
321     ///     point.
322     ///
323     /// @param[in] get_parent_variables
324     ///     If \b true, all variables from all parent blocks will be
325     ///     added to the variable list.
326     ///
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.
331     ///
332     /// @param[in/out] variable_list
333     ///     All variables in this block, and optionally all parent
334     ///     blocks will be added to this list.
335     ///
336     /// @return
337     ///     The number of variable that were appended to \a
338     ///     variable_list.
339     //------------------------------------------------------------------
340     uint32_t
341     AppendVariables (bool can_create,
342                      bool get_parent_variables,
343                      bool stop_if_block_is_inlined_function,
344                      VariableList *variable_list);
345 
346     //------------------------------------------------------------------
347     /// Get const accessor for any inlined function information.
348     ///
349     /// @return
350     ///     A comst pointer to any inlined function information, or NULL
351     ///     if this is a regular block.
352     //------------------------------------------------------------------
353     const InlineFunctionInfo*
GetInlinedFunctionInfo()354     GetInlinedFunctionInfo () const
355     {
356         return m_inlineInfoSP.get();
357     }
358 
359     clang::DeclContext *
360     GetClangDeclContext();
361 
362     //------------------------------------------------------------------
363     /// Get the memory cost of this object.
364     ///
365     /// Returns the cost of this object plus any owned objects from the
366     /// ranges, variables, and inline function information.
367     ///
368     /// @return
369     ///     The number of bytes that this object occupies in memory.
370     //------------------------------------------------------------------
371     size_t
372     MemorySize() const;
373 
374     //------------------------------------------------------------------
375     /// Set accessor for any inlined function information.
376     ///
377     /// @param[in] name
378     ///     The method name for the inlined function. This value should
379     ///     not be NULL.
380     ///
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.
385     ///
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.
390     ///
391     /// @param[in] call_decl_ptr
392     ///     Optional calling location declaration information that
393     ///     describes from where this inlined function was called.
394     //------------------------------------------------------------------
395     void
396     SetInlinedFunctionInfo (const char *name,
397                             const char *mangled,
398                             const Declaration *decl_ptr,
399                             const Declaration *call_decl_ptr);
400 
401 
402     void
SetParentScope(SymbolContextScope * parent_scope)403     SetParentScope (SymbolContextScope *parent_scope)
404     {
405         m_parent_scope = parent_scope;
406     }
407 
408     //------------------------------------------------------------------
409     /// Set accessor for the variable list.
410     ///
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
413     /// to this object.
414     ///
415     /// @param[in] variable_list_sp
416     ///     A shared pointer to a VariableList.
417     //------------------------------------------------------------------
418     void
SetVariableList(lldb::VariableListSP & variable_list_sp)419     SetVariableList (lldb::VariableListSP& variable_list_sp)
420     {
421         m_variable_list_sp = variable_list_sp;
422     }
423 
424 
425 
426     bool
BlockInfoHasBeenParsed()427     BlockInfoHasBeenParsed() const
428     {
429         return m_parsed_block_info;
430     }
431 
432     void
433     SetBlockInfoHasBeenParsed (bool b, bool set_children);
434 
435     Block *
436     FindBlockByID (lldb::user_id_t block_id);
437 
438     size_t
GetNumRanges()439     GetNumRanges () const
440     {
441         return m_ranges.GetSize();
442     }
443 
444     bool
445     GetRangeContainingOffset (const lldb::addr_t offset, Range &range);
446 
447     bool
448     GetRangeContainingAddress (const Address& addr, AddressRange &range);
449 
450     bool
451     GetRangeContainingLoadAddress (lldb::addr_t load_addr, Target &target, AddressRange &range);
452 
453     uint32_t
454     GetRangeIndexContainingAddress (const Address& addr);
455 
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     //------------------------------------------------------------------
460     bool
461     GetRangeAtIndex (uint32_t range_idx,
462                      AddressRange &range);
463 
464     bool
465     GetStartAddress (Address &addr);
466 
467     void
468     SetDidParseVariables (bool b, bool set_children);
469 
470 protected:
471     typedef std::vector<lldb::BlockSP> collection;
472     //------------------------------------------------------------------
473     // Member variables.
474     //------------------------------------------------------------------
475     SymbolContextScope *m_parent_scope;
476     collection m_children;
477     RangeList m_ranges;
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;
483 
484     // A parent of child blocks can be asked to find a sibling block given
485     // one of its child blocks
486     Block *
487     GetSiblingForChild (const Block *child_block) const;
488 
489 private:
490     DISALLOW_COPY_AND_ASSIGN (Block);
491 };
492 
493 
494 } // namespace lldb_private
495 
496 #endif  // liblldb_Block_h_
497