From: Reid Kleckner Date: Fri, 31 May 2019 20:55:31 +0000 (+0000) Subject: [codeview] Fix inline line table accuracy for discontiguous segments X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cabc6f59cc5f144c36a4c473c159eb0ce5cea1e0;p=llvm [codeview] Fix inline line table accuracy for discontiguous segments After improving the inline line table dumper in llvm-pdbutil and looking at MSVC's inline line tables, it is clear that setting the length of the inlined code region does not update the code offset. This means that the delta to the beginning of a new discontiguous inlined code region should be calculated relative to the last code offset, excluding the length. Implementing this is a one line fix for MC: simply don't update LastLabel. While I'm updating these test cases, switch them to use llvm-objdump -d and llvm-pdbutil. This allows us to show offsets of each instruction and correlate the line table offsets to the actual code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362264 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/MCCodeView.cpp b/lib/MC/MCCodeView.cpp index 1a71b542bd0..b2983c11e34 100644 --- a/lib/MC/MCCodeView.cpp +++ b/lib/MC/MCCodeView.cpp @@ -535,7 +535,6 @@ void CodeViewContext::encodeInlineLineTable(MCAsmLayout &Layout, unsigned Length = computeLabelDiff(Layout, LastLabel, Loc.getLabel()); compressAnnotation(BinaryAnnotationsOpCode::ChangeCodeLength, Buffer); compressAnnotation(Length, Buffer); - LastLabel = Loc.getLabel(); } HaveOpenRange = false; continue; diff --git a/test/MC/COFF/cv-inline-linetable-unlikely.s b/test/MC/COFF/cv-inline-linetable-unlikely.s index 0ad3559beb7..3f693ee6329 100644 --- a/test/MC/COFF/cv-inline-linetable-unlikely.s +++ b/test/MC/COFF/cv-inline-linetable-unlikely.s @@ -1,4 +1,6 @@ -# RUN: llvm-mc -triple=x86_64-windows -filetype=obj < %s | llvm-readobj --codeview | FileCheck %s +# RUN: llvm-mc -triple=x86_64-windows -filetype=obj < %s -o %t.obj +# RUN: llvm-objdump -d %t.obj | FileCheck %s --check-prefix=ASM +# RUN: llvm-pdbutil dump -symbols %t.obj | FileCheck %s --check-prefix=CODEVIEW # C source to generate the assembly: # volatile int unlikely_cond = 0; @@ -19,20 +21,28 @@ # calls to __asan_report*, for which it is very important to have an accurate # stack trace. -# CHECK: GlobalProcIdSym { -# CHECK: FunctionType: g (0x1003) -# CHECK: CodeOffset: g+0x0 -# CHECK: DisplayName: g -# CHECK: LinkageName: g -# CHECK: } -# CHECK: InlineSiteSym { -# CHECK: Inlinee: f (0x1002) -# CHECK: BinaryAnnotations [ -# CHECK-NEXT: ChangeCodeOffsetAndLineOffset: {CodeOffset: 0xE, LineOffset: 1} -# CHECK-NEXT: ChangeCodeLength: 0x9 -# CHECK-NEXT: ChangeCodeOffsetAndLineOffset: {CodeOffset: 0xF, LineOffset: 1} -# CHECK-NEXT: ChangeCodeLength: 0x7 -# CHECK-NEXT: ] +# ASM: 0000000000000000 g: +# ASM-NEXT: 0: 48 83 ec 28 subq $40, %rsp +# ASM-NEXT: 4: c7 05 fc ff ff ff 00 00 00 00 movl $0, -4(%rip) +# Begin inline loc (matches cv_loc below) +# ASM-NEXT: e: 83 3d ff ff ff ff 00 cmpl $0, -1(%rip) +# ASM-NEXT: 15: 75 0f jne 15 +# End inline loc +# ASM-NEXT: 17: c7 05 fc ff ff ff 00 00 00 00 movl $0, -4(%rip) +# ASM-NEXT: 21: 48 83 c4 28 addq $40, %rsp +# ASM-NEXT: 25: c3 retq +# Begin inline loc (matches cv_loc below) +# ASM-NEXT: 26: e8 00 00 00 00 callq 0 +# ASM-NEXT: 2b: 0f 0b ud2 +# End inline loc + +# CODEVIEW: S_INLINESITE [size = 26] +# CODEVIEW-NEXT: inlinee = 0x1002 (f), parent = 0, end = 0 +# CODEVIEW-NEXT: 0B2E code 0xE (+0xE) line 1 (+1) +# CODEVIEW-NEXT: 0409 code end 0x17 (+0x9) +# CODEVIEW-NEXT: 0602 line 2 (+1) +# CODEVIEW-NEXT: 0318 code 0x26 (+0x18) +# CODEVIEW-NEXT: 0407 code end 0x2D (+0x7) .text .globl g diff --git a/test/MC/COFF/cv-inline-linetable.s b/test/MC/COFF/cv-inline-linetable.s index f226d6fe21f..08f250eb43b 100644 --- a/test/MC/COFF/cv-inline-linetable.s +++ b/test/MC/COFF/cv-inline-linetable.s @@ -123,7 +123,9 @@ Ltmp3: .short Ltmp5-Ltmp4 Ltmp4: .short 4429 - .asciz "\000\000\000\000\000\000\000\000\003\020\000" + .long 0 # parent + .long 0 # end + .long 0x1003 # inlinee, bar .cv_inline_linetable 1 1 9 Lfunc_begin0 Lfunc_end0 # CHECK: InlineSiteSym { # CHECK: PtrParent: 0x0 diff --git a/test/MC/COFF/cv-loc-unreachable-2.s b/test/MC/COFF/cv-loc-unreachable-2.s index be96e82fa1b..e13ad84a814 100644 --- a/test/MC/COFF/cv-loc-unreachable-2.s +++ b/test/MC/COFF/cv-loc-unreachable-2.s @@ -1,26 +1,33 @@ -# RUN: llvm-mc < %s -triple=i686-pc-win32 -filetype=obj | llvm-readobj - --codeview | FileCheck %s +# RUN: llvm-mc %s -triple=i686-pc-win32 -filetype=obj -o %t.obj +# RUN: llvm-objdump -d %t.obj | FileCheck %s --check-prefix=ASM +# RUN: llvm-pdbutil dump -il -symbols %t.obj | FileCheck %s --check-prefix=CODEVIEW # Based on the other cv-loc-unreachable-2.s, but with other code in the same # section afterwards. We had negative label difference assertions when .cv_loc # bound tightly to the next instruction. -# CHECK-LABEL: InlineeSourceLine { -# CHECK: Inlinee: do_exit (0x1002) -# CHECK: FileID: C:\src\llvm-project\build\t.cpp (0x0) -# CHECK: SourceLineNum: 3 -# CHECK: } +# ASM: 0000000000000000 _callit: +# begin inline { +# ASM-NEXT: 0: e8 00 00 00 00 calll 0 <_callit+0x5> +# ASM-NEXT: 5: 85 c0 testl %eax, %eax +# ASM-NEXT: 7: 75 01 jne 1 <_callit+0xa> +# } end inline +# ASM-NEXT: 9: c3 retl +# begin inline { +# ASM-NEXT: a: 6a 20 pushl $32 +# ASM-NEXT: c: ff 15 00 00 00 00 calll *0 +# } end inline -# CHECK-LABEL: InlineSiteSym { -# CHECK: Kind: S_INLINESITE (0x114D) -# CHECK: Inlinee: do_exit (0x1002) -# CHECK: BinaryAnnotations [ -# CHECK-NEXT: ChangeLineOffset: 1 -# CHECK-NEXT: ChangeCodeLength: 0x9 -# CHECK-NEXT: ChangeCodeOffsetAndLineOffset: {CodeOffset: 0x1, LineOffset: 1} -# CHECK-NEXT: ChangeCodeOffsetAndLineOffset: {CodeOffset: 0x8, LineOffset: 1} -# CHECK-NEXT: ChangeCodeLength: 0x0 -# CHECK-NEXT: ] -# CHECK: } +# CODEVIEW: Inlinee | Line | Source File +# CODEVIEW: 0x1002 | 3 | C:\src\llvm-project\build\t.cpp (MD5: 0BC092F354CE14FDC2FA78F8EDE7426E) + +# CODEVIEW: S_INLINESITE [size = 26] +# CODEVIEW-NEXT: inlinee = 0x1002 (do_exit), parent = 0, end = 0 +# CODEVIEW-NEXT: 0602 line 1 (+1) +# CODEVIEW-NEXT: 0409 code end 0x9 (+0x9) +# CODEVIEW-NEXT: 0B2A code 0xA (+0xA) line 2 (+1) +# CODEVIEW-NEXT: 0B28 code 0x12 (+0x8) line 3 (+1) +# CODEVIEW-NEXT: 0400 code end 0x12 (+0x0) .text .def _callit; .scl 2; .type 32; .endef diff --git a/test/MC/COFF/cv-loc-unreachable.s b/test/MC/COFF/cv-loc-unreachable.s index 945e519f506..bd6f8f75a8c 100644 --- a/test/MC/COFF/cv-loc-unreachable.s +++ b/test/MC/COFF/cv-loc-unreachable.s @@ -1,4 +1,6 @@ -# RUN: llvm-mc < %s -triple=i686-pc-win32 -filetype=obj | llvm-readobj - --codeview | FileCheck %s +# RUN: llvm-mc %s -triple=i686-pc-win32 -filetype=obj -o %t.obj +# RUN: llvm-objdump -d %t.obj | FileCheck %s --check-prefix=ASM +# RUN: llvm-pdbutil dump -il -symbols %t.obj | FileCheck %s --check-prefix=CODEVIEW # Original source, slightly modified with an extra .cv_loc directive (at EXTRA # below) that was causing assertions: @@ -14,23 +16,29 @@ # do_exit(); # } -# CHECK-LABEL: InlineeSourceLine { -# CHECK: Inlinee: do_exit (0x1002) -# CHECK: FileID: C:\src\llvm-project\build\t.cpp (0x0) -# CHECK: SourceLineNum: 3 -# CHECK: } -# CHECK-LABEL: InlineSiteSym { -# CHECK: Kind: S_INLINESITE (0x114D) -# CHECK: Inlinee: do_exit (0x1002) -# CHECK: BinaryAnnotations [ -# CHECK-NEXT: ChangeLineOffset: 1 -# CHECK-NEXT: ChangeCodeLength: 0x9 -# CHECK-NEXT: ChangeCodeOffsetAndLineOffset: {CodeOffset: 0x1, LineOffset: 1} -# CHECK-NEXT: ChangeCodeOffsetAndLineOffset: {CodeOffset: 0x8, LineOffset: 1} -# CHECK-NEXT: ChangeCodeLength: 0x0 -# CHECK-NEXT: ] -# CHECK: } +# ASM: 0000000000000000 _callit: +# begin inline { +# ASM-NEXT: 0: e8 00 00 00 00 calll 0 <_callit+0x5> +# ASM-NEXT: 5: 85 c0 testl %eax, %eax +# ASM-NEXT: 7: 75 01 jne 1 <_callit+0xa> +# } end inline +# ASM-NEXT: 9: c3 retl +# begin inline { +# ASM-NEXT: a: 6a 20 pushl $32 +# ASM-NEXT: c: ff 15 00 00 00 00 calll *0 +# } end inline + +# CODEVIEW: Inlinee | Line | Source File +# CODEVIEW: 0x1002 | 3 | C:\src\llvm-project\build\t.cpp (MD5: 0BC092F354CE14FDC2FA78F8EDE7426E) + +# CODEVIEW: S_INLINESITE [size = 26] +# CODEVIEW-NEXT: inlinee = 0x1002 (do_exit), parent = 0, end = 0 +# CODEVIEW-NEXT: 0602 line 1 (+1) +# CODEVIEW-NEXT: 0409 code end 0x9 (+0x9) +# CODEVIEW-NEXT: 0B2A code 0xA (+0xA) line 2 (+1) +# CODEVIEW-NEXT: 0B28 code 0x12 (+0x8) line 3 (+1) +# CODEVIEW-NEXT: 0400 code end 0x12 (+0x0) .text .def _callit; .scl 2; .type 32; .endef