[Lldb-commits] [lldb] [lldb] Convert file address to load address when reading memory for DW_OP_piece (PR #116411)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Nov 15 09:08:28 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-debuginfo
Author: Ilia Kuklin (kuilpd)
<details>
<summary>Changes</summary>
When parsing an optimized value and reading a piece from a file address, LLDB tries to read the data from memory using that address.
This patch converts file address to load address before reading the memory.
Fixes #<!-- -->111313 #<!-- -->97484
---
Full diff: https://github.com/llvm/llvm-project/pull/116411.diff
2 Files Affected:
- (modified) lldb/source/Expression/DWARFExpression.cpp (+16-3)
- (added) lldb/test/Shell/SymbolFile/DWARF/DW_OP_piece-O3.c (+23)
``````````diff
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index f92f25ed342a9c..a7126b25c1cc38 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1853,12 +1853,25 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
const Value::ValueType curr_piece_source_value_type =
curr_piece_source_value.GetValueType();
Scalar &scalar = curr_piece_source_value.GetScalar();
- const lldb::addr_t addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
+ lldb::addr_t addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
switch (curr_piece_source_value_type) {
case Value::ValueType::Invalid:
return llvm::createStringError("invalid value type");
- case Value::ValueType::LoadAddress:
- case Value::ValueType::FileAddress: {
+ case Value::ValueType::FileAddress:
+ if (target) {
+ curr_piece_source_value.ConvertToLoadAddress(module_sp.get(),
+ target);
+ addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
+ } else {
+ return llvm::createStringError(
+ "unable to convert file address 0x%" PRIx64
+ " to load address "
+ "for DW_OP_piece(%" PRIu64 "): "
+ "no target available",
+ addr, piece_byte_size);
+ }
+ [[fallthrough]];
+ case Value::ValueType::LoadAddress: {
if (target) {
if (curr_piece.ResizeData(piece_byte_size) == piece_byte_size) {
if (target->ReadMemory(addr, curr_piece.GetBuffer().GetBytes(),
diff --git a/lldb/test/Shell/SymbolFile/DWARF/DW_OP_piece-O3.c b/lldb/test/Shell/SymbolFile/DWARF/DW_OP_piece-O3.c
new file mode 100644
index 00000000000000..d31250426dc112
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/DW_OP_piece-O3.c
@@ -0,0 +1,23 @@
+// Check that optimized with -O3 values that have a file address can be read
+// DWARF info:
+// 0x00000023: DW_TAG_variable
+// DW_AT_name ("array")
+// DW_AT_type (0x00000032 "char[5]")
+// DW_AT_location (DW_OP_piece 0x2, DW_OP_addrx 0x0, DW_OP_piece 0x1)
+
+// RUN: %clang_host -O3 -gdwarf %s -o %t
+// RUN: %lldb %t \
+// RUN: -o "b 22" \
+// RUN: -o "r" \
+// RUN: -o "p/x array[2]" \
+// RUN: -b | FileCheck %s
+//
+// CHECK: (lldb) p/x array[2]
+// CHECK: (char) 0x03
+
+static char array[5] = {0, 1, 2, 3, 4};
+
+int main(void) {
+ array[2]++;
+ return 0;
+}
\ No newline at end of file
``````````
</details>
https://github.com/llvm/llvm-project/pull/116411
More information about the lldb-commits
mailing list