Skip to content

[lldb][nfc] Factor out code checking if Variable is in scope #143572

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions lldb/include/lldb/Symbol/Variable.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ class Variable : public UserID, public std::enable_shared_from_this<Variable> {

bool IsInScope(StackFrame *frame);

/// Returns true if this variable is in scope at `addr` inside `block`.
bool IsInScope(const Block &block, const Address &addr);

bool LocationIsValidForFrame(StackFrame *frame);

bool LocationIsValidForAddress(const Address &address);
Expand Down
46 changes: 24 additions & 22 deletions lldb/source/Symbol/Variable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,28 +290,9 @@ bool Variable::IsInScope(StackFrame *frame) {
// this variable was defined in is currently
Block *deepest_frame_block =
frame->GetSymbolContext(eSymbolContextBlock).block;
if (deepest_frame_block) {
SymbolContext variable_sc;
CalculateSymbolContext(&variable_sc);

// Check for static or global variable defined at the compile unit
// level that wasn't defined in a block
if (variable_sc.block == nullptr)
return true;

// Check if the variable is valid in the current block
if (variable_sc.block != deepest_frame_block &&
!variable_sc.block->Contains(deepest_frame_block))
return false;

// If no scope range is specified then it means that the scope is the
// same as the scope of the enclosing lexical block.
if (m_scope_range.IsEmpty())
return true;

addr_t file_address = frame->GetFrameCodeAddress().GetFileAddress();
return m_scope_range.FindEntryThatContains(file_address) != nullptr;
}
Address frame_addr = frame->GetFrameCodeAddress();
if (deepest_frame_block)
return IsInScope(*deepest_frame_block, frame_addr);
}
break;

Expand All @@ -321,6 +302,27 @@ bool Variable::IsInScope(StackFrame *frame) {
return false;
}

bool Variable::IsInScope(const Block &block, const Address &addr) {
SymbolContext variable_sc;
CalculateSymbolContext(&variable_sc);

// Check for static or global variable defined at the compile unit
// level that wasn't defined in a block
if (variable_sc.block == nullptr)
return true;

// Check if the variable is valid in the current block
if (variable_sc.block != &block && !variable_sc.block->Contains(&block))
return false;

// If no scope range is specified then it means that the scope is the
// same as the scope of the enclosing lexical block.
if (m_scope_range.IsEmpty())
return true;

return m_scope_range.FindEntryThatContains(addr.GetFileAddress()) != nullptr;
}

Status Variable::GetValuesForVariableExpressionPath(
llvm::StringRef variable_expr_path, ExecutionContextScope *scope,
GetVariableCallback callback, void *baton, VariableList &variable_list,
Expand Down
Loading