From 0c2b7fa8691e9d1f6c7dd656e44321ef8c84ae87 Mon Sep 17 00:00:00 2001 From: Jason Molenda Date: Fri, 2 Dec 2022 14:39:41 -0800 Subject: [PATCH] Leave DW_OP_addr addresses as load addresses in DWARFExpression DWARFExpression::Evaluate will convert DW_OP_addr addresses in a DWARF expression into load addresses on the expression stack when there is a StackFrame in the ExecutionContext, this from a change in 2018 in https://reviews.llvm.org/D46362. At the time this was handling a case that came up in swift programs, and is no longer necessary. I generalized this conversion to a load address when a Target is available in https://reviews.llvm.org/D137682 to make a test case possible; this change broke a use case that Ted reported. This change removes my test case, and removes this conversion of a DW_OP_addr into a load address in some instances. Differential Revision: https://reviews.llvm.org/D139226 --- lldb/source/Expression/DWARFExpression.cpp | 4 -- lldb/test/API/lang/c/high-mem-global/Makefile | 3 -- .../lang/c/high-mem-global/TestHighMemGlobal.py | 59 ---------------------- lldb/test/API/lang/c/high-mem-global/main.c | 9 ---- 4 files changed, 75 deletions(-) delete mode 100644 lldb/test/API/lang/c/high-mem-global/Makefile delete mode 100644 lldb/test/API/lang/c/high-mem-global/TestHighMemGlobal.py delete mode 100644 lldb/test/API/lang/c/high-mem-global/main.c diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 9e7df2d..e92216b 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -925,10 +925,6 @@ bool DWARFExpression::Evaluate( stack.back().SetValueType(Value::ValueType::LoadAddress); } else { stack.back().SetValueType(Value::ValueType::FileAddress); - // Convert the file address to a load address, so subsequent - // DWARF operators can operate on it. - if (target) - stack.back().ConvertToLoadAddress(module_sp.get(), target); } break; diff --git a/lldb/test/API/lang/c/high-mem-global/Makefile b/lldb/test/API/lang/c/high-mem-global/Makefile deleted file mode 100644 index 1049594..0000000 --- a/lldb/test/API/lang/c/high-mem-global/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -C_SOURCES := main.c - -include Makefile.rules diff --git a/lldb/test/API/lang/c/high-mem-global/TestHighMemGlobal.py b/lldb/test/API/lang/c/high-mem-global/TestHighMemGlobal.py deleted file mode 100644 index b0df19a..0000000 --- a/lldb/test/API/lang/c/high-mem-global/TestHighMemGlobal.py +++ /dev/null @@ -1,59 +0,0 @@ -"""Look that lldb can display a global loaded in high memory at an addressable address.""" - - -import lldb -from lldbsuite.test.lldbtest import * -import lldbsuite.test.lldbutil as lldbutil -from lldbsuite.test.decorators import * - -class TestHighMemGlobal(TestBase): - - NO_DEBUG_INFO_TESTCASE = True - - @skipUnlessDarwin # hardcoding of __DATA segment name - def test_command_line(self): - """Test that we can display a global variable loaded in high memory.""" - self.build() - - exe = self.getBuildArtifact("a.out") - err = lldb.SBError() - - target = self.dbg.CreateTarget(exe, '', '', False, err) - self.assertTrue(target.IsValid()) - module = target.GetModuleAtIndex(0) - self.assertTrue(module.IsValid()) - data_segment = module.FindSection("__DATA") - self.assertTrue(data_segment.IsValid()) - err.Clear() - - self.expect("expr -- global.c", substrs=[' = 1']) - self.expect("expr -- global.d", substrs=[' = 2']) - self.expect("expr -- global.e", substrs=[' = 3']) - - err = target.SetSectionLoadAddress(data_segment, 0xffffffff00000000) - self.assertTrue(err.Success()) - self.expect("expr -- global.c", substrs=[' = 1']) - self.expect("expr -- global.d", substrs=[' = 2']) - self.expect("expr -- global.e", substrs=[' = 3']) - - err = target.SetSectionLoadAddress(data_segment, 0x0000088100004000) - self.assertTrue(err.Success()) - self.expect("expr -- global.c", substrs=[' = 1']) - self.expect("expr -- global.d", substrs=[' = 2']) - self.expect("expr -- global.e", substrs=[' = 3']) - - # This is an address in IRMemoryMap::FindSpace where it has an - # lldb-side buffer of memory that's used in IR interpreters when - # memory cannot be allocated in the inferior / functions cannot - # be jitted. - err = target.SetSectionLoadAddress(data_segment, 0xdead0fff00000000) - self.assertTrue(err.Success()) - - # The global variable `global` is now overlayed by this - # IRMemoryMap special buffer, and now we cannot see the variable. - # Testing that we get the incorrect values at this address ensures - # that IRMemoryMap::FindSpace and this test stay in sync. - self.runCmd("expr -- int $global_c = global.c") - self.runCmd("expr -- int $global_d = global.d") - self.runCmd("expr -- int $global_e = global.e") - self.expect("expr -- $global_c != 1 || $global_d != 2 || $global_e != 3", substrs=[' = true']) diff --git a/lldb/test/API/lang/c/high-mem-global/main.c b/lldb/test/API/lang/c/high-mem-global/main.c deleted file mode 100644 index ae75f64..0000000 --- a/lldb/test/API/lang/c/high-mem-global/main.c +++ /dev/null @@ -1,9 +0,0 @@ - -struct mystruct { - int c, d, e; -} global = {1, 2, 3}; - -int main () -{ - return global.c; // break here -} -- 2.7.4