[PATCH] clang does not emit DW_TAG_enumerator and DW_TAG_enumeration_type for unnamed enum types
jyoti allur
jyoti.yalamanchili at gmail.com
Thu Nov 28 06:13:29 PST 2013
Hi echristo,
//global-used-types.c
/*
Contributed by Dodji Seketeli <dodji at redhat.com>
{ dg-options "-g -dA -fno-merge-debug-strings" }
{ dg-do compile }
{ dg-final { scan-assembler-times "0x.* DW_TAG_enumeration_type" 1 } }
{ dg-final { scan-assembler-times "DW_TAG_enumerator" 3 } }
{ dg-final { scan-assembler "\"a\"" } } //check emission of enum members
{ dg-final { scan-assembler "\"b\"" } } //check emission of enum members
*/
enum { a, b };
int v = a;
char s[b];
clang does not seem to emit DW_TAG_enumerator and DW_TAG_enumeration_type for unnamed enum types.
I have made a patch for the same. Let me know if this is good for commit. Need help adding a testcase for it in Debuginfo.
http://llvm-reviews.chandlerc.com/D2286
Files:
llvm/tools/clang/lib/CodeGen/CodeGenModule.h
llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
llvm/tools/clang/lib/CodeGen/CGDebugInfo.h
Index: llvm/tools/clang/lib/CodeGen/CodeGenModule.h
===================================================================
--- llvm/tools/clang/lib/CodeGen/CodeGenModule.h
+++ llvm/tools/clang/lib/CodeGen/CodeGenModule.h
@@ -1036,6 +1036,7 @@
void SetFunctionAttributes(GlobalDecl GD,
llvm::Function *F,
bool IsIncompleteFunction);
+ void EmitEnumType(EnumDecl *GlobalEnum );
void EmitGlobalDefinition(GlobalDecl D);
Index: llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
===================================================================
--- llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
+++ llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
@@ -2926,6 +2926,11 @@
EmitGlobal(cast<VarDecl>(D));
break;
+ case Decl::Enum:
+ //Handle Enum Case
+ EmitEnumType(cast<EnumDecl>(D));
+ break;
+
// Indirect fields from global anonymous structs and unions can be
// ignored; only the actual variable requires IR gen support.
case Decl::IndirectField:
@@ -3197,3 +3202,10 @@
return llvm::ConstantStruct::getAnon(Fields);
}
+
+void CodeGenModule::EmitEnumType(EnumDecl *GlobalEnum ) {
+
+ if (CGDebugInfo *DI = getModuleDebugInfo())
+ DI->EmitEnumerator(GlobalEnum);
+}
+
Index: llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
+++ llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -3275,3 +3275,12 @@
DBuilder.finalize();
}
+
+void CGDebugInfo::EmitEnumerator(const EnumDecl *EnumD) {
+
+ ASTContext &Context = CGM.getContext();
+ QualType T = Context.getEnumType(EnumD);
+ if (const EnumType *Enum = T->getAs<EnumType>())
+ CreateEnumType(Enum);
+}
+
Index: llvm/tools/clang/lib/CodeGen/CGDebugInfo.h
===================================================================
--- llvm/tools/clang/lib/CodeGen/CGDebugInfo.h
+++ llvm/tools/clang/lib/CodeGen/CGDebugInfo.h
@@ -267,6 +267,9 @@
/// EmitGlobalVariable - Emit global variable's debug info.
void EmitGlobalVariable(const ValueDecl *VD, llvm::Constant *Init);
+ /// EmitEnumerator - Emit enumerators debug info.
+ void EmitEnumerator(const EnumDecl *EnumD);
+
/// \brief - Emit C++ using directive.
void EmitUsingDirective(const UsingDirectiveDecl &UD);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2286.1.patch
Type: text/x-patch
Size: 2350 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131128/0c25a8d1/attachment.bin>
More information about the cfe-commits
mailing list