================ @@ -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 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits