}
};
+ 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,
; 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: ]
; 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: ]
; 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: ]
; 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: ]
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
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 [
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 [
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: ]
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: ]
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: ]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 {
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: ]
// 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;
}
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);
+ }
+ }
}
}
}