diff options
author | Anders Carlsson <andersca@mac.com> | 2010-01-26 05:26:39 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-01-26 05:26:39 +0000 |
commit | e70d391ed56839841e4ace189d22ae3ee789b044 (patch) | |
tree | 15130c075f16ebddb10aa749a98250b02b92b26b /lib/CodeGen/CGDebugInfo.cpp | |
parent | 4433f1cf8a2704395e509d020d8f79da4e273458 (diff) |
Fix another debug info crash with virtual bases.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94520 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index e1aeb5ed8c..cb8752e7d5 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -615,21 +615,28 @@ CollectCXXBases(const CXXRecordDecl *Decl, for (CXXRecordDecl::base_class_const_iterator BI = Decl->bases_begin(), BE = Decl->bases_end(); BI != BE; ++BI) { unsigned BFlags = 0; - if (BI->isVirtual()) + uint64_t BaseOffset; + + const CXXRecordDecl *Base = + cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); + + if (BI->isVirtual()) { + BaseOffset = RL.getVBaseClassOffset(Base); BFlags = llvm::DIType::FlagVirtual; + } else + BaseOffset = RL.getBaseClassOffset(Base); + AccessSpecifier Access = BI->getAccessSpecifier(); if (Access == clang::AS_private) BFlags |= llvm::DIType::FlagPrivate; else if (Access == clang::AS_protected) BFlags |= llvm::DIType::FlagProtected; - const CXXRecordDecl *Base = - cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); llvm::DIType DTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_inheritance, RecordTy, llvm::StringRef(), llvm::DICompileUnit(), 0, 0, 0, - RL.getBaseClassOffset(Base), BFlags, + BaseOffset, BFlags, getOrCreateType(BI->getType(), Unit)); EltTys.push_back(DTy); |