diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -4438,11 +4438,19 @@ StringRef Name = VD->getName(); llvm::DIType *Ty = getOrCreateType(VD->getType(), Unit); - // Do not use global variables for enums, unless in CodeView. + // Use global variables for enums in CodeView, use DW_TAG_enumeration_type for + // enums for non-CodeView. if (const auto *ECD = dyn_cast(VD)) { const auto *ED = cast(ECD->getDeclContext()); assert(isa(ED->getTypeForDecl()) && "Enum without EnumType?"); - (void)ED; + + // If not CodeView, emit DW_TAG_enumeration_type if necessary. + if (!CGM.getCodeGenOpts().EmitCodeView) { + llvm::DIType *EDTy = + getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); + if (EDTy->getTag() == llvm::dwarf::DW_TAG_enumeration_type) + return; + } // If CodeView, emit enums as global variables, unless they are defined // inside a class. We do this because MSVC doesn't emit S_CONSTANTs for diff --git a/clang/test/CodeGen/enum2.c b/clang/test/CodeGen/enum2.c --- a/clang/test/CodeGen/enum2.c +++ b/clang/test/CodeGen/enum2.c @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -triple i386-unknown-unknown %s -debug-info-kind=limited -emit-llvm -o /dev/null +// RUN: %clang_cc1 -triple i386-unknown-unknown %s -debug-info-kind=limited -emit-llvm -o - | FileCheck %s + int v; enum e { MAX }; @@ -6,3 +7,9 @@ { v = MAX; } +// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, +// CHECK-SAME: baseType: ![[LONG:[0-9]+]] +// CHECK-SAME: elements: ![[ELTS:[0-9]+]] +// CHECK: ![[LONG]] = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned) +// CHECK: ![[ELTS]] = !{![[MAX:[0-9]+]]} +// CHECK: ![[MAX]] = !DIEnumerator(name: "MAX", value: 0, isUnsigned: true)