diff options
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 19 | ||||
-rw-r--r-- | clang/test/CodeGenObjCXX/debug-info-cyclic.mm | 3 |
2 files changed, 17 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 48458dbd600..a20e39f3fc0 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -590,18 +590,29 @@ llvm::DIType *CGDebugInfo::CreateType(const PointerType *Ty, Ty->getPointeeType(), Unit); } +/// \return whether a C++ mangling exists for the type defined by TD. +static bool hasCXXMangling(const TagDecl *TD, llvm::DICompileUnit *TheCU) { + switch (TheCU->getSourceLanguage()) { + case llvm::dwarf::DW_LANG_C_plus_plus: + return true; + case llvm::dwarf::DW_LANG_ObjC_plus_plus: + return isa<CXXRecordDecl>(TD) || isa<EnumDecl>(TD); + default: + return false; + } +} + /// In C++ mode, types have linkage, so we can rely on the ODR and /// on their mangled names, if they're external. static SmallString<256> 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->getSourceLanguage() != llvm::dwarf::DW_LANG_C_plus_plus || - !TD->isExternallyVisible()) + + if (!hasCXXMangling(TD, TheCU) || !TD->isExternallyVisible()) return FullName; + // Microsoft Mangler does not have support for mangleCXXRTTIName yet. if (CGM.getTarget().getCXXABI().isMicrosoft()) return FullName; diff --git a/clang/test/CodeGenObjCXX/debug-info-cyclic.mm b/clang/test/CodeGenObjCXX/debug-info-cyclic.mm index 8983fe51120..37a8064baaf 100644 --- a/clang/test/CodeGenObjCXX/debug-info-cyclic.mm +++ b/clang/test/CodeGenObjCXX/debug-info-cyclic.mm @@ -1,12 +1,13 @@ // RUN: %clang_cc1 -triple x86_64-apple-darwin -g -emit-llvm %s -o - | FileCheck %s struct B { -// CHECK: ![[B:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "B" +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "B" // CHECK-SAME: line: [[@LINE-2]], // CHECK-SAME: size: 8, align: 8, // CHECK-NOT: offset: // CHECK-NOT: DIFlagFwdDecl // CHECK-SAME: elements: ![[BMEMBERS:[0-9]+]] +// CHECK-SAME: identifier: [[B:.*]]) // CHECK: ![[BMEMBERS]] = !{![[BB:[0-9]+]]} B(struct A *); // CHECK: ![[BB]] = !DISubprogram(name: "B", scope: ![[B]] |