summaryrefslogtreecommitdiffstats
path: root/clang/lib
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
commit3dc7eb94403c9de3c5ec2cc0ffd9c4b7f57ba5fb (patch)
tree7a35d514fee4bc3d18759ba9d45f15bfea8b0a38 /clang/lib
parent13ddd8514f8a852ac6fbb008e1e0ef4f61cc6270 (diff)
downloadbcm5719-llvm-3dc7eb94403c9de3c5ec2cc0ffd9c4b7f57ba5fb.tar.gz
bcm5719-llvm-3dc7eb94403c9de3c5ec2cc0ffd9c4b7f57ba5fb.zip
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. llvm-svn: 77556
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp26
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.h1
-rw-r--r--clang/lib/CodeGen/CodeGenTypes.cpp2
3 files changed, 21 insertions, 8 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index e3581d88d24..a60a72b74fa 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/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();
diff --git a/clang/lib/AST/RecordLayoutBuilder.h b/clang/lib/AST/RecordLayoutBuilder.h
index e7d49b55a8e..41c002d61dc 100644
--- a/clang/lib/AST/RecordLayoutBuilder.h
+++ b/clang/lib/AST/RecordLayoutBuilder.h
@@ -48,6 +48,7 @@ class ASTRecordLayoutBuilder {
void LayoutFields(const RecordDecl *D);
void LayoutField(const FieldDecl *D);
+ void LayoutVtable(const CXXRecordDecl *RD);
void LayoutNonVirtualBases(const CXXRecordDecl *RD);
void LayoutNonVirtualBase(const CXXRecordDecl *RD);
diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp
index f88ed048fd3..c20e90e8ce6 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -381,8 +381,6 @@ const llvm::Type *CodeGenTypes::ConvertTagDeclType(const TagDecl *TD) {
// FIXME. This may have to move to a better place.
if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TD)) {
- 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()) {
OpenPOWER on IntegriCloud