[llvm] r207719 - Revert "Emit DW_AT_object_pointer once, on the declaration, for each function."

Robinson, Paul Paul_Robinson at playstation.sony.com
Wed Apr 30 19:40:57 PDT 2014


Yeah, I was wondering.  Attributes like object_pointer seem more
appropriate to a definition than a declaration, as the declaration
typically wouldn't provide the actual location.
--paulr

> -----Original Message-----
> From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-
> bounces at cs.uiuc.edu] On Behalf Of David Blaikie
> Sent: Wednesday, April 30, 2014 4:11 PM
> To: llvm-commits at cs.uiuc.edu
> Subject: Re: [llvm] r207719 - Revert "Emit DW_AT_object_pointer once, on
> the declaration, for each function."
> 
> On Wed, Apr 30, 2014 at 3:58 PM, David Blaikie <dblaikie at gmail.com>
> wrote:
> > Author: dblaikie
> > Date: Wed Apr 30 17:58:19 2014
> > New Revision: 207719
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=207719&view=rev
> > Log:
> > Revert "Emit DW_AT_object_pointer once, on the declaration, for each
> function."
> >
> > Breaks GDB buildbot
> > (http://lab.llvm.org:8011/builders/clang-x86_64-ubuntu-gdb-
> 75/builds/14517)
> >
> > GCC emits DW_AT_object_pointer /everywhere/ (declaration, abstract
> > definition, inlined subroutine), but it looks like GCC relies on it
> > being somewhere other than the declaration, at least.
> 
> Checked again, GCC puts it on the declaration and (abstract or
> concrete) definition, but not the inlined_subroutine. Clang (without
> r207705) puts it on the abstract or concrete definition only, and with
> r207705 puts it on the declaration only. Given GDB's expectation of
> finding this on the definition I'm just going to leave it there for
> now rather than duplicating it in both declaration and definition
> since it appears GDB doesn't need it on the declaration and doesn't
> take it from there for the definition.
> 
> Pity.
> 
> > I'll experiment
> > further & can hopefully still remove it from the inlined_subroutine.
> >
> > This reverts commit r207705.
> >
> > Modified:
> >     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> >     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> >     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> >     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
> >     llvm/trunk/test/DebugInfo/X86/DW_AT_object_pointer.ll
> >     llvm/trunk/test/DebugInfo/X86/inline-member-function.ll
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=207719&r1=2
> 07718&r2=207719&view=diff
> >
> ========================================================================
> ======
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Apr 30
> 17:58:19 2014
> > @@ -557,16 +557,11 @@ DIE *DwarfDebug::createScopeChildrenDIE(
> >  }
> >
> >  void DwarfDebug::createAndAddScopeChildren(DwarfCompileUnit &TheCU,
> > -                                           LexicalScope *Scope,
> > -                                           DISubprogram Sub, DIE
> &ScopeDIE) {
> > +                                           LexicalScope *Scope, DIE
> &ScopeDIE) {
> >    // We create children when the scope DIE is not null.
> >    SmallVector<std::unique_ptr<DIE>, 8> Children;
> >    if (DIE *ObjectPointer = createScopeChildrenDIE(TheCU, Scope,
> Children))
> > -    // The declaration will have the object_pointer, otherwise put it
> on the
> > -    // definition. This happens with ObjC blocks that have
> object_pointer on
> > -    // non-member functions.
> > -    if (!Sub.getFunctionDeclaration())
> > -      TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
> *ObjectPointer);
> > +    TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
> *ObjectPointer);
> >
> >    // Add children
> >    for (auto &I : Children)
> > @@ -585,7 +580,7 @@ void DwarfDebug::constructAbstractSubpro
> >
> >    if (DIE *ScopeDIE = TheCU.getDIE(Sub)) {
> >      AbstractSPDies.insert(std::make_pair(Sub, ScopeDIE));
> > -    createAndAddScopeChildren(TheCU, Scope, Sub, *ScopeDIE);
> > +    createAndAddScopeChildren(TheCU, Scope, *ScopeDIE);
> >    }
> >  }
> >
> > @@ -602,7 +597,7 @@ DIE &DwarfDebug::constructSubprogramScop
> >
> >    DIE &ScopeDIE = updateSubprogramScopeDIE(TheCU, Sub);
> >
> > -  createAndAddScopeChildren(TheCU, Scope, Sub, ScopeDIE);
> > +  createAndAddScopeChildren(TheCU, Scope, ScopeDIE);
> >
> >    return ScopeDIE;
> >  }
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=207719&r1=207
> 718&r2=207719&view=diff
> >
> ========================================================================
> ======
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Wed Apr 30 17:58:19
> 2014
> > @@ -368,7 +368,7 @@ class DwarfDebug : public AsmPrinterHand
> >    std::unique_ptr<DIE> constructScopeDIE(DwarfCompileUnit &TheCU,
> >                                           LexicalScope *Scope);
> >    void createAndAddScopeChildren(DwarfCompileUnit &TheCU,
> LexicalScope *Scope,
> > -                                 DISubprogram Sub, DIE &ScopeDIE);
> > +                                 DIE &ScopeDIE);
> >    /// \brief Construct a DIE for this abstract scope.
> >    void constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU,
> >                                             LexicalScope *Scope);
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=207719&r1=20
> 7718&r2=207719&view=diff
> >
> ========================================================================
> ======
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Wed Apr 30
> 17:58:19 2014
> > @@ -1164,8 +1164,7 @@ void DwarfUnit::constructTypeDIE(DIE &Bu
> >  }
> >
> >  /// constructSubprogramArguments - Construct function argument DIEs.
> > -DIE *DwarfUnit::constructSubprogramArguments(DIE &Buffer, DIArray
> Args) {
> > -  DIE *ObjectPointer = nullptr;
> > +void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DIArray
> Args) {
> >    for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
> >      DIDescriptor Ty = Args.getElement(i);
> >      if (Ty.isUnspecifiedParameter()) {
> > @@ -1176,11 +1175,8 @@ DIE *DwarfUnit::constructSubprogramArgum
> >        addType(Arg, DIType(Ty));
> >        if (DIType(Ty).isArtificial())
> >          addFlag(Arg, dwarf::DW_AT_artificial);
> > -      if (DIType(Ty).isObjectPointer())
> > -        ObjectPointer = &Arg;
> >      }
> >    }
> > -  return ObjectPointer;
> >  }
> >
> >  /// constructTypeDIE - Construct type DIE from DICompositeType.
> > @@ -1501,8 +1497,7 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE
> >
> >      // Add arguments. Do not add arguments for subprogram definition.
> They will
> >      // be handled while processing variables.
> > -    if (DIE *ObjectPointer = constructSubprogramArguments(SPDie,
> Args))
> > -      addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
> *ObjectPointer);
> > +    constructSubprogramArguments(SPDie, Args);
> >    }
> >
> >    if (SP.isArtificial())
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
> > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h?rev=207719&r1=2077
> 18&r2=207719&view=diff
> >
> ========================================================================
> ======
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Wed Apr 30 17:58:19
> 2014
> > @@ -418,7 +418,7 @@ public:
> >                                              AbstractOrInlined AbsIn =
> AOI_None);
> >
> >    /// constructSubprogramArguments - Construct function argument
> DIEs.
> > -  DIE *constructSubprogramArguments(DIE &Buffer, DIArray Args);
> > +  void constructSubprogramArguments(DIE &Buffer, DIArray Args);
> >
> >    /// Create a DIE with the given Tag, add the DIE to its parent, and
> >    /// call insertDIE if MD is not null.
> >
> > Modified: llvm/trunk/test/DebugInfo/X86/DW_AT_object_pointer.ll
> > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/DebugInfo/X86/DW_AT_object_pointer.ll?rev=207719
> &r1=207718&r2=207719&view=diff
> >
> ========================================================================
> ======
> > --- llvm/trunk/test/DebugInfo/X86/DW_AT_object_pointer.ll (original)
> > +++ llvm/trunk/test/DebugInfo/X86/DW_AT_object_pointer.ll Wed Apr 30
> 17:58:19 2014
> > @@ -1,28 +1,13 @@
> >  ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj
> >  ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
> >
> > -; Emit the DW_TAG_object_pointer on the declaration only, not the
> definition.
> > -; This seems the most correct thing - the DW_TAG_object_pointer is
> inherited
> > -; from the declaration to any (abstract or concrete) definitions and
> DWARF
> > -; consumers can use this information for callers that can only see
> the
> > -; declaration.
> > -; That said, it isn't very space efficient - making member function
> > -; declarations 11 bytes instead of 7 and I'm not sure which tools
> actually
> > -; use this information here (ObjC Blocks are a different story & most
> likely
> > -; require object_pointer) - perhaps we should omit it entirely for
> space.
> > -; No overall space impact study has been performed.
> > -
> > -; CHECK: [[DEFINITION:0x[0-9a-f]*]]: DW_TAG_subprogram
> > -; CHECK-NOT: DW_TAG
> > -; CHECK-NOT: DW_TAG_object_pointer
> > +; CHECK: DW_TAG_formal_parameter [
> > +; CHECK-NOT: ""
> >  ; CHECK: DW_TAG
> > -
> >  ; CHECK: DW_TAG_class_type
> > -; CHECK-NOT: NULL
> > -; CHECK: DW_TAG_subprogram
> > -; CHECK-NEXT: DW_AT_name {{.*}} "A"
> >  ; CHECK: DW_AT_object_pointer [DW_FORM_ref4]     (cu + 0x{{[0-9a-
> f]*}} => {[[PARAM:0x[0-9a-f]*]]})
> >  ; CHECK: [[PARAM]]:     DW_TAG_formal_parameter
> > +; CHECK-NEXT: DW_AT_name [DW_FORM_strp]     ( .debug_str[0x{{[0-9a-
> f]*}}] = "this")
> >
> >  %class.A = type { i32 }
> >
> >
> > Modified: llvm/trunk/test/DebugInfo/X86/inline-member-function.ll
> > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/DebugInfo/X86/inline-member-
> function.ll?rev=207719&r1=207718&r2=207719&view=diff
> >
> ========================================================================
> ======
> > --- llvm/trunk/test/DebugInfo/X86/inline-member-function.ll (original)
> > +++ llvm/trunk/test/DebugInfo/X86/inline-member-function.ll Wed Apr 30
> 17:58:19 2014
> > @@ -22,20 +22,11 @@
> >  ; CHECK-NOT: DW_AT_artificial
> >  ; CHECK: DW_TAG
> >
> > -; But make sure we emit DW_AT_object_pointer on the declaration.
> > -; CHECK: DW_TAG_structure_type
> > -; CHECK-NEXT: DW_AT_name {{.*}} "foo"
> > -; CHECK-NOT: NULL
> > -; CHECK: [[DECLARATION:0x[0-9a-e]*]]: DW_TAG_subprogram
> > -; CHECK-NOT: DW_TAG
> > -; CHECK: DW_AT_object_pointer
> > -
> > -; But don't put it on the abstract definition, either.
> > +; But make sure we emit DW_AT_object_pointer on the abstract
> definition.
> >  ; CHECK: [[ABSTRACT_ORIGIN]]: DW_TAG_subprogram
> > -; CHECK-NEXT: DW_AT_specification {{.*}}{[[DECLARATION]]}
> >  ; CHECK-NOT: NULL
> > -; CHECK-NOT: DW_AT_object_pointer
> > -; CHECK: DW_TAG_formal_parameter
> > +; CHECK-NOT: TAG
> > +; CHECK: DW_AT_object_pointer
> >
> >  %struct.foo = type { i8 }
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits






More information about the llvm-commits mailing list