-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DWARF][BOLT] Handle getBinaryFunctionContainingAddress returning nul…
…lptr for DW_TAG_call_site DW_TAG_call_site/DW_AT_call_return_pc can contain address that is not in any function. In this case getBinaryFunctionContainingAddress returns nullptr. For this case preserving original address. Reviewed By: rafauler Differential Revision: https://reviews.llvm.org/D132057
- Loading branch information
Showing
4 changed files
with
614 additions
and
4 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
202 changes: 202 additions & 0 deletions
202
bolt/test/X86/Inputs/dwarf5-call-pc-function-null-check-helper.s
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,202 @@ | ||
# clang++ main.cpp -g2 -O2 -S | ||
# int helper(int z_, int d_) { | ||
# return z_ + d_; | ||
# } | ||
|
||
|
||
.text | ||
.file "helper.cpp" | ||
.globl _Z6helperii # -- Begin function _Z6helperii | ||
.p2align 4, 0x90 | ||
.type _Z6helperii,@function | ||
_Z6helperii: # @_Z6helperii | ||
.Lfunc_begin0: | ||
.file 0 "." "helper.cpp" md5 0x8020e02b87876b529416442978378ed0 | ||
.loc 0 1 0 # helper.cpp:1:0 | ||
.cfi_startproc | ||
# %bb.0: # %entry | ||
#DEBUG_VALUE: helper:z_ <- $edi | ||
#DEBUG_VALUE: helper:d_ <- $esi | ||
# kill: def $esi killed $esi def $rsi | ||
# kill: def $edi killed $edi def $rdi | ||
.loc 0 2 13 prologue_end # helper.cpp:2:13 | ||
leal (%rdi,%rsi), %eax | ||
.loc 0 2 3 is_stmt 0 # helper.cpp:2:3 | ||
retq | ||
.Ltmp0: | ||
.Lfunc_end0: | ||
.size _Z6helperii, .Lfunc_end0-_Z6helperii | ||
.cfi_endproc | ||
# -- End function | ||
.section .debug_abbrev,"",@progbits | ||
.byte 1 # Abbreviation Code | ||
.byte 17 # DW_TAG_compile_unit | ||
.byte 1 # DW_CHILDREN_yes | ||
.byte 37 # DW_AT_producer | ||
.byte 37 # DW_FORM_strx1 | ||
.byte 19 # DW_AT_language | ||
.byte 5 # DW_FORM_data2 | ||
.byte 3 # DW_AT_name | ||
.byte 37 # DW_FORM_strx1 | ||
.byte 114 # DW_AT_str_offsets_base | ||
.byte 23 # DW_FORM_sec_offset | ||
.byte 16 # DW_AT_stmt_list | ||
.byte 23 # DW_FORM_sec_offset | ||
.byte 27 # DW_AT_comp_dir | ||
.byte 37 # DW_FORM_strx1 | ||
.byte 17 # DW_AT_low_pc | ||
.byte 27 # DW_FORM_addrx | ||
.byte 18 # DW_AT_high_pc | ||
.byte 6 # DW_FORM_data4 | ||
.byte 115 # DW_AT_addr_base | ||
.byte 23 # DW_FORM_sec_offset | ||
.byte 0 # EOM(1) | ||
.byte 0 # EOM(2) | ||
.byte 2 # Abbreviation Code | ||
.byte 46 # DW_TAG_subprogram | ||
.byte 1 # DW_CHILDREN_yes | ||
.byte 17 # DW_AT_low_pc | ||
.byte 27 # DW_FORM_addrx | ||
.byte 18 # DW_AT_high_pc | ||
.byte 6 # DW_FORM_data4 | ||
.byte 64 # DW_AT_frame_base | ||
.byte 24 # DW_FORM_exprloc | ||
.byte 122 # DW_AT_call_all_calls | ||
.byte 25 # DW_FORM_flag_present | ||
.byte 110 # DW_AT_linkage_name | ||
.byte 37 # DW_FORM_strx1 | ||
.byte 3 # DW_AT_name | ||
.byte 37 # DW_FORM_strx1 | ||
.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 3 # Abbreviation Code | ||
.byte 5 # DW_TAG_formal_parameter | ||
.byte 0 # DW_CHILDREN_no | ||
.byte 2 # DW_AT_location | ||
.byte 24 # DW_FORM_exprloc | ||
.byte 3 # DW_AT_name | ||
.byte 37 # DW_FORM_strx1 | ||
.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 | ||
.byte 37 # DW_FORM_strx1 | ||
.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 0 # EOM(3) | ||
.section .debug_info,"",@progbits | ||
.Lcu_begin0: | ||
.long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit | ||
.Ldebug_info_start0: | ||
.short 5 # DWARF version number | ||
.byte 1 # DWARF Unit Type | ||
.byte 8 # Address Size (in bytes) | ||
.long .debug_abbrev # Offset Into Abbrev. Section | ||
.byte 1 # Abbrev [1] 0xc:0x41 DW_TAG_compile_unit | ||
.byte 0 # DW_AT_producer | ||
.short 33 # DW_AT_language | ||
.byte 1 # DW_AT_name | ||
.long .Lstr_offsets_base0 # DW_AT_str_offsets_base | ||
.long .Lline_table_start0 # DW_AT_stmt_list | ||
.byte 2 # DW_AT_comp_dir | ||
.byte 0 # DW_AT_low_pc | ||
.long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc | ||
.long .Laddr_table_base0 # DW_AT_addr_base | ||
.byte 2 # Abbrev [2] 0x23:0x25 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_call_all_calls | ||
.byte 3 # DW_AT_linkage_name | ||
.byte 4 # DW_AT_name | ||
.byte 0 # DW_AT_decl_file | ||
.byte 1 # DW_AT_decl_line | ||
.long 72 # DW_AT_type | ||
# DW_AT_external | ||
.byte 3 # Abbrev [3] 0x33:0xa DW_TAG_formal_parameter | ||
.byte 1 # DW_AT_location | ||
.byte 85 | ||
.byte 6 # DW_AT_name | ||
.byte 0 # DW_AT_decl_file | ||
.byte 1 # DW_AT_decl_line | ||
.long 72 # DW_AT_type | ||
.byte 3 # Abbrev [3] 0x3d:0xa DW_TAG_formal_parameter | ||
.byte 1 # DW_AT_location | ||
.byte 84 | ||
.byte 7 # DW_AT_name | ||
.byte 0 # DW_AT_decl_file | ||
.byte 1 # DW_AT_decl_line | ||
.long 72 # DW_AT_type | ||
.byte 0 # End Of Children Mark | ||
.byte 4 # Abbrev [4] 0x48:0x4 DW_TAG_base_type | ||
.byte 5 # DW_AT_name | ||
.byte 5 # DW_AT_encoding | ||
.byte 4 # DW_AT_byte_size | ||
.byte 0 # End Of Children Mark | ||
.Ldebug_info_end0: | ||
.section .debug_str_offsets,"",@progbits | ||
.long 36 # Length of String Offsets Set | ||
.short 5 | ||
.short 0 | ||
.Lstr_offsets_base0: | ||
.section .debug_str,"MS",@progbits,1 | ||
.Linfo_string0: | ||
.asciz "clang version 16.0.0" # string offset=0 | ||
.Linfo_string1: | ||
.asciz "helper.cpp" # string offset=134 | ||
.Linfo_string2: | ||
.asciz "." # string offset=145 | ||
.Linfo_string3: | ||
.asciz "_Z6helperii" # string offset=198 | ||
.Linfo_string4: | ||
.asciz "helper" # string offset=210 | ||
.Linfo_string5: | ||
.asciz "int" # string offset=217 | ||
.Linfo_string6: | ||
.asciz "z_" # string offset=221 | ||
.Linfo_string7: | ||
.asciz "d_" # string offset=224 | ||
.section .debug_str_offsets,"",@progbits | ||
.long .Linfo_string0 | ||
.long .Linfo_string1 | ||
.long .Linfo_string2 | ||
.long .Linfo_string3 | ||
.long .Linfo_string4 | ||
.long .Linfo_string5 | ||
.long .Linfo_string6 | ||
.long .Linfo_string7 | ||
.section .debug_addr,"",@progbits | ||
.long .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution | ||
.Ldebug_addr_start0: | ||
.short 5 # DWARF version number | ||
.byte 8 # Address size | ||
.byte 0 # Segment selector size | ||
.Laddr_table_base0: | ||
.quad .Lfunc_begin0 | ||
.Ldebug_addr_end0: | ||
.ident "clang version 16.0.0" | ||
.section ".note.GNU-stack","",@progbits | ||
.addrsig | ||
.section .debug_line,"",@progbits | ||
.Lline_table_start0: |
Oops, something went wrong.