summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ASTContext.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2008-06-06 02:14:01 +0000
committerDevang Patel <dpatel@apple.com>2008-06-06 02:14:01 +0000
commit8f5645cd518a31e7de9401543a4a75057bb1947e (patch)
tree8bebbd659e4769682dbac82255735f3c01787791 /clang/lib/AST/ASTContext.cpp
parente1f10511ba77d6b6d98aa680505ffb844bd42b37 (diff)
downloadbcm5719-llvm-8f5645cd518a31e7de9401543a4a75057bb1947e.tar.gz
bcm5719-llvm-8f5645cd518a31e7de9401543a4a75057bb1947e.zip
During interface layout, don't forget super class.
llvm-svn: 52035
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
-rw-r--r--clang/lib/AST/ASTContext.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 4a1fb39bb60..d8e2c06fc03 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -405,10 +405,22 @@ ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) {
// Allocate and assign into ASTRecordLayouts here. The "Entry" reference can
// be invalidated (dangle) if the ASTRecordLayouts hashtable is inserted into.
- ASTRecordLayout *NewEntry = new ASTRecordLayout();
+ ASTRecordLayout *NewEntry = NULL;
+ unsigned FieldCount = D->ivar_size();
+ if (ObjCInterfaceDecl *SD = D->getSuperClass()) {
+ FieldCount++;
+ const ASTRecordLayout &SL = getASTObjCInterfaceLayout(SD);
+ unsigned Alignment = SL.getAlignment();
+ uint64_t Size = SL.getSize();
+ NewEntry = new ASTRecordLayout(Size, Alignment);
+ NewEntry->InitializeLayout(FieldCount);
+ NewEntry->SetFieldOffset(0, 0); // Super class is at the beginning of the layout.
+ } else {
+ NewEntry = new ASTRecordLayout();
+ NewEntry->InitializeLayout(FieldCount);
+ }
Entry = NewEntry;
- NewEntry->InitializeLayout(D->ivar_size());
bool IsPacked = D->getAttr<PackedAttr>();
if (const AlignedAttr *AA = D->getAttr<AlignedAttr>())
OpenPOWER on IntegriCloud