Author: majnemer Date: Fri Jul 1 18:12:54 2016 New Revision: 274401 URL: http://llvm.org/viewvc/llvm-project?rev=274401&view=rev Log: [CodeView] Include MSVC style names for unnamed types
The CodeView printer expects to be able to generate fully qualified names from the debug info graph. This means that we need to include the MSVC-style name in the debug info for anonymous types. Added: cfe/trunk/test/CodeGenCXX/debug-info-ms-anonymous-tag.cpp Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=274401&r1=274400&r2=274401&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Jul 1 18:12:54 2016 @@ -259,20 +259,56 @@ StringRef CGDebugInfo::getSelectorName(S } StringRef CGDebugInfo::getClassName(const RecordDecl *RD) { - // quick optimization to avoid having to intern strings that are already - // stored reliably elsewhere - if (!isa<ClassTemplateSpecializationDecl>(RD)) - return RD->getName(); - - SmallString<128> Name; - { + if (isa<ClassTemplateSpecializationDecl>(RD)) { + SmallString<128> Name; llvm::raw_svector_ostream OS(Name); RD->getNameForDiagnostic(OS, CGM.getContext().getPrintingPolicy(), /*Qualified*/ false); + + // Copy this name on the side and use its reference. + return internString(Name); + } + + // quick optimization to avoid having to intern strings that are already + // stored reliably elsewhere + if (const IdentifierInfo *II = RD->getIdentifier()) + return II->getName(); + + // The CodeView printer in LLVM wants to see the names of unnamed types: it is + // used to reconstruct the fully qualified type names. + if (CGM.getCodeGenOpts().EmitCodeView) { + if (const TypedefNameDecl *D = RD->getTypedefNameForAnonDecl()) { + assert(RD->getDeclContext() == D->getDeclContext() && + "Typedef should not be in another decl context!"); + assert(D->getDeclName().getAsIdentifierInfo() && + "Typedef was not named!"); + return D->getDeclName().getAsIdentifierInfo()->getName(); + } + + if (CGM.getLangOpts().CPlusPlus) { + StringRef Name; + + ASTContext &Context = CGM.getContext(); + if (const DeclaratorDecl *DD = Context.getDeclaratorForUnnamedTagDecl(RD)) + // Anonymous types without a name for linkage purposes have their + // declarator mangled in if they have one. + Name = DD->getName(); + else if (const TypedefNameDecl *TND = + Context.getTypedefNameForUnnamedTagDecl(RD)) + // Anonymous types without a name for linkage purposes have their + // associate typedef mangled in if they have one. + Name = TND->getName(); + + if (!Name.empty()) { + SmallString<256> UnnamedType("<unnamed-type-"); + UnnamedType += Name; + UnnamedType += '>'; + return internString(UnnamedType); + } + } } - // Copy this name on the side and use its reference. - return internString(Name); + return StringRef(); } llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) { Added: cfe/trunk/test/CodeGenCXX/debug-info-ms-anonymous-tag.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-ms-anonymous-tag.cpp?rev=274401&view=auto ============================================================================== --- cfe/trunk/test/CodeGenCXX/debug-info-ms-anonymous-tag.cpp (added) +++ cfe/trunk/test/CodeGenCXX/debug-info-ms-anonymous-tag.cpp Fri Jul 1 18:12:54 2016 @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple x86_64-pc-win32 -debug-info-kind=limited -gcodeview %s -emit-llvm -o - | FileCheck %s + +typedef struct { +} test1; + +test1 gv1; +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "test1" + +struct { +} test2; +void *use_test2 = &test2; + +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "<unnamed-type-test2>" + +typedef struct { +} *test3; +test3 gv3; +void *use_test3 = &gv3; + +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "<unnamed-type-test3>" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits