diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-12-05 01:05:03 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-12-05 01:05:03 +0000 |
commit | 6c08ce77064f529a6e91dddd50a20b58f044679d (patch) | |
tree | 9eec40da5384d1a966ca351ab6d9b7970fdad0b3 /clang | |
parent | 047a767d745eebfe80743603530622f0aa775540 (diff) | |
download | bcm5719-llvm-6c08ce77064f529a6e91dddd50a20b58f044679d.tar.gz bcm5719-llvm-6c08ce77064f529a6e91dddd50a20b58f044679d.zip |
Skip actually generating the vtable unless we are defining it. This avoids
the side-effects of generating the methods in the vtable (including PR5676).
llvm-svn: 90635
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CGVtable.cpp | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp index 74375d9cff0..35caa570edb 100644 --- a/clang/lib/CodeGen/CGVtable.cpp +++ b/clang/lib/CodeGen/CGVtable.cpp @@ -31,7 +31,8 @@ private: // Vtable - The components of the vtable being built. typedef llvm::SmallVector<llvm::Constant *, 64> VtableVectorTy; VtableVectorTy Vtable; - + const bool BuildVtable; + llvm::Type *Ptr8Ty; /// MostDerivedClass - The most derived class that this vtable is being @@ -178,15 +179,18 @@ private: public: VtableBuilder(const CXXRecordDecl *MostDerivedClass, - const CXXRecordDecl *l, uint64_t lo, CodeGenModule &cgm) - : MostDerivedClass(MostDerivedClass), LayoutClass(l), LayoutOffset(lo), - BLayout(cgm.getContext().getASTRecordLayout(l)), - rtti(cgm.GenerateRTTIRef(MostDerivedClass)), - VMContext(cgm.getModule().getContext()),CGM(cgm), PureVirtualFn(0), + const CXXRecordDecl *l, uint64_t lo, CodeGenModule &cgm, + bool build) + : BuildVtable(build), MostDerivedClass(MostDerivedClass), LayoutClass(l), + LayoutOffset(lo), BLayout(cgm.getContext().getASTRecordLayout(l)), + rtti(0), VMContext(cgm.getModule().getContext()),CGM(cgm), + PureVirtualFn(0), subAddressPoints(AllocAddressPoint(cgm, l, MostDerivedClass)), Extern(!l->isInAnonymousNamespace()), - LLVMPointerWidth(cgm.getContext().Target.getPointerWidth(0)) { + LLVMPointerWidth(cgm.getContext().Target.getPointerWidth(0)) { Ptr8Ty = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext), 0); + if (BuildVtable) + rtti = cgm.GenerateRTTIRef(MostDerivedClass); } // getVtable - Returns a reference to the vtable components. @@ -420,13 +424,15 @@ public: D1(printf("============= combining vbase/vcall\n")); D(VCalls.insert(VCalls.begin(), 673)); D(VCalls.push_back(672)); - + Vtable.insert(Vtable.begin() + InsertionPoint, VCalls.size(), 0); - // The vcalls come first... - for (std::vector<Index_t>::reverse_iterator i = VCalls.rbegin(), - e = VCalls.rend(); - i != e; ++i) - Vtable[InsertionPoint++] = wrap((0?600:0) + *i); + if (BuildVtable) { + // The vcalls come first... + for (std::vector<Index_t>::reverse_iterator i = VCalls.rbegin(), + e = VCalls.rend(); + i != e; ++i) + Vtable[InsertionPoint++] = wrap((0?600:0) + *i); + } VCalls.clear(); VCall.clear(); } @@ -481,7 +487,7 @@ public: extra = -VCalls.size(); // Add the offset to top. - Vtable.push_back(wrap(-((Offset-LayoutOffset)/8))); + Vtable.push_back(BuildVtable ? wrap(-((Offset-LayoutOffset)/8)) : 0); // Add the RTTI information. Vtable.push_back(rtti); @@ -839,6 +845,14 @@ bool VtableBuilder::OverrideMethod(GlobalDecl GD, bool MorallyVirtual, } void VtableBuilder::AppendMethodsToVtable() { + if (!BuildVtable) { + Vtable.insert(Vtable.end(), Methods.size(), (llvm::Constant*)0); + ThisAdjustments.clear(); + BaseReturnTypes.clear(); + Methods.clear(); + return; + } + // Reserve room in the vtable for our new methods. Vtable.reserve(Vtable.size() + Methods.size()); @@ -1048,7 +1062,7 @@ int64_t CGVtableInfo::getVirtualBaseOffsetIndex(const CXXRecordDecl *RD, // FIXME: This seems expensive. Can we do a partial job to get // just this data. - VtableBuilder b(RD, RD, 0, CGM); + VtableBuilder b(RD, RD, 0, CGM, false); D1(printf("vtable %s\n", RD->getNameAsCString())); b.GenerateVtableForBase(RD); b.GenerateVtableForVBases(RD); @@ -1089,15 +1103,6 @@ llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *LayoutClass, if (AddressPoint == 0) AddressPoint = 1; } else { - VtableBuilder b(RD, LayoutClass, Offset, *this); - - D1(printf("vtable %s\n", RD->getNameAsCString())); - // First comes the vtables for all the non-virtual bases... - AddressPoint = b.GenerateVtableForBase(RD, Offset); - - // then the vtables for all the virtual bases. - b.GenerateVtableForVBases(RD, Offset); - bool CreateDefinition = true; if (LayoutClass != RD) CreateDefinition = true; @@ -1114,6 +1119,15 @@ llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *LayoutClass, } } + VtableBuilder b(RD, LayoutClass, Offset, *this, CreateDefinition); + + D1(printf("vtable %s\n", RD->getNameAsCString())); + // First comes the vtables for all the non-virtual bases... + AddressPoint = b.GenerateVtableForBase(RD, Offset); + + // then the vtables for all the virtual bases. + b.GenerateVtableForVBases(RD, Offset); + llvm::Constant *C = 0; llvm::Type *type = Ptr8Ty; llvm::GlobalVariable::LinkageTypes linktype |