summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/MC/MCCodeView.cpp16
-rw-r--r--llvm/test/MC/COFF/cv-inline-linetable-infloop.s71
2 files changed, 82 insertions, 5 deletions
diff --git a/llvm/lib/MC/MCCodeView.cpp b/llvm/lib/MC/MCCodeView.cpp
index 81597f6c145..f50fdab8dfa 100644
--- a/llvm/lib/MC/MCCodeView.cpp
+++ b/llvm/lib/MC/MCCodeView.cpp
@@ -236,8 +236,8 @@ void CodeViewContext::emitInlineLineTableForFunction(
SecondaryFunctionIds, OS.getCurrentSectionOnly());
}
-unsigned computeLabelDiff(MCAsmLayout &Layout, const MCSymbol *Begin,
- const MCSymbol *End) {
+static unsigned computeLabelDiff(MCAsmLayout &Layout, const MCSymbol *Begin,
+ const MCSymbol *End) {
MCContext &Ctx = Layout.getAssembler().getContext();
MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
const MCExpr *BeginRef = MCSymbolRefExpr::create(Begin, Variant, Ctx),
@@ -338,9 +338,15 @@ void CodeViewContext::encodeInlineLineTable(MCAsmLayout &Layout,
computeLabelDiff(Layout, LastLoc->getLabel(), Frag.getFnEndSym());
unsigned LocAfterLength = ~0U;
ArrayRef<MCCVLineEntry> LocAfter = getLinesForExtent(LocEnd, LocEnd + 1);
- if (!LocAfter.empty())
- LocAfterLength =
- computeLabelDiff(Layout, LastLoc->getLabel(), LocAfter[0].getLabel());
+ if (!LocAfter.empty()) {
+ // Only try to compute this difference if we're in the same section.
+ const MCCVLineEntry &Loc = LocAfter[0];
+ if (&Loc.getLabel()->getSection(false) ==
+ &LastLoc->getLabel()->getSection(false)) {
+ LocAfterLength =
+ computeLabelDiff(Layout, LastLoc->getLabel(), Loc.getLabel());
+ }
+ }
compressAnnotation(ChangeCodeLength, Buffer);
compressAnnotation(std::min(EndSymLength, LocAfterLength), Buffer);
diff --git a/llvm/test/MC/COFF/cv-inline-linetable-infloop.s b/llvm/test/MC/COFF/cv-inline-linetable-infloop.s
new file mode 100644
index 00000000000..cd0a073be2a
--- /dev/null
+++ b/llvm/test/MC/COFF/cv-inline-linetable-infloop.s
@@ -0,0 +1,71 @@
+# RUN: llvm-mc -triple=x86_64-pc-win32 -filetype=obj < %s | llvm-readobj -codeview | FileCheck %s
+
+# CHECK: InlineSite {
+# CHECK: BinaryAnnotations [
+# CHECK: ChangeLineOffset: 1
+# CHECK: ChangeCodeLength: 0x2
+# CHECK: ]
+# CHECK: }
+
+ .text
+ .cv_file 1 "D:\\src\\llvm\\build\\t.c"
+
+ .def infloop;
+ .scl 2;
+ .type 32;
+ .endef
+ .section .text,"xr",one_only,infloop
+ .globl infloop
+ .p2align 4, 0x90
+infloop: # @infloop
+.Lfunc_begin1:
+ .cv_loc 2 1 3 7 # t.c:3:7
+ jmp .Lfunc_begin1
+.Lfunc_end1:
+
+ .def afterinfloop;
+ .scl 2;
+ .type 32;
+ .endef
+ .section .text,"xr",one_only,afterinfloop
+ .globl afterinfloop
+ .p2align 4, 0x90
+afterinfloop: # @afterinfloop
+ .cv_loc 3 1 13 0 # t.c:13:0
+ retq
+
+ .section .debug$S,"dr"
+ .long 4
+ .long 241 # Symbol subsection for infloop
+ .long .Ltmp17-.Ltmp16 # Subsection size
+.Ltmp16:
+ .short .Ltmp19-.Ltmp18 # Record length
+.Ltmp18:
+ .short 4423 # Record kind: S_GPROC32_ID
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 0 # PtrNext
+ .long .Lfunc_end1-infloop # Code size
+ .long 0 # Offset after prologue
+ .long 0 # Offset before epilogue
+ .long 0 # Function type index
+ .secrel32 infloop # Function section relative address
+ .secidx infloop # Function section index
+ .byte 0 # Flags
+ .asciz "infloop" # Function name
+.Ltmp19:
+ .short .Ltmp21-.Ltmp20 # Record length
+.Ltmp20:
+ .short 4429 # Record kind: S_INLINESITE
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 4098 # Inlinee type index
+ .cv_inline_linetable 2 1 2 .Lfunc_begin1 .Lfunc_end1
+.Ltmp21:
+ .short 2 # Record length
+ .short 4430 # Record kind: S_INLINESITE_END
+ .short 2 # Record length
+ .short 4431 # Record kind: S_PROC_ID_END
+.Ltmp17:
+ .p2align 2
+ .cv_linetable 1, infloop, .Lfunc_end1
OpenPOWER on IntegriCloud