https://github.com/sr-tream updated https://github.com/llvm/llvm-project/pull/67213
>From bf024310a4fe796a497880c0e2bd6a27c86ce7f5 Mon Sep 17 00:00:00 2001 From: SR_team <m...@sr.team> Date: Sat, 21 Oct 2023 21:24:26 +0300 Subject: [PATCH] [clangd] Show alignment for records and fields decls --- clang-tools-extra/clangd/Hover.cpp | 5 +++++ clang-tools-extra/clangd/Hover.h | 2 ++ clang-tools-extra/clangd/unittests/HoverTests.cpp | 11 +++++++++++ 3 files changed, 18 insertions(+) diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp index 0ec85fc24df151b..933c69294b40926 100644 --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -1001,6 +1001,8 @@ void addLayoutInfo(const NamedDecl &ND, HoverInfo &HI) { if (auto *RD = llvm::dyn_cast<RecordDecl>(&ND)) { if (auto Size = Ctx.getTypeSizeInCharsIfKnown(RD->getTypeForDecl())) HI.Size = Size->getQuantity() * 8; + if (!RD->isDependentType() && RD->isCompleteDefinition()) + HI.Align = Ctx.getTypeAlign(RD->getTypeForDecl()); return; } @@ -1009,6 +1011,7 @@ void addLayoutInfo(const NamedDecl &ND, HoverInfo &HI) { if (Record) Record = Record->getDefinition(); if (Record && !Record->isInvalidDecl() && !Record->isDependentType()) { + HI.Align = Ctx.getTypeAlign(FD->getType()); const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(Record); HI.Offset = Layout.getFieldOffset(FD->getFieldIndex()); if (FD->isBitField()) @@ -1487,6 +1490,8 @@ markup::Document HoverInfo::present() const { P.appendText( llvm::formatv(" (+{0} padding)", formatSize(*Padding)).str()); } + if (Align) + P.appendText(", alignment " + formatSize(*Align)); } if (CalleeArgInfo) { diff --git a/clang-tools-extra/clangd/Hover.h b/clang-tools-extra/clangd/Hover.h index 6a61100912918ea..fe689de44732ebe 100644 --- a/clang-tools-extra/clangd/Hover.h +++ b/clang-tools-extra/clangd/Hover.h @@ -97,6 +97,8 @@ struct HoverInfo { std::optional<uint64_t> Offset; /// Contains the padding following a field within the enclosing class. std::optional<uint64_t> Padding; + /// Contains the alignment of fields and types where it's interesting. + std::optional<uint64_t> Align; // Set when symbol is inside function call. Contains information extracted // from the callee definition about the argument this is passed as. std::optional<Param> CalleeArgInfo; diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp index 8c88cd52574536c..c5623759a7c2041 100644 --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -92,6 +92,7 @@ TEST(Hover, Structured) { HI.Offset = 0; HI.Size = 8; HI.Padding = 56; + HI.Align = 8; HI.AccessSpecifier = "private"; }}, // Union field @@ -110,6 +111,7 @@ TEST(Hover, Structured) { HI.Type = "char"; HI.Size = 8; HI.Padding = 120; + HI.Align = 8; HI.AccessSpecifier = "public"; }}, // Bitfield @@ -128,6 +130,7 @@ TEST(Hover, Structured) { HI.Type = "int"; HI.Offset = 0; HI.Size = 1; + HI.Align = 32; HI.AccessSpecifier = "public"; }}, // Local to class method. @@ -192,6 +195,7 @@ TEST(Hover, Structured) { HI.Type = "char"; HI.Offset = 0; HI.Size = 8; + HI.Align = 8; HI.AccessSpecifier = "public"; }}, // Struct definition shows size. @@ -204,6 +208,7 @@ TEST(Hover, Structured) { HI.Kind = index::SymbolKind::Struct; HI.Definition = "struct X {}"; HI.Size = 8; + HI.Align = 8; }}, // Variable with template type {R"cpp( @@ -1375,6 +1380,7 @@ class Foo final {})cpp"; HI.Offset = 8; HI.Size = 1; HI.Padding = 23; + HI.Align = 8; HI.AccessSpecifier = "public"; }}}; for (const auto &Case : Cases) { @@ -1411,6 +1417,7 @@ class Foo final {})cpp"; EXPECT_EQ(H->Value, Expected.Value); EXPECT_EQ(H->Size, Expected.Size); EXPECT_EQ(H->Offset, Expected.Offset); + EXPECT_EQ(H->Align, Expected.Align); EXPECT_EQ(H->AccessSpecifier, Expected.AccessSpecifier); EXPECT_EQ(H->CalleeArgInfo, Expected.CalleeArgInfo); EXPECT_EQ(H->CallPassType, Expected.CallPassType); @@ -3448,6 +3455,7 @@ template <typename T, typename C = bool> class Foo {})", HI.Size = 32; HI.Offset = 96; HI.Padding = 32; + HI.Align = 32; }, R"(field foo @@ -3455,6 +3463,7 @@ Type: type (aka can_type) Value = value Offset: 12 bytes Size: 4 bytes (+4 bytes padding) +Align: 4 bytes // In test::Bar def)", @@ -3470,6 +3479,7 @@ def)", HI.Size = 25; HI.Offset = 35; HI.Padding = 4; + HI.Align = 64; }, R"(field foo @@ -3477,6 +3487,7 @@ Type: type (aka can_type) Value = value Offset: 4 bytes and 3 bits Size: 25 bits (+4 bits padding) +Align: 8 bytes // In test::Bar def)", _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits