diff options
Diffstat (limited to 'clang/lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 154 |
1 files changed, 10 insertions, 144 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 7f9216a10cb..693d0f6fdfc 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -148,9 +148,7 @@ void CGDebugInfo::setLocation(SourceLocation Loc) { } llvm::DIScope *CGDebugInfo::getDeclContextDescriptor(const Decl *D) { - llvm::DIScope *Mod = getParentModuleOrNull(D); - return getContextDescriptor(cast<Decl>(D->getDeclContext()), - Mod ? Mod : TheCU); + return getContextDescriptor(cast<Decl>(D->getDeclContext()), TheCU); } llvm::DIScope *CGDebugInfo::getContextDescriptor(const Decl *Context, @@ -1450,9 +1448,6 @@ void CGDebugInfo::completeRequiredType(const RecordDecl *RD) { if (CXXDecl->isDynamicClass()) return; - if (DebugTypeExtRefs && RD->isFromASTFile()) - return; - QualType Ty = CGM.getContext().getRecordType(RD); llvm::DIType *T = getTypeOrNull(Ty); if (T && T->isForwardDecl()) @@ -1674,9 +1669,9 @@ CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod) { TheCU->getSourceLanguage(), internString(Mod.ModuleName), internString(Mod.Path), TheCU->getProducer(), true, StringRef(), 0, internString(Mod.ASTFile), llvm::DIBuilder::FullDebug, Mod.Signature); - llvm::DIModule *M = DIB.createModule( - CU, Mod.ModuleName, ConfigMacros, internString(Mod.Path), - internString(CGM.getHeaderSearchOpts().Sysroot)); + llvm::DIModule *M = + DIB.createModule(CU, Mod.ModuleName, ConfigMacros, internString(Mod.Path), + internString(CGM.getHeaderSearchOpts().Sysroot)); DIB.finalize(); ModRef.reset(M); return M; @@ -2086,16 +2081,9 @@ llvm::DIType *CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile *Unit) { if (auto *T = getTypeOrNull(Ty)) return T; - llvm::DIType *Res = nullptr; - if (DebugTypeExtRefs) - // Make a forward declaration of an external type. - Res = getTypeExtRefOrNull(Ty, Unit); - // Otherwise create the type. - if (!Res) - Res = CreateTypeNode(Ty, Unit); - - void* TyPtr = Ty.getAsOpaquePtr(); + llvm::DIType *Res = CreateTypeNode(Ty, Unit); + void *TyPtr = Ty.getAsOpaquePtr(); // And update the type cache. TypeCache[TyPtr].reset(Res); @@ -2127,123 +2115,6 @@ ObjCInterfaceDecl *CGDebugInfo::getObjCInterfaceDecl(QualType Ty) { } } -llvm::DIModule *CGDebugInfo::getParentModuleOrNull(const Decl *D) { - if (!DebugTypeExtRefs || !D || !D->isFromASTFile()) - return nullptr; - - llvm::DIModule *ModuleRef = nullptr; - auto *Reader = CGM.getContext().getExternalSource(); - auto Idx = D->getOwningModuleID(); - auto Info = Reader->getSourceDescriptor(Idx); - if (Info) - ModuleRef = getOrCreateModuleRef(*Info); - return ModuleRef; -} - -llvm::DIType *CGDebugInfo::getTypeExtRefOrNull(QualType Ty, llvm::DIFile *F, - bool Anchored) { - assert(DebugTypeExtRefs && "module debugging only"); - Decl *TyDecl = nullptr; - StringRef Name; - SmallString<256> UID; - unsigned Tag = 0; - - // Handle all types that have a declaration. - switch (Ty->getTypeClass()) { - case Type::Typedef: { - TyDecl = cast<TypedefType>(Ty)->getDecl(); - if (!TyDecl->isFromASTFile()) - return nullptr; - - // A typedef will anchor a type in the module. - if (auto *TD = dyn_cast<TypedefDecl>(TyDecl)) { - // This is a working around the fact that LLVM does not allow - // typedefs to be forward declarations. - QualType Ty = TD->getUnderlyingType(); - Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); - if (auto *AnchoredTy = getTypeExtRefOrNull(Ty, F, /*Anchored=*/true)) { - TypeCache[Ty.getAsOpaquePtr()].reset(AnchoredTy); - SourceLocation Loc = TD->getLocation(); - return DBuilder.createTypedef(AnchoredTy, TD->getName(), - getOrCreateFile(Loc), getLineNumber(Loc), - getDeclContextDescriptor(TD)); - } - } - break; - } - - case Type::Record: { - TyDecl = cast<RecordType>(Ty)->getDecl(); - if (!TyDecl->isFromASTFile()) - return nullptr; - - if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(TyDecl)) - if (!CTSD->isExplicitInstantiationOrSpecialization() && !Anchored) - // We may not assume that this type made it into the module. - return nullptr; - // C++ classes and template instantiations. - if (auto *RD = dyn_cast<CXXRecordDecl>(TyDecl)) { - if (!RD->getDefinition()) - return nullptr; - Tag = getTagForRecord(RD); - UID = - getUniqueTagTypeName(cast<TagType>(RD->getTypeForDecl()), CGM, TheCU); - Name = getClassName(RD); - } else if (auto *RD = dyn_cast<RecordDecl>(TyDecl)) { - // C-style structs. - if (!RD->getDefinition()) - return nullptr; - Tag = getTagForRecord(RD); - Name = getClassName(RD); - } - break; - } - - case Type::Enum: { - TyDecl = cast<EnumType>(Ty)->getDecl(); - if (!TyDecl->isFromASTFile()) - return nullptr; - - if (auto *ED = dyn_cast<EnumDecl>(TyDecl)) { - if (!ED->getDefinition()) - return nullptr; - Tag = llvm::dwarf::DW_TAG_enumeration_type; - if ((TheCU->getSourceLanguage() == llvm::dwarf::DW_LANG_C_plus_plus) || - (TheCU->getSourceLanguage() == llvm::dwarf::DW_LANG_ObjC_plus_plus)) { - UID = getUniqueTagTypeName(cast<TagType>(ED->getTypeForDecl()), CGM, - TheCU); - Name = ED->getName(); - } - } - break; - } - - case Type::ObjCInterface: { - TyDecl = cast<ObjCInterfaceType>(Ty)->getDecl(); - if (!TyDecl->isFromASTFile()) - return nullptr; - - if (auto *ID = dyn_cast<ObjCInterfaceDecl>(TyDecl)) { - if (!ID->getDefinition()) - return nullptr; - Tag = llvm::dwarf::DW_TAG_structure_type; - Name = ID->getName(); - } - break; - } - - default: - return nullptr; - } - - if (Tag && !Name.empty()) { - assert(TyDecl); - auto *Ctx = getDeclContextDescriptor(TyDecl); - return DBuilder.createForwardDecl(Tag, Name, Ctx, F, 0, 0, 0, 0, UID); - } else - return nullptr; -} - llvm::DIType *CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile *Unit) { // Handle qualifiers, which recursively handles what they refer to. if (Ty.hasLocalQualifiers()) @@ -2454,10 +2325,8 @@ void CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit, dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) FDContext = getOrCreateNameSpace(NSDecl); else if (const RecordDecl *RDecl = - dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) { - llvm::DIScope *Mod = getParentModuleOrNull(RDecl); - FDContext = getContextDescriptor(RDecl, Mod ? Mod : TheCU); - } + dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) + FDContext = getContextDescriptor(RDecl, TheCU); // Collect template parameters. TParamsArray = CollectFunctionTemplateParams(FD, Unit); } @@ -2505,9 +2374,7 @@ void CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit, // outside the class by putting it in the global scope. if (DC->isRecord()) DC = CGM.getContext().getTranslationUnitDecl(); - - llvm::DIScope *Mod = getParentModuleOrNull(VD); - VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU); + VDContext = getContextDescriptor(cast<Decl>(DC), TheCU); } llvm::DISubprogram * @@ -3432,8 +3299,7 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, llvm::DIScope *CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { if (!LexicalBlockStack.empty()) return LexicalBlockStack.back(); - llvm::DIScope *Mod = getParentModuleOrNull(D); - return getContextDescriptor(D, Mod ? Mod : TheCU); + return getContextDescriptor(D, TheCU); } void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { |