OSDN Git Service

[CodeView] Properly handle empty line tables
authorDavid Majnemer <david.majnemer@gmail.com>
Sat, 30 Jan 2016 00:36:09 +0000 (00:36 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sat, 30 Jan 2016 00:36:09 +0000 (00:36 +0000)
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
test/MC/COFF/cv-empty-linetable.s [new file with mode: 0644]

index 8ecdd05..713c3b5 100644 (file)
@@ -125,14 +125,14 @@ public:
   }
 
   std::vector<MCCVLineEntry> getFunctionLineEntries(unsigned FuncId) {
-    auto I = MCCVLineStartStop.find(FuncId);
-    assert(I != MCCVLineStartStop.end());
-
     std::vector<MCCVLineEntry> 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 (file)
index 0000000..4fcafd2
--- /dev/null
@@ -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:  ]