[llvm] 6ba150d - [llvm-dwarfdump] Fix split-dwarf bug in stats for inlined var loc cov

Djordje Todorovic via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 26 02:01:43 PDT 2021


Author: Djordje Todorovic
Date: 2021-04-26T01:56:15-07:00
New Revision: 6ba150dbb44346f4f2b39d15b85f3c2339427771

URL: https://github.com/llvm/llvm-project/commit/6ba150dbb44346f4f2b39d15b85f3c2339427771
DIFF: https://github.com/llvm/llvm-project/commit/6ba150dbb44346f4f2b39d15b85f3c2339427771.diff

LOG: [llvm-dwarfdump] Fix split-dwarf bug in stats for inlined var loc cov

Initial (D96045) patch didn't handle split dwarf cases,
so this fixes that bug.

In addition, before applying this patch, we had a slowdown
that happened after the D96045. With this patch,
the slowdown will be fixed as well.

Differential Revision: https://reviews.llvm.org/D100951

Added: 
    llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf-objfile1.s
    llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf-objfile2.s
    llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf.s
    llvm/test/tools/llvm-dwarfdump/X86/inlined_variables_with_zero_cov.test

Modified: 
    llvm/tools/llvm-dwarfdump/Statistics.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf-objfile1.s b/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf-objfile1.s
new file mode 100644
index 000000000000..e7cc9a4b96f6
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf-objfile1.s
@@ -0,0 +1,263 @@
+	.text
+	.file	"test1.cpp"
+	.globl	_Z2f1v                          # -- Begin function _Z2f1v
+	.p2align	4, 0x90
+	.type	_Z2f1v, at function
+_Z2f1v:                                 # @_Z2f1v
+.Lfunc_begin0:
+	.file	1 "./" "test1.cpp"
+	.loc	1 7 0                           # test1.cpp:7:0
+	.cfi_startproc
+# %bb.0:                                # %entry
+	pushq	%rax
+	.cfi_def_cfa_offset 16
+.Ltmp0:
+	.loc	1 5 3 prologue_end              # test1.cpp:5:3
+	callq	_ZL1xv
+.Ltmp1:
+	.loc	1 9 1                           # test1.cpp:9:1
+	popq	%rax
+	.cfi_def_cfa_offset 8
+	retq
+.Ltmp2:
+.Lfunc_end0:
+	.size	_Z2f1v, .Lfunc_end0-_Z2f1v
+	.cfi_endproc
+                                        # -- End function
+	.p2align	4, 0x90                         # -- Begin function _ZL1xv
+	.type	_ZL1xv, at function
+_ZL1xv:                                 # @_ZL1xv
+.Lfunc_begin1:
+	.loc	1 1 0                           # test1.cpp:1:0
+	.cfi_startproc
+# %bb.0:                                # %entry
+	.loc	1 2 1 prologue_end              # test1.cpp:2:1
+	retq
+.Ltmp3:
+.Lfunc_end1:
+	.size	_ZL1xv, .Lfunc_end1-_ZL1xv
+	.cfi_endproc
+                                        # -- End function
+	.section	.debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+	.asciz	"_ZL1yv"                        # string offset=0
+.Linfo_string1:
+	.asciz	"y"                             # string offset=7
+.Linfo_string2:
+	.asciz	"var"                           # string offset=9
+.Linfo_string3:
+	.asciz	"int"                           # string offset=13
+.Linfo_string4:
+	.asciz	"_Z2f1v"                        # string offset=17
+.Linfo_string5:
+	.asciz	"f1"                            # string offset=24
+.Linfo_string6:
+	.asciz	"_ZL1xv"                        # string offset=27
+.Linfo_string7:
+	.asciz	"x"                             # string offset=34
+.Linfo_string8:
+	.asciz	"clang version 13.0.0" # string offset=36
+.Linfo_string9:
+	.asciz	"test1.cpp"                     # string offset=141
+.Linfo_string10:
+	.asciz	"test1.dwo"                     # string offset=151
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.long	0
+	.long	7
+	.long	9
+	.long	13
+	.long	17
+	.long	24
+	.long	27
+	.long	34
+	.long	36
+	.long	141
+	.long	151
+	.section	.debug_info.dwo,"e", at progbits
+	.long	.Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 # Length of Unit
+.Ldebug_info_dwo_start0:
+	.short	4                               # DWARF version number
+	.long	0                               # Offset Into Abbrev. Section
+	.byte	8                               # Address Size (in bytes)
+	.byte	1                               # Abbrev [1] 0xb:0x4e DW_TAG_compile_unit
+	.byte	8                               # DW_AT_producer
+	.short	33                              # DW_AT_language
+	.byte	9                               # DW_AT_name
+	.byte	10                              # DW_AT_GNU_dwo_name
+	.quad	-7114235821576765290            # DW_AT_GNU_dwo_id
+	.byte	2                               # Abbrev [2] 0x19:0xf DW_TAG_subprogram
+	.byte	0                               # DW_AT_linkage_name
+	.byte	1                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	3                               # DW_AT_decl_line
+	.byte	1                               # DW_AT_inline
+	.byte	3                               # Abbrev [3] 0x1f:0x8 DW_TAG_variable
+	.byte	2                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	4                               # DW_AT_decl_line
+	.long	40                              # DW_AT_type
+	.byte	0                               # End Of Children Mark
+	.byte	4                               # Abbrev [4] 0x28:0x4 DW_TAG_base_type
+	.byte	3                               # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	4                               # DW_AT_byte_size
+	.byte	5                               # Abbrev [5] 0x2c:0x20 DW_TAG_subprogram
+	.byte	0                               # DW_AT_low_pc
+	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+	.byte	1                               # DW_AT_frame_base
+	.byte	87
+                                        # DW_AT_GNU_all_call_sites
+	.byte	4                               # DW_AT_linkage_name
+	.byte	5                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	7                               # DW_AT_decl_line
+                                        # DW_AT_external
+	.byte	6                               # Abbrev [6] 0x38:0xd DW_TAG_inlined_subroutine
+	.long	25                              # DW_AT_abstract_origin
+	.byte	1                               # DW_AT_low_pc
+	.long	.Ltmp1-.Ltmp0                   # DW_AT_high_pc
+	.byte	1                               # DW_AT_call_file
+	.byte	8                               # DW_AT_call_line
+	.byte	3                               # DW_AT_call_column
+	.byte	7                               # Abbrev [7] 0x45:0x6 DW_TAG_GNU_call_site
+	.long	76                              # DW_AT_abstract_origin
+	.byte	2                               # DW_AT_low_pc
+	.byte	0                               # End Of Children Mark
+	.byte	8                               # Abbrev [8] 0x4c:0xc DW_TAG_subprogram
+	.byte	3                               # DW_AT_low_pc
+	.long	.Lfunc_end1-.Lfunc_begin1       # DW_AT_high_pc
+	.byte	1                               # DW_AT_frame_base
+	.byte	87
+                                        # DW_AT_GNU_all_call_sites
+	.byte	6                               # DW_AT_linkage_name
+	.byte	7                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	1                               # DW_AT_decl_line
+	.byte	0                               # End Of Children Mark
+.Ldebug_info_dwo_end0:
+	.section	.debug_abbrev.dwo,"e", at progbits
+	.byte	1                               # Abbreviation Code
+	.byte	17                              # DW_TAG_compile_unit
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	37                              # DW_AT_producer
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	19                              # DW_AT_language
+	.byte	5                               # DW_FORM_data2
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.ascii	"\260B"                         # DW_AT_GNU_dwo_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.ascii	"\261B"                         # DW_AT_GNU_dwo_id
+	.byte	7                               # DW_FORM_data8
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	2                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	110                             # DW_AT_linkage_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	32                              # DW_AT_inline
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	3                               # Abbreviation Code
+	.byte	52                              # DW_TAG_variable
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	4                               # Abbreviation Code
+	.byte	36                              # DW_TAG_base_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	62                              # DW_AT_encoding
+	.byte	11                              # DW_FORM_data1
+	.byte	11                              # DW_AT_byte_size
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	5                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	17                              # DW_AT_low_pc
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	64                              # DW_AT_frame_base
+	.byte	24                              # DW_FORM_exprloc
+	.ascii	"\227B"                         # DW_AT_GNU_all_call_sites
+	.byte	25                              # DW_FORM_flag_present
+	.byte	110                             # DW_AT_linkage_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	63                              # DW_AT_external
+	.byte	25                              # DW_FORM_flag_present
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	6                               # Abbreviation Code
+	.byte	29                              # DW_TAG_inlined_subroutine
+	.byte	0                               # DW_CHILDREN_no
+	.byte	49                              # DW_AT_abstract_origin
+	.byte	19                              # DW_FORM_ref4
+	.byte	17                              # DW_AT_low_pc
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	88                              # DW_AT_call_file
+	.byte	11                              # DW_FORM_data1
+	.byte	89                              # DW_AT_call_line
+	.byte	11                              # DW_FORM_data1
+	.byte	87                              # DW_AT_call_column
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	7                               # Abbreviation Code
+	.ascii	"\211\202\001"                  # DW_TAG_GNU_call_site
+	.byte	0                               # DW_CHILDREN_no
+	.byte	49                              # DW_AT_abstract_origin
+	.byte	19                              # DW_FORM_ref4
+	.byte	17                              # DW_AT_low_pc
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	8                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	0                               # DW_CHILDREN_no
+	.byte	17                              # DW_AT_low_pc
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	64                              # DW_AT_frame_base
+	.byte	24                              # DW_FORM_exprloc
+	.ascii	"\227B"                         # DW_AT_GNU_all_call_sites
+	.byte	25                              # DW_FORM_flag_present
+	.byte	110                             # DW_AT_linkage_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	0                               # EOM(3)

diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf-objfile2.s b/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf-objfile2.s
new file mode 100644
index 000000000000..d6c8faf32933
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf-objfile2.s
@@ -0,0 +1,297 @@
+	.text
+	.file	"test2.cpp"
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+.Lfunc_begin0:
+	.file	1 "/dir" "test2.cpp"
+	.loc	1 8 0                           # test2.cpp:8:0
+	.cfi_startproc
+# %bb.0:                                # %entry
+	pushq	%rax
+	.cfi_def_cfa_offset 16
+.Ltmp0:
+	.loc	1 9 3 prologue_end              # test2.cpp:9:3
+	callq	_Z2f1v
+.Ltmp1:
+	.loc	1 5 3                           # test2.cpp:5:3
+	callq	_ZL1xv
+.Ltmp2:
+	.loc	1 11 1                          # test2.cpp:11:1
+	xorl	%eax, %eax
+	popq	%rcx
+	.cfi_def_cfa_offset 8
+	retq
+.Ltmp3:
+.Lfunc_end0:
+	.size	main, .Lfunc_end0-main
+	.cfi_endproc
+                                        # -- End function
+	.p2align	4, 0x90                         # -- Begin function _ZL1xv
+	.type	_ZL1xv, at function
+_ZL1xv:                                 # @_ZL1xv
+.Lfunc_begin1:
+	.loc	1 1 0                           # test2.cpp:1:0
+	.cfi_startproc
+# %bb.0:                                # %entry
+	.loc	1 2 1 prologue_end              # test2.cpp:2:1
+	retq
+.Ltmp4:
+.Lfunc_end1:
+	.size	_ZL1xv, .Lfunc_end1-_ZL1xv
+	.cfi_endproc
+                                        # -- End function
+	.section	.debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+	.asciz	"_ZL1yv"                        # string offset=0
+.Linfo_string1:
+	.asciz	"y"                             # string offset=7
+.Linfo_string2:
+	.asciz	"var"                           # string offset=9
+.Linfo_string3:
+	.asciz	"int"                           # string offset=13
+.Linfo_string4:
+	.asciz	"_Z2f1v"                        # string offset=17
+.Linfo_string5:
+	.asciz	"f1"                            # string offset=24
+.Linfo_string6:
+	.asciz	"main"                          # string offset=27
+.Linfo_string7:
+	.asciz	"_ZL1xv"                        # string offset=32
+.Linfo_string8:
+	.asciz	"x"                             # string offset=39
+.Linfo_string9:
+	.asciz	"clang version 13.0.0" # string offset=41
+.Linfo_string10:
+	.asciz	"test2.cpp"                     # string offset=146
+.Linfo_string11:
+	.asciz	"test2.dwo"                     # string offset=156
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.long	0
+	.long	7
+	.long	9
+	.long	13
+	.long	17
+	.long	24
+	.long	27
+	.long	32
+	.long	39
+	.long	41
+	.long	146
+	.long	156
+	.section	.debug_info.dwo,"e", at progbits
+	.long	.Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 # Length of Unit
+.Ldebug_info_dwo_start0:
+	.short	4                               # DWARF version number
+	.long	0                               # Offset Into Abbrev. Section
+	.byte	8                               # Address Size (in bytes)
+	.byte	1                               # Abbrev [1] 0xb:0x5c DW_TAG_compile_unit
+	.byte	9                               # DW_AT_producer
+	.short	33                              # DW_AT_language
+	.byte	10                              # DW_AT_name
+	.byte	11                              # DW_AT_GNU_dwo_name
+	.quad	-6064033601213906696            # DW_AT_GNU_dwo_id
+	.byte	2                               # Abbrev [2] 0x19:0xf DW_TAG_subprogram
+	.byte	0                               # DW_AT_linkage_name
+	.byte	1                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	3                               # DW_AT_decl_line
+	.byte	1                               # DW_AT_inline
+	.byte	3                               # Abbrev [3] 0x1f:0x8 DW_TAG_variable
+	.byte	2                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	4                               # DW_AT_decl_line
+	.long	40                              # DW_AT_type
+	.byte	0                               # End Of Children Mark
+	.byte	4                               # Abbrev [4] 0x28:0x4 DW_TAG_base_type
+	.byte	3                               # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	4                               # DW_AT_byte_size
+	.byte	5                               # Abbrev [5] 0x2c:0x29 DW_TAG_subprogram
+	.byte	0                               # DW_AT_low_pc
+	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+	.byte	1                               # DW_AT_frame_base
+	.byte	87
+                                        # DW_AT_GNU_all_call_sites
+	.byte	6                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	8                               # DW_AT_decl_line
+	.long	40                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	6                               # Abbrev [6] 0x3b:0xd DW_TAG_inlined_subroutine
+	.long	25                              # DW_AT_abstract_origin
+	.byte	1                               # DW_AT_low_pc
+	.long	.Ltmp2-.Ltmp1                   # DW_AT_high_pc
+	.byte	1                               # DW_AT_call_file
+	.byte	10                              # DW_AT_call_line
+	.byte	3                               # DW_AT_call_column
+	.byte	7                               # Abbrev [7] 0x48:0x6 DW_TAG_GNU_call_site
+	.long	85                              # DW_AT_abstract_origin
+	.byte	1                               # DW_AT_low_pc
+	.byte	7                               # Abbrev [7] 0x4e:0x6 DW_TAG_GNU_call_site
+	.long	90                              # DW_AT_abstract_origin
+	.byte	2                               # DW_AT_low_pc
+	.byte	0                               # End Of Children Mark
+	.byte	8                               # Abbrev [8] 0x55:0x5 DW_TAG_subprogram
+	.byte	4                               # DW_AT_linkage_name
+	.byte	5                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	7                               # DW_AT_decl_line
+                                        # DW_AT_declaration
+                                        # DW_AT_external
+	.byte	9                               # Abbrev [9] 0x5a:0xc DW_TAG_subprogram
+	.byte	3                               # DW_AT_low_pc
+	.long	.Lfunc_end1-.Lfunc_begin1       # DW_AT_high_pc
+	.byte	1                               # DW_AT_frame_base
+	.byte	87
+                                        # DW_AT_GNU_all_call_sites
+	.byte	7                               # DW_AT_linkage_name
+	.byte	8                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	1                               # DW_AT_decl_line
+	.byte	0                               # End Of Children Mark
+.Ldebug_info_dwo_end0:
+	.section	.debug_abbrev.dwo,"e", at progbits
+	.byte	1                               # Abbreviation Code
+	.byte	17                              # DW_TAG_compile_unit
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	37                              # DW_AT_producer
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	19                              # DW_AT_language
+	.byte	5                               # DW_FORM_data2
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.ascii	"\260B"                         # DW_AT_GNU_dwo_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.ascii	"\261B"                         # DW_AT_GNU_dwo_id
+	.byte	7                               # DW_FORM_data8
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	2                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	110                             # DW_AT_linkage_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	32                              # DW_AT_inline
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	3                               # Abbreviation Code
+	.byte	52                              # DW_TAG_variable
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	4                               # Abbreviation Code
+	.byte	36                              # DW_TAG_base_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	62                              # DW_AT_encoding
+	.byte	11                              # DW_FORM_data1
+	.byte	11                              # DW_AT_byte_size
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	5                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	17                              # DW_AT_low_pc
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	64                              # DW_AT_frame_base
+	.byte	24                              # DW_FORM_exprloc
+	.ascii	"\227B"                         # DW_AT_GNU_all_call_sites
+	.byte	25                              # DW_FORM_flag_present
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	63                              # DW_AT_external
+	.byte	25                              # DW_FORM_flag_present
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	6                               # Abbreviation Code
+	.byte	29                              # DW_TAG_inlined_subroutine
+	.byte	0                               # DW_CHILDREN_no
+	.byte	49                              # DW_AT_abstract_origin
+	.byte	19                              # DW_FORM_ref4
+	.byte	17                              # DW_AT_low_pc
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	88                              # DW_AT_call_file
+	.byte	11                              # DW_FORM_data1
+	.byte	89                              # DW_AT_call_line
+	.byte	11                              # DW_FORM_data1
+	.byte	87                              # DW_AT_call_column
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	7                               # Abbreviation Code
+	.ascii	"\211\202\001"                  # DW_TAG_GNU_call_site
+	.byte	0                               # DW_CHILDREN_no
+	.byte	49                              # DW_AT_abstract_origin
+	.byte	19                              # DW_FORM_ref4
+	.byte	17                              # DW_AT_low_pc
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	8                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	0                               # DW_CHILDREN_no
+	.byte	110                             # DW_AT_linkage_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	60                              # DW_AT_declaration
+	.byte	25                              # DW_FORM_flag_present
+	.byte	63                              # DW_AT_external
+	.byte	25                              # DW_FORM_flag_present
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	9                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	0                               # DW_CHILDREN_no
+	.byte	17                              # DW_AT_low_pc
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	64                              # DW_AT_frame_base
+	.byte	24                              # DW_FORM_exprloc
+	.ascii	"\227B"                         # DW_AT_GNU_all_call_sites
+	.byte	25                              # DW_FORM_flag_present
+	.byte	110                             # DW_AT_linkage_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	0                               # EOM(3)

diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf.s b/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf.s
new file mode 100644
index 000000000000..30624bbd5f7d
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/X86/Inputs/split-dwarf.s
@@ -0,0 +1,104 @@
+	.text
+	.file	"main.cpp"
+	.globl	_Z2f1v                          # -- Begin function _Z2f1v
+	.p2align	4, 0x90
+	.type	_Z2f1v, at function
+_Z2f1v:                                 # @_Z2f1v
+.Lfunc_begin0:
+	.file	1 "./" "main.cpp"
+	.loc	1 7 0                           # main.cpp:7:0
+	.cfi_startproc
+# %bb.0:                                # %entry
+	pushq	%rax
+	.cfi_def_cfa_offset 16
+.Ltmp0:
+	.loc	1 5 3 prologue_end              # main.cpp:5:3
+	callq	_ZL1xv
+.Ltmp1:
+	.loc	1 9 1                           # main.cpp:9:1
+	popq	%rax
+	.cfi_def_cfa_offset 8
+	retq
+.Ltmp2:
+.Lfunc_end0:
+	.size	_Z2f1v, .Lfunc_end0-_Z2f1v
+	.cfi_endproc
+                                        # -- End function
+	.p2align	4, 0x90                         # -- Begin function _ZL1xv
+	.type	_ZL1xv, at function
+_ZL1xv:                                 # @_ZL1xv
+.Lfunc_begin1:
+	.loc	1 1 0                           # main.cpp:1:0
+	.cfi_startproc
+# %bb.0:                                # %entry
+	.loc	1 2 1 prologue_end              # main.cpp:2:1
+	retq
+.Ltmp3:
+.Lfunc_end1:
+	.size	_ZL1xv, .Lfunc_end1-_ZL1xv
+	.cfi_endproc
+                                        # -- End function
+	.section	.debug_abbrev,"", at progbits
+	.byte	1                               # Abbreviation Code
+	.byte	17                              # DW_TAG_compile_unit
+	.byte	0                               # DW_CHILDREN_no
+	.byte	16                              # DW_AT_stmt_list
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	27                              # DW_AT_comp_dir
+	.byte	14                              # DW_FORM_strp
+	.ascii	"\264B"                         # DW_AT_GNU_pubnames
+	.byte	25                              # DW_FORM_flag_present
+	.ascii	"\260B"                         # DW_AT_GNU_dwo_name
+	.byte	14                              # DW_FORM_strp
+	.ascii	"\261B"                         # DW_AT_GNU_dwo_id
+	.byte	7                               # DW_FORM_data8
+	.byte	17                              # DW_AT_low_pc
+	.byte	1                               # DW_FORM_addr
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.ascii	"\263B"                         # DW_AT_GNU_addr_base
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	0                               # EOM(3)
+	.section	.debug_info,"", at progbits
+.Lcu_begin0:
+	.long	.Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+	.short	4                               # DWARF version number
+	.long	.debug_abbrev                   # Offset Into Abbrev. Section
+	.byte	8                               # Address Size (in bytes)
+	.byte	1                               # Abbrev [1] 0xb:0x25 DW_TAG_compile_unit
+	.long	.Lline_table_start0             # DW_AT_stmt_list
+	.long	.Lskel_string0                  # DW_AT_comp_dir
+                                        # DW_AT_GNU_pubnames
+	.long	.Lskel_string1                  # DW_AT_GNU_dwo_name
+	.quad	-7114235821576765290            # DW_AT_GNU_dwo_id
+	.quad	.Lfunc_begin0                   # DW_AT_low_pc
+	.long	.Lfunc_end1-.Lfunc_begin0       # DW_AT_high_pc
+.Ldebug_info_end0:
+	.section	.debug_info,"", at progbits
+.Lcu_begin1:
+	.long	.Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit
+.Ldebug_info_start1:
+	.short	4                               # DWARF version number
+	.long	.debug_abbrev                   # Offset Into Abbrev. Section
+	.byte	8                               # Address Size (in bytes)
+	.byte	1                               # Abbrev [1] 0xb:0x25 DW_TAG_compile_unit
+	.long	.Lline_table_start0             # DW_AT_stmt_list
+	.long	.Lskel_string0                  # DW_AT_comp_dir
+                                        # DW_AT_GNU_pubnames
+	.long	.Lskel_string2                  # DW_AT_GNU_dwo_name
+	.quad	-6064033601213906696            # DW_AT_GNU_dwo_id
+	.quad	.Lfunc_begin0                   # DW_AT_low_pc
+	.long	.Lfunc_end1-.Lfunc_begin0       # DW_AT_high_pc
+.Ldebug_info_end1:
+	.section	.debug_str,"MS", at progbits,1
+.Lskel_string0:
+	.asciz	"./" # string offset=0
+.Lskel_string1:
+	.asciz	"test1.dwo"                     # string offset=82
+.Lskel_string2:
+	.asciz	"test2.dwo"                     # string offset=82
+
+.Lline_table_start0:

diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/inlined_variables_with_zero_cov.test b/llvm/test/tools/llvm-dwarfdump/X86/inlined_variables_with_zero_cov.test
new file mode 100644
index 000000000000..597df8f92a4d
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/X86/inlined_variables_with_zero_cov.test
@@ -0,0 +1,41 @@
+## This checks the number of inlined variables with 0% location
+## coverage in split dwarf cases.
+##  $ cat test1.cpp
+##  __attribute__((optnone)) static void x() {
+##  }
+##  __attribute__((always_inline)) static void y() {
+##    int var;
+##    x();
+##  }
+##  void f1() {
+##    y();
+##  }
+##
+##  $ cat test2.cpp
+##  __attribute__((optnone)) static void x() {
+##  }
+##  __attribute__((always_inline)) static void y() {
+##    int var;
+##    x();
+##  }
+##  void f1();
+##  int main() {
+##    f1();
+##    y();
+##  }
+##  $ clang++ -O1 -g -gsplit-dwarf test2.cpp test1.cpp -S
+##  The split-dwarf.s was handcrafted.
+
+REQUIRES: x86_64-linux
+RUN: rm -rf %t
+RUN: mkdir %t
+RUN: cd %t
+RUN: llvm-mc -triple x86_64-unknown-linux -filetype=obj %S/Inputs/split-dwarf-objfile1.s -o test1.dwo
+RUN: llvm-mc -triple x86_64-unknown-linux -filetype=obj %S/Inputs/split-dwarf-objfile2.s -o test2.dwo
+RUN: llvm-mc -triple x86_64-unknown-linux -filetype=obj %S/Inputs/split-dwarf.s -o split-dwarf.o
+RUN: llvm-dwarfdump --statistics split-dwarf.o | FileCheck %s
+
+CHECK: "#variables processed by location statistics": 2
+CHECK: "#variables with 0% of parent scope covered by DW_AT_location": 2
+CHECK: "#local vars processed by location statistics": 2
+CHECK: "#local vars with 0% of parent scope covered by DW_AT_location": 2

diff  --git a/llvm/tools/llvm-dwarfdump/Statistics.cpp b/llvm/tools/llvm-dwarfdump/Statistics.cpp
index 3758a56da7a2..379078d0a91b 100644
--- a/llvm/tools/llvm-dwarfdump/Statistics.cpp
+++ b/llvm/tools/llvm-dwarfdump/Statistics.cpp
@@ -714,11 +714,19 @@ bool dwarfdump::collectStatsForObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
   StringRef FormatName = Obj.getFileFormatName();
   GlobalStats GlobalStats;
   LocationStats LocStats;
-  InlinedVarsTyMap GlobalInlinedFnInfo;
-  InlinedFnInstacesTy InlinedFnsToBeProcessed;
   StringMap<PerFunctionStats> Statistics;
   for (const auto &CU : static_cast<DWARFContext *>(&DICtx)->compile_units()) {
     if (DWARFDie CUDie = CU->getNonSkeletonUnitDIE(false)) {
+      // These variables are being reset for each CU, since there could be
+      // a situation where we have two subprogram DIEs with the same offsets
+      // in two diferent CUs, and we can end up using wrong variables info
+      // when trying to resolve abstract_orign attribute.
+      // TODO: Handle LTO cases where the abstract origin of
+      // the function is in a 
diff erent CU than the one it's
+      // referenced from or inlined into.
+      InlinedVarsTyMap GlobalInlinedFnInfo;
+      InlinedFnInstacesTy InlinedFnsToBeProcessed;
+
       collectStatsRecursive(CUDie, "/", "g", 0, 0, Statistics, GlobalStats,
                             LocStats, GlobalInlinedFnInfo,
                             InlinedFnsToBeProcessed);


        


More information about the llvm-commits mailing list