[Lldb-commits] [lldb] [lldb] Replace ResolveValue() with GetScalar() in DWARFExpression (NFCI) (PR #185841)
Sergei Barannikov via lldb-commits
lldb-commits at lists.llvm.org
Sun Apr 5 01:05:00 PDT 2026
https://github.com/s-barannikov updated https://github.com/llvm/llvm-project/pull/185841
>From 015e3b92b24a29e1d65ee4496c790ce8d2c82a23 Mon Sep 17 00:00:00 2001
From: Sergei Barannikov <barannikov88 at gmail.com>
Date: Wed, 11 Mar 2026 12:21:38 +0300
Subject: [PATCH] [lldb] Replace ResolveValue() with GetScalar() in
DWARFExpression (NFCI)
Value::ResolveValue() only does something if the value has an associated
compiler type, which is never set on values involved in DWARF expression
evaluation. Simplify code by inlining the method.
---
lldb/source/Expression/DWARFExpression.cpp | 65 ++++++++-----------
.../SymbolFile/DWARF/DWARFASTParserClang.cpp | 2 +-
lldb/source/Target/StackFrame.cpp | 2 +-
3 files changed, 28 insertions(+), 41 deletions(-)
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index c23471a2c1219..df392eb1153c2 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1337,7 +1337,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
// value and pushes its absolute value. If the absolute value can not be
// represented, the result is undefined.
case DW_OP_abs:
- if (!stack.back().ResolveValue(exe_ctx).AbsoluteValue()) {
+ if (!stack.back().GetScalar().AbsoluteValue()) {
return llvm::createStringError(
"failed to take the absolute value of the first stack item");
}
@@ -1350,8 +1350,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_and:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) & tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() & tmp.GetScalar();
break;
// OPCODE: DW_OP_div
@@ -1361,18 +1360,18 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
// the result.
case DW_OP_div: {
tmp = stack.back();
- if (tmp.ResolveValue(exe_ctx).IsZero())
+ if (tmp.GetScalar().IsZero())
return llvm::createStringError("divide by zero");
stack.pop_back();
Scalar divisor, dividend;
- divisor = tmp.ResolveValue(exe_ctx);
- dividend = stack.back().ResolveValue(exe_ctx);
+ divisor = tmp.GetScalar();
+ dividend = stack.back().GetScalar();
divisor.MakeSigned();
dividend.MakeSigned();
stack.back() = dividend / divisor;
- if (!stack.back().ResolveValue(exe_ctx).IsValid())
+ if (!stack.back().GetScalar().IsValid())
return llvm::createStringError("divide failed");
} break;
@@ -1383,8 +1382,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_minus:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) - tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() - tmp.GetScalar();
break;
// OPCODE: DW_OP_mod
@@ -1395,8 +1393,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_mod:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) % tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() % tmp.GetScalar();
break;
// OPCODE: DW_OP_mul
@@ -1406,15 +1403,14 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_mul:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) * tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() * tmp.GetScalar();
break;
// OPCODE: DW_OP_neg
// OPERANDS: none
// DESCRIPTION: pops the top stack entry, and pushes its negation.
case DW_OP_neg:
- if (!stack.back().ResolveValue(exe_ctx).UnaryNegate())
+ if (!stack.back().GetScalar().UnaryNegate())
return llvm::createStringError("unary negate failed");
break;
@@ -1423,7 +1419,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
// DESCRIPTION: pops the top stack entry, and pushes its bitwise
// complement
case DW_OP_not:
- if (!stack.back().ResolveValue(exe_ctx).OnesComplement())
+ if (!stack.back().GetScalar().OnesComplement())
return llvm::createStringError("logical NOT failed");
break;
@@ -1434,8 +1430,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_or:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) | tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() | tmp.GetScalar();
break;
// OPCODE: DW_OP_plus
@@ -1468,7 +1463,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_shl:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) <<= tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() <<= tmp.GetScalar();
break;
// OPCODE: DW_OP_shr
@@ -1479,8 +1474,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_shr:
tmp = stack.back();
stack.pop_back();
- if (!stack.back().ResolveValue(exe_ctx).ShiftRightLogical(
- tmp.ResolveValue(exe_ctx)))
+ if (!stack.back().GetScalar().ShiftRightLogical(tmp.GetScalar()))
return llvm::createStringError("DW_OP_shr failed");
break;
@@ -1493,7 +1487,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_shra:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) >>= tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() >>= tmp.GetScalar();
break;
// OPCODE: DW_OP_xor
@@ -1503,8 +1497,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_xor:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) ^ tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() ^ tmp.GetScalar();
break;
// OPCODE: DW_OP_skip
@@ -1540,7 +1533,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
stack.pop_back();
int16_t bra_offset = (int16_t)opcodes.GetU16(&offset);
Scalar zero(0);
- if (tmp.ResolveValue(exe_ctx) != zero) {
+ if (tmp.GetScalar() != zero) {
lldb::offset_t new_offset = offset + bra_offset;
// New offset can point at the end of the data, in this case we should
// terminate the DWARF expression evaluation (will happen in the loop
@@ -1565,8 +1558,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_eq:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) == tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() == tmp.GetScalar();
break;
// OPCODE: DW_OP_ge
@@ -1579,8 +1571,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_ge:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) >= tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() >= tmp.GetScalar();
break;
// OPCODE: DW_OP_gt
@@ -1593,8 +1584,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_gt:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) > tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() > tmp.GetScalar();
break;
// OPCODE: DW_OP_le
@@ -1607,8 +1597,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_le:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) <= tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() <= tmp.GetScalar();
break;
// OPCODE: DW_OP_lt
@@ -1621,8 +1610,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_lt:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) < tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() < tmp.GetScalar();
break;
// OPCODE: DW_OP_ne
@@ -1635,8 +1623,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
case DW_OP_ne:
tmp = stack.back();
stack.pop_back();
- stack.back().ResolveValue(exe_ctx) =
- stack.back().ResolveValue(exe_ctx) != tmp.ResolveValue(exe_ctx);
+ stack.back().GetScalar() = stack.back().GetScalar() != tmp.GetScalar();
break;
// OPCODE: DW_OP_litn
@@ -1779,7 +1766,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
return err;
int64_t breg_offset = opcodes.GetSLEB128(&offset);
- tmp.ResolveValue(exe_ctx) += (uint64_t)breg_offset;
+ tmp.GetScalar() += (uint64_t)breg_offset;
tmp.ClearContext();
stack.push_back(tmp);
stack.back().SetValueType(Value::ValueType::LoadAddress);
@@ -1797,7 +1784,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
return err;
int64_t breg_offset = opcodes.GetSLEB128(&offset);
- tmp.ResolveValue(exe_ctx) += (uint64_t)breg_offset;
+ tmp.GetScalar() += (uint64_t)breg_offset;
tmp.ClearContext();
stack.push_back(tmp);
stack.back().SetValueType(Value::ValueType::LoadAddress);
@@ -2142,7 +2129,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
bit_size = bit_size_sign_or_err->first;
sign = bit_size_sign_or_err->second;
}
- Scalar &top = stack.back().ResolveValue(exe_ctx);
+ Scalar &top = stack.back().GetScalar();
top.TruncOrExtendTo(bit_size, sign);
break;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
index cb33fc21bfba9..3862ac4a6e763 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -685,7 +685,7 @@ ExtractDataMemberLocation(DWARFDIE const &die, DWARFFormValue const &form_value,
return {};
}
- return memberOffset->ResolveValue(nullptr).UInt();
+ return memberOffset->GetScalar().UInt();
}
static TypePayloadClang GetPtrAuthMofidierPayload(const DWARFDIE &die) {
diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp
index 9fb26176e43c0..98d7f44b96d1d 100644
--- a/lldb/source/Target/StackFrame.cpp
+++ b/lldb/source/Target/StackFrame.cpp
@@ -1182,7 +1182,7 @@ llvm::Error StackFrame::GetFrameBaseValue(Scalar &frame_base) {
if (!expr_value)
m_frame_base_error = Status::FromError(expr_value.takeError());
else
- m_frame_base = expr_value->ResolveValue(&exe_ctx);
+ m_frame_base = expr_value->GetScalar();
} else {
m_frame_base_error =
Status::FromErrorString("No function in symbol context.");
More information about the lldb-commits
mailing list