diff options
author | Shafik Yaghmour <syaghmour@apple.com> | 2018-09-20 17:06:34 +0000 |
---|---|---|
committer | Shafik Yaghmour <syaghmour@apple.com> | 2018-09-20 17:06:34 +0000 |
commit | e23d0b636ca317347e84b3006a89eb185a130983 (patch) | |
tree | e7996dd12ef9f139aaf2b502c99462f0eaac117d /lldb/source/Target/StackFrame.cpp | |
parent | 6d0e4fce1accff627f01313dda6e100b0bce09a3 (diff) | |
download | bcm5719-llvm-e23d0b636ca317347e84b3006a89eb185a130983.tar.gz bcm5719-llvm-e23d0b636ca317347e84b3006a89eb185a130983.zip |
Refactor FindVariable() core functionality into StackFrame out of SBFrame
rdar://problem/14365983
Patch by Shafik Yaghmour
Differential Revision: https://reviews.llvm.org/D52247
llvm-svn: 342663
Diffstat (limited to 'lldb/source/Target/StackFrame.cpp')
-rw-r--r-- | lldb/source/Target/StackFrame.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp index ce7aa0e6848..0e9c6df2bf7 100644 --- a/lldb/source/Target/StackFrame.cpp +++ b/lldb/source/Target/StackFrame.cpp @@ -1709,6 +1709,41 @@ lldb::ValueObjectSP StackFrame::GuessValueForRegisterAndOffset(ConstString reg, GetFrameCodeAddress()); } +lldb::ValueObjectSP StackFrame::FindVariable(ConstString name) { + ValueObjectSP value_sp; + + if (!name) + return value_sp; + + TargetSP target_sp = CalculateTarget(); + ProcessSP process_sp = CalculateProcess(); + + if (!target_sp && !process_sp) + return value_sp; + + VariableList variable_list; + VariableSP var_sp; + SymbolContext sc(GetSymbolContext(eSymbolContextBlock)); + + if (sc.block) { + const bool can_create = true; + const bool get_parent_variables = true; + const bool stop_if_block_is_inlined_function = true; + + if (sc.block->AppendVariables( + can_create, get_parent_variables, stop_if_block_is_inlined_function, + [this](Variable *v) { return v->IsInScope(this); }, + &variable_list)) { + var_sp = variable_list.FindVariable(name); + } + + if (var_sp) + value_sp = GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); + } + + return value_sp; +} + TargetSP StackFrame::CalculateTarget() { TargetSP target_sp; ThreadSP thread_sp(GetThread()); |