llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. The code has been divided into the following patches: 1) Interval tree 2) Driver and documentation 3) Logical elements 4) Locations and ranges 5) Select elements 6) Warning and internal options 7) Compare elements 8) ELF Reader 9) CodeView Reader Full details: https://discourse.llvm.org/t/llvm-dev-rfc-llvm-dva-debug-information-visual-analyzer/62570 This patch: This is a high level summary of the changes in this patch. CodeView Reader - Support for CodeView/PDB. LVCodeViewReader, LVTypeVisitor, LVSymbolVisitor, LVLogicalVisitor Reviewed By: psamolysov, probinson, djtodoro, zequanwu Differential Revision: https://reviews.llvm.org/D125784
137 lines
5.8 KiB
Plaintext
137 lines
5.8 KiB
Plaintext
; REQUIRES: x86-registered-target
|
|
|
|
; Test case 4 - Missing nested enumerations.
|
|
|
|
; pr-46466.cpp
|
|
; 1 struct Struct {
|
|
; 2 union Union {
|
|
; 3 enum NestedEnum { RED, BLUE };
|
|
; 4 };
|
|
; 5 Union U;
|
|
; 6 };
|
|
; 7
|
|
; 8 Struct S;
|
|
; 9 int test() {
|
|
; 10 return S.U.BLUE;
|
|
; 11 }
|
|
|
|
; The above test is used to illustrate a scope issue found in the Clang
|
|
; compiler.
|
|
; PR46466: https://bugs.llvm.org/show_bug.cgi?id=46466
|
|
; PR45811: https://github.com/llvm/llvm-project/issues/45811
|
|
|
|
; In the following logical views, we can see that the CodeView debug
|
|
; information generated by the Clang compiler does not include any
|
|
; references to the enumerators 'RED' and 'BLUE'. The CodeView generated
|
|
; by GCC and MSVC, does include such references.
|
|
|
|
; RUN: llvm-debuginfo-analyzer --attribute=level,format,producer \
|
|
; RUN: --output-sort=name \
|
|
; RUN: --print=symbols,types \
|
|
; RUN: %p/Inputs/pr-46466-codeview-clang.o \
|
|
; RUN: %p/Inputs/pr-46466-codeview-msvc.o 2>&1 | \
|
|
; RUN: FileCheck --strict-whitespace -check-prefix=ONE %s
|
|
|
|
; ONE: Logical View:
|
|
; ONE-NEXT: [000] {File} 'pr-46466-codeview-clang.o' -> COFF-x86-64
|
|
; ONE-EMPTY:
|
|
; ONE-NEXT: [001] {CompileUnit} 'pr-46466.cpp'
|
|
; ONE-NEXT: [002] {Producer} 'clang version 15.0.0 {{.*}}'
|
|
; ONE-NEXT: [002] {Variable} extern 'S' -> 'Struct'
|
|
; ONE-NEXT: [002] 1 {Struct} 'Struct'
|
|
; ONE-NEXT: [003] {Member} public 'U' -> 'Union'
|
|
; ONE-NEXT: [003] 2 {Union} 'Union'
|
|
; ONE-NEXT: [004] 3 {Enumeration} 'NestedEnum' -> 'int'
|
|
; ONE-NEXT: [005] {Enumerator} 'BLUE' = '0x1'
|
|
; ONE-NEXT: [005] {Enumerator} 'RED' = '0x0'
|
|
; ONE-EMPTY:
|
|
; ONE-NEXT: Logical View:
|
|
; ONE-NEXT: [000] {File} 'pr-46466-codeview-msvc.o' -> COFF-x86-64
|
|
; ONE-EMPTY:
|
|
; ONE-NEXT: [001] {CompileUnit} 'pr-46466.cpp'
|
|
; ONE-NEXT: [002] {Producer} 'Microsoft (R) Optimizing Compiler'
|
|
; ONE-NEXT: [002] {Variable} extern 'S' -> 'Struct'
|
|
; ONE-NEXT: [002] 1 {Struct} 'Struct'
|
|
; ONE-NEXT: [003] {Member} public 'U' -> 'Union'
|
|
; ONE-NEXT: [003] 2 {Union} 'Union'
|
|
; ONE-NEXT: [004] 3 {Enumeration} 'NestedEnum' -> 'int'
|
|
; ONE-NEXT: [005] {Enumerator} 'BLUE' = '0x1'
|
|
; ONE-NEXT: [005] {Enumerator} 'RED' = '0x0'
|
|
|
|
; Using the selection facilities, we can produce a logical view
|
|
; showing just the logical types that are 'Enumerator' and its
|
|
; parents. The logical view is sorted by the types name.
|
|
|
|
; RUN: llvm-debuginfo-analyzer --attribute=level,format \
|
|
; RUN: --output-sort=name \
|
|
; RUN: --select-types=Enumerator \
|
|
; RUN: --report=parents \
|
|
; RUN: --print=types \
|
|
; RUN: %p/Inputs/pr-46466-*.o 2>&1 | \
|
|
; RUN: FileCheck --strict-whitespace -check-prefix=TWO %s
|
|
|
|
; TWO: Logical View:
|
|
; TWO-NEXT: [000] {File} 'pr-46466-codeview-clang.o' -> COFF-x86-64
|
|
; TWO-EMPTY:
|
|
; TWO-NEXT: [001] {CompileUnit} 'pr-46466.cpp'
|
|
; TWO-NEXT: [002] 1 {Struct} 'Struct'
|
|
; TWO-NEXT: [003] 2 {Union} 'Union'
|
|
; TWO-NEXT: [004] 3 {Enumeration} 'NestedEnum' -> 'int'
|
|
; TWO-NEXT: [005] {Enumerator} 'BLUE' = '0x1'
|
|
; TWO-NEXT: [005] {Enumerator} 'RED' = '0x0'
|
|
; TWO-EMPTY:
|
|
; TWO-NEXT: Logical View:
|
|
; TWO-NEXT: [000] {File} 'pr-46466-codeview-msvc.o' -> COFF-x86-64
|
|
; TWO-EMPTY:
|
|
; TWO-NEXT: [001] {CompileUnit} 'pr-46466.cpp'
|
|
; TWO-NEXT: [002] 1 {Struct} 'Struct'
|
|
; TWO-NEXT: [003] 2 {Union} 'Union'
|
|
; TWO-NEXT: [004] 3 {Enumeration} 'NestedEnum' -> 'int'
|
|
; TWO-NEXT: [005] {Enumerator} 'BLUE' = '0x1'
|
|
; TWO-NEXT: [005] {Enumerator} 'RED' = '0x0'
|
|
|
|
; Using the selection facilities, we can produce a simple tabular output
|
|
; including a summary for the logical types that are 'Enumerator'. The
|
|
; logical view is sorted by the types name.
|
|
|
|
; RUN: llvm-debuginfo-analyzer --attribute=level,format \
|
|
; RUN: --output-sort=name \
|
|
; RUN: --select-types=Enumerator \
|
|
; RUN: --print=types,summary \
|
|
; RUN: %p/Inputs/pr-46466-*.o 2>&1 | \
|
|
; RUN: FileCheck --strict-whitespace -check-prefix=THR %s
|
|
|
|
; THR: Logical View:
|
|
; THR-NEXT: [000] {File} 'pr-46466-codeview-clang.o' -> COFF-x86-64
|
|
; THR-EMPTY:
|
|
; THR-NEXT: [001] {CompileUnit} 'pr-46466.cpp'
|
|
; THR-NEXT: [005] {Enumerator} 'BLUE' = '0x1'
|
|
; THR-NEXT: [005] {Enumerator} 'RED' = '0x0'
|
|
; THR-EMPTY:
|
|
; THR-NEXT: -----------------------------
|
|
; THR-NEXT: Element Total Printed
|
|
; THR-NEXT: -----------------------------
|
|
; THR-NEXT: Scopes 5 0
|
|
; THR-NEXT: Symbols 2 0
|
|
; THR-NEXT: Types 6 2
|
|
; THR-NEXT: Lines 0 0
|
|
; THR-NEXT: -----------------------------
|
|
; THR-NEXT: Total 13 2
|
|
; THR-EMPTY:
|
|
; THR-NEXT: Logical View:
|
|
; THR-NEXT: [000] {File} 'pr-46466-codeview-msvc.o' -> COFF-x86-64
|
|
; THR-EMPTY:
|
|
; THR-NEXT: [001] {CompileUnit} 'pr-46466.cpp'
|
|
; THR-NEXT: [005] {Enumerator} 'BLUE' = '0x1'
|
|
; THR-NEXT: [005] {Enumerator} 'RED' = '0x0'
|
|
; THR-EMPTY:
|
|
; THR-NEXT: -----------------------------
|
|
; THR-NEXT: Element Total Printed
|
|
; THR-NEXT: -----------------------------
|
|
; THR-NEXT: Scopes 5 0
|
|
; THR-NEXT: Symbols 2 0
|
|
; THR-NEXT: Types 7 2
|
|
; THR-NEXT: Lines 0 0
|
|
; THR-NEXT: -----------------------------
|
|
; THR-NEXT: Total 14 2
|