1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00

[CodeView] Improve the line table dumper

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.

llvm-svn: 257552
This commit is contained in:
David Majnemer 2016-01-13 01:05:16 +00:00
parent 6bfddf84c3
commit 32661ec901
7 changed files with 547 additions and 213 deletions

View 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,

View File

@ -110,17 +110,28 @@
; 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: ]
@ -232,20 +243,36 @@
; 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: ]

View File

@ -137,24 +137,40 @@
; 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: ]
@ -297,30 +313,50 @@
; 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: ]

View File

@ -265,49 +265,82 @@
; 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:.*]]:{{$}}
@ -570,60 +603,104 @@
; 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: ]

View File

@ -104,12 +104,20 @@
; 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: ]
@ -214,15 +222,27 @@
; 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: ]

View 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: ]

View 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);
}
}
}
}
}