-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[llvm-debuginfo-analyzer] Add support for DW_FORM_implicit_const.
The ELF reader ignored attributes with the DW_FORM_implicit_const form, which caused logical elements to have missing logical data (mainly line/file declaration numbers). The issue is described by llvm/llvm-project#57040 where GCC generates the following abbreviations: .debug_abbrev contents: Abbrev table for offset: 0x00000000 [1] DW_TAG_formal_parameter DW_CHILDREN_no DW_AT_decl_file DW_FORM_implicit_const 1 DW_AT_decl_line DW_FORM_implicit_const 2 [2] DW_TAG_typedef DW_CHILDREN_no DW_AT_decl_file DW_FORM_implicit_const 1 DW_AT_decl_line DW_FORM_data1
- Loading branch information
1 parent
afa4475
commit 6581419
Showing
4 changed files
with
83 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file added
BIN
+3.14 KB
llvm/test/tools/llvm-debuginfo-analyzer/DWARF/Inputs/pr-57040-test-dwarf-clang.o
Binary file not shown.
Binary file added
BIN
+3.2 KB
llvm/test/tools/llvm-debuginfo-analyzer/DWARF/Inputs/pr-57040-test-dwarf-gcc.o
Binary file not shown.
65 changes: 65 additions & 0 deletions
65
llvm/test/tools/llvm-debuginfo-analyzer/DWARF/pr-57040-ignored-DW_FORM_implicit_const.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
; Ignored attributes with DW_FORM_implicit_const. | ||
; https://github.com/llvm/llvm-project/issues/57040 | ||
|
||
; Output generated by g++ (Debian 11.3.0-3) 11.3.0 | ||
|
||
; .debug_abbrev contents: | ||
; [1] DW_TAG_formal_parameter DW_CHILDREN_no | ||
; DW_AT_decl_file DW_FORM_implicit_const 1 | ||
; DW_AT_decl_line DW_FORM_implicit_const 2 | ||
|
||
; [2] DW_TAG_typedef DW_CHILDREN_no | ||
; DW_AT_decl_file DW_FORM_implicit_const 1 | ||
; DW_AT_decl_line DW_FORM_data1 | ||
|
||
; Attributes with DW_FORM_implicit_const being ignored by the ELFReader, | ||
; causing {Parameter} and {TypeAlias} to omit line numbers. | ||
|
||
; test.cpp | ||
; 1 using INTPTR = const int *; | ||
; 2 int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) { | ||
; 3 if (ParamBool) { | ||
; 4 typedef int INTEGER; | ||
; 5 const INTEGER CONSTANT = 7; | ||
; 6 return CONSTANT; | ||
; 7 } | ||
; 8 return ParamUnsigned; | ||
; 9 } | ||
|
||
; RUN: llvm-debuginfo-analyzer --attribute=level,format,producer \ | ||
; RUN: --print=scopes,symbols,types \ | ||
; RUN: %p/Inputs/pr-57040-test-dwarf-clang.o 2>&1 | \ | ||
; RUN: FileCheck --strict-whitespace -check-prefix=ONE %s | ||
|
||
; ONE: Logical View: | ||
; ONE-NEXT: [000] {File} 'pr-57040-test-dwarf-clang.o' -> elf64-x86-64 | ||
; ONE-EMPTY: | ||
; ONE-NEXT: [001] {CompileUnit} 'test.cpp' | ||
; ONE-NEXT: [002] {Producer} 'clang version 14.0.6' | ||
; ONE-NEXT: [002] 1 {TypeAlias} 'INTPTR' -> '* const int' | ||
; ONE-NEXT: [002] 2 {Function} extern not_inlined 'foo' -> 'int' | ||
; ONE-NEXT: [003] {Block} | ||
; ONE-NEXT: [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER' | ||
; ONE-NEXT: [003] 2 {Parameter} 'ParamBool' -> 'bool' | ||
; ONE-NEXT: [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR' | ||
; ONE-NEXT: [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int' | ||
; ONE-NEXT: [003] 4 {TypeAlias} 'INTEGER' -> 'int' | ||
|
||
; RUN: llvm-debuginfo-analyzer --attribute=level,format,producer \ | ||
; RUN: --print=scopes,symbols,types \ | ||
; RUN: %p/Inputs/pr-57040-test-dwarf-gcc.o 2>&1 | \ | ||
; RUN: FileCheck --strict-whitespace -check-prefix=TWO %s | ||
|
||
; TWO: Logical View: | ||
; TWO-NEXT: [000] {File} 'pr-57040-test-dwarf-gcc.o' -> elf64-x86-64 | ||
; TWO-EMPTY: | ||
; TWO-NEXT: [001] {CompileUnit} 'test.cpp' | ||
; TWO-NEXT: [002] {Producer} 'GNU C++17 11.3.0 {{.*}}' | ||
; TWO-NEXT: [002] 1 {TypeAlias} 'INTPTR' -> '* const int' | ||
; TWO-NEXT: [002] 2 {Function} extern not_inlined 'foo' -> 'int' | ||
; TWO-NEXT: [003] {Block} | ||
; TWO-NEXT: [004] 4 {TypeAlias} 'INTEGER' -> 'int' | ||
; TWO-NEXT: [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER' | ||
; TWO-NEXT: [003] 2 {Parameter} 'ParamBool' -> 'bool' | ||
; TWO-NEXT: [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR' | ||
; TWO-NEXT: [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int' |