[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