[llvm] r225011 - DebugInfo: Omit is_stmt from line table entries on the same line.

Daniel Sanders Daniel.Sanders at imgtec.com
Mon Jan 19 02:48:01 PST 2015


> > The reason I ask is that Mips is failing this test because the address of the function is calculated
> > six times and all six use the line info for the first call. As a result, there are some additional .loc's
> > and it fails some of the 'CHECK-NOT: .loc' directives. The easiest way to fix this seems to be to
> > call six different functions but I thought I ought to check that this didn't go against the intent of
> > the test.
>
> That seems like it'll produce a bad experience for the user (stepping through the function they'll jump back & forth to the start all the time).
>
> If you are going to update/modify the test, it's probably worth a comment explaining that you're working around a MIPS bug that ought to be fixed at some point.
>
> - David

That's a good point. Having the debugger jump around the source like that is unacceptable at –O0. I've looked into this a bit further and I think that http://reviews.llvm.org/D7050 would be a better fix than changing the test.

Thanks

From: David Blaikie [mailto:dblaikie at gmail.com]
Sent: 18 January 2015 20:06
To: Daniel Sanders
Cc: llvm-commits at cs.uiuc.edu
Subject: Re: [llvm] r225011 - DebugInfo: Omit is_stmt from line table entries on the same line.



On Sun, Jan 18, 2015 at 11:22 AM, Daniel Sanders <Daniel.Sanders at imgtec.com<mailto:Daniel.Sanders at imgtec.com>> wrote:
Hi David,

Is it essential that this test has six calls to f1()

Nope

or would it be just as good with six calls to six different functions?

Sort of.

The reason I ask is that Mips is failing this test because the address of the function is calculated six times and all six use the line info for the first call. As a result, there are some additional .loc's and it fails some of the 'CHECK-NOT: .loc' directives. The easiest way to fix this seems to be to call six different functions but I thought I ought to check that this didn't go against the intent of the test.

That seems like it'll produce a bad experience for the user (stepping through the function they'll jump back & forth to the start all the time).

If you are going to update/modify the test, it's probably worth a comment explaining that you're working around a MIPS bug that ought to be fixed at some point.

- David

________________________________________
From: llvm-commits-bounces at cs.uiuc.edu<mailto:llvm-commits-bounces at cs.uiuc.edu> [llvm-commits-bounces at cs.uiuc.edu<mailto:llvm-commits-bounces at cs.uiuc.edu>] on behalf of David Blaikie [dblaikie at gmail.com<mailto:dblaikie at gmail.com>]
Sent: 30 December 2014 22:47
To: llvm-commits at cs.uiuc.edu<mailto:llvm-commits at cs.uiuc.edu>
Subject: [llvm] r225011 - DebugInfo: Omit is_stmt from line table entries on    the same line.

Author: dblaikie
Date: Tue Dec 30 16:47:13 2014
New Revision: 225011

URL: http://llvm.org/viewvc/llvm-project?rev=225011&view=rev
Log:
DebugInfo: Omit is_stmt from line table entries on the same line.

GCC does this for non-zero discriminators and since GCC doesn't produce
column info, that was the only place it comes up there. For LLVM, since
we can emit discriminators and/or column info, it makes more sense to
invert the condition and just test for changes in line number.

This should resolve at least some of the GDB 7.5 test suite failures
created by recent Clang changes that increase the location fidelity
(which, since Clang defaults to including column info on Linux by
default created a bunch of cases that confused GDB).

In theory we could do this better/differently by grouping actual source
statements together in a similar manner to the way lexical scopes are
handled but given that GDB isn't really in a position to consume that (&
users are probably somewhat used to different lines being different
'statements') this seems the safest and cheapest change. (I'm concerned
that doing this 'right' would bloat the debugloc data even further -
something Duncan's working hard to address)

Added:
    llvm/trunk/test/DebugInfo/multiline.ll
Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
    llvm/trunk/lib/MC/MCAsmStreamer.cpp
    llvm/trunk/test/DebugInfo/X86/discriminator.ll

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=225011&r1=225010&r2=225011&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Dec 30 16:47:13 2014
@@ -1026,8 +1026,10 @@ void DwarfDebug::beginInstruction(const
       if (DL == PrologEndLoc) {
         Flags |= DWARF2_FLAG_PROLOGUE_END;
         PrologEndLoc = DebugLoc();
+        Flags |= DWARF2_FLAG_IS_STMT;
       }
-      if (PrologEndLoc.isUnknown())
+      if (DL.getLine() !=
+          Asm->OutStreamer.getContext().getCurrentDwarfLoc().getLine())
         Flags |= DWARF2_FLAG_IS_STMT;

       if (!DL.isUnknown()) {

Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=225011&r1=225010&r2=225011&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Tue Dec 30 16:47:13 2014
@@ -872,8 +872,6 @@ void MCAsmStreamer::EmitDwarfLocDirectiv
                                           unsigned Isa,
                                           unsigned Discriminator,
                                           StringRef FileName) {
-  this->MCStreamer::EmitDwarfLocDirective(FileNo, Line, Column, Flags,
-                                          Isa, Discriminator, FileName);
   OS << "\t.loc\t" << FileNo << " " << Line << " " << Column;
   if (Flags & DWARF2_FLAG_BASIC_BLOCK)
     OS << " basic_block";
@@ -903,6 +901,8 @@ void MCAsmStreamer::EmitDwarfLocDirectiv
        << Line << ':' << Column;
   }
   EmitEOL();
+  this->MCStreamer::EmitDwarfLocDirective(FileNo, Line, Column, Flags,
+                                          Isa, Discriminator, FileName);
 }

 MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(unsigned CUID) {

Modified: llvm/trunk/test/DebugInfo/X86/discriminator.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/discriminator.ll?rev=225011&r1=225010&r2=225011&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/discriminator.ll (original)
+++ llvm/trunk/test/DebugInfo/X86/discriminator.ll Tue Dec 30 16:47:13 2014
@@ -60,4 +60,4 @@ attributes #0 = { nounwind uwtable "less

 ; CHECK: Address            Line   Column File   ISA Discriminator Flags
 ; CHECK: ------------------ ------ ------ ------ --- ------------- -------------
-; CHECK: 0x0000000000000011      2      0      1   0            42  is_stmt
+; CHECK: 0x0000000000000011      2      0      1   0            42 {{$}}

Added: llvm/trunk/test/DebugInfo/multiline.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/multiline.ll?rev=225011&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/multiline.ll (added)
+++ llvm/trunk/test/DebugInfo/multiline.ll Tue Dec 30 16:47:13 2014
@@ -0,0 +1,81 @@
+; RUN: llc -filetype=asm -O0 < %s | FileCheck %s
+; RUN: llc -filetype=obj -O0 < %s | llvm-dwarfdump -debug-dump=line - | FileCheck %s --check-prefix=INT
+
+; Check that the assembly output properly handles is_stmt changes. And since
+; we're testing anyway, check the integrated assembler too.
+
+; Generated with clang from multiline.c:
+; void f1();
+; void f2() {
+;   f1(); f1(); f1();
+;   f1(); f1(); f1();
+; }
+
+
+; CHECK: .loc  1 2 0 #
+; CHECK-NOT: .loc
+; CHECK: .loc  1 3 3 prologue_end #
+; CHECK-NOT: .loc
+; CHECK: .loc  1 3 9 is_stmt 0 #
+; CHECK-NOT: .loc
+; CHECK: .loc  1 3 15 #
+; CHECK-NOT: .loc
+; CHECK: .loc  1 4 3 is_stmt 1 #
+; CHECK-NOT: .loc
+; CHECK: .loc  1 4 9 is_stmt 0 #
+; CHECK-NOT: .loc
+; CHECK: .loc  1 4 15 #
+; CHECK-NOT: .loc
+; CHECK: .loc  1 5 1 is_stmt 1 #
+
+; INT: {{^}}Address
+; INT: -----
+; INT-NEXT: 2 0 1 0 0 is_stmt{{$}}
+; INT-NEXT: 3 3 1 0 0 is_stmt prologue_end{{$}}
+; INT-NEXT: 3 9 1 0 0 {{$}}
+; INT-NEXT: 3 15 1 0 0 {{$}}
+; INT-NEXT: 4 3 1 0 0 is_stmt{{$}}
+; INT-NEXT: 4 9 1 0 0 {{$}}
+; INT-NEXT: 4 15 1 0 0 {{$}}
+; INT-NEXT: 5 1 1 0 0 is_stmt{{$}}
+
+
+; Function Attrs: nounwind uwtable
+define void @f2() #0 {
+entry:
+  call void (...)* @f1(), !dbg !11
+  call void (...)* @f1(), !dbg !12
+  call void (...)* @f1(), !dbg !13
+  call void (...)* @f1(), !dbg !14
+  call void (...)* @f1(), !dbg !15
+  call void (...)* @f1(), !dbg !16
+  ret void, !dbg !17
+}
+
+declare void @f1(...) #1
+
+attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu<http://llvm.dbg.cu> = !{!0}
+!llvm.module.flags = !{!8, !9}
+!llvm.ident = !{!10}
+
+!0 = !{!"0x11\0012\00clang version 3.6.0 (trunk 225000) (llvm/trunk 224999)\000\00\000\00\001", !1, !2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/multiline.c] [DW_LANG_C99]
+!1 = !{!"multiline.c", !"/tmp/dbginfo"}
+!2 = !{}
+!3 = !{!4}
+!4 = !{!"0x2e\00f2\00f2\00\002\000\001\000\000\000\000\002", !1, !5, !6, null, void ()* @f2, null, null, !2} ; [ DW_TAG_subprogram ] [line 2] [def] [f2]
+!5 = !{!"0x29", !1}                               ; [ DW_TAG_file_type ] [/tmp/dbginfo/multiline.c]
+!6 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
+!7 = !{null}
+!8 = !{i32 2, !"Dwarf Version", i32 4}
+!9 = !{i32 2, !"Debug Info Version", i32 2}
+!10 = !{!"clang version 3.6.0 (trunk 225000) (llvm/trunk 224999)"}
+!11 = !{i32 3, i32 3, !4, null}
+!12 = !{i32 3, i32 9, !4, null}
+!13 = !{i32 3, i32 15, !4, null}
+!14 = !{i32 4, i32 3, !4, null}
+!15 = !{i32 4, i32 9, !4, null}
+!16 = !{i32 4, i32 15, !4, null}
+!17 = !{i32 5, i32 1, !4, null}


_______________________________________________
llvm-commits mailing list
llvm-commits at cs.uiuc.edu<mailto:llvm-commits at cs.uiuc.edu>
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150119/ae533297/attachment.html>


More information about the llvm-commits mailing list