Will this cause us to emit all enumerations, even those that are not referenced? That might be too bloaty/expensive.
(& please check the test cases it tools/clang/tests/CodeGen* to use as a basis for writing test cases for your change/fix) On Thu, Nov 28, 2013 at 6:13 AM, jyoti allur <[email protected]> wrote: > 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); > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
