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

David Blaikie dblaikie at gmail.com
Wed Apr 30 21:56:29 PDT 2014


On Wed, Apr 30, 2014 at 7:40 PM, Robinson, Paul
<Paul_Robinson at playstation.sony.com> wrote:
> 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.

I'm not sure the actual location is a prerequisite for making use of
object_pointer - I figured callers might like to know about it (but I
suppose you can't /call/ a function from just the DWARF declaration?
Never really thought about whether debuggers would manage that - they
could /maybe/ build the mangled name, etc). Useful for rendering
functions in pretty printers (well, the first parameter is flagged as
artifiical in the declaration, perhaps that's sufficient for printing
purposes - another case where it'd be nice if we didn't have to
duplicate that information in the definition, though).

But, sure, it'd be great if there was no reason to put object_pointer
on declarations - not insignificant space savings when emitting types
all over the place.

- David

> --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