https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/83295
>From 7b3d74a917446ad03e605f57fcf9158eee1d21c5 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Wed, 28 Feb 2024 13:52:54 +0000 Subject: [PATCH] [lldb][ClangASTImporter] Import record layouts from origin if available --- .../Clang/ClangASTImporter.cpp | 23 ++++--- .../API/lang/cpp/gmodules/alignment/Makefile | 4 ++ .../gmodules/alignment/TestPchAlignment.py | 60 +++++++++++++++++++ .../API/lang/cpp/gmodules/alignment/main.cpp | 10 ++++ .../API/lang/cpp/gmodules/alignment/pch.h | 21 +++++++ 5 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 lldb/test/API/lang/cpp/gmodules/alignment/Makefile create mode 100644 lldb/test/API/lang/cpp/gmodules/alignment/TestPchAlignment.py create mode 100644 lldb/test/API/lang/cpp/gmodules/alignment/main.cpp create mode 100644 lldb/test/API/lang/cpp/gmodules/alignment/pch.h diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp index 99d210c347a21d..30b50df79da90f 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp @@ -760,7 +760,6 @@ bool ClangASTImporter::LayoutRecordType( &vbase_offsets) { RecordDeclToLayoutMap::iterator pos = m_record_decl_to_layout_map.find(record_decl); - bool success = false; base_offsets.clear(); vbase_offsets.clear(); if (pos != m_record_decl_to_layout_map.end()) { @@ -770,13 +769,23 @@ bool ClangASTImporter::LayoutRecordType( base_offsets.swap(pos->second.base_offsets); vbase_offsets.swap(pos->second.vbase_offsets); m_record_decl_to_layout_map.erase(pos); - success = true; - } else { - bit_size = 0; - alignment = 0; - field_offsets.clear(); + return true; } - return success; + + // It's possible that we calculated the layout in a different + // ClangASTImporter instance. Try to import such layout if + // our decl has an origin. + if (auto origin = GetDeclOrigin(record_decl); origin.Valid()) + if (importRecordLayoutFromOrigin(record_decl, bit_size, alignment, + field_offsets, base_offsets, + vbase_offsets)) + return true; + + bit_size = 0; + alignment = 0; + field_offsets.clear(); + + return false; } void ClangASTImporter::SetRecordLayout(clang::RecordDecl *decl, diff --git a/lldb/test/API/lang/cpp/gmodules/alignment/Makefile b/lldb/test/API/lang/cpp/gmodules/alignment/Makefile new file mode 100644 index 00000000000000..a6c3e8ca84a3e4 --- /dev/null +++ b/lldb/test/API/lang/cpp/gmodules/alignment/Makefile @@ -0,0 +1,4 @@ +PCH_CXX_SOURCE = pch.h +CXX_SOURCES = main.cpp + +include Makefile.rules diff --git a/lldb/test/API/lang/cpp/gmodules/alignment/TestPchAlignment.py b/lldb/test/API/lang/cpp/gmodules/alignment/TestPchAlignment.py new file mode 100644 index 00000000000000..535dd13d0ada48 --- /dev/null +++ b/lldb/test/API/lang/cpp/gmodules/alignment/TestPchAlignment.py @@ -0,0 +1,60 @@ +""" +Tests that we correctly track AST layout info +(specifically alignment) when moving AST nodes +between ClangASTImporter instances (in this case, +from pch to executable to expression AST). +""" + +import lldb +import os +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestPchAlignment(TestBase): + @add_test_categories(["gmodules"]) + def test_expr(self): + self.build() + lldbutil.run_to_source_breakpoint( + self, "return data", lldb.SBFileSpec("main.cpp") + ) + + self.expect( + "frame variable data", + substrs=["row = 1", "col = 2", "row = 3", "col = 4", "stride = 5"], + ) + + @add_test_categories(["gmodules"]) + def test_frame_var(self): + self.build() + lldbutil.run_to_source_breakpoint( + self, "return data", lldb.SBFileSpec("main.cpp") + ) + + self.expect_expr( + "data", + result_type="MatrixData", + result_children=[ + ValueCheck( + name="section", + children=[ + ValueCheck( + name="origin", + children=[ + ValueCheck(name="row", value="1"), + ValueCheck(name="col", value="2"), + ], + ), + ValueCheck( + name="size", + children=[ + ValueCheck(name="row", value="3"), + ValueCheck(name="col", value="4"), + ], + ), + ], + ), + ValueCheck(name="stride", value="5"), + ], + ) diff --git a/lldb/test/API/lang/cpp/gmodules/alignment/main.cpp b/lldb/test/API/lang/cpp/gmodules/alignment/main.cpp new file mode 100644 index 00000000000000..5481f3fad1ff76 --- /dev/null +++ b/lldb/test/API/lang/cpp/gmodules/alignment/main.cpp @@ -0,0 +1,10 @@ +int main(int argc, const char *argv[]) { + struct MatrixData data = {0}; + data.section.origin.row = 1; + data.section.origin.col = 2; + data.section.size.row = 3; + data.section.size.col = 4; + data.stride = 5; + + return data.section.size.row; +} diff --git a/lldb/test/API/lang/cpp/gmodules/alignment/pch.h b/lldb/test/API/lang/cpp/gmodules/alignment/pch.h new file mode 100644 index 00000000000000..f0be272aa601aa --- /dev/null +++ b/lldb/test/API/lang/cpp/gmodules/alignment/pch.h @@ -0,0 +1,21 @@ +#ifndef PCH_H_IN +#define PCH_H_IN + +static const int kAlignment = 64; + +struct [[gnu::aligned(kAlignment)]] RowCol { + unsigned row; + unsigned col; +}; + +struct [[gnu::aligned(kAlignment)]] Submatrix { + struct RowCol origin; + struct RowCol size; +}; + +struct [[gnu::aligned(kAlignment)]] MatrixData { + struct Submatrix section; + unsigned stride; +}; + +#endif // _H_IN _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits