aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Kuklin <ikuklin@accesssoftek.com>2024-11-19 19:37:32 +0500
committerGitHub <noreply@github.com>2024-11-19 19:37:32 +0500
commit27dcae53eb9ea7b4d722d650e63567ca54e12d7d (patch)
treeddb71ffef10449733bf0076f3557004b37a804ee
parentaf41c55673ab4342310f19bd2ef506803e9dc91c (diff)
downloadllvm-27dcae53eb9ea7b4d722d650e63567ca54e12d7d.zip
llvm-27dcae53eb9ea7b4d722d650e63567ca54e12d7d.tar.gz
llvm-27dcae53eb9ea7b4d722d650e63567ca54e12d7d.tar.bz2
[lldb] Convert file address to load address when reading memory for DW_OP_piece (#116411)
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 Fixes #97484
-rw-r--r--lldb/source/Expression/DWARFExpression.cpp19
-rw-r--r--lldb/test/Shell/SymbolFile/DWARF/DW_OP_piece-O3.c23
2 files changed, 39 insertions, 3 deletions
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index f92f25e..a7126b2 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 0000000..d3125042
--- /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