aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-07-30 00:22:38 +0000
committerMike Stump <mrs@apple.com>2009-07-30 00:22:38 +0000
commit3dee6efcad9ad56d14f7edd1c29924f0b876a7f9 (patch)
treee35a916ac3b84b6116ac016822681449896f1151 /lib/AST/RecordLayoutBuilder.cpp
parentbebc467b2455fa35fec2258b5ae088759f1ee952 (diff)
Add ability to layout the vtable pointer in trivial cases. I noticed
that we would silently do bad things with virtual bases in the layout code, so, we just turn them off. When people do better things with them, we can turn them back on. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77556 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r--lib/AST/RecordLayoutBuilder.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index e3581d88d2..a60a72b74f 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -24,11 +24,19 @@ ASTRecordLayoutBuilder::ASTRecordLayoutBuilder(ASTContext &Ctx)
: Ctx(Ctx), Size(0), Alignment(8), StructPacking(0), NextOffset(0),
IsUnion(false), NonVirtualSize(0), NonVirtualAlignment(8) {}
+void ASTRecordLayoutBuilder::LayoutVtable(const CXXRecordDecl *RD) {
+ if (RD->isPolymorphic())
+ {
+ assert (RD->getNumBases() == 0 && "no polymorphic inheritance yet");
+ int AS = 0;
+ UpdateAlignment(Ctx.Target.getPointerAlign(AS));
+ Size += Ctx.Target.getPointerWidth(AS);
+ NextOffset = Size;
+ }
+}
+
void
ASTRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) {
- assert(!RD->isPolymorphic() &&
- "FIXME: We don't support polymorphic classes yet!");
-
for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
e = RD->bases_end(); i != e; ++i) {
if (!i->isVirtual()) {
@@ -74,14 +82,20 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) {
UpdateAlignment(AA->getAlignment());
// If this is a C++ class, lay out the nonvirtual bases.
- if (Ctx.getLangOptions().CPlusPlus)
- LayoutNonVirtualBases(cast<CXXRecordDecl>(D));
+ if (Ctx.getLangOptions().CPlusPlus) {
+ const CXXRecordDecl *RD = cast<CXXRecordDecl>(D);
+ LayoutVtable(RD);
+ LayoutNonVirtualBases(RD);
+
+ assert (RD->getNumVBases() == 0
+ && "FIXME: We don't support virtual bases yet!");
+ }
LayoutFields(D);
NonVirtualSize = Size;
NonVirtualAlignment = Alignment;
-
+
// Finally, round the size of the total struct up to the alignment of the
// struct itself.
FinishLayout();