[llvm] r202188 - Debug info: Support variadic functions.

Eric Christopher echristo at gmail.com
Tue Feb 25 14:22:20 PST 2014


Also, since I split it across two emails when you started the patch
and when I did the review:

Thanks for working on this! :)

-eric

On Tue, Feb 25, 2014 at 1:54 PM, Eric Christopher <echristo at gmail.com> wrote:
> On Tue, Feb 25, 2014 at 11:57 AM, Adrian Prantl <aprantl at apple.com> wrote:
>> Author: adrian
>> Date: Tue Feb 25 13:57:42 2014
>> New Revision: 202188
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=202188&view=rev
>> Log:
>> Debug info: Support variadic functions.
>> Variadic functions have an unspecified parameter tag after the last
>> argument. In IR this is represented as an unspecified parameter in the
>> subroutine type.
>>
>> Paired commit with CFE r202185.
>>
>> rdar://problem/13690847
>>
>> This re-applies r202184 + a bugfix in DwarfDebug's argument handling.
>
> Would be nice to have more description what the bugfix is here. What
> was the difference? Did you add more to the testcase or a comment in
> some place?
>
>>
>> -    /// createUnspecifiedParameter - Create unspeicified type descriptor
>> +    /// createUnspecifiedParameter - Create unspecified type descriptor
>>      /// for a subroutine type.
>>      DIDescriptor createUnspecifiedParameter();
>>
>
> Could have been committed separately - especially since it's in a file
> by itself.
>
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=202188&r1=202187&r2=202188&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Feb 25 13:57:42 2014
>> @@ -403,15 +403,21 @@ DIE *DwarfDebug::updateSubprogramScopeDI
>>          DIArray Args = SPTy.getTypeArray();
>>          uint16_t SPTag = SPTy.getTag();
>>          if (SPTag == dwarf::DW_TAG_subroutine_type)
>> +          // FIXME: Use DwarfUnit::constructSubprogramArguments() here.
>
> What's the problem here?
>
>>            for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
>> -            DIE *Arg =
>> -                SPCU->createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
>>              DIType ATy(Args.getElement(i));
>> -            SPCU->addType(Arg, ATy);
>> -            if (ATy.isArtificial())
>> -              SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
>> -            if (ATy.isObjectPointer())
>> -              SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer, Arg);
>> +            if (ATy.isUnspecifiedParameter()) {
>> +              assert(i == N-1 && "ellipsis must be the last argument");
>
> Reword this to avoid the use of ellipsis. Use unspecified parameter or
> something IR specific.
> The next line is over 80-columns as well.
>
>>    // Collect arguments for current function.
>> -  if (LScopes.isCurrentFunctionScope(Scope))
>> +  if (LScopes.isCurrentFunctionScope(Scope)) {
>>      for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
>>        if (DbgVariable *ArgDV = CurrentFnArguments[i])
>>          if (DIE *Arg =
>> @@ -592,6 +598,16 @@ DIE *DwarfDebug::createScopeChildrenDIE(
>>              ObjectPointer = Arg;
>>          }
>>
>> +    // Create the unspecified parameter that marks a function as variadic.
>
> Might want to move this comment inside the conditional, or make it
> sound conditional.
>
>> +    DISubprogram SP(Scope->getScopeNode());
>> +    assert(SP.Verify());
>
> If this assert fires then something is really really wrong :) You
> might want to add some text here if it fails.
>
>> +    DIArray FnArgs = SP.getType().getTypeArray();
>> +    if (FnArgs.getElement(FnArgs.getNumElements()-1).isUnspecifiedParameter()) {
>> +      DIE *Ellipsis = new DIE(dwarf::DW_TAG_unspecified_parameters);
>> +      Children.push_back(Ellipsis);
>> +    }
>> +  }
>> +
>
> This feels awkward here. Thoughts?
>
>> +/// constructSubprogramArguments - Construct function argument DIEs.
>> +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()) {
>> +        assert(i == N-1 && "ellipsis must be the last argument");
>
> Same comment as above about the text here.
>
>>      // Add arguments. Do not add arguments for subprogram definition. They will
>>      // be handled while processing variables.
>> -    for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
>> -      DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
>> -      DIType ATy(Args.getElement(i));
>> -      addType(Arg, ATy);
>> -      if (ATy.isArtificial())
>> -        addFlag(Arg, dwarf::DW_AT_artificial);
>> -    }
>> +    constructSubprogramArguments(*SPDie, Args);
>
> The comment here seems like it should go onto the function or change somewhat.
>
>>    }
>>
>>    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=202188&r1=202187&r2=202188&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Tue Feb 25 13:57:42 2014
>> @@ -476,6 +476,9 @@ protected:
>>    DIE *getOrCreateStaticMemberDIE(DIDerivedType DT);
>>
>>  private:
>> +  /// constructSubprogramArguments - Construct function argument DIEs.
>> +  void constructSubprogramArguments(DIE &Buffer, DIArray Args);
>> +
>
> This refactoring could have been done in a separate patch.
>
>>    /// constructTypeDIE - Construct basic type die from DIBasicType.
>>    void constructTypeDIE(DIE &Buffer, DIBasicType BTy);
>>
>>
>> Added: llvm/trunk/test/DebugInfo/X86/varargs.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/varargs.ll?rev=202188&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/X86/varargs.ll (added)
>> +++ llvm/trunk/test/DebugInfo/X86/varargs.ll Tue Feb 25 13:57:42 2014
>> @@ -0,0 +1,90 @@
>> +; RUN: llc -O0 -filetype=obj -o %t.o %s
>> +; RUN: llvm-dwarfdump -debug-dump=info %t.o | FileCheck %s
>> +;
>> +; Normal variadic function.
>> +;
>> +; CHECK: DW_TAG_subprogram
>> +; CHECK-NOT: DW_TAG
>> +; CHECK: DW_TAG_formal_parameter
>> +; CHECK-NOT: DW_TAG
>> +; CHECK: DW_TAG_unspecified_parameters
>> +;
>> +; Variadic C++ member function.
>> +;
>> +; CHECK: DW_TAG_subprogram
>> +; CHECK-NOT: DW_TAG
>> +; CHECK: DW_TAG_formal_parameter
>> +; CHECK-NOT: DW_TAG
>> +; CHECK: DW_TAG_formal_parameter
>> +; CHECK-NOT: DW_TAG
>> +; CHECK: DW_TAG_unspecified_parameters
>> +;
>> +; Variadic function pointer.
>> +;
>> +; CHECK: DW_TAG_subroutine_type
>> +; CHECK-NOT: DW_TAG
>> +; CHECK: DW_TAG_formal_parameter
>> +; CHECK-NOT: DW_TAG
>> +; CHECK: DW_TAG_unspecified_parameters
>
> Please add more details (CHECK lines with names perhaps?) to what
> you're testing here and comments. The check and check-not lines are
> inscrutable. Also is there any reason that this is X86 only? You don't
> appear to be checking addresses or sizes.
>
> -eric



More information about the llvm-commits mailing list