From: David Majnemer Date: Wed, 13 Jan 2016 01:05:16 +0000 (+0000) Subject: [CodeView] Improve the line table dumper X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=812af1efba18ceeda296e1bed2e9e59eecd4e9d2;p=oota-llvm.git [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257552 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/COFF.h b/include/llvm/Support/COFF.h index 0162175efe3..0245632c96a 100644 --- a/include/llvm/Support/COFF.h +++ b/include/llvm/Support/COFF.h @@ -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, diff --git a/test/DebugInfo/COFF/asm.ll b/test/DebugInfo/COFF/asm.ll index b67100c87fd..fed296fa3ad 100644 --- a/test/DebugInfo/COFF/asm.ll +++ b/test/DebugInfo/COFF/asm.ll @@ -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: ] diff --git a/test/DebugInfo/COFF/multifile.ll b/test/DebugInfo/COFF/multifile.ll index 70bc0022cfb..90a15914e2f 100644 --- a/test/DebugInfo/COFF/multifile.ll +++ b/test/DebugInfo/COFF/multifile.ll @@ -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: ] diff --git a/test/DebugInfo/COFF/multifunction.ll b/test/DebugInfo/COFF/multifunction.ll index a25b5ed0ddd..832a67f99b2 100644 --- a/test/DebugInfo/COFF/multifunction.ll +++ b/test/DebugInfo/COFF/multifunction.ll @@ -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: ] diff --git a/test/DebugInfo/COFF/simple.ll b/test/DebugInfo/COFF/simple.ll index 2103df07f6d..3e62b2b7e4d 100644 --- a/test/DebugInfo/COFF/simple.ll +++ b/test/DebugInfo/COFF/simple.ll @@ -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: ] diff --git a/test/tools/llvm-readobj/codeview-linetables.test b/test/tools/llvm-readobj/codeview-linetables.test index 880b6d52f09..a1c6ab66b4c 100644 --- a/test/tools/llvm-readobj/codeview-linetables.test +++ b/test/tools/llvm-readobj/codeview-linetables.test @@ -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: ] diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp index 516d1cf8057..d44da0d5746 100644 --- a/tools/llvm-readobj/COFFDumper.cpp +++ b/tools/llvm-readobj/COFFDumper.cpp @@ -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); + } + } } } }