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