From b0c1ff7c6086d3391e3882e12725f74da401ede6 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 31 May 2019 22:55:03 +0000 Subject: [PATCH] [codeview] Revert inline line table change of r362264 Testing with debuggers shows that our previous behavior was correct. The reason I thought MSVC did things differently is that MSVC prefers to use the 0xB combined code offset and code length update opcode when inline sites are discontiguous. Keep the test changes, and update the llvm-pdbutil inline line table dumper to account for this new interpretation of the opcodes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362277 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCCodeView.cpp | 1 + test/MC/COFF/cv-inline-linetable-unlikely.s | 5 ++--- test/MC/COFF/cv-loc-unreachable-2.s | 2 +- test/MC/COFF/cv-loc-unreachable.s | 2 +- tools/llvm-pdbutil/MinimalSymbolDumper.cpp | 4 ++++ 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/MC/MCCodeView.cpp b/lib/MC/MCCodeView.cpp index b2983c11e34..1a71b542bd0 100644 --- a/lib/MC/MCCodeView.cpp +++ b/lib/MC/MCCodeView.cpp @@ -535,6 +535,7 @@ 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 3f693ee6329..a12f6d32ad2 100644 --- a/test/MC/COFF/cv-inline-linetable-unlikely.s +++ b/test/MC/COFF/cv-inline-linetable-unlikely.s @@ -36,12 +36,11 @@ # ASM-NEXT: 2b: 0f 0b ud2 # End inline loc -# CODEVIEW: S_INLINESITE [size = 26] +# CODEVIEW: S_INLINESITE [size = 24] # 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: 0B2F code 0x26 (+0xF) line 2 (+1) # CODEVIEW-NEXT: 0407 code end 0x2D (+0x7) .text diff --git a/test/MC/COFF/cv-loc-unreachable-2.s b/test/MC/COFF/cv-loc-unreachable-2.s index e13ad84a814..66e8da4fa14 100644 --- a/test/MC/COFF/cv-loc-unreachable-2.s +++ b/test/MC/COFF/cv-loc-unreachable-2.s @@ -25,7 +25,7 @@ # 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: 0B21 code 0xA (+0x1) line 2 (+1) # CODEVIEW-NEXT: 0B28 code 0x12 (+0x8) line 3 (+1) # CODEVIEW-NEXT: 0400 code end 0x12 (+0x0) diff --git a/test/MC/COFF/cv-loc-unreachable.s b/test/MC/COFF/cv-loc-unreachable.s index bd6f8f75a8c..7a14a2d6002 100644 --- a/test/MC/COFF/cv-loc-unreachable.s +++ b/test/MC/COFF/cv-loc-unreachable.s @@ -36,7 +36,7 @@ # 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: 0B21 code 0xA (+0x1) line 2 (+1) # CODEVIEW-NEXT: 0B28 code 0x12 (+0x8) line 3 (+1) # CODEVIEW-NEXT: 0400 code end 0x12 (+0x0) diff --git a/tools/llvm-pdbutil/MinimalSymbolDumper.cpp b/tools/llvm-pdbutil/MinimalSymbolDumper.cpp index d3c3f3da9c0..720d7396601 100644 --- a/tools/llvm-pdbutil/MinimalSymbolDumper.cpp +++ b/tools/llvm-pdbutil/MinimalSymbolDumper.cpp @@ -689,6 +689,10 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, InlineSiteSym &IS) { break; case BinaryAnnotationsOpCode::ChangeCodeLength: formatCodeLength(Annot.U1); + // Apparently this annotation updates the code offset. It's hard to make + // MSVC produce this opcode, but clang uses it, and debuggers seem to use + // this interpretation. + CodeOffset += Annot.U1; break; case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: formatCodeOffset(Annot.U1); -- 2.50.1