From 41a66df74f2b7df77d7132e2d71b6df448015f59 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 30 Jan 2016 00:36:09 +0000 Subject: [PATCH] [CodeView] Properly handle empty line tables Don't crash when there are no appropriate line table entries for a given function. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259277 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCCodeView.h | 14 +++---- test/MC/COFF/cv-empty-linetable.s | 82 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 test/MC/COFF/cv-empty-linetable.s diff --git a/include/llvm/MC/MCCodeView.h b/include/llvm/MC/MCCodeView.h index 8ecdd055d12..713c3b5af5c 100644 --- a/include/llvm/MC/MCCodeView.h +++ b/include/llvm/MC/MCCodeView.h @@ -125,14 +125,14 @@ public: } std::vector getFunctionLineEntries(unsigned FuncId) { - auto I = MCCVLineStartStop.find(FuncId); - assert(I != MCCVLineStartStop.end()); - std::vector FilteredLines; - for (size_t Idx = I->second.first, End = I->second.second + 1; Idx != End; - ++Idx) - if (MCCVLines[Idx].getFunctionId() == FuncId) - FilteredLines.push_back(MCCVLines[Idx]); + + auto I = MCCVLineStartStop.find(FuncId); + if (I != MCCVLineStartStop.end()) + for (size_t Idx = I->second.first, End = I->second.second + 1; Idx != End; + ++Idx) + if (MCCVLines[Idx].getFunctionId() == FuncId) + FilteredLines.push_back(MCCVLines[Idx]); return FilteredLines; } diff --git a/test/MC/COFF/cv-empty-linetable.s b/test/MC/COFF/cv-empty-linetable.s new file mode 100644 index 00000000000..4fcafd2d268 --- /dev/null +++ b/test/MC/COFF/cv-empty-linetable.s @@ -0,0 +1,82 @@ +# RUN: llvm-mc -filetype=obj -triple i686-pc-win32 < %s | llvm-readobj -codeview - | FileCheck %s + .text + .def @feat.00; + .scl 3; + .type 0; + .endef + .globl @feat.00 +@feat.00 = 1 + .def _f; + .scl 2; + .type 32; + .endef + .globl _f + .p2align 4, 0x90 +_f: # @f +Lfunc_begin0: +# BB#0: # %entry + .cv_file 1 "cv-empty-linetable.s" + .cv_loc 1 1 3 15 is_stmt 0 + jmp _g # TAILCALL +Lfunc_end0: + + .section .debug$T,"dr" + .long 4 + .short 6 + .short 4609 + .long 0 + .short 14 + .short 4104 + .asciz "\003\000\000\000\000\000\000\000\000\020\000" + .short 14 + .short 5633 + .asciz "\000\000\000\000\001\020\000" + .ascii "fn1" + .byte 0 + .short 38 + .short 5633 + .asciz "\000\000\000\000\001\020\000" + .ascii "??__Fa@?1??fn1@@YAXXZ@YAXXZ" + .byte 0 + .short 26 + .short 5633 + .asciz "\000\000\000\000\001\020\000" + .ascii "vector::~vector" + .byte 0 + .section .debug$S,"dr" + .long 4 + .long 241 # Symbol subsection for f + .long Ltmp1-Ltmp0 +Ltmp0: + .short Ltmp3-Ltmp2 +Ltmp2: + .short 4423 + .zero 12 + .long Lfunc_end0-_f + .zero 12 + .secrel32 _f + .secidx _f + .byte 0 + .byte 102 + .byte 0 +Ltmp3: + .short Ltmp5-Ltmp4 +Ltmp4: + .short 4429 + .asciz "\000\000\000\000\000\000\000\000\004\020\000" +Ltmp5: + .short 2 + .short 4430 + .short 2 + .short 4431 +Ltmp1: + .zero 3 + .cv_linetable 0, _f, Lfunc_end0 + .cv_filechecksums # File index to string table offset subsection + .cv_stringtable # String table + +# CHECK: FunctionLineTable [ +# CHECK: LinkageName: _f +# CHECK: Flags: 0x0 +# CHECK: CodeSize: 0x5 +# CHECK: ] -- 2.11.0