r345009 - [DebugInfo] Generate debug information for labels. (After fix PR39094)

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 23 06:19:46 PDT 2018


This broke Chromium again. I've reverted in rr345026

See https://bugs.chromium.org/p/chromium/issues/detail?id=898152#c1
for the reproducer.

On Tue, Oct 23, 2018 at 1:06 AM, Hsiangkai Wang via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: hsiangkai
> Date: Tue Oct 23 01:06:21 2018
> New Revision: 345009
>
> URL: http://llvm.org/viewvc/llvm-project?rev=345009&view=rev
> Log:
> [DebugInfo] Generate debug information for labels. (After fix PR39094)
>
> Generate DILabel metadata and call llvm.dbg.label after label
> statement to associate the metadata with the label.
>
> After fixing PR37395.
> After fixing problems in LiveDebugVariables.
> After fixing NULL symbol problems in AddressPool when enabling
> split-dwarf-file.
> After fixing PR39094.
>
> Differential Revision: https://reviews.llvm.org/D45045
>
> Added:
>     cfe/trunk/test/CodeGen/debug-label-inline.c
>     cfe/trunk/test/CodeGen/debug-label.c
> Modified:
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>     cfe/trunk/lib/CodeGen/CGDebugInfo.h
>     cfe/trunk/lib/CodeGen/CGStmt.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=345009&r1=345008&r2=345009&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Tue Oct 23 01:06:21 2018
> @@ -3804,6 +3804,32 @@ CGDebugInfo::EmitDeclareOfAutoVariable(c
>    return EmitDeclare(VD, Storage, llvm::None, Builder);
>  }
>
> +void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) {
> +  assert(DebugKind >= codegenoptions::LimitedDebugInfo);
> +  assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
> +
> +  if (D->hasAttr<NoDebugAttr>())
> +    return;
> +
> +  auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
> +  llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
> +
> +  // Get location information.
> +  unsigned Line = getLineNumber(D->getLocation());
> +  unsigned Column = getColumnNumber(D->getLocation());
> +
> +  StringRef Name = D->getName();
> +
> +  // Create the descriptor for the label.
> +  auto *L =
> +      DBuilder.createLabel(Scope, Name, Unit, Line, CGM.getLangOpts().Optimize);
> +
> +  // Insert an llvm.dbg.label into the current block.
> +  DBuilder.insertLabel(L,
> +                       llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt),
> +                       Builder.GetInsertBlock());
> +}
> +
>  llvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy,
>                                            llvm::DIType *Ty) {
>    llvm::DIType *CachedTy = getTypeOrNull(QualTy);
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=345009&r1=345008&r2=345009&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Tue Oct 23 01:06:21 2018
> @@ -420,6 +420,9 @@ public:
>                                                     llvm::Value *AI,
>                                                     CGBuilderTy &Builder);
>
> +  /// Emit call to \c llvm.dbg.label for an label.
> +  void EmitLabel(const LabelDecl *D, CGBuilderTy &Builder);
> +
>    /// Emit call to \c llvm.dbg.declare for an imported variable
>    /// declaration in a block.
>    void EmitDeclareOfBlockDeclRefVariable(
>
> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=345009&r1=345008&r2=345009&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Tue Oct 23 01:06:21 2018
> @@ -531,6 +531,16 @@ void CodeGenFunction::EmitLabel(const La
>    }
>
>    EmitBlock(Dest.getBlock());
> +
> +  // Emit debug info for labels.
> +  if (CGDebugInfo *DI = getDebugInfo()) {
> +    if (CGM.getCodeGenOpts().getDebugInfo() >=
> +        codegenoptions::LimitedDebugInfo) {
> +      DI->setLocation(D->getLocation());
> +      DI->EmitLabel(D, Builder);
> +    }
> +  }
> +
>    incrementProfileCounter(D->getStmt());
>  }
>
>
> Added: cfe/trunk/test/CodeGen/debug-label-inline.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-label-inline.c?rev=345009&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGen/debug-label-inline.c (added)
> +++ cfe/trunk/test/CodeGen/debug-label-inline.c Tue Oct 23 01:06:21 2018
> @@ -0,0 +1,28 @@
> +// This test will test the correctness of generating DILabel and
> +// llvm.dbg.label when the label is in inlined functions.
> +//
> +// RUN: %clang_cc1 -O2 %s -o - -emit-llvm -debug-info-kind=limited | FileCheck %s
> +inline int f1(int a, int b) {
> +  int sum;
> +
> +top:
> +  sum = a + b;
> +  return sum;
> +}
> +
> +extern int ga, gb;
> +
> +int f2(void) {
> +  int result;
> +
> +  result = f1(ga, gb);
> +  // CHECK: call void @llvm.dbg.label(metadata [[LABEL_METADATA:!.*]]), !dbg [[LABEL_LOCATION:!.*]]
> +
> +  return result;
> +}
> +
> +// CHECK: distinct !DISubprogram(name: "f1", {{.*}}, retainedNodes: [[ELEMENTS:!.*]])
> +// CHECK: [[ELEMENTS]] = !{{{.*}}, [[LABEL_METADATA]]}
> +// CHECK: [[LABEL_METADATA]] = !DILabel({{.*}}, name: "top", {{.*}}, line: 8)
> +// CHECK: [[INLINEDAT:!.*]] = distinct !DILocation(line: 18,
> +// CHECK: [[LABEL_LOCATION]] = !DILocation(line: 8, {{.*}}, inlinedAt: [[INLINEDAT]])
>
> Added: cfe/trunk/test/CodeGen/debug-label.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-label.c?rev=345009&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGen/debug-label.c (added)
> +++ cfe/trunk/test/CodeGen/debug-label.c Tue Oct 23 01:06:21 2018
> @@ -0,0 +1,16 @@
> +// This test will test the correstness of generating DILabel and
> +// llvm.dbg.label for labels.
> +//
> +// RUN: %clang_cc1 -emit-llvm %s -o - -emit-llvm -debug-info-kind=limited | FileCheck %s
> +
> +int f1(int a, int b) {
> +  int sum;
> +
> +top:
> +  // CHECK: call void @llvm.dbg.label(metadata [[LABEL_METADATA:!.*]]), !dbg [[LABEL_LOCATION:!.*]]
> +  sum = a + b;
> +  return sum;
> +}
> +
> +// CHECK: [[LABEL_METADATA]] = !DILabel({{.*}}, name: "top", {{.*}}, line: 9)
> +// CHECK: [[LABEL_LOCATION]] = !DILocation(line: 9,
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list