Skip to content

Commit

Permalink
[lldb][test] Add test-cases for packed structures
Browse files Browse the repository at this point in the history
Adds test that checks that LLDB correctly infers the
alignment of packed structures. Specifically, the
`InferAlignment` code-path of the `ItaniumRecordLayoutBuilder`
where it assumes that overlapping field offsets imply a
packed structure and thus sets alignment to `1`. See discussion
in llvm#93809.

Also adds two XFAIL-ed tests:
1. where LLDB doesn't correctly infer the alignment of a derived class whose base has
an explicit `DW_AT_alignment. See llvm#73623.
2. where the aforementioned `InferAlignment` kicks in for
   overlapping fields (but in this case incorrectly since
   the structure isn't actually packed).
  • Loading branch information
Michael137 committed Jun 27, 2024
1 parent e258bb3 commit 2113f05
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,11 @@ def test(self):
# Verify specified class alignments.
self.expect_expr("alignof(B2)", result_value="8")
self.expect_expr("alignof(EmptyClassAlign8)", result_value="8")

@no_debug_info_test
@expectedFailureAll(bugnumber="https://github.com/llvm/llvm-project/issues/73623")
def test(self):
self.build()
self.dbg.CreateTarget(self.getBuildArtifact("a.out"))

self.expect_expr("alignof(Derived)", result_value="8")
6 changes: 6 additions & 0 deletions lldb/test/API/lang/cpp/alignas_base_class/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,10 @@ D d3g;
struct alignas(8) EmptyClassAlign8 {
} t;

struct alignas(8) __attribute__((packed)) AlignedAndPackedBase {} foo;

struct Derived : AlignedAndPackedBase {
} bar;
static_assert(alignof(Derived) == 8);

int main() {}
25 changes: 25 additions & 0 deletions lldb/test/Shell/SymbolFile/DWARF/no_unique_address-alignment.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// XFAIL: *

// RUN: %clangxx_host -gdwarf -o %t %s
// RUN: %lldb %t \
// RUN: -o "b main" \
// RUN: -o "expr alignof(OverlappingFields)" \
// RUN: -o "expr sizeof(OverlappingFields)" \
// RUN: -o exit | FileCheck %s

// CHECK: (lldb) expr alignof(OverlappingFields)
// CHECK-NEXT: ${{.*}} = 4
// CHECK: (lldb) expr sizeof(OverlappingFields)
// CHECK-NEXT: ${{.*}} = 8

struct Empty {};

struct OverlappingFields {
char y;
[[no_unique_address]] Empty e;
int z;
} g_packed_struct;
static_assert(alignof(OverlappingFields) == 4);
static_assert(sizeof(OverlappingFields) == 8);

int main() {}
36 changes: 36 additions & 0 deletions lldb/test/Shell/SymbolFile/DWARF/packed.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// RUN: %clangxx_host -gdwarf -o %t %s
// RUN: %lldb %t \
// RUN: -o "b main" \
// RUN: -o "expr alignof(packed)" \
// RUN: -o "expr sizeof(packed)" \
// RUN: -o "expr alignof(packed_and_aligned)" \
// RUN: -o "expr sizeof(packed_and_aligned)" \
// RUN: -o exit | FileCheck %s

// CHECK: (lldb) expr alignof(packed)
// CHECK-NEXT: ${{.*}} = 1
// CHECK: (lldb) expr sizeof(packed)
// CHECK-NEXT: ${{.*}} = 9

// CHECK: (lldb) expr alignof(packed_and_aligned)
// CHECK-NEXT: ${{.*}} = 16
// CHECK: (lldb) expr sizeof(packed_and_aligned)
// CHECK-NEXT: ${{.*}} = 16

struct __attribute__((packed)) packed {
int x;
char y;
int z;
} g_packed_struct;
static_assert(alignof(packed) == 1);
static_assert(sizeof(packed) == 9);

struct __attribute__((packed, aligned(16))) packed_and_aligned {
int x;
char y;
int z;
} g_packed_and_aligned_struct;
static_assert(alignof(packed_and_aligned) == 16);
static_assert(sizeof(packed_and_aligned) == 16);

int main() {}

0 comments on commit 2113f05

Please sign in to comment.