r268055 - Recommitted r264281 "Supporting all entities declared in lexical scope in LLVM debug info."

Aboud, Amjad via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 29 13:47:23 PDT 2016


I could not reproduce the issue.
This error appeared before and it always meant that LLVM and Clang were not aligned.
You need both revisions to work correctly: (LLVM) 268054, (Clang) 268055

Please, let me know if you can reproduce the issue locally using these versions.

Regards,
Amjad

> -----Original Message-----
> From: Rafael EspĂ­ndola [mailto:rafael.espindola at gmail.com]
> Sent: Friday, April 29, 2016 22:42
> To: Aboud, Amjad <amjad.aboud at intel.com>
> Cc: cfe-commits cfe <cfe-commits at lists.llvm.org>
> Subject: Re: r268055 - Recommitted r264281 "Supporting all entities declared in
> lexical scope in LLVM debug info."
> 
> Maybe this is the cause of this bootstrap failure:
> http://lab.llvm.org:8080/green/job/llvm-stage2-cmake-RgLTO_build/6843
> ?
> 
> Cheers,
> Rafael
> 
> 
> On 29 April 2016 at 12:08, Amjad Aboud via cfe-commits <cfe-
> commits at lists.llvm.org> wrote:
> > Author: aaboud
> > Date: Fri Apr 29 11:08:08 2016
> > New Revision: 268055
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=268055&view=rev
> > Log:
> > Recommitted r264281 "Supporting all entities declared in lexical scope in LLVM
> debug info."
> > After fixing PR26942 in r267004.
> >
> > Added:
> >     cfe/trunk/test/CodeGenCXX/debug-info-lb.cpp
> > Modified:
> >     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> >     cfe/trunk/lib/CodeGen/CGDebugInfo.h
> >     cfe/trunk/lib/CodeGen/CGDecl.cpp
> >     cfe/trunk/test/CodeGenCXX/debug-info-anon-union-vars.cpp
> >
> > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> > URL:
> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.
> > cpp?rev=268055&r1=268054&r2=268055&view=diff
> >
> =================================================================
> =====
> > ========
> > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Apr 29 11:08:08 2016
> > @@ -814,15 +814,18 @@ llvm::DIType *CGDebugInfo::CreateType(co
> >
> >  llvm::DIType *CGDebugInfo::CreateType(const TypedefType *Ty,
> >                                        llvm::DIFile *Unit) {
> > +  TypedefNameDecl *TD = Ty->getDecl();
> >    // We don't set size information, but do specify where the typedef was
> >    // declared.
> > -  SourceLocation Loc = Ty->getDecl()->getLocation();
> > +  SourceLocation Loc = TD->getLocation();
> > +
> > +  llvm::DIScope *TDContext = getDeclarationLexicalScope(*TD,
> > + QualType(Ty, 0));
> >
> >    // Typedefs are derived from some other type.
> >    return DBuilder.createTypedef(
> >        getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit),
> >        Ty->getDecl()->getName(), getOrCreateFile(Loc), getLineNumber(Loc),
> > -      getDeclContextDescriptor(Ty->getDecl()));
> > +      TDContext);
> >  }
> >
> >  llvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty, @@
> > -1457,6 +1460,23 @@ llvm::DIType *CGDebugInfo::getOrCreateSt
> >    return T;
> >  }
> >
> > +void CGDebugInfo::recordDeclarationLexicalScope(const Decl &D) {
> > +  assert(LexicalBlockMap.find(&D) == LexicalBlockMap.end() &&
> > +         "D is already mapped to lexical block scope");
> > +  if (!LexicalBlockStack.empty())
> > +    LexicalBlockMap[&D] = LexicalBlockStack.back(); }
> > +
> > +llvm::DIScope *CGDebugInfo::getDeclarationLexicalScope(const Decl &D,
> > +                                                       QualType Ty) {
> > +  auto I = LexicalBlockMap.find(&D);
> > +  if (I != LexicalBlockMap.end()) {
> > +    RetainedTypes.push_back(Ty.getAsOpaquePtr());
> > +    return I->second;
> > +  }
> > +  return getDeclContextDescriptor(cast<Decl>(&D));
> > +}
> > +
> >  void CGDebugInfo::completeType(const EnumDecl *ED) {
> >    if (DebugKind <= codegenoptions::DebugLineTablesOnly)
> >      return;
> > @@ -2060,7 +2080,7 @@ llvm::DIType *CGDebugInfo::CreateEnumTyp
> >      // entered into the ReplaceMap: finalize() will replace the first
> >      // FwdDecl with the second and then replace the second with
> >      // complete type.
> > -    llvm::DIScope *EDContext = getDeclContextDescriptor(ED);
> > +    llvm::DIScope *EDContext = getDeclarationLexicalScope(*ED,
> > + QualType(Ty, 0));
> >      llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
> >      llvm::TempDIScope
> TmpContext(DBuilder.createReplaceableCompositeType(
> >          llvm::dwarf::DW_TAG_enumeration_type, "", TheCU, DefUnit,
> > 0)); @@ -2104,7 +2124,7 @@ llvm::DIType *CGDebugInfo::CreateTypeDef
> >
> >    llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
> >    unsigned Line = getLineNumber(ED->getLocation());
> > -  llvm::DIScope *EnumContext = getDeclContextDescriptor(ED);
> > +  llvm::DIScope *EnumContext = getDeclarationLexicalScope(*ED,
> > + QualType(Ty, 0));
> >    llvm::DIType *ClassTy =
> >        ED->isFixed() ? getOrCreateType(ED->getIntegerType(), DefUnit) : nullptr;
> >    return DBuilder.createEnumerationType(EnumContext, ED->getName(),
> > DefUnit, @@ -2365,7 +2385,7 @@ llvm::DICompositeType
> *CGDebugInfo::Crea
> >    unsigned Line = getLineNumber(RD->getLocation());
> >    StringRef RDName = getClassName(RD);
> >
> > -  llvm::DIScope *RDContext = getDeclContextDescriptor(RD);
> > +  llvm::DIScope *RDContext = getDeclarationLexicalScope(*RD,
> > + QualType(Ty, 0));
> >
> >    // If we ended up creating the type during the context chain construction,
> >    // just return that.
> > @@ -2536,8 +2556,15 @@ void CGDebugInfo::collectVarDeclProps(co
> >    if (DC->isRecord())
> >      DC = CGM.getContext().getTranslationUnitDecl();
> >
> > - llvm::DIScope *Mod = getParentModuleOrNull(VD);
> > - VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU);
> > +  if (VD->isStaticLocal()) {
> > +    // Get context for static locals (that are technically globals) the same way
> > +    // we do for "local" locals -- by using current lexical block.
> > +    assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack
> empty!");
> > +    VDContext = LexicalBlockStack.back();  } else {
> > +    llvm::DIScope *Mod = getParentModuleOrNull(VD);
> > +    VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod :
> > + TheCU);  }
> >  }
> >
> >  llvm::DISubprogram *
> >
> > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
> > URL:
> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.
> > h?rev=268055&r1=268054&r2=268055&view=diff
> >
> =================================================================
> =====
> > ========
> > --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
> > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Fri Apr 29 11:08:08 2016
> > @@ -107,6 +107,11 @@ class CGDebugInfo {
> >
> >    /// Keep track of our current nested lexical block.
> >    std::vector<llvm::TypedTrackingMDRef<llvm::DIScope>>
> > LexicalBlockStack;
> > +
> > +  /// Map of AST declaration to its lexical block scope.
> > +  llvm::DenseMap<const Decl *, llvm::TypedTrackingMDRef<llvm::DIScope>>
> > +      LexicalBlockMap;
> > +
> >    llvm::DenseMap<const Decl *, llvm::TrackingMDRef> RegionMap;
> >    /// Keep track of LexicalBlockStack counter at the beginning of a
> >    /// function. This is used to pop unbalanced regions at the end of
> > a @@ -369,6 +374,12 @@ public:
> >    /// Emit an Objective-C interface type standalone debug info.
> >    llvm::DIType *getOrCreateInterfaceType(QualType Ty, SourceLocation
> > Loc);
> >
> > +  /// Map AST declaration to its lexical block scope if available.
> > +  void recordDeclarationLexicalScope(const Decl &D);
> > +
> > +  /// Get lexical scope of AST declaration.
> > +  llvm::DIScope *getDeclarationLexicalScope(const Decl &D, QualType
> > + Ty);
> > +
> >    /// Emit standalone debug info for a type.
> >    llvm::DIType *getOrCreateStandaloneType(QualType Ty, SourceLocation
> > Loc);
> >
> >
> > Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
> > URL:
> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?r
> > ev=268055&r1=268054&r2=268055&view=diff
> >
> =================================================================
> =====
> > ========
> > --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Fri Apr 29 11:08:08 2016
> > @@ -87,11 +87,7 @@ void CodeGenFunction::EmitDecl(const Dec
> >    case Decl::UsingShadow:
> >    case Decl::ObjCTypeParam:
> >      llvm_unreachable("Declaration should not be in declstmts!");
> > -  case Decl::Function:  // void X();
> > -  case Decl::Record:    // struct/union/class X;
> > -  case Decl::Enum:      // enum X;
> > -  case Decl::EnumConstant: // enum ? { X = ? }
> > -  case Decl::CXXRecord: // struct/union/class X; [C++]
> > +  case Decl::Function:     // void X();
> >    case Decl::StaticAssert: // static_assert(X, ""); [C++0x]
> >    case Decl::Label:        // __label__ x;
> >    case Decl::Import:
> > @@ -101,13 +97,21 @@ void CodeGenFunction::EmitDecl(const Dec
> >      // None of these decls require codegen support.
> >      return;
> >
> > +  case Decl::Record:       // struct/union/class X;
> > +  case Decl::Enum:         // enum X;
> > +  case Decl::EnumConstant: // enum ? { X = ? }
> > +  case Decl::CXXRecord:    // struct/union/class X; [C++]
> > +    if (CGDebugInfo *DI = getDebugInfo())
> > +      DI->recordDeclarationLexicalScope(D);
> > +    return;
> > +
> >    case Decl::NamespaceAlias:
> >      if (CGDebugInfo *DI = getDebugInfo())
> > -        DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(D));
> > +      DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(D));
> >      return;
> >    case Decl::Using:          // using X; [C++]
> >      if (CGDebugInfo *DI = getDebugInfo())
> > -        DI->EmitUsingDecl(cast<UsingDecl>(D));
> > +      DI->EmitUsingDecl(cast<UsingDecl>(D));
> >      return;
> >    case Decl::UsingDirective: // using namespace X; [C++]
> >      if (CGDebugInfo *DI = getDebugInfo()) @@ -128,6 +132,9 @@ void
> > CodeGenFunction::EmitDecl(const Dec
> >      const TypedefNameDecl &TD = cast<TypedefNameDecl>(D);
> >      QualType Ty = TD.getUnderlyingType();
> >
> > +    if (CGDebugInfo *DI = getDebugInfo())
> > +      DI->recordDeclarationLexicalScope(D);
> > +
> >      if (Ty->isVariablyModifiedType())
> >        EmitVariablyModifiedType(Ty);
> >    }
> >
> > Modified: cfe/trunk/test/CodeGenCXX/debug-info-anon-union-vars.cpp
> > URL:
> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-in
> > fo-anon-union-vars.cpp?rev=268055&r1=268054&r2=268055&view=diff
> >
> =================================================================
> =====
> > ========
> > --- cfe/trunk/test/CodeGenCXX/debug-info-anon-union-vars.cpp
> > (original)
> > +++ cfe/trunk/test/CodeGenCXX/debug-info-anon-union-vars.cpp Fri Apr
> > +++ 29 11:08:08 2016
> > @@ -44,8 +44,13 @@ void instantiate(int x) {
> >    buildBytes(x);
> >  }
> >
> > -// CHECK: !DIGlobalVariable(name: "c",{{.*}} file: [[FILE:.*]], line:
> > 6,{{.*}} isLocal: true, isDefinition: true -// CHECK: [[FILE]] =
> > !DIFile(filename: "{{.*}}debug-info-anon-union-vars.cpp",
> > +// CHECK: ![[UNION:[0-9]+]] = distinct !DICompositeType(tag:
> > +DW_TAG_union_type, // CHECK-NOT: name:
> > +// CHECK: elements
> > +// CHECK: [[FILE:.*]] = !DIFile(filename:
> > +"{{.*}}debug-info-anon-union-vars.cpp",
> > +// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i", scope:
> > +![[UNION]], // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "c",
> > +scope: ![[UNION]], // CHECK: !DIGlobalVariable(name: "c",{{.*}} file:
> > +[[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
> >  // CHECK: !DIGlobalVariable(name: "d",{{.*}} file: [[FILE]], line:
> > 6,{{.*}} isLocal: true, isDefinition: true  // CHECK:
> > !DIGlobalVariable(name: "a",{{.*}} file: [[FILE]], line: 6,{{.*}}
> > isLocal: true, isDefinition: true  // CHECK: !DIGlobalVariable(name:
> > "b",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition:
> > true @@ -55,9 +60,4 @@ void instantiate(int x) {  // CHECK:
> > !DILocalVariable(name: "c", {{.*}}, flags: DIFlagArtificial  // CHECK:
> !DILocalVariable(  // CHECK-NOT: name:
> > -// CHECK: type: ![[UNION:[0-9]+]]
> > -// CHECK: ![[UNION]] = distinct !DICompositeType(tag:
> > DW_TAG_union_type, -// CHECK-NOT: name:
> > -// CHECK: elements
> > -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i", scope:
> > ![[UNION]], -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "c",
> > scope: ![[UNION]],
> > +// CHECK: type: ![[UNION]]
> >
> > Added: cfe/trunk/test/CodeGenCXX/debug-info-lb.cpp
> > URL:
> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-in
> > fo-lb.cpp?rev=268055&view=auto
> >
> =================================================================
> =====
> > ========
> > --- cfe/trunk/test/CodeGenCXX/debug-info-lb.cpp (added)
> > +++ cfe/trunk/test/CodeGenCXX/debug-info-lb.cpp Fri Apr 29 11:08:08
> > +++ 2016
> > @@ -0,0 +1,27 @@
> > +// RUN: %clang_cc1 -triple x86_64-none-linux-gnu -emit-llvm
> > +-debug-info-kind=limited %s -o - | FileCheck %s
> > +
> > +void foo() {
> > +  static int bar = 1;
> > +  {
> > +    struct X {};
> > +    typedef char Y;
> > +    static int bar = 0;
> > +    // The following basic block is intended, in order to check the case where
> > +    // types "X", "Y" are defined in a different scope than where they are used.
> > +    // They should have the scope they are defined at as their parent scope.
> > +    {
> > +      X a;
> > +      Y b;
> > +    }
> > +  }
> > +}
> > +
> > +// CHECK: !{{[0-9]+}} = distinct !DICompositeType(tag:
> > +DW_TAG_structure_type, name: "X", scope: [[LBScope:![0-9]+]], //
> > +CHECK: [[LBScope]] = distinct !DILexicalBlock(scope: !{{[0-9]+}},
> > +file: !{{[0-9]+}}, line: 5)
> > +
> > +// CHECK: [[FuncScope:![0-9]+]] = distinct !DISubprogram(name: "foo",
> > +
> > +// CHECK: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_typedef, name:
> > +"Y", scope: [[LBScope]], // CHECK: !{{[0-9]+}} = distinct
> > +!DIGlobalVariable(name: "bar", scope: [[FuncScope]], file:
> > +!{{[0-9]+}}, line: 4 // CHECK: !{{[0-9]+}} = distinct
> > +!DIGlobalVariable(name: "bar", scope: [[LBScope]], file: !{{[0-9]+}},
> > +line: 8
> > +
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
---------------------------------------------------------------------
Intel Israel (74) Limited

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.


More information about the cfe-commits mailing list