diff options
author | Nico Weber <nicolasweber@gmx.de> | 2013-04-01 20:33:18 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2013-04-01 20:33:18 +0000 |
commit | bd0152fb251e84c6f335c66322b83a9af09fed0c (patch) | |
tree | f9ee6b7c1e8b834c84ba2a878f7395417d074943 /lib/CodeGen/CGDebugInfo.cpp | |
parent | f396ad9b1fa0c74c9db16a8158c3882c9db774e2 (diff) |
Revert r178079, it caused PR15637.
Also add a test for PR15637.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178497 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index a60d7239b2..b159152933 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -392,12 +392,21 @@ llvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) { llvm::DIType ISATy = DBuilder.createPointerType(ClassTy, Size); - ObjTy = + llvm::DIType FwdTy = DBuilder.createStructType(TheCU, "objc_object", getOrCreateMainFile(), 0, 0, 0, 0, llvm::DIType(), llvm::DIArray()); - ObjTy.setTypeArray(DBuilder.getOrCreateArray(&*DBuilder.createMemberType( - ObjTy, "isa", getOrCreateMainFile(), 0, Size, 0, 0, 0, ISATy))); + llvm::TrackingVH<llvm::MDNode> ObjNode(FwdTy); + SmallVector<llvm::Value *, 1> EltTys; + llvm::DIType FieldTy = + DBuilder.createMemberType(llvm::DIDescriptor(ObjNode), "isa", + getOrCreateMainFile(), 0, Size, + 0, 0, 0, ISATy); + EltTys.push_back(FieldTy); + llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); + + ObjNode->replaceOperandWith(10, Elements); + ObjTy = llvm::DIType(ObjNode); return ObjTy; } case BuiltinType::ObjCSel: { @@ -1323,16 +1332,15 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) { // may refer to the forward decl if the struct is recursive) and replace all // uses of the forward declaration with the final definition. - llvm::DICompositeType FwdDecl( - getOrCreateLimitedType(QualType(Ty, 0), DefUnit)); - assert(FwdDecl.Verify() && - "The debug type of a RecordType should be a DICompositeType"); + llvm::DIType FwdDecl = getOrCreateLimitedType(QualType(Ty, 0), DefUnit); if (FwdDecl.isForwardDecl()) return FwdDecl; + llvm::TrackingVH<llvm::MDNode> FwdDeclNode(FwdDecl); + // Push the struct on region stack. - LexicalBlockStack.push_back(&*FwdDecl); + LexicalBlockStack.push_back(FwdDeclNode); RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); // Add this to the completed-type cache while we're completing it recursively. @@ -1366,10 +1374,19 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) { RegionMap.erase(Ty->getDecl()); llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); - FwdDecl.setTypeArray(Elements, TParamsArray); + // FIXME: Magic numbers ahoy! These should be changed when we + // get some enums in llvm/Analysis/DebugInfo.h to refer to + // them. + if (RD->isUnion()) + FwdDeclNode->replaceOperandWith(10, Elements); + else if (CXXDecl) { + FwdDeclNode->replaceOperandWith(10, Elements); + FwdDeclNode->replaceOperandWith(13, TParamsArray); + } else + FwdDeclNode->replaceOperandWith(10, Elements); - RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); - return FwdDecl; + RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDeclNode); + return llvm::DIType(FwdDeclNode); } /// CreateType - get objective-c object type. @@ -1412,7 +1429,7 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, if (ID->getImplementation()) Flags |= llvm::DIDescriptor::FlagObjcClassComplete; - llvm::DICompositeType RealDecl = + llvm::DIType RealDecl = DBuilder.createStructType(Unit, ID->getName(), DefUnit, Line, Size, Align, Flags, llvm::DIType(), llvm::DIArray(), RuntimeLang); @@ -1422,8 +1439,9 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, QualType QualTy = QualType(Ty, 0); CompletedTypeCache[QualTy.getAsOpaquePtr()] = RealDecl; // Push the struct on region stack. + llvm::TrackingVH<llvm::MDNode> FwdDeclNode(RealDecl); - LexicalBlockStack.push_back(static_cast<llvm::MDNode*>(RealDecl)); + LexicalBlockStack.push_back(FwdDeclNode); RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); // Convert all the elements. @@ -1543,7 +1561,7 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, } llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); - RealDecl.setTypeArray(Elements); + FwdDeclNode->replaceOperandWith(10, Elements); // If the implementation is not yet set, we do not want to mark it // as complete. An implementation may declare additional @@ -1552,7 +1570,7 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, CompletedTypeCache.erase(QualTy.getAsOpaquePtr()); LexicalBlockStack.pop_back(); - return RealDecl; + return llvm::DIType(FwdDeclNode); } llvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, llvm::DIFile Unit) { |