r300523 - Debug Info: Remove special-casing of indirect function argument handling.

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 24 08:51:43 PDT 2017


\o/ awesome! (I added that "indirect" hack ages ago, unfortunately - one
consolation is that it was worse before: Clang would describe the
parameter's type as "T&" in the DWARF, instead of as "T"... )

On Mon, Apr 17, 2017 at 6:34 PM Adrian Prantl via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: adrian
> Date: Mon Apr 17 20:22:01 2017
> New Revision: 300523
>
> URL: http://llvm.org/viewvc/llvm-project?rev=300523&view=rev
> Log:
> Debug Info: Remove special-casing of indirect function argument handling.
>
> LLVM has changed the semantics of dbg.declare for describing function
> arguments. After this patch a dbg.declare always takes the *address*
> of a variable as the first argument, even if the argument is not an
> alloca.
>
> https://bugs.llvm.org/show_bug.cgi?id=32382
> rdar://problem/31205000
>
> Modified:
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>     cfe/trunk/test/CodeGen/debug-info-vla.c
>     cfe/trunk/test/CodeGenCXX/debug-info.cpp
>     cfe/trunk/test/CodeGenOpenCL/amdgpu-debug-info-variable-expression.cl
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=300523&r1=300522&r2=300523&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Apr 17 20:22:01 2017
> @@ -3466,17 +3466,17 @@ void CGDebugInfo::EmitDeclare(const VarD
>    // functions there won't be an implicit param at arg1 and
>    // otherwise it is 'self' or 'this'.
>    if (isa<ImplicitParamDecl>(VD) && ArgNo && *ArgNo == 1)
> -    Flags |= llvm::DINode::FlagObjectPointer;
> -  if (auto *Arg = dyn_cast<llvm::Argument>(Storage))
> -    if (Arg->getType()->isPointerTy() && !Arg->hasByValAttr() &&
> -        !VD->getType()->isPointerType())
> -      Expr.push_back(llvm::dwarf::DW_OP_deref);
> +  Flags |= llvm::DINode::FlagObjectPointer;
>
> +  // Note: Older versions of clang used to emit byval references with an
> extra
> +  // DW_OP_deref, because they referenced the IR arg directly instead of
> +  // referencing an alloca. Newer versions of LLVM don't treat allocas
> +  // differently from other function arguments when used in a dbg.declare.
>    auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
> -
>    StringRef Name = VD->getName();
>    if (!Name.empty()) {
>      if (VD->hasAttr<BlocksAttr>()) {
> +      // Here, we need an offset *into* the alloca.
>        CharUnits offset = CharUnits::fromQuantity(32);
>        Expr.push_back(llvm::dwarf::DW_OP_plus);
>        // offset of __forwarding field
> @@ -3488,22 +3488,7 @@ void CGDebugInfo::EmitDeclare(const VarD
>        // offset of x field
>        offset = CGM.getContext().toCharUnitsFromBits(XOffset);
>        Expr.push_back(offset.getQuantity());
> -
> -      // Create the descriptor for the variable.
> -      auto *D = ArgNo
> -                    ? DBuilder.createParameterVariable(Scope,
> VD->getName(),
> -                                                       *ArgNo, Unit,
> Line, Ty)
> -                    : DBuilder.createAutoVariable(Scope, VD->getName(),
> Unit,
> -                                                  Line, Ty, Align);
> -
> -      // Insert an llvm.dbg.declare into the current block.
> -      DBuilder.insertDeclare(
> -          Storage, D, DBuilder.createExpression(Expr),
> -          llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt),
> -          Builder.GetInsertBlock());
> -      return;
> -    } else if (isa<VariableArrayType>(VD->getType()))
> -      Expr.push_back(llvm::dwarf::DW_OP_deref);
> +    }
>    } else if (const auto *RT = dyn_cast<RecordType>(VD->getType())) {
>      // If VD is an anonymous union then Storage represents value for
>      // all union fields.
> @@ -3606,8 +3591,7 @@ void CGDebugInfo::EmitDeclareOfBlockDecl
>            ->getElementOffset(blockInfo.getCapture(VD).getIndex()));
>
>    SmallVector<int64_t, 9> addr;
> -  if (isa<llvm::AllocaInst>(Storage))
> -    addr.push_back(llvm::dwarf::DW_OP_deref);
> +  addr.push_back(llvm::dwarf::DW_OP_deref);
>    addr.push_back(llvm::dwarf::DW_OP_plus);
>    addr.push_back(offset.getQuantity());
>    if (isByRef) {
> @@ -3633,12 +3617,11 @@ void CGDebugInfo::EmitDeclareOfBlockDecl
>    // Insert an llvm.dbg.declare into the current block.
>    auto DL =
>        llvm::DebugLoc::get(Line, Column, LexicalBlockStack.back(),
> CurInlinedAt);
> +  auto *Expr = DBuilder.createExpression(addr);
>    if (InsertPoint)
> -    DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(addr),
> DL,
> -                           InsertPoint);
> +    DBuilder.insertDeclare(Storage, D, Expr, DL, InsertPoint);
>    else
> -    DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(addr),
> DL,
> -                           Builder.GetInsertBlock());
> +    DBuilder.insertDeclare(Storage, D, Expr, DL,
> Builder.GetInsertBlock());
>  }
>
>  void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value
> *AI,
>
> Modified: cfe/trunk/test/CodeGen/debug-info-vla.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-vla.c?rev=300523&r1=300522&r2=300523&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/debug-info-vla.c (original)
> +++ cfe/trunk/test/CodeGen/debug-info-vla.c Mon Apr 17 20:22:01 2017
> @@ -4,8 +4,8 @@ void testVLAwithSize(int s)
>  {
>  // CHECK: dbg.declare
>  // CHECK: dbg.declare({{.*}}, metadata ![[VAR:.*]], metadata ![[EXPR:.*]])
> -// CHECK: ![[VAR]] = !DILocalVariable(name: "vla",{{.*}} line: [[@LINE+2]]
> -// CHECK: ![[EXPR]] = !DIExpression(DW_OP_deref)
> +// CHECK: ![[EXPR]] = !DIExpression()
> +// CHECK: ![[VAR]] = !DILocalVariable(name: "vla",{{.*}} line: [[@LINE+1]]
>    int vla[s];
>    int i;
>    for (i = 0; i < s; i++) {
>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info.cpp?rev=300523&r1=300522&r2=300523&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/debug-info.cpp Mon Apr 17 20:22:01 2017
> @@ -21,6 +21,7 @@
>
>  // CHECK: ![[INCTYPE]] = !DICompositeType(tag: DW_TAG_structure_type,
> name: "incomplete"
>  // CHECK-SAME:                                   DIFlagFwdDecl
> +// CHECK: ![[EXPR]] = !DIExpression()
>
>  template<typename T> struct Identity {
>    typedef T Type;
> @@ -117,7 +118,6 @@ struct foo {
>  // For some reason function arguments ended up down here
>  // CHECK: ![[F]] = !DILocalVariable(name: "f", arg: 1, scope: ![[FUNC]]
>  // CHECK-SAME:                      type: ![[FOO]]
> -// CHECK: ![[EXPR]] = !DIExpression(DW_OP_deref)
>  foo func(foo f) {
>    return f; // reference 'f' for now because otherwise we hit another bug
>  }
>
> Modified: cfe/trunk/test/CodeGenOpenCL/
> amdgpu-debug-info-variable-expression.cl
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/amdgpu-debug-info-variable-expression.cl?rev=300523&r1=300522&r2=300523&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenOpenCL/amdgpu-debug-info-variable-expression.cl
> (original)
> +++ cfe/trunk/test/CodeGenOpenCL/amdgpu-debug-info-variable-expression.cl
> Mon Apr 17 20:22:01 2017
> @@ -1,6 +1,5 @@
>  // RUN: %clang -cl-std=CL2.0 -emit-llvm -g -O0 -S -target
> amdgcn-amd-amdhsa -mcpu=fiji -o - %s | FileCheck %s
>
> -// CHECK-DAG: ![[NONE:[0-9]+]] = !DIExpression()
>  // CHECK-DAG: ![[LOCAL:[0-9]+]] = !DIExpression(DW_OP_constu, 2,
> DW_OP_swap, DW_OP_xderef)
>  // CHECK-DAG: ![[PRIVATE:[0-9]+]] = !DIExpression(DW_OP_constu, 1,
> DW_OP_swap, DW_OP_xderef)
>
> @@ -82,7 +81,7 @@ kernel void kernel1(
>    int *FuncVar4 = Tmp1;
>
>    // CHECK-DAG: ![[FUNCVAR5:[0-9]+]] = !DILocalVariable(name: "FuncVar5",
> scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: {{[0-9]+}}, type: !{{[0-9]+}})
> -  // CHECK-DAG: call void @llvm.dbg.declare(metadata i32 addrspace(1)**
> {{.*}}, metadata ![[FUNCVAR5]], metadata ![[NONE]]), !dbg !{{[0-9]+}}
> +  // CHECK-DAG: call void @llvm.dbg.declare(metadata i32 addrspace(1)**
> {{.*}}, metadata ![[FUNCVAR5]], metadata ![[NONE:[0-9]+]]), !dbg !{{[0-9]+}}
>    global int *constant FuncVar5 = KernelArg0;
>    // CHECK-DAG: ![[FUNCVAR6:[0-9]+]] = !DILocalVariable(name: "FuncVar6",
> scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: {{[0-9]+}}, type: !{{[0-9]+}})
>    // CHECK-DAG: call void @llvm.dbg.declare(metadata i32 addrspace(2)**
> {{.*}}, metadata ![[FUNCVAR6]], metadata ![[NONE]]), !dbg !{{[0-9]+}}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170424/f7177b31/attachment.html>


More information about the cfe-commits mailing list