diff options
| author | Manman Ren <manman.ren@gmail.com> | 2013-08-29 20:48:48 +0000 |
|---|---|---|
| committer | Manman Ren <manman.ren@gmail.com> | 2013-08-29 20:48:48 +0000 |
| commit | f801f808ba8a5933c8321c6f7295312b394c664b (patch) | |
| tree | eb0002ef358113aeef2881ce47cc7b12a27e66dd /clang/lib/CodeGen | |
| parent | 825d2084da02f9f6aa976d9d8acd8eb5a9b95ab2 (diff) | |
| download | bcm5719-llvm-f801f808ba8a5933c8321c6f7295312b394c664b.tar.gz bcm5719-llvm-f801f808ba8a5933c8321c6f7295312b394c664b.zip | |
Debug Info: this reverts commit r189600.
We had further discussions on how to retain types, whether to do it in front end
or in DIBuilder. And we agree to do it in DIBuilder so front ends
generating unique identifier do not need to worry about retaining them.
llvm-svn: 189609
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 67 |
1 files changed, 7 insertions, 60 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index bd197373529..fd495fe7733 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -599,29 +599,6 @@ llvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, Ty->getPointeeType(), Unit); } -/// In C++ mode, types have linkage, so we can rely on the ODR and -/// on their mangled names, if they're external. Otherwise, we append -/// the CU's directory and file name. -static void getUniqueTagTypeName(const TagType *Ty, CodeGenModule &CGM, - llvm::DICompileUnit TheCU, - SmallString<256> &FullName) { - // FIXME: ODR should apply to ObjC++ exactly the same wasy it does to C++. - // For now, only apply ODR with C++. - const TagDecl *TD = Ty->getDecl(); - if (TheCU.getLanguage() != llvm::dwarf::DW_LANG_C_plus_plus || - !TD->isExternallyVisible()) - return; - // Microsoft Mangler does not have support for mangleCXXRTTIName yet. - if (CGM.getTarget().getCXXABI().isMicrosoft()) - return; - - // TODO: This is using the RTTI name. Is there a better way to get - // a unique string for a type? - llvm::raw_svector_ostream Out(FullName); - CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(QualType(Ty, 0), Out); - Out.flush(); -} - // Creates a forward declaration for a RecordDecl in the given context. llvm::DICompositeType CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty, @@ -644,14 +621,7 @@ CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty, } // Create the type. - SmallString<256> FullName; - getUniqueTagTypeName(Ty, CGM, TheCU, FullName); - if (!FullName.empty()) { - QualType QTy(Ty, 0); - RetainedTypes.push_back(QTy.getAsOpaquePtr()); - } - return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line, 0, 0, 0, - FullName.str()); + return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line); } // Walk up the context chain and create forward decls for record decls, @@ -1914,13 +1884,6 @@ llvm::DIType CGDebugInfo::CreateEnumType(const EnumType *Ty) { Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); } - SmallString<256> FullName; - getUniqueTagTypeName(Ty, CGM, TheCU, FullName); - if (!FullName.empty()) { - QualType QTy(Ty, 0); - RetainedTypes.push_back(QTy.getAsOpaquePtr()); - } - // If this is just a forward declaration, construct an appropriately // marked node and just return it. if (!ED->getDefinition()) { @@ -1931,7 +1894,7 @@ llvm::DIType CGDebugInfo::CreateEnumType(const EnumType *Ty) { StringRef EDName = ED->getName(); return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line, 0, - Size, Align, FullName.str()); + Size, Align); } // Create DIEnumerator elements for each enumerator. @@ -1957,7 +1920,7 @@ llvm::DIType CGDebugInfo::CreateEnumType(const EnumType *Ty) { llvm::DIType DbgTy = DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit, Line, Size, Align, EltArray, - ClassTy, FullName.str()); + ClassTy); return DbgTy; } @@ -2307,28 +2270,20 @@ llvm::DICompositeType CGDebugInfo::CreateLimitedType(const RecordType *Ty) { uint64_t Align = CGM.getContext().getTypeAlign(Ty); llvm::DICompositeType RealDecl; - SmallString<256> FullName; - getUniqueTagTypeName(Ty, CGM, TheCU, FullName); - if (!FullName.empty()) { - QualType QTy(Ty, 0); - RetainedTypes.push_back(QTy.getAsOpaquePtr()); - } - if (RD->isUnion()) RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line, - Size, Align, 0, llvm::DIArray(), 0, - FullName.str()); + Size, Align, 0, llvm::DIArray()); else if (RD->isClass()) { // FIXME: This could be a struct type giving a default visibility different // than C++ class type, but needs llvm metadata changes first. RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line, Size, Align, 0, 0, llvm::DIType(), llvm::DIArray(), llvm::DIType(), - llvm::DIArray(), FullName.str()); + llvm::DIArray()); } else RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line, Size, Align, 0, llvm::DIType(), - llvm::DIArray(), 0, 0, FullName.str()); + llvm::DIArray()); RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl; @@ -3335,17 +3290,9 @@ void CGDebugInfo::finalize() { // We keep our own list of retained types, because we need to look // up the final type in the type cache. - // Both createForwardDecl and createLimitedType can add the same type to - // RetainedTypes. A set is used to avoid duplication. - llvm::SmallPtrSet<void *, 16> RetainSet; for (std::vector<void *>::const_iterator RI = RetainedTypes.begin(), RE = RetainedTypes.end(); RI != RE; ++RI) - if (RetainSet.insert(*RI)) { - llvm::DenseMap<void *, llvm::WeakVH>::iterator it = - TypeCache.find(*RI); - if (it != TypeCache.end() && it->second) - DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(it->second))); - } + DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(TypeCache[*RI]))); DBuilder.finalize(); } |

