Anders, One of your patch between r97339 and r97342 caused a regression. Please investigate this soon. Thanks! - Devang
$ clang++ -c virtfunc.cc 0 clang 0x0000000100f3953b PrintStackTrace(void*) + 38 1 clang 0x0000000100f39ac9 SignalHandler(int) + 336 2 libSystem.B.dylib 0x00007fff830a6eaa _sigtramp + 26 3 clang 0x000000010055c111 bool llvm::isa_impl_cl<clang::Type*>::isa<clang::ReferenceType>(clang::Type*) + 21 4 libSystem.B.dylib 0x00007fff83122e74 __pthread_markcancel + 0 5 clang 0x00000001001f2466 (anonymous namespace)::FinalOverriders::MergeSubobjectOffsets(llvm::DenseMap<clang::CXXRecordDecl const*, llvm::SmallVector<unsigned long long, 1u>, llvm::DenseMapInfo<clang::CXXRecordDecl const*>, llvm::DenseMapInfo<llvm::SmallVector<unsigned long long, 1u> > > const&, llvm::DenseMap<clang::CXXRecordDecl const*, llvm::SmallVector<unsigned long long, 1u>, llvm::DenseMapInfo<clang::CXXRecordDecl const*>, llvm::DenseMapInfo<llvm::SmallVector<unsigned long long, 1u> > >&) + 418 6 clang 0x00000001001f845c (anonymous namespace)::FinalOverriders::ComputeFinalOverriders(clang::CodeGen::BaseSubobject, bool, llvm::DenseMap<clang::CXXRecordDecl const*, llvm::SmallVector<unsigned long long, 1u>, llvm::DenseMapInfo<clang::CXXRecordDecl const*>, llvm::DenseMapInfo<llvm::SmallVector<unsigned long long, 1u> > >&) + 466 7 clang 0x00000001001f8407 (anonymous namespace)::FinalOverriders::ComputeFinalOverriders(clang::CodeGen::BaseSubobject, bool, llvm::DenseMap<clang::CXXRecordDecl const*, llvm::SmallVector<unsigned long long, 1u>, llvm::DenseMapInfo<clang::CXXRecordDecl const*>, llvm::DenseMapInfo<llvm::SmallVector<unsigned long long, 1u> > >&) + 381 8 clang 0x00000001001f8557 (anonymous namespace)::FinalOverriders::FinalOverriders(clang::CXXRecordDecl const*) + 185 9 clang 0x00000001001f9431 (anonymous namespace)::VtableBuilder::VtableBuilder(clang::CodeGen::CGVtableInfo&, clang::CXXRecordDecl const*, unsigned long long, bool, clang::CXXRecordDecl const*) + 129 10 clang 0x00000001001f9595 clang::CodeGen::CGVtableInfo::GenerateVtable(llvm::GlobalValue::LinkageTypes, bool, clang::CXXRecordDecl const*, clang::CXXRecordDecl const*, unsigned long long, bool, llvm::DenseMap<clang::CodeGen::BaseSubobject, unsigned long long, llvm::DenseMapInfo<clang::CodeGen::BaseSubobject>, llvm::DenseMapInfo<unsigned long long> >&) + 217 11 clang 0x00000001001f9be7 clang::CodeGen::CGVtableInfo::GenerateClassData(llvm::GlobalValue::LinkageTypes, clang::CXXRecordDecl const*) + 187 12 clang 0x00000001001f9ce5 clang::CodeGen::CGVtableInfo::MaybeEmitVtable(clang::CodeGen::GlobalDecl) + 211 13 clang 0x0000000100213479 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::CodeGen::GlobalDecl) + 171 14 clang 0x00000001002137a5 clang::CodeGen::CodeGenModule::EmitGlobal(clang::CodeGen::GlobalDecl) + 341 On Sat, Feb 27, 2010 at 12:39 PM, Anders Carlsson <[email protected]> wrote: > Author: andersca > Date: Sat Feb 27 14:39:05 2010 > New Revision: 97342 > > URL: http://llvm.org/viewvc/llvm-project?rev=97342&view=rev > Log: > Start fleshing out construction vtable support. > > Modified: > cfe/trunk/lib/CodeGen/CGVtable.cpp > > Modified: cfe/trunk/lib/CodeGen/CGVtable.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVtable.cpp?rev=97342&r1=97341&r2=97342&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGVtable.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGVtable.cpp Sat Feb 27 14:39:05 2010 > @@ -1058,6 +1058,15 @@ > /// vtable. > const CXXRecordDecl *MostDerivedClass; > > + /// MostDerivedClassOffset - If we're building a construction vtable, this > + /// holds the offset from the layout class to the most derived class. > + const uint64_t MostDerivedClassOffset; > + > + /// LayoutClass - The class we're using for layout information. Will be > + /// different than the most derived class if we're building a construction > + /// vtable. > + const CXXRecordDecl *LayoutClass; > + > /// Context - The ASTContext which we will use for layout information. > ASTContext &Context; > > @@ -1215,9 +1224,12 @@ > VisitedVirtualBasesSetTy &VBases); > > public: > - VtableBuilder(CGVtableInfo &VtableInfo, const CXXRecordDecl > *MostDerivedClass) > - : VtableInfo(VtableInfo), MostDerivedClass(MostDerivedClass), > - Context(MostDerivedClass->getASTContext()), Overriders(MostDerivedClass) > { > + VtableBuilder(CGVtableInfo &VtableInfo, const CXXRecordDecl > *MostDerivedClass, > + uint64_t MostDerivedClassOffset, > + const CXXRecordDecl *LayoutClass) > + : VtableInfo(VtableInfo), MostDerivedClass(MostDerivedClass), > + MostDerivedClassOffset(MostDerivedClassOffset), LayoutClass(LayoutClass), > + Context(MostDerivedClass->getASTContext()), Overriders(MostDerivedClass) > { > > LayoutVtable(); > } > @@ -1808,8 +1820,17 @@ > > /// dumpLayout - Dump the vtable layout. > void VtableBuilder::dumpLayout(llvm::raw_ostream& Out) { > - > - Out << "Vtable for '" << MostDerivedClass->getQualifiedNameAsString(); > + > + if (MostDerivedClass == LayoutClass) { > + Out << "Vtable for '"; > + Out << MostDerivedClass->getQualifiedNameAsString(); > + } else { > + Out << "Construction vtable for ('"; > + Out << MostDerivedClass->getQualifiedNameAsString() << "', "; > + // FIXME: Don't use / 8 . > + Out << MostDerivedClassOffset / 8 << ") in '"; > + Out << LayoutClass->getQualifiedNameAsString(); > + } > Out << "' (" << Components.size() << " entries).\n"; > > // Iterate through the address points and insert them into a new map where > @@ -1983,7 +2004,8 @@ > > Out << '\n'; > } > - > + > + Out << '\n'; > } > > } > @@ -3272,11 +3294,17 @@ > const CXXRecordDecl *LayoutClass, > const CXXRecordDecl *RD, uint64_t Offset, > AddressPointsMapTy& AddressPoints) { > - if (GenerateDefinition && LayoutClass == RD) { > - VtableBuilder Builder(*this, RD); > - > - if (CGM.getLangOptions().DumpVtableLayouts) > + if (GenerateDefinition) { > + if (LayoutClass == RD) { > + VtableBuilder Builder(*this, RD, Offset, LayoutClass); > + > + if (CGM.getLangOptions().DumpVtableLayouts) > + Builder.dumpLayout(llvm::errs()); > + } else if (CGM.getLangOptions().DumpVtableLayouts) { > + // We only build construction vtables when dumping vtable layouts for > now. > + VtableBuilder Builder(*this, RD, Offset, LayoutClass); > Builder.dumpLayout(llvm::errs()); > + } > } > > llvm::SmallString<256> OutName; > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > -- - Devang
virtfunc.cc
Description: Binary data
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
