This revision was automatically updated to reflect the committed changes.
Closed by commit rL373470: [lldb] Fix evaluation of nested classes with parent
from other CU (authored by teemperor, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Changed prior to commit:
https://reviews.llvm.org/D68278?vs=222803&id=222820#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D68278/new/
https://reviews.llvm.org/D68278
Files:
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/Makefile
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/TestNestedClassWithParentInAnotherCU.py
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/main.cpp
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/other.cpp
lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/shared.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
===================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -691,6 +691,8 @@
type_sp = unique_ast_entry_up->m_type_sp;
if (type_sp) {
dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
+ LinkDeclContextToDIE(
+ GetCachedClangDeclContextForDIE(unique_ast_entry_up->m_die), die);
return type_sp;
}
}
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/main.cpp
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/main.cpp
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/main.cpp
@@ -0,0 +1,22 @@
+#include "shared.h"
+
+struct WrapperA {
+ OuterY::Inner<unsigned int> y;
+};
+
+int main() {
+ // WrapperA refers to the Inner and Outer class DIEs from this CU.
+ WrapperA a;
+ // WrapperB refers to the Inner and Outer DIEs from the other.cpp CU.
+ // It is important that WrapperB is only forward-declared in shared.h.
+ WrapperB* b = foo();
+
+ // Evaluating 'b' here will parse other.cpp's DIEs for all
+ // the Inner and Outer classes from shared.h.
+ //
+ // Evaluating 'a' here will find and reuse the already-parsed
+ // versions of the Inner and Outer classes. In the associated test
+ // we make sure that we can still resolve all the types properly
+ // by evaluating 'a.y.oY_inner.oX_inner'.
+ return 0; // break here
+}
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/TestNestedClassWithParentInAnotherCU.py
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/TestNestedClassWithParentInAnotherCU.py
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/TestNestedClassWithParentInAnotherCU.py
@@ -0,0 +1,29 @@
+"""
+Test that the expression evaluator can access members of nested classes even if
+the parents of the nested classes were imported from another compilation unit.
+"""
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestNestedClassWithParentInAnotherCU(TestBase):
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_nested_class_with_parent_in_another_cu(self):
+ self.main_source_file = lldb.SBFileSpec("main.cpp")
+ self.build()
+ (_, _, thread, _) = lldbutil.run_to_source_breakpoint(self, "// break here", self.main_source_file)
+ frame = thread.GetSelectedFrame()
+ # Parse the DIEs of the parent classes and the nested classes from
+ # other.cpp's CU.
+ warmup_result = frame.EvaluateExpression("b")
+ self.assertTrue(warmup_result.IsValid())
+ # Inspect fields of the nested classes. This will reuse the types that
+ # were parsed during the evaluation above. By accessing a chain of
+ # fields, we try to verify that all the DIEs, reused types and
+ # declaration contexts were wired properly into lldb's parser's state.
+ expr_result = frame.EvaluateExpression("a.y.oY_inner.oX_inner")
+ self.assertTrue(expr_result.IsValid())
+ self.assertEqual(expr_result.GetValue(), "42")
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/other.cpp
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/other.cpp
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/other.cpp
@@ -0,0 +1,10 @@
+#include "shared.h"
+
+struct WrapperB {
+ OuterY y;
+ OuterX x;
+};
+
+WrapperB* foo() {
+ return new WrapperB();
+}
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/Makefile
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/Makefile
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp other.cpp
+
+include Makefile.rules
Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/shared.h
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/shared.h
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/shared.h
@@ -0,0 +1,17 @@
+struct OuterX {
+ template<typename T>
+ struct Inner {
+ int oX_inner = 42;
+ };
+};
+
+struct OuterY {
+ template<typename T>
+ struct Inner {
+ typename OuterX::Inner<T> oY_inner;
+ };
+};
+
+struct WrapperB;
+
+WrapperB* foo();
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits