[CodeView] Improve the line table dumper
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 13 Jan 2016 01:05:16 +0000 (01:05 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 13 Jan 2016 01:05:16 +0000 (01:05 +0000)
This change has us print out fields we didn't previously understand.  To
improve readability, we now group column information with it's
respective line.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257552 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/COFF.h
test/DebugInfo/COFF/asm.ll
test/DebugInfo/COFF/multifile.ll
test/DebugInfo/COFF/multifunction.ll
test/DebugInfo/COFF/simple.ll
test/tools/llvm-readobj/codeview-linetables.test
tools/llvm-readobj/COFFDumper.cpp

index 0162175..0245632 100644 (file)
@@ -656,6 +656,15 @@ namespace COFF {
     }
   };
 
+  enum CodeViewLine : unsigned {
+    CVL_LineNumberStartBits = 24,
+    CVL_LineNumberEndDeltaBits = 7,
+    CVL_LineNumberEndDeltaMask = (1U << CVL_LineNumberEndDeltaBits) - 1,
+    CVL_MaxLineNumber = (1U << CVL_LineNumberStartBits) - 1,
+    CVL_IsStatement = 1U << 31,
+    CVL_MaxColumnNumber = UINT16_MAX,
+  };
+
   enum CodeViewIdentifiers {
     DEBUG_LINE_TABLES_HAVE_COLUMN_RECORDS = 0x1,
     DEBUG_SECTION_MAGIC = 0x4,
index b67100c..fed296f 100644 (file)
 ; OBJ32-NEXT:   Flags: 0x1
 ; OBJ32-NEXT:   CodeSize: 0x6
 ; OBJ32-NEXT:   FilenameSegment [
-; OBJ32-NEXT:     Filename: D:\asm.c
+; OBJ32-NEXT:   Filename: D:\asm.c
 ; FIXME: An empty __asm stmt creates an extra entry.
 ; We seem to know that these offsets are the same statically during the
 ; execution of endModule().  See PR18679 for the details.
-; OBJ32-NEXT:     +0x0: 4
-; OBJ32-NEXT:     +0x0: 5
-; OBJ32-NEXT:     +0x5: 6
+; OBJ32-NEXT:   +0x0 [
+; OBJ32-NEXT:     LineNumberStart: 4
+; OBJ32-NEXT:     LineNumberEndDelta: 0
+; OBJ32-NEXT:     IsStatement: No
 ; OBJ32-NEXT:     ColStart: 0
 ; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:   ]
+; OBJ32-NEXT:   +0x0 [
+; OBJ32-NEXT:     LineNumberStart: 5
+; OBJ32-NEXT:     LineNumberEndDelta: 0
+; OBJ32-NEXT:     IsStatement: No
 ; OBJ32-NEXT:     ColStart: 0
 ; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:   ]
+; OBJ32-NEXT:   +0x5 [
+; OBJ32-NEXT:     LineNumberStart: 6
+; OBJ32-NEXT:     LineNumberEndDelta: 0
+; OBJ32-NEXT:     IsStatement: No
 ; OBJ32-NEXT:     ColStart: 0
 ; OBJ32-NEXT:     ColEnd: 0
 ; OBJ32-NEXT:   ]
 ; OBJ64-NEXT:   CodeSize: 0xE
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\asm.c
-; OBJ64-NEXT:     +0x0: 3
 ; FIXME: An empty __asm stmt creates an extra entry.
 ; See PR18679 for the details.
-; OBJ64-NEXT:     +0x4: 4
-; OBJ64-NEXT:     +0x4: 5
-; OBJ64-NEXT:     +0x9: 6
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0x0 [
+; OBJ64-NEXT:       LineNumberStart: 3
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x4 [
+; OBJ64-NEXT:       LineNumberStart: 4
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x4 [
+; OBJ64-NEXT:       LineNumberStart: 5
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x9 [
+; OBJ64-NEXT:       LineNumberStart: 6
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT: ]
 
index 70bc002..90a1591 100644 (file)
 ; OBJ32-NEXT:   CodeSize: 0x10
 ; OBJ32-NEXT:   FilenameSegment [
 ; OBJ32-NEXT:     Filename: D:\one.c
-; OBJ32-NEXT:     +0x0: 1
-; OBJ32-NEXT:     ColStart: 0
-; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:     +0x0 [
+; OBJ32-NEXT:       LineNumberStart: 1
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 0
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
 ; OBJ32-NEXT:   ]
 ; OBJ32-NEXT:   FilenameSegment [
 ; OBJ32-NEXT:     Filename: D:\two.c
-; OBJ32-NEXT:     +0x5: 2
-; OBJ32-NEXT:     ColStart: 0
-; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:     +0x5 [
+; OBJ32-NEXT:       LineNumberStart: 2
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 0
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
 ; OBJ32-NEXT:   ]
 ; OBJ32-NEXT:   FilenameSegment [
 ; OBJ32-NEXT:     Filename: D:\one.c
-; OBJ32-NEXT:     +0xA: 7
-; OBJ32-NEXT:     +0xF: 8
-; OBJ32-NEXT:     ColStart: 0
-; OBJ32-NEXT:     ColEnd: 0
-; OBJ32-NEXT:     ColStart: 0
-; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:     +0xA [
+; OBJ32-NEXT:       LineNumberStart: 7
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 0
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
+; OBJ32-NEXT:     +0xF [
+; OBJ32-NEXT:       LineNumberStart: 8
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 0
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
 ; OBJ32-NEXT:   ]
 ; OBJ32-NEXT: ]
 
 ; OBJ64-NEXT:   CodeSize: 0x18
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\input.c
-; OBJ64-NEXT:     +0x0: 3
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0x0 [
+; OBJ64-NEXT:       LineNumberStart: 3
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\one.c
-; OBJ64-NEXT:     +0x4: 1
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0x4 [
+; OBJ64-NEXT:       LineNumberStart: 1
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\two.c
-; OBJ64-NEXT:     +0x9: 2
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0x9 [
+; OBJ64-NEXT:       LineNumberStart: 2
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\one.c
-; OBJ64-NEXT:     +0xE: 7
-; OBJ64-NEXT:     +0x13: 8
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0xE [
+; OBJ64-NEXT:       LineNumberStart: 7
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x13 [
+; OBJ64-NEXT:       LineNumberStart: 8
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT: ]
 
index a25b5ed..832a67f 100644 (file)
 ; OBJ32-NEXT:   CodeSize: 0x6
 ; OBJ32-NEXT:   FilenameSegment [
 ; OBJ32-NEXT:     Filename: D:\source.c
-; OBJ32-NEXT:     +0x0: 4
-; OBJ32-NEXT:     +0x5: 5
-; OBJ32-NEXT:     ColStart: 42
-; OBJ32-NEXT:     ColEnd: 0
-; OBJ32-NEXT:     ColStart: 43
-; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:     +0x0 [
+; OBJ32-NEXT:       LineNumberStart: 4
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 42
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
+; OBJ32-NEXT:     +0x5 [
+; OBJ32-NEXT:       LineNumberStart: 5
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 43
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
 ; OBJ32-NEXT:   ]
 ; OBJ32-NEXT: ]
 ; OBJ32-NEXT: FunctionLineTable [
-; OBJ32-NEXT:   Name: _y
+; OBJ32-NEXT:   LinkageName: _y
 ; OBJ32-NEXT:   Flags: 0x1
 ; OBJ32-NEXT:   CodeSize: 0x6
 ; OBJ32-NEXT:   FilenameSegment [
 ; OBJ32-NEXT:     Filename: D:\source.c
-; OBJ32-NEXT:     +0x0: 8
-; OBJ32-NEXT:     +0x5: 9
-; OBJ32-NEXT:     ColStart: 52
-; OBJ32-NEXT:     ColEnd: 0
-; OBJ32-NEXT:     ColStart: 53
-; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:     +0x0 [
+; OBJ32-NEXT:       LineNumberStart: 8
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 52
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
+; OBJ32-NEXT:     +0x5 [
+; OBJ32-NEXT:       LineNumberStart: 9
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 53
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
 ; OBJ32-NEXT:   ]
 ; OBJ32-NEXT: ]
 ; OBJ32-NEXT: FunctionLineTable [
-; OBJ32-NEXT:   Name: _f
+; OBJ32-NEXT:   LinkageName: _f
 ; OBJ32-NEXT:   Flags: 0x1
 ; OBJ32-NEXT:   CodeSize: 0x10
 ; OBJ32-NEXT:   FilenameSegment [
 ; OBJ32-NEXT:     Filename: D:\source.c
-; OBJ32-NEXT:     +0x0: 12
-; OBJ32-NEXT:     +0x5: 13
-; OBJ32-NEXT:     +0xA: 14
-; OBJ32-NEXT:     +0xF: 15
-; OBJ32-NEXT:     ColStart: 62
-; OBJ32-NEXT:     ColEnd: 0
-; OBJ32-NEXT:     ColStart: 63
-; OBJ32-NEXT:     ColEnd: 0
-; OBJ32-NEXT:     ColStart: 72
-; OBJ32-NEXT:     ColEnd: 0
-; OBJ32-NEXT:     ColStart: 73
-; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:     +0x0 [
+; OBJ32-NEXT:       LineNumberStart: 12
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 62
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
+; OBJ32-NEXT:     +0x5 [
+; OBJ32-NEXT:       LineNumberStart: 13
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 63
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
+; OBJ32-NEXT:     +0xA [
+; OBJ32-NEXT:       LineNumberStart: 14
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 72
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
+; OBJ32-NEXT:     +0xF [
+; OBJ32-NEXT:       LineNumberStart: 15
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 73
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
 ; OBJ32-NEXT:   ]
 ; OBJ32-NEXT: ]
 
+
 ; X64-LABEL: x:
 ; X64-NEXT: .L{{.*}}:
 ; X64-NEXT: [[X_START:.*]]:{{$}}
 ; OBJ64-NEXT:   Type: 0xF2
 ; OBJ64:      ]
 ; OBJ64:      FunctionLineTable [
-; OBJ64-NEXT:   Name: x
+; OBJ64-NEXT:   LinkageName: x
 ; OBJ64-NEXT:   Flags: 0x1
 ; OBJ64-NEXT:   CodeSize: 0xE
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\source.c
-; OBJ64-NEXT:     +0x0: 3
-; OBJ64-NEXT:     +0x4: 4
-; OBJ64-NEXT:     +0x9: 5
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 42
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 43
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0x0 [
+; OBJ64-NEXT:       LineNumberStart: 3
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x4 [
+; OBJ64-NEXT:       LineNumberStart: 4
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 42
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x9 [
+; OBJ64-NEXT:       LineNumberStart: 5
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 43
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT: ]
 ; OBJ64-NEXT: FunctionLineTable [
-; OBJ64-NEXT:   Name: y
+; OBJ64-NEXT:   LinkageName: y
 ; OBJ64-NEXT:   Flags: 0x1
 ; OBJ64-NEXT:   CodeSize: 0xE
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\source.c
-; OBJ64-NEXT:     +0x0: 7
-; OBJ64-NEXT:     +0x4: 8
-; OBJ64-NEXT:     +0x9: 9
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 52
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 53
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0x0 [
+; OBJ64-NEXT:       LineNumberStart: 7
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x4 [
+; OBJ64-NEXT:       LineNumberStart: 8
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 52
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x9 [
+; OBJ64-NEXT:       LineNumberStart: 9
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 53
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT: ]
 ; OBJ64-NEXT: FunctionLineTable [
-; OBJ64-NEXT:   Name: f
+; OBJ64-NEXT:   LinkageName: f
 ; OBJ64-NEXT:   Flags: 0x1
 ; OBJ64-NEXT:   CodeSize: 0x18
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\source.c
-; OBJ64-NEXT:     +0x0: 11
-; OBJ64-NEXT:     +0x4: 12
-; OBJ64-NEXT:     +0x9: 13
-; OBJ64-NEXT:     +0xE: 14
-; OBJ64-NEXT:     +0x13: 15
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 62
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 63
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 72
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 73
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0x0 [
+; OBJ64-NEXT:       LineNumberStart: 11
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x4 [
+; OBJ64-NEXT:       LineNumberStart: 12
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 62
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x9 [
+; OBJ64-NEXT:       LineNumberStart: 13
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 63
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0xE [
+; OBJ64-NEXT:       LineNumberStart: 14
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 72
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x13 [
+; OBJ64-NEXT:       LineNumberStart: 15
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 73
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT: ]
 
index 2103df0..3e62b2b 100644 (file)
 ; OBJ32-NEXT:   CodeSize: 0x6
 ; OBJ32-NEXT:   FilenameSegment [
 ; OBJ32-NEXT:     Filename: D:\test.c
-; OBJ32-NEXT:     +0x0: 4
-; OBJ32-NEXT:     +0x5: 5
-; OBJ32-NEXT:     ColStart: 0
-; OBJ32-NEXT:     ColEnd: 0
-; OBJ32-NEXT:     ColStart: 0
-; OBJ32-NEXT:     ColEnd: 0
+; OBJ32-NEXT:     +0x0 [
+; OBJ32-NEXT:       LineNumberStart: 4
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 0
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
+; OBJ32-NEXT:     +0x5 [
+; OBJ32-NEXT:       LineNumberStart: 5
+; OBJ32-NEXT:       LineNumberEndDelta: 0
+; OBJ32-NEXT:       IsStatement: No
+; OBJ32-NEXT:       ColStart: 0
+; OBJ32-NEXT:       ColEnd: 0
+; OBJ32-NEXT:     ]
 ; OBJ32-NEXT:   ]
 ; OBJ32-NEXT: ]
 
 ; OBJ64-NEXT:   CodeSize: 0xE
 ; OBJ64-NEXT:   FilenameSegment [
 ; OBJ64-NEXT:     Filename: D:\test.c
-; OBJ64-NEXT:     +0x0: 3
-; OBJ64-NEXT:     +0x4: 4
-; OBJ64-NEXT:     +0x9: 5
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
-; OBJ64-NEXT:     ColStart: 0
-; OBJ64-NEXT:     ColEnd: 0
+; OBJ64-NEXT:     +0x0 [
+; OBJ64-NEXT:       LineNumberStart: 3
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x4 [
+; OBJ64-NEXT:       LineNumberStart: 4
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
+; OBJ64-NEXT:     +0x9 [
+; OBJ64-NEXT:       LineNumberStart: 5
+; OBJ64-NEXT:       LineNumberEndDelta: 0
+; OBJ64-NEXT:       IsStatement: No
+; OBJ64-NEXT:       ColStart: 0
+; OBJ64-NEXT:       ColEnd: 0
+; OBJ64-NEXT:     ]
 ; OBJ64-NEXT:   ]
 ; OBJ64-NEXT: ]
 
index 880b6d5..a1c6ab6 100644 (file)
@@ -103,41 +103,85 @@ MFUN32-NEXT:     Type: 0xF1
 MFUN32-NEXT:     PayloadSize: 0x8
 MFUN32:        ]
 MFUN32-NEXT:   FunctionLineTable [
-MFUN32-NEXT:     LinkageName: _x
-MFUN32-NEXT:     Flags: 0x0
-MFUN32-NEXT:     CodeSize: 0xA
-MFUN32-NEXT:     FilenameSegment [
-MFUN32-NEXT:       Filename: d:\source.c
-MFUN32-NEXT:       +0x0: 3
-MFUN32-NEXT:       +0x3: 4
-MFUN32-NEXT:       +0x8: 5
-MFUN32-NEXT:     ]
-MFUN32-NEXT:   ]
-MFUN32-NEXT:   FunctionLineTable [
-MFUN32-NEXT:     LinkageName: _y
-MFUN32-NEXT:     Flags: 0x0
-MFUN32-NEXT:     CodeSize: 0xA
-MFUN32-NEXT:     FilenameSegment [
-MFUN32-NEXT:       Filename: d:\source.c
-MFUN32-NEXT:       +0x0: 7
-MFUN32-NEXT:       +0x3: 8
-MFUN32-NEXT:       +0x8: 9
-MFUN32-NEXT:     ]
-MFUN32-NEXT:   ]
-MFUN32-NEXT:   FunctionLineTable [
-MFUN32-NEXT:     LinkageName: _f
-MFUN32-NEXT:     Flags: 0x0
-MFUN32-NEXT:     CodeSize: 0x14
-MFUN32-NEXT:     FilenameSegment [
-MFUN32-NEXT:       Filename: d:\source.c
-MFUN32-NEXT:       +0x0: 11
-MFUN32-NEXT:       +0x3: 12
-MFUN32-NEXT:       +0x8: 13
-MFUN32-NEXT:       +0xD: 14
-MFUN32-NEXT:       +0x12: 15
-MFUN32-NEXT:     ]
-MFUN32-NEXT:   ]
-MFUN32-NEXT: ]
+MFUN32-NEXT      LinkageName: _x
+MFUN32-NEXT      Flags: 0x0
+MFUN32-NEXT      CodeSize: 0xA
+MFUN32-NEXT      FilenameSegment [
+MFUN32-NEXT        Filename: d:\source.c
+MFUN32-NEXT        +0x0 [
+MFUN32-NEXT          LineNumberStart: 3
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT        +0x3 [
+MFUN32-NEXT          LineNumberStart: 4
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT        +0x8 [
+MFUN32-NEXT          LineNumberStart: 5
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT      ]
+MFUN32-NEXT    ]
+MFUN32-NEXT    FunctionLineTable [
+MFUN32-NEXT      LinkageName: _y
+MFUN32-NEXT      Flags: 0x0
+MFUN32-NEXT      CodeSize: 0xA
+MFUN32-NEXT      FilenameSegment [
+MFUN32-NEXT        Filename: d:\source.c
+MFUN32-NEXT        +0x0 [
+MFUN32-NEXT          LineNumberStart: 7
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT        +0x3 [
+MFUN32-NEXT          LineNumberStart: 8
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT        +0x8 [
+MFUN32-NEXT          LineNumberStart: 9
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT      ]
+MFUN32-NEXT    ]
+MFUN32-NEXT    FunctionLineTable [
+MFUN32-NEXT      LinkageName: _f
+MFUN32-NEXT      Flags: 0x0
+MFUN32-NEXT      CodeSize: 0x14
+MFUN32-NEXT      FilenameSegment [
+MFUN32-NEXT        Filename: d:\source.c
+MFUN32-NEXT        +0x0 [
+MFUN32-NEXT          LineNumberStart: 11
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT        +0x3 [
+MFUN32-NEXT          LineNumberStart: 12
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT        +0x8 [
+MFUN32-NEXT          LineNumberStart: 13
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT        +0xD [
+MFUN32-NEXT          LineNumberStart: 14
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT        +0x12 [
+MFUN32-NEXT          LineNumberStart: 15
+MFUN32-NEXT          LineNumberEndDelta: 0
+MFUN32-NEXT          IsStatement: Yes
+MFUN32-NEXT        ]
+MFUN32-NEXT      ]
+MFUN32-NEXT    ]
+MFUN32-NEXT  ]
 
 MFUN64:      CodeViewDebugInfo [
 MFUN64-NEXT:   Magic: 0x4
@@ -208,9 +252,21 @@ MFUN64-NEXT:     Flags: 0x0
 MFUN64-NEXT:     CodeSize: 0xE
 MFUN64-NEXT:     FilenameSegment [
 MFUN64-NEXT:       Filename: d:\source.c
-MFUN64-NEXT:       +0x0: 3
-MFUN64-NEXT:       +0x4: 4
-MFUN64-NEXT:       +0x9: 5
+MFUN64-NEXT:       +0x0 [
+MFUN64-NEXT:         LineNumberStart: 3
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
+MFUN64-NEXT:       +0x4 [
+MFUN64-NEXT:         LineNumberStart: 4
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
+MFUN64-NEXT:       +0x9 [
+MFUN64-NEXT:         LineNumberStart: 5
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
 MFUN64-NEXT:     ]
 MFUN64-NEXT:   ]
 MFUN64-NEXT:   FunctionLineTable [
@@ -219,9 +275,21 @@ MFUN64-NEXT:     Flags: 0x0
 MFUN64-NEXT:     CodeSize: 0xE
 MFUN64-NEXT:     FilenameSegment [
 MFUN64-NEXT:       Filename: d:\source.c
-MFUN64-NEXT:       +0x0: 7
-MFUN64-NEXT:       +0x4: 8
-MFUN64-NEXT:       +0x9: 9
+MFUN64-NEXT:       +0x0 [
+MFUN64-NEXT:         LineNumberStart: 7
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
+MFUN64-NEXT:       +0x4 [
+MFUN64-NEXT:         LineNumberStart: 8
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
+MFUN64-NEXT:       +0x9 [
+MFUN64-NEXT:         LineNumberStart: 9
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
 MFUN64-NEXT:     ]
 MFUN64-NEXT:   ]
 MFUN64-NEXT:   FunctionLineTable [
@@ -230,11 +298,31 @@ MFUN64-NEXT:     Flags: 0x0
 MFUN64-NEXT:     CodeSize: 0x18
 MFUN64-NEXT:     FilenameSegment [
 MFUN64-NEXT:       Filename: d:\source.c
-MFUN64-NEXT:       +0x0: 11
-MFUN64-NEXT:       +0x4: 12
-MFUN64-NEXT:       +0x9: 13
-MFUN64-NEXT:       +0xE: 14
-MFUN64-NEXT:       +0x13: 15
+MFUN64-NEXT:       +0x0 [
+MFUN64-NEXT:         LineNumberStart: 11
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
+MFUN64-NEXT:       +0x4 [
+MFUN64-NEXT:         LineNumberStart: 12
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
+MFUN64-NEXT:       +0x9 [
+MFUN64-NEXT:         LineNumberStart: 13
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
+MFUN64-NEXT:       +0xE [
+MFUN64-NEXT:         LineNumberStart: 14
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
+MFUN64-NEXT:       +0x13 [
+MFUN64-NEXT:         LineNumberStart: 15
+MFUN64-NEXT:         LineNumberEndDelta: 0
+MFUN64-NEXT:         IsStatement: Yes
+MFUN64-NEXT:       ]
 MFUN64-NEXT:     ]
 MFUN64-NEXT:   ]
 MFUN64-NEXT: ]
@@ -306,20 +394,40 @@ MFILE32-NEXT:     Flags: 0x0
 MFILE32-NEXT:     CodeSize: 0x14
 MFILE32-NEXT:     FilenameSegment [
 MFILE32-NEXT:       Filename: d:\input.c
-MFILE32-NEXT:       +0x0: 3
+MFILE32-NEXT:       +0x0 [
+MFILE32-NEXT:         LineNumberStart: 3
+MFILE32-NEXT:         LineNumberEndDelta: 0
+MFILE32-NEXT:         IsStatement: Yes
+MFILE32-NEXT:       ]
 MFILE32-NEXT:     ]
 MFILE32-NEXT:     FilenameSegment [
 MFILE32-NEXT:       Filename: d:\one.c
-MFILE32-NEXT:       +0x3: 1
+MFILE32-NEXT:       +0x3 [
+MFILE32-NEXT:         LineNumberStart: 1
+MFILE32-NEXT:         LineNumberEndDelta: 0
+MFILE32-NEXT:         IsStatement: Yes
+MFILE32-NEXT:       ]
 MFILE32-NEXT:     ]
 MFILE32-NEXT:     FilenameSegment [
 MFILE32-NEXT:       Filename: d:\two.c
-MFILE32-NEXT:       +0x8: 2
+MFILE32-NEXT:       +0x8 [
+MFILE32-NEXT:         LineNumberStart: 2
+MFILE32-NEXT:         LineNumberEndDelta: 0
+MFILE32-NEXT:         IsStatement: Yes
+MFILE32-NEXT:       ]
 MFILE32-NEXT:     ]
 MFILE32-NEXT:     FilenameSegment [
 MFILE32-NEXT:       Filename: d:\one.c
-MFILE32-NEXT:       +0xD: 7
-MFILE32-NEXT:       +0x12: 8
+MFILE32-NEXT:       +0xD [
+MFILE32-NEXT:         LineNumberStart: 7
+MFILE32-NEXT:         LineNumberEndDelta: 0
+MFILE32-NEXT:         IsStatement: Yes
+MFILE32-NEXT:       ]
+MFILE32-NEXT:       +0x12 [
+MFILE32-NEXT:         LineNumberStart: 8
+MFILE32-NEXT:         LineNumberEndDelta: 0
+MFILE32-NEXT:         IsStatement: Yes
+MFILE32-NEXT:       ]
 MFILE32-NEXT:     ]
 MFILE32-NEXT:   ]
 MFILE32-NEXT: ]
@@ -357,28 +465,47 @@ MFILE64-NEXT:   Subsection [
 MFILE64-NEXT:     Type: 0xF1
 MFILE64-NEXT:     PayloadSize: 0x8
 MFILE64:        ]
-MFILE64-NEXT:   FunctionLineTable [
-MFILE64-NEXT:     LinkageName: f
-MFILE64-NEXT:     Flags: 0x0
-MFILE64-NEXT:     CodeSize: 0x18
-MFILE64-NEXT:     FilenameSegment [
-MFILE64-NEXT:       Filename: d:\input.c
-MFILE64-NEXT:       +0x0: 3
-MFILE64-NEXT:     ]
-MFILE64-NEXT:     FilenameSegment [
-MFILE64-NEXT:       Filename: d:\one.c
-MFILE64-NEXT:       +0x4: 1
-MFILE64-NEXT:     ]
-MFILE64-NEXT:     FilenameSegment [
-MFILE64-NEXT:       Filename: d:\two.c
-MFILE64-NEXT:       +0x9: 2
-MFILE64-NEXT:     ]
-MFILE64-NEXT:     FilenameSegment [
-MFILE64-NEXT:       Filename: d:\one.c
-MFILE64-NEXT:       +0xE: 7
-MFILE64-NEXT:       +0x13: 8
-MFILE64-NEXT:     ]
-MFILE64-NEXT:   ]
+MFILE64-NEXT:  FunctionLineTable [
+MFILE64-NEXT:    LinkageName: f
+MFILE64-NEXT:    Flags: 0x0
+MFILE64-NEXT:    CodeSize: 0x18
+MFILE64-NEXT:    FilenameSegment [
+MFILE64-NEXT:      Filename: d:\input.c
+MFILE64-NEXT:      +0x0 [
+MFILE64-NEXT:        LineNumberStart: 3
+MFILE64-NEXT:        LineNumberEndDelta: 0
+MFILE64-NEXT:        IsStatement: Yes
+MFILE64-NEXT:      ]
+MFILE64-NEXT:    ]
+MFILE64-NEXT:    FilenameSegment [
+MFILE64-NEXT:      Filename: d:\one.c
+MFILE64-NEXT:      +0x4 [
+MFILE64-NEXT:        LineNumberStart: 1
+MFILE64-NEXT:        LineNumberEndDelta: 0
+MFILE64-NEXT:        IsStatement: Yes
+MFILE64-NEXT:      ]
+MFILE64-NEXT:    ]
+MFILE64-NEXT:    FilenameSegment [
+MFILE64-NEXT:      Filename: d:\two.c
+MFILE64-NEXT:      +0x9 [
+MFILE64-NEXT:        LineNumberStart: 2
+MFILE64-NEXT:        LineNumberEndDelta: 0
+MFILE64-NEXT:        IsStatement: Yes
+MFILE64-NEXT:      ]
+MFILE64-NEXT:    ]
+MFILE64-NEXT:    FilenameSegment [
+MFILE64-NEXT:      Filename: d:\one.c
+MFILE64-NEXT:      +0xE [
+MFILE64-NEXT:        LineNumberStart: 7
+MFILE64-NEXT:        LineNumberEndDelta: 0
+MFILE64-NEXT:        IsStatement: Yes
+MFILE64-NEXT:      ]
+MFILE64-NEXT:      +0x13 [
+MFILE64-NEXT:        LineNumberStart: 8
+MFILE64-NEXT:        LineNumberEndDelta: 0
+MFILE64-NEXT:        IsStatement: Yes
+MFILE64-NEXT:      ]
+MFILE64-NEXT:    ]
 MFILE64-NEXT: ]
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -411,9 +538,21 @@ MCOMDAT-NEXT:   Flags: 0x0
 MCOMDAT-NEXT:   CodeSize: 0x7
 MCOMDAT-NEXT:   FilenameSegment [
 MCOMDAT-NEXT:     Filename: c:\src\test.cc
-MCOMDAT-NEXT:     +0x0: 2
-MCOMDAT-NEXT:     +0x3: 3
-MCOMDAT-NEXT:     +0x5: 4
+MCOMDAT-NEXT:     +0x0 [
+MCOMDAT-NEXT:       LineNumberStart: 2
+MCOMDAT-NEXT:       LineNumberEndDelta: 0
+MCOMDAT-NEXT:       IsStatement: Yes
+MCOMDAT-NEXT:     ]
+MCOMDAT-NEXT:     +0x3 [
+MCOMDAT-NEXT:       LineNumberStart: 3
+MCOMDAT-NEXT:       LineNumberEndDelta: 0
+MCOMDAT-NEXT:       IsStatement: Yes
+MCOMDAT-NEXT:     ]
+MCOMDAT-NEXT:     +0x5 [
+MCOMDAT-NEXT:       LineNumberStart: 4
+MCOMDAT-NEXT:       LineNumberEndDelta: 0
+MCOMDAT-NEXT:       IsStatement: Yes
+MCOMDAT-NEXT:     ]
 MCOMDAT-NEXT:   ]
 MCOMDAT-NEXT: ]
 MCOMDAT:      ProcStart {
@@ -427,8 +566,20 @@ MCOMDAT-NEXT:   Flags: 0x0
 MCOMDAT-NEXT:   CodeSize: 0x7
 MCOMDAT-NEXT:   FilenameSegment [
 MCOMDAT-NEXT:     Filename: c:\src\test.cc
-MCOMDAT-NEXT:     +0x0: 7
-MCOMDAT-NEXT:     +0x3: 8
-MCOMDAT-NEXT:     +0x5: 9
+MCOMDAT-NEXT:     +0x0 [
+MCOMDAT-NEXT:       LineNumberStart: 7
+MCOMDAT-NEXT:       LineNumberEndDelta: 0
+MCOMDAT-NEXT:       IsStatement: Yes
+MCOMDAT-NEXT:     ]
+MCOMDAT-NEXT:     +0x3 [
+MCOMDAT-NEXT:       LineNumberStart: 8
+MCOMDAT-NEXT:       LineNumberEndDelta: 0
+MCOMDAT-NEXT:       IsStatement: Yes
+MCOMDAT-NEXT:     ]
+MCOMDAT-NEXT:     +0x5 [
+MCOMDAT-NEXT:       LineNumberStart: 9
+MCOMDAT-NEXT:       LineNumberEndDelta: 0
+MCOMDAT-NEXT:       IsStatement: Yes
+MCOMDAT-NEXT:     ]
 MCOMDAT-NEXT:   ]
 MCOMDAT-NEXT: ]
index 516d1cf..d44da0d 100644 (file)
@@ -603,12 +603,14 @@ void COFFDumper::printCodeViewSection(const SectionRef &Section) {
       // in the line table.  The filename string is accessed using double
       // indirection to the string table subsection using the index subsection.
       uint32_t OffsetInIndex = DE.getU32(&Offset),
-               SegmentLength = DE.getU32(&Offset),
+               NumLines = DE.getU32(&Offset),
                FullSegmentSize = DE.getU32(&Offset);
 
+      uint32_t ColumnOffset = Offset + 8 * NumLines;
+      DataExtractor ColumnDE(DE.getData(), true, 4);
+
       if (FullSegmentSize !=
-          12 + 8 * SegmentLength +
-              (HasColumnInformation ? 4 * SegmentLength : 0)) {
+          12 + 8 * NumLines + (HasColumnInformation ? 4 * NumLines : 0)) {
         error(object_error::parse_failed);
         return;
       }
@@ -635,29 +637,41 @@ void COFFDumper::printCodeViewSection(const SectionRef &Section) {
       StringRef Filename(CVStringTable.data() + FilenameOffset);
       ListScope S(W, "FilenameSegment");
       W.printString("Filename", Filename);
-      for (unsigned J = 0; J != SegmentLength && DE.isValidOffset(Offset);
-           ++J) {
+      for (unsigned LineIdx = 0;
+           LineIdx != NumLines && DE.isValidOffset(Offset); ++LineIdx) {
         // Then go the (PC, LineNumber) pairs.  The line number is stored in the
         // least significant 31 bits of the respective word in the table.
-        uint32_t PC = DE.getU32(&Offset),
-                 LineNumber = DE.getU32(&Offset) & 0x7fffffff;
+        uint32_t PC = DE.getU32(&Offset), LineData = DE.getU32(&Offset);
         if (PC >= FunctionSize) {
           error(object_error::parse_failed);
           return;
         }
         char Buffer[32];
         format("+0x%X", PC).snprint(Buffer, 32);
-        W.printNumber(Buffer, LineNumber);
-      }
-      if (HasColumnInformation) {
-        for (unsigned J = 0; J != SegmentLength && DE.isValidOffset(Offset);
-             ++J) {
-          uint16_t ColStart = DE.getU16(&Offset);
+        ListScope PCScope(W, Buffer);
+        uint32_t LineNumberStart = LineData & COFF::CVL_MaxLineNumber;
+        uint32_t LineNumberEndDelta =
+            (LineData >> COFF::CVL_LineNumberStartBits) &
+            COFF::CVL_LineNumberEndDeltaMask;
+        bool IsStatement = LineData & COFF::CVL_IsStatement;
+        W.printNumber("LineNumberStart", LineNumberStart);
+        W.printNumber("LineNumberEndDelta", LineNumberEndDelta);
+        W.printBoolean("IsStatement", IsStatement);
+        if (HasColumnInformation &&
+            ColumnDE.isValidOffsetForDataOfSize(ColumnOffset, 4)) {
+          uint16_t ColStart = ColumnDE.getU16(&ColumnOffset);
           W.printNumber("ColStart", ColStart);
-          uint16_t ColEnd = DE.getU16(&Offset);
+          uint16_t ColEnd = ColumnDE.getU16(&ColumnOffset);
           W.printNumber("ColEnd", ColEnd);
         }
       }
+      // Skip over the column data.
+      if (HasColumnInformation) {
+        for (unsigned LineIdx = 0;
+             LineIdx != NumLines && DE.isValidOffset(Offset); ++LineIdx) {
+          DE.getU32(&Offset);
+        }
+      }
     }
   }
 }