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

Rafael EspĂ­ndola via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 29 14:34:57 PDT 2016


The same error message shows up in https://llvm.org/bugs/show_bug.cgi?id=27579.

On 29 April 2016 at 16:47, Aboud, Amjad <amjad.aboud at intel.com> wrote:
> 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