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

Eric Christopher echristo at gmail.com
Tue Feb 25 13:54:57 PST 2014


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