Coverage Report

Created: 2023-09-21 18:56

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Target/StackFrame.h
Line
Count
Source
1
//===-- StackFrame.h --------------------------------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#ifndef LLDB_TARGET_STACKFRAME_H
10
#define LLDB_TARGET_STACKFRAME_H
11
12
#include <memory>
13
#include <mutex>
14
15
#include "lldb/Utility/Flags.h"
16
17
#include "lldb/Core/ValueObjectList.h"
18
#include "lldb/Symbol/SymbolContext.h"
19
#include "lldb/Target/ExecutionContextScope.h"
20
#include "lldb/Target/StackID.h"
21
#include "lldb/Utility/Scalar.h"
22
#include "lldb/Utility/Status.h"
23
#include "lldb/Utility/StreamString.h"
24
#include "lldb/Utility/UserID.h"
25
26
namespace lldb_private {
27
28
/// \class StackFrame StackFrame.h "lldb/Target/StackFrame.h"
29
///
30
/// This base class provides an interface to stack frames.
31
///
32
/// StackFrames may have a Canonical Frame Address (CFA) or not.
33
/// A frame may have a plain pc value or it may  indicate a specific point in
34
/// the debug session so the correct section load list is used for
35
/// symbolication.
36
///
37
/// Local variables may be available, or not.  A register context may be
38
/// available, or not.
39
40
class StackFrame : public ExecutionContextScope,
41
                   public std::enable_shared_from_this<StackFrame> {
42
public:
43
  enum ExpressionPathOption {
44
    eExpressionPathOptionCheckPtrVsMember = (1u << 0),
45
    eExpressionPathOptionsNoFragileObjcIvar = (1u << 1),
46
    eExpressionPathOptionsNoSyntheticChildren = (1u << 2),
47
    eExpressionPathOptionsNoSyntheticArrayRange = (1u << 3),
48
    eExpressionPathOptionsAllowDirectIVarAccess = (1u << 4),
49
    eExpressionPathOptionsInspectAnonymousUnions = (1u << 5)
50
  };
51
52
  enum class Kind {
53
    /// A regular stack frame with access to registers and local variables.
54
    Regular,
55
56
    /// A historical stack frame -- possibly without CFA or registers or
57
    /// local variables.
58
    History,
59
60
    /// An artificial stack frame (e.g. a synthesized result of inferring
61
    /// missing tail call frames from a backtrace) with limited support for
62
    /// local variables.
63
    Artificial
64
  };
65
66
  /// Construct a StackFrame object without supplying a RegisterContextSP.
67
  ///
68
  /// This is the one constructor that doesn't take a RegisterContext
69
  /// parameter.  This ctor may be called when creating a history StackFrame;
70
  /// these are used if we've collected a stack trace of pc addresses at some
71
  /// point in the past.  We may only have pc values. We may have a CFA,
72
  /// or more likely, we won't.
73
  ///
74
  /// \param [in] thread_sp
75
  ///   The Thread that this frame belongs to.
76
  ///
77
  /// \param [in] frame_idx
78
  ///   This StackFrame's frame index number in the Thread.  If inlined stack
79
  ///   frames are being created, this may differ from the concrete_frame_idx
80
  ///   which is the frame index without any inlined stack frames.
81
  ///
82
  /// \param [in] concrete_frame_idx
83
  ///   The StackFrame's frame index number in the Thread without any inlined
84
  ///   stack frames being included in the index.
85
  ///
86
  /// \param [in] cfa
87
  ///   The Canonical Frame Address (this terminology from DWARF) for this
88
  ///   stack frame.  The CFA for a stack frame does not change over the
89
  ///   span of the stack frame's existence.  It is often the value of the
90
  ///   caller's stack pointer before the call instruction into this frame's
91
  ///   function.  It is usually not the same as the frame pointer register's
92
  ///   value.
93
  ///
94
  /// \param [in] cfa_is_valid
95
  ///   A history stack frame may not have a CFA value collected.  We want to
96
  ///   distinguish between "no CFA available" and a CFA of
97
  ///   LLDB_INVALID_ADDRESS.
98
  ///
99
  /// \param [in] pc
100
  ///   The current pc value of this stack frame.
101
  ///
102
  /// \param [in] sc_ptr
103
  ///   Optionally seed the StackFrame with the SymbolContext information that
104
  ///   has
105
  ///   already been discovered.
106
  StackFrame(const lldb::ThreadSP &thread_sp, lldb::user_id_t frame_idx,
107
             lldb::user_id_t concrete_frame_idx, lldb::addr_t cfa,
108
             bool cfa_is_valid, lldb::addr_t pc, Kind frame_kind,
109
             bool behaves_like_zeroth_frame, const SymbolContext *sc_ptr);
110
111
  StackFrame(const lldb::ThreadSP &thread_sp, lldb::user_id_t frame_idx,
112
             lldb::user_id_t concrete_frame_idx,
113
             const lldb::RegisterContextSP &reg_context_sp, lldb::addr_t cfa,
114
             lldb::addr_t pc, bool behaves_like_zeroth_frame,
115
             const SymbolContext *sc_ptr);
116
117
  StackFrame(const lldb::ThreadSP &thread_sp, lldb::user_id_t frame_idx,
118
             lldb::user_id_t concrete_frame_idx,
119
             const lldb::RegisterContextSP &reg_context_sp, lldb::addr_t cfa,
120
             const Address &pc, bool behaves_like_zeroth_frame,
121
             const SymbolContext *sc_ptr);
122
123
  ~StackFrame() override;
124
125
1.32M
  lldb::ThreadSP GetThread() const { return m_thread_wp.lock(); }
126
127
  StackID &GetStackID();
128
129
  /// Get an Address for the current pc value in this StackFrame.
130
  ///
131
  /// May not be the same as the actual PC value for inlined stack frames.
132
  ///
133
  /// \return
134
  ///   The Address object set to the current PC value.
135
  const Address &GetFrameCodeAddress();
136
137
  /// Get the current code Address suitable for symbolication,
138
  /// may not be the same as GetFrameCodeAddress().
139
  ///
140
  /// For a frame in the middle of the stack, the return-pc is the
141
  /// current code address, but for symbolication purposes the
142
  /// return address after a noreturn call may point to the next
143
  /// function, a DWARF location list entry that is a completely
144
  /// different code path, or the wrong source line.
145
  ///
146
  /// The address returned should be used for symbolication (source line,
147
  /// block, function, DWARF location entry selection) but should NOT
148
  /// be shown to the user.  It may not point to an actual instruction
149
  /// boundary.
150
  ///
151
  /// \return
152
  ///   The Address object set to the current PC value.
153
  Address GetFrameCodeAddressForSymbolication();
154
155
  /// Change the pc value for a given thread.
156
  ///
157
  /// Change the current pc value for the frame on this thread.
158
  ///
159
  /// \param[in] pc
160
  ///     The load address that the pc will be set to.
161
  ///
162
  /// \return
163
  ///     true if the pc was changed.  false if this failed -- possibly
164
  ///     because this frame is not a live StackFrame.
165
  bool ChangePC(lldb::addr_t pc);
166
167
  /// Provide a SymbolContext for this StackFrame's current pc value.
168
  ///
169
  /// The StackFrame maintains this SymbolContext and adds additional
170
  /// information to it on an as-needed basis.  This helps to avoid different
171
  /// functions looking up symbolic information for a given pc value multiple
172
  /// times.
173
  ///
174
  /// \param [in] resolve_scope
175
  ///   Flags from the SymbolContextItem enumerated type which specify what
176
  ///   type of symbol context is needed by this caller.
177
  ///
178
  /// \return
179
  ///   A SymbolContext reference which includes the types of information
180
  ///   requested by resolve_scope, if they are available.
181
  const SymbolContext &GetSymbolContext(lldb::SymbolContextItem resolve_scope);
182
183
  /// Return the Canonical Frame Address (DWARF term) for this frame.
184
  ///
185
  /// The CFA is typically the value of the stack pointer register before the
186
  /// call invocation is made.  It will not change during the lifetime of a
187
  /// stack frame.  It is often not the same thing as the frame pointer
188
  /// register value.
189
  ///
190
  /// Live StackFrames will always have a CFA but other types of frames may
191
  /// not be able to supply one.
192
  ///
193
  /// \param [out] value
194
  ///   The address of the CFA for this frame, if available.
195
  ///
196
  /// \param [out] error_ptr
197
  ///   If there is an error determining the CFA address, this may contain a
198
  ///   string explaining the failure.
199
  ///
200
  /// \return
201
  ///   Returns true if the CFA value was successfully set in value.  Some
202
  ///   frames may be unable to provide this value; they will return false.
203
  bool GetFrameBaseValue(Scalar &value, Status *error_ptr);
204
205
  /// Get the DWARFExpressionList corresponding to the Canonical Frame Address.
206
  ///
207
  /// Often a register (bp), but sometimes a register + offset.
208
  ///
209
  /// \param [out] error_ptr
210
  ///   If there is an error determining the CFA address, this may contain a
211
  ///   string explaining the failure.
212
  ///
213
  /// \return
214
  ///   Returns the corresponding DWARF expression, or NULL.
215
  DWARFExpressionList *GetFrameBaseExpression(Status *error_ptr);
216
217
  /// Get the current lexical scope block for this StackFrame, if possible.
218
  ///
219
  /// If debug information is available for this stack frame, return a pointer
220
  /// to the innermost lexical Block that the frame is currently executing.
221
  ///
222
  /// \return
223
  ///   A pointer to the current Block.  nullptr is returned if this can
224
  ///   not be provided.
225
  Block *GetFrameBlock();
226
227
  /// Get the RegisterContext for this frame, if possible.
228
  ///
229
  /// Returns a shared pointer to the RegisterContext for this stack frame.
230
  /// Only a live StackFrame object will be able to return a RegisterContext -
231
  /// callers must be prepared for an empty shared pointer being returned.
232
  ///
233
  /// Even a live StackFrame RegisterContext may not be able to provide all
234
  /// registers.  Only the currently executing frame (frame 0) can reliably
235
  /// provide every register in the register context.
236
  ///
237
  /// \return
238
  ///   The RegisterContext shared point for this frame.
239
  lldb::RegisterContextSP GetRegisterContext();
240
241
3.36k
  const lldb::RegisterContextSP &GetRegisterContextSP() const {
242
3.36k
    return m_reg_context_sp;
243
3.36k
  }
244
245
  /// Retrieve the list of variables that are in scope at this StackFrame's
246
  /// pc.
247
  ///
248
  /// A frame that is not live may return an empty VariableList for a given
249
  /// pc value even though variables would be available at this point if it
250
  /// were a live stack frame.
251
  ///
252
  /// \param[in] get_file_globals
253
  ///     Whether to also retrieve compilation-unit scoped variables
254
  ///     that are visible to the entire compilation unit (e.g. file
255
  ///     static in C, globals that are homed in this CU).
256
  ///
257
  /// \param [out] error_ptr
258
  ///   If there is an error in the debug information that prevents variables
259
  ///   from being fetched. \see SymbolFile::GetFrameVariableError() for full
260
  ///   details.
261
  ///
262
  /// \return
263
  ///     A pointer to a list of variables.
264
  VariableList *GetVariableList(bool get_file_globals, Status *error_ptr);
265
266
  /// Retrieve the list of variables that are in scope at this StackFrame's
267
  /// pc.
268
  ///
269
  /// A frame that is not live may return an empty VariableListSP for a
270
  /// given pc value even though variables would be available at this point if
271
  /// it were a live stack frame.
272
  ///
273
  /// \param[in] get_file_globals
274
  ///     Whether to also retrieve compilation-unit scoped variables
275
  ///     that are visible to the entire compilation unit (e.g. file
276
  ///     static in C, globals that are homed in this CU).
277
  ///
278
  /// \return
279
  ///     A pointer to a list of variables.
280
  lldb::VariableListSP
281
  GetInScopeVariableList(bool get_file_globals,
282
                         bool must_have_valid_location = false);
283
284
  /// Create a ValueObject for a variable name / pathname, possibly including
285
  /// simple dereference/child selection syntax.
286
  ///
287
  /// \param[in] var_expr
288
  ///     The string specifying a variable to base the VariableObject off
289
  ///     of.
290
  ///
291
  /// \param[in] use_dynamic
292
  ///     Whether the correct dynamic type of an object pointer should be
293
  ///     determined before creating the object, or if the static type is
294
  ///     sufficient.  One of the DynamicValueType enumerated values.
295
  ///
296
  /// \param[in] options
297
  ///     An unsigned integer of flags, values from
298
  ///     StackFrame::ExpressionPathOption
299
  ///     enum.
300
  /// \param[in] var_sp
301
  ///     A VariableSP that will be set to the variable described in the
302
  ///     var_expr path.
303
  ///
304
  /// \param[in] error
305
  ///     Record any errors encountered while evaluating var_expr.
306
  ///
307
  /// \return
308
  ///     A shared pointer to the ValueObject described by var_expr.
309
  lldb::ValueObjectSP GetValueForVariableExpressionPath(
310
      llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic,
311
      uint32_t options, lldb::VariableSP &var_sp, Status &error);
312
313
  /// Determine whether this StackFrame has debug information available or not.
314
  ///
315
  /// \return
316
  ///    true if debug information is available for this frame (function,
317
  ///    compilation unit, block, etc.)
318
  bool HasDebugInformation();
319
320
  /// Return the disassembly for the instructions of this StackFrame's
321
  /// function as a single C string.
322
  ///
323
  /// \return
324
  ///    C string with the assembly instructions for this function.
325
  const char *Disassemble();
326
327
  /// Print a description for this frame using the frame-format formatter
328
  /// settings.
329
  ///
330
  /// \param [in] strm
331
  ///   The Stream to print the description to.
332
  ///
333
  /// \param [in] show_unique
334
  ///   Whether to print the function arguments or not for backtrace unique.
335
  ///
336
  /// \param [in] frame_marker
337
  ///   Optional string that will be prepended to the frame output description.
338
  void DumpUsingSettingsFormat(Stream *strm, bool show_unique = false,
339
                               const char *frame_marker = nullptr);
340
341
  /// Print a description for this frame using a default format.
342
  ///
343
  /// \param [in] strm
344
  ///   The Stream to print the description to.
345
  ///
346
  /// \param [in] show_frame_index
347
  ///   Whether to print the frame number or not.
348
  ///
349
  /// \param [in] show_fullpaths
350
  ///   Whether to print the full source paths or just the file base name.
351
  void Dump(Stream *strm, bool show_frame_index, bool show_fullpaths);
352
353
  /// Print a description of this stack frame and/or the source
354
  /// context/assembly for this stack frame.
355
  ///
356
  /// \param[in] strm
357
  ///   The Stream to send the output to.
358
  ///
359
  /// \param[in] show_frame_info
360
  ///   If true, print the frame info by calling DumpUsingSettingsFormat().
361
  ///
362
  /// \param[in] show_source
363
  ///   If true, print source or disassembly as per the user's settings.
364
  ///
365
  /// \param[in] show_unique
366
  ///   If true, print using backtrace unique style, without function
367
  ///            arguments as per the user's settings.
368
  ///
369
  /// \param[in] frame_marker
370
  ///   Passed to DumpUsingSettingsFormat() for the frame info printing.
371
  ///
372
  /// \return
373
  ///   Returns true if successful.
374
  bool GetStatus(Stream &strm, bool show_frame_info, bool show_source,
375
                 bool show_unique = false, const char *frame_marker = nullptr);
376
377
  /// Query whether this frame is a concrete frame on the call stack, or if it
378
  /// is an inlined frame derived from the debug information and presented by
379
  /// the debugger.
380
  ///
381
  /// \return
382
  ///   true if this is an inlined frame.
383
  bool IsInlined();
384
385
  /// Query whether this frame is part of a historical backtrace.
386
  bool IsHistorical() const;
387
388
  /// Query whether this frame is artificial (e.g a synthesized result of
389
  /// inferring missing tail call frames from a backtrace). Artificial frames
390
  /// may have limited support for inspecting variables.
391
  bool IsArtificial() const;
392
393
  /// Query this frame to find what frame it is in this Thread's
394
  /// StackFrameList.
395
  ///
396
  /// \return
397
  ///   StackFrame index 0 indicates the currently-executing function.  Inline
398
  ///   frames are included in this frame index count.
399
  uint32_t GetFrameIndex() const;
400
401
  /// Set this frame's synthetic frame index.
402
52
  void SetFrameIndex(uint32_t index) { m_frame_index = index; }
403
404
  /// Query this frame to find what frame it is in this Thread's
405
  /// StackFrameList, not counting inlined frames.
406
  ///
407
  /// \return
408
  ///   StackFrame index 0 indicates the currently-executing function.  Inline
409
  ///   frames are not included in this frame index count; their concrete
410
  ///   frame index will be the same as the concrete frame that they are
411
  ///   derived from.
412
362k
  uint32_t GetConcreteFrameIndex() const { return m_concrete_frame_index; }
413
414
  /// Create a ValueObject for a given Variable in this StackFrame.
415
  ///
416
  /// \param [in] variable_sp
417
  ///   The Variable to base this ValueObject on
418
  ///
419
  /// \param [in] use_dynamic
420
  ///     Whether the correct dynamic type of the variable should be
421
  ///     determined before creating the ValueObject, or if the static type
422
  ///     is sufficient.  One of the DynamicValueType enumerated values.
423
  ///
424
  /// \return
425
  ///     A ValueObject for this variable.
426
  lldb::ValueObjectSP
427
  GetValueObjectForFrameVariable(const lldb::VariableSP &variable_sp,
428
                                 lldb::DynamicValueType use_dynamic);
429
430
  /// Query this frame to determine what the default language should be when
431
  /// parsing expressions given the execution context.
432
  ///
433
  /// \return
434
  ///   The language of the frame if known, else lldb::eLanguageTypeUnknown.
435
  lldb::LanguageType GetLanguage();
436
437
  // similar to GetLanguage(), but is allowed to take a potentially incorrect
438
  // guess if exact information is not available
439
  lldb::LanguageType GuessLanguage();
440
441
  /// Attempt to econstruct the ValueObject for a given raw address touched by
442
  /// the current instruction.  The ExpressionPath should indicate how to get
443
  /// to this value using "frame variable."
444
  ///
445
  /// \param [in] addr
446
  ///   The raw address.
447
  ///
448
  /// \return
449
  ///   The ValueObject if found.  If valid, it has a valid ExpressionPath.
450
  lldb::ValueObjectSP GuessValueForAddress(lldb::addr_t addr);
451
452
  /// Attempt to reconstruct the ValueObject for the address contained in a
453
  /// given register plus an offset.  The ExpressionPath should indicate how
454
  /// to get to this value using "frame variable."
455
  ///
456
  /// \param [in] reg
457
  ///   The name of the register.
458
  ///
459
  /// \param [in] offset
460
  ///   The offset from the register.  Particularly important for sp...
461
  ///
462
  /// \return
463
  ///   The ValueObject if found.  If valid, it has a valid ExpressionPath.
464
  lldb::ValueObjectSP GuessValueForRegisterAndOffset(ConstString reg,
465
                                                     int64_t offset);
466
467
  /// Attempt to reconstruct the ValueObject for a variable with a given \a name
468
  /// from within the current StackFrame, within the current block. The search
469
  /// for the variable starts in the deepest block corresponding to the current
470
  /// PC in the stack frame and traverse through all parent blocks stopping at
471
  /// inlined function boundaries.
472
  ///
473
  /// \param [in] name
474
  ///   The name of the variable.
475
  ///
476
  /// \return
477
  ///   The ValueObject if found.
478
  lldb::ValueObjectSP FindVariable(ConstString name);
479
480
  // lldb::ExecutionContextScope pure virtual functions
481
  lldb::TargetSP CalculateTarget() override;
482
483
  lldb::ProcessSP CalculateProcess() override;
484
485
  lldb::ThreadSP CalculateThread() override;
486
487
  lldb::StackFrameSP CalculateStackFrame() override;
488
489
  void CalculateExecutionContext(ExecutionContext &exe_ctx) override;
490
491
  lldb::RecognizedStackFrameSP GetRecognizedFrame();
492
493
protected:
494
  friend class StackFrameList;
495
496
  void SetSymbolContextScope(SymbolContextScope *symbol_scope);
497
498
  void UpdateCurrentFrameFromPreviousFrame(StackFrame &prev_frame);
499
500
  void UpdatePreviousFrameFromCurrentFrame(StackFrame &curr_frame);
501
502
  bool HasCachedData() const;
503
504
private:
505
  // For StackFrame only
506
  lldb::ThreadWP m_thread_wp;
507
  uint32_t m_frame_index;
508
  uint32_t m_concrete_frame_index;
509
  lldb::RegisterContextSP m_reg_context_sp;
510
  StackID m_id;
511
  Address m_frame_code_addr; // The frame code address (might not be the same as
512
                             // the actual PC for inlined frames) as a
513
                             // section/offset address
514
  SymbolContext m_sc;
515
  Flags m_flags;
516
  Scalar m_frame_base;
517
  Status m_frame_base_error;
518
  bool m_cfa_is_valid; // Does this frame have a CFA?  Different from CFA ==
519
                       // LLDB_INVALID_ADDRESS
520
  Kind m_stack_frame_kind;
521
522
  // Whether this frame behaves like the zeroth frame, in the sense
523
  // that its pc value might not immediately follow a call (and thus might
524
  // be the first address of its function). True for actual frame zero as
525
  // well as any other frame with the same trait.
526
  bool m_behaves_like_zeroth_frame;
527
  lldb::VariableListSP m_variable_list_sp;
528
  ValueObjectList m_variable_list_value_objects; // Value objects for each
529
                                                 // variable in
530
                                                 // m_variable_list_sp
531
  lldb::RecognizedStackFrameSP m_recognized_frame_sp;
532
  StreamString m_disassembly;
533
  std::recursive_mutex m_mutex;
534
535
  StackFrame(const StackFrame &) = delete;
536
  const StackFrame &operator=(const StackFrame &) = delete;
537
};
538
539
} // namespace lldb_private
540
541
#endif // LLDB_TARGET_STACKFRAME_H