-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve support of PDB as an external layout source
Summary: This patch improves support of PDB as an external layout source in the next cases: - Multiple non-virtual inheritance from packed base classes. When using external layout, there's no need to align `NonVirtualSize` of a base class. It may cause an overlapping when the next base classes will be layouted (but there is a slightly different case in the test because I can't find a way to specify a base offset); - Support of nameless structs and unions. There is no info about nameless child structs and unions in Microsoft cl-emitted PDBs. Instead all its fields are just treated as outer structure's (union's) fields. This also causes a fields overlapping, and makes it possible for unions to have fields located at a non-zero offset. Reviewers: rsmith, zturner, rnk, mstorsjo, majnemer Reviewed By: rnk Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D49871 llvm-svn: 338353
- Loading branch information
Aleksandr Urakov
committed
Jul 31, 2018
1 parent
615540d
commit 09240ef
Showing
5 changed files
with
112 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
16 changes: 16 additions & 0 deletions
16
clang/test/CodeGenCXX/Inputs/override-layout-nameless-struct-union.layout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
|
||
*** Dumping AST Record Layout | ||
Type: struct S | ||
|
||
Layout: <ASTRecordLayout | ||
Size:64 | ||
Alignment:32 | ||
FieldOffsets: [0, 32, 32]> | ||
|
||
*** Dumping AST Record Layout | ||
Type: union U | ||
|
||
Layout: <ASTRecordLayout | ||
Size:96 | ||
Alignment:32 | ||
FieldOffsets: [0, 0, 32, 64, 68, 73]> |
18 changes: 18 additions & 0 deletions
18
clang/test/CodeGenCXX/Inputs/override-layout-packed-base.layout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
|
||
*** Dumping AST Record Layout | ||
Type: class B<0> | ||
|
||
Layout: <ASTRecordLayout | ||
FieldOffsets: [0, 32]> | ||
|
||
*** Dumping AST Record Layout | ||
Type: class B<1> | ||
|
||
Layout: <ASTRecordLayout | ||
FieldOffsets: [0, 32]> | ||
|
||
*** Dumping AST Record Layout | ||
Type: class C | ||
|
||
Layout: <ASTRecordLayout | ||
FieldOffsets: [80]> |
33 changes: 33 additions & 0 deletions
33
clang/test/CodeGenCXX/override-layout-nameless-struct-union.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// RUN: %clang_cc1 -w -fdump-record-layouts-simple -foverride-record-layout=%S/Inputs/override-layout-nameless-struct-union.layout %s | FileCheck %s | ||
|
||
// CHECK: Type: struct S | ||
// CHECK: Size:64 | ||
// CHECK: Alignment:32 | ||
// CHECK: FieldOffsets: [0, 32, 32] | ||
struct S { | ||
short _s; | ||
//union { | ||
int _su0; | ||
char _su1; | ||
//}; | ||
}; | ||
|
||
// CHECK: Type: union U | ||
// CHECK: Size:96 | ||
// CHECK: Alignment:32 | ||
// CHECK: FieldOffsets: [0, 0, 32, 64, 68, 73] | ||
union U { | ||
short _u; | ||
//struct { | ||
char _us0; | ||
int _us1; | ||
unsigned _us20 : 4; | ||
unsigned _us21 : 5; | ||
unsigned _us22 : 6; | ||
//}; | ||
}; | ||
|
||
void use_structs() { | ||
S ss[sizeof(S)]; | ||
U us[sizeof(U)]; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// RUN: %clang_cc1 -w -fdump-record-layouts-simple -foverride-record-layout=%S/Inputs/override-layout-packed-base.layout %s | FileCheck %s | ||
|
||
// CHECK: Type: class B<0> | ||
// CHECK: FieldOffsets: [0, 32] | ||
|
||
// CHECK: Type: class B<1> | ||
// CHECK: FieldOffsets: [0, 32] | ||
|
||
//#pragma pack(push, 1) | ||
template<int I> | ||
class B { | ||
int _b1; | ||
char _b2; | ||
}; | ||
//#pragma pack(pop) | ||
|
||
// CHECK: Type: class C | ||
// CHECK: FieldOffsets: [80] | ||
|
||
class C : B<0>, B<1> { | ||
char _c; | ||
}; | ||
|
||
void use_structs() { | ||
C cs[sizeof(C)]; | ||
} |