[codeview] Don't attempt a cross-section label diff

This only comes up when we're trying to find the next .cv_loc label.

Fixes PR26467

llvm-svn: 259733
This commit is contained in:
Reid Kleckner 2016-02-04 00:21:42 +00:00
parent ce925c580e
commit cb91e7d395
2 changed files with 82 additions and 5 deletions

View File

@ -236,7 +236,7 @@ void CodeViewContext::emitInlineLineTableForFunction(
SecondaryFunctionIds, OS.getCurrentSectionOnly());
}
unsigned computeLabelDiff(MCAsmLayout &Layout, const MCSymbol *Begin,
static unsigned computeLabelDiff(MCAsmLayout &Layout, const MCSymbol *Begin,
const MCSymbol *End) {
MCContext &Ctx = Layout.getAssembler().getContext();
MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
@ -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())
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(), LocAfter[0].getLabel());
computeLabelDiff(Layout, LastLoc->getLabel(), Loc.getLabel());
}
}
compressAnnotation(ChangeCodeLength, Buffer);
compressAnnotation(std::min(EndSymLength, LocAfterLength), Buffer);

View File

@ -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