@@ -85,6 +85,25 @@ LayoutField Parser::WalkVTablePointer(Class* Class,
85
85
return LayoutField;
86
86
}
87
87
88
+ static CppAbi GetClassLayoutAbi (clang::TargetCXXABI::Kind abi)
89
+ {
90
+ switch (abi)
91
+ {
92
+ case clang::TargetCXXABI::Microsoft:
93
+ return CppAbi::Microsoft;
94
+ case clang::TargetCXXABI::GenericItanium:
95
+ return CppAbi::Itanium;
96
+ case clang::TargetCXXABI::GenericARM:
97
+ return CppAbi::ARM;
98
+ case clang::TargetCXXABI::iOS:
99
+ return CppAbi::iOS;
100
+ case clang::TargetCXXABI::iOS64:
101
+ return CppAbi::iOS64;
102
+ default :
103
+ llvm_unreachable (" Unsupported C++ ABI kind" );
104
+ }
105
+ }
106
+
88
107
void Parser::ReadClassLayout (Class* Class, const clang::RecordDecl* RD,
89
108
clang::CharUnits Offset, bool IncludeVirtualBases)
90
109
{
@@ -695,12 +714,13 @@ void Parser::WalkVTable(const clang::CXXRecordDecl* RD, Class* C)
695
714
if (!C->layout )
696
715
C->layout = new ClassLayout ();
697
716
717
+ C->layout ->ABI = GetClassLayoutAbi (targetABI);
718
+
698
719
auto & AST = c->getASTContext ();
699
720
switch (targetABI)
700
721
{
701
722
case TargetCXXABI::Microsoft:
702
723
{
703
- C->layout ->ABI = CppAbi::Microsoft;
704
724
MicrosoftVTableContext VTContext (AST);
705
725
706
726
const auto & VFPtrs = VTContext.getVFPtrOffsets (RD);
@@ -719,7 +739,6 @@ void Parser::WalkVTable(const clang::CXXRecordDecl* RD, Class* C)
719
739
}
720
740
case TargetCXXABI::GenericItanium:
721
741
{
722
- C->layout ->ABI = CppAbi::Itanium;
723
742
ItaniumVTableContext VTContext (AST);
724
743
725
744
auto & VTLayout = VTContext.getVTableLayout (RD);
@@ -954,6 +973,7 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
954
973
const auto & Layout = c->getASTContext ().getASTRecordLayout (Record);
955
974
if (!RC->layout )
956
975
RC->layout = new ClassLayout ();
976
+ RC->layout ->ABI = GetClassLayoutAbi (targetABI);
957
977
RC->layout ->alignment = (int )Layout.getAlignment ().getQuantity ();
958
978
RC->layout ->size = (int )Layout.getSize ().getQuantity ();
959
979
RC->layout ->dataSize = (int )Layout.getDataSize ().getQuantity ();
0 commit comments