Hi echristo,

//global-used-types.c

/*
 Contributed by Dodji Seketeli <[email protected]>
 { 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);
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);
 
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to