[Lldb-commits] [lldb] [lldb] Extract DW_OP_deref evaluation code (NFC) (PR #146801)
Adrian Prantl via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 3 10:30:12 PDT 2025
================
@@ -860,6 +860,64 @@ ResolveLoadAddress(ExecutionContext *exe_ctx, lldb::ModuleSP &module_sp,
return load_addr;
}
+static llvm::Error Evaluate_DW_OP_deref(DWARFExpression::Stack &stack,
+ ExecutionContext *exe_ctx,
+ lldb::ModuleSP module_sp,
+ Process *process) {
+ if (stack.empty())
+ return llvm::createStringError("expression stack empty for DW_OP_deref");
+
+ const Value::ValueType value_type = stack.back().GetValueType();
+ switch (value_type) {
+ case Value::ValueType::HostAddress: {
+ void *src = (void *)stack.back().GetScalar().ULongLong();
+ intptr_t ptr;
+ ::memcpy(&ptr, src, sizeof(void *));
+ stack.back().GetScalar() = ptr;
+ stack.back().ClearContext();
+ } break;
+ case Value::ValueType::FileAddress: {
+ auto file_addr = stack.back().GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
+ Address so_addr;
+ auto maybe_load_addr = ResolveLoadAddress(exe_ctx, module_sp, "DW_OP_deref",
+ file_addr, so_addr);
+ if (!maybe_load_addr)
+ return maybe_load_addr.takeError();
+ stack.back().GetScalar() = *maybe_load_addr;
+ // Fall through to load address promotion code below.
+ }
+ [[fallthrough]];
+ case Value::ValueType::Scalar:
+ // Promote Scalar to LoadAddress and fall through.
+ stack.back().SetValueType(Value::ValueType::LoadAddress);
+ [[fallthrough]];
+ case Value::ValueType::LoadAddress: {
+ if (!exe_ctx)
+ return llvm::createStringError("NULL execution context for DW_OP_deref");
+ if (!process)
+ return llvm::createStringError("NULL process for DW_OP_deref");
+ lldb::addr_t pointer_addr =
+ stack.back().GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
+ Status error;
+ lldb::addr_t pointer_value =
+ process->ReadPointerFromMemory(pointer_addr, error);
+ if (pointer_value == LLDB_INVALID_ADDRESS)
+ return llvm::createStringError(
+ "Failed to dereference pointer from 0x%" PRIx64
+ " for DW_OP_deref: %s\n",
+ pointer_addr, error.AsCString());
----------------
adrian-prantl wrote:
Status is an llvm::Error, so this should be
`return llvm::joinErrors(llvm::createStringError("Failed to dereference pointer from 0x%" PRIx64 " for DW_OP_deref", pointer_addr, error.takeError())`
https://github.com/llvm/llvm-project/pull/146801
More information about the lldb-commits
mailing list