1# REQUIRES: system-linux 2 3; RUN: rm -rf %t 4; RUN: mkdir %t 5; RUN: cd %t 6 7# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux -split-dwarf-file=main.dwo %p/Inputs/dwarf5-split-dwarf4-monolithic-main.s -o main.o 8# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper0.s -o helper0.o 9# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux -split-dwarf-file=helper1.dwo %p/Inputs/dwarf5-split-dwarf4-monolithic-helper1.s -o helper1.o 10# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper2.s -o helper2.o 11# RUN: %clang %cflags -dwarf-5 main.o helper0.o helper1.o helper2.o -o main.exe -Wl,-q 12# RUN: llvm-bolt main.exe -o main.bolt --update-debug-sections 13# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe | FileCheck --check-prefix=PRECHECK %s 14# RUN: llvm-dwarfdump --show-form --verbose --debug-line main.exe | FileCheck --check-prefix=PRECHECK-LINE %s 15# RUN: llvm-dwarfdump --show-form --verbose --debug-addr main.bolt > boltout.txt 16# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.bolt >> boltout.txt 17# RUN: cat boltout.txt | FileCheck --check-prefix=POSTCHECK %s 18# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.dwo.dwo | FileCheck --check-prefix=POSTCHECK-DWO-MAIN %s 19# RUN: llvm-dwarfdump --show-form --verbose --debug-info helper1.dwo.dwo | FileCheck --check-prefix=POSTCHECK-DWO-HELPER1 %s 20# RUN: llvm-dwarfdump --show-form --verbose --debug-line main.bolt | FileCheck --check-prefix=POSTCHECK-LINE %s 21 22 23# Check BOLT handles monolithic mix of DWARF4 and DWARF5. 24 25# main.cpp 26# PRECHECK: version = 0x0005 27# PRECHECK: DW_TAG_skeleton_unit 28# PRECHECK-NEXT: DW_AT_stmt_list 29# PRECHECK-NEXT: DW_AT_str_offsets_base 30# PRECHECK-NEXT: DW_AT_comp_dir 31# PRECHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true) 32# PRECHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1] (indexed (00000001) string = "main.dwo") 33# PRECHECK-NEXT: DW_AT_low_pc 34# PRECHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000010 35# PRECHECK-NEXT: [0x 36# PRECHECK-NEXT: [0x 37# PRECHECK-NEXT: DW_AT_addr_base 38# PRECHECK-NEXT: DW_AT_rnglists_base 39 40# helper0.cpp 41# PRECHECK: version = 0x0004 42# PRECHECK: DW_TAG_compile_unit 43# PRECHECK-NEXT: DW_AT_producer 44# PRECHECK-NEXT: DW_AT_language 45# PRECHECK-NEXT: DW_AT_name 46# PRECHECK-NEXT: DW_AT_stmt_list 47# PRECHECK-NEXT: DW_AT_comp_dir 48# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] 49# PRECHECK-NEXT: DW_AT_high_pc 50# PRECHECK: DW_TAG_subprogram [7] 51# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] 52# PRECHECK-NEXT: DW_AT_high_pc 53# PRECHECK: DW_TAG_variable [9] 54# PRECHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] (0x00000000: 55# PRECHECK: DW_TAG_inlined_subroutine [10] 56# PRECHECK-NEXT: DW_AT_abstract_origin 57# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] 58# PRECHECK-NEXT: DW_AT_high_pc 59 60# helper1.cpp 61# PRECHECK: version = 0x0005 62# PRECHECK: DW_TAG_skeleton_unit [1] 63# PRECHECK-NEXT: DW_AT_stmt_list 64# PRECHECK-NEXT: DW_AT_str_offsets_base 65# PRECHECK-NEXT: DW_AT_comp_dir 66# PRECHECK-NEXT: DW_AT_GNU_pubnames 67# PRECHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1] (indexed (00000001) string = "helper1.dwo") 68# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001) address 69# PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] 70# PRECHECK-NEXT: DW_AT_addr_base 71 72# helper2.cpp 73# PRECHECK: version = 0x0004 74# PRECHECK: DW_TAG_compile_unit [1] * 75# PRECHECK-NEXT: DW_AT_producer 76# PRECHECK-NEXT: DW_AT_language 77# PRECHECK-NEXT: DW_AT_name 78# PRECHECK-NEXT: DW_AT_stmt_list 79# PRECHECK-NEXT: DW_AT_comp_dir 80# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] 81# PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] 82# PRECHECK: DW_TAG_subprogram [7] 83# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] 84# PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] 85# PRECHECK: DW_TAG_variable [9] 86# PRECHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] 87# PRECHECK: DW_TAG_inlined_subroutine [10] 88# PRECHECK-NEXT: DW_AT_abstract_origin 89# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] 90# PRECHECK-NEXT: DW_AT_high_pc 91 92# Checking debug line. 93 94# PRECHECK-LINE: debug_line[ 95# PRECHECK-LINE: version: 5 96# PRECHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#%.8x,LINE:]]] = "." 97# PRECHECK-LINE-NEXT: file_names[ 0]: 98# PRECHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,LINE:]]] = "main.cpp" 99# PRECHECK-LINE-NEXT: dir_index: 0 100# PRECHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab 101 102# PRECHECK-LINE: debug_line[ 103# PRECHECK-LINE: version: 4 104# PRECHECK-LINE: include_directories[ 1] = "/test" 105# PRECHECK-LINE-NEXT: file_names[ 1]: 106# PRECHECK-LINE-NEXT: name: "helper0.cpp" 107# PRECHECK-LINE-NEXT: dir_index: 1 108# PRECHECK-LINE-NEXT: mod_time: 109# PRECHECK-LINE-NEXT: length: 110 111# PRECHECK-LINE: debug_line[ 112# PRECHECK-LINE: version: 5 113# PRECHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#%.8x,LINE:]]] = "." 114# PRECHECK-LINE-NEXT: file_names[ 0]: 115# PRECHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,LINE:]]] = "helper1.cpp" 116# PRECHECK-LINE-NEXT: dir_index: 0 117# PRECHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce 118 119 120# PRECHECK-LINE: debug_line[ 121# PRECHECK-LINE: version: 4 122# PRECHECK-LINE: include_directories[ 1] = "/test" 123# PRECHECK-LINE-NEXT: file_names[ 1]: 124# PRECHECK-LINE-NEXT: name: "helper2.cpp" 125# PRECHECK-LINE-NEXT: dir_index: 1 126# PRECHECK-LINE-NEXT: mod_time: 127# PRECHECK-LINE-NEXT: length: 128 129 130# POST BOLT. 131 132# POSTCHECK: Addrs: [ 133# POSTCHECK-NEXT: 0x[[#%.16x,ADDR:]] 134# POSTCHECK-NEXT: 0x[[#%.16x,ADDR1:]] 135# POSTCHECK-NEXT: 0x[[#%.16x,ADDR2:]] 136# POSTCHECK-NEXT: 0x[[#%.16x,ADDR3:]] 137# POSTCHECK-NEXT: 0x[[#%.16x,ADDR4:]] 138# POSTCHECK-NEXT: 0x[[#%.16x,ADDR5:]] 139# POSTCHECK-NEXT: 0x[[#%.16x,ADDR6:]] 140# POSTCHECK-NEXT: 0x[[#%.16x,ADDR7:]] 141# POSTCHECK-NEXT: 0x[[#%.16x,ADDR8:]] 142 143# POSTCHECK: Addrs: [ 144# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB:]] 145# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB1:]] 146# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB2:]] 147# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB3:]] 148 149 150# main.cpp 151# POSTCHECK: version = 0x0005 152# POSTCHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) 153# POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008) 154# POSTCHECK-NEXT: DW_AT_comp_dir [DW_FORM_strx1] (indexed (00000000) string = ".") 155# POSTCHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true) 156# POSTCHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1] (indexed (00000001) string = "main.dwo.dwo") 157# POSTCHECK-NEXT: DW_AT_low_pc 158# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) 159# POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x7]] 160# POSTCHECK-NEXT: [0x[[#ADDR2]], 0x[[#ADDR2 + 0x51]] 161# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] 162# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] 163 164# helper0.cpp 165# POSTCHECK: version = 0x0004 166# POSTCHECK: DW_TAG_compile_unit 167# POSTCHECK-NEXT: DW_AT_producer 168# POSTCHECK-NEXT: DW_AT_language 169# POSTCHECK-NEXT: DW_AT_name 170# POSTCHECK-NEXT: DW_AT_stmt_list 171# POSTCHECK-NEXT: DW_AT_comp_dir 172# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 173# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] 174# POSTCHECK-NEXT: [0x 175# POSTCHECK: DW_TAG_subprogram [7] 176# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 177# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] 178# POSTCHECK-NEXT: [0x 179# POSTCHECK: DW_TAG_variable [9] 180# POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] 181# POSTCHECK-NEXT: [0x 182# POSTCHECK-NEXT: [0x 183# POSTCHECK: DW_TAG_inlined_subroutine [10] 184# POSTCHECK-NEXT: DW_AT_abstract_origin 185# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 186# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] 187# POSTCHECK-NEXT: [0x 188 189# helper1.cpp 190# POSTCHECK: version = 0x0005 191# POSTCHECK: DW_TAG_skeleton_unit [1] 192# POSTCHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x000000fe) 193# POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000018) 194# POSTCHECK-NEXT: DW_AT_comp_dir [DW_FORM_strx1] (indexed (00000000) string = ".") 195# POSTCHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true) 196# POSTCHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1] (indexed (00000001) string = "helper1.dwo.dwo") 197# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000002) 198# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) 199# POSTCHECK-NEXT: [0x[[#ADDRB1]], 0x[[#ADDRB1 + 0x4]] 200# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] 201# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] 202 203# helper2.cpp 204# POSTCHECK: version = 0x0004 205# POSTCHECK: DW_TAG_compile_unit [1] * 206# POSTCHECK-NEXT: DW_AT_producer 207# POSTCHECK-NEXT: DW_AT_language 208# POSTCHECK-NEXT: DW_AT_name 209# POSTCHECK-NEXT: DW_AT_stmt_list 210# POSTCHECK-NEXT: DW_AT_comp_dir 211# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 212# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] 213# POSTCHECK-NEXT: [0x 214# POSTCHECK: DW_TAG_subprogram [7] 215# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 216# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] 217# POSTCHECK-NEXT: [0x 218# POSTCHECK: DW_TAG_variable [9] 219# POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] 220# POSTCHECK-NEXT: [0x 221# POSTCHECK-NEXT: [0x 222# POSTCHECK: DW_TAG_inlined_subroutine [10] 223# POSTCHECK-NEXT: DW_AT_abstract_origin 224# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 225# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] 226# POSTCHECK-NEXT: [0x 227 228# POSTCHECK-DWO-MAIN: version = 0x0005 229# POSTCHECK-DWO-MAIN: DW_TAG_compile_unit 230# POSTCHECK-DWO-MAIN: DW_TAG_subprogram [2] 231# POSTCHECK-DWO-MAIN-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001) 232# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000018 233# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000007)) 234# POSTCHECK-DWO-MAIN: DW_TAG_subprogram [8] 235# POSTCHECK-DWO-MAIN-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001) 236# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x0000001c 237# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000051)) 238# POSTCHECK-DWO-MAIN: DW_TAG_formal_parameter [9] 239# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000018: 240# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length (0x0000000000000002, 0x0000000000000022): DW_OP_reg5 RDI 241# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length (0x0000000000000003, 0x000000000000002f): DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value) 242# POSTCHECK-DWO-MAIN: DW_TAG_formal_parameter [9] 243# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x1) loclist = 0x00000026: 244# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length (0x0000000000000002, 0x0000000000000027): DW_OP_reg4 RSI 245# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length (0x0000000000000004, 0x000000000000002a): DW_OP_entry_value(DW_OP_reg4 RSI), DW_OP_stack_value) 246# POSTCHECK-DWO-MAIN: DW_TAG_variable [10] 247# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x2) loclist = 0x00000034: 248# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length (0x0000000000000005, 0x0000000000000006): DW_OP_reg5 RDI 249# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length (0x0000000000000006, 0x0000000000000040): DW_OP_reg14 R14) 250# POSTCHECK-DWO-MAIN: DW_TAG_inlined_subroutine [12] 251# POSTCHECK-DWO-MAIN-NEXT: DW_AT_abstract_origin [DW_FORM_ref4] 252# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x2) rangelist = 0x00000020 253# BOLT uses DW_RLE_startx_length encoding. Wit this encoding llvm-dwarfdump tries to lookup the actual address. 254# Since .debug_addr is in the binary low_pc is set to 0. 255# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000004) 256# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000006)) 257 258# POSTCHECK-DWO-HELPER1: version = 0x0005 259# POSTCHECK-DWO-HELPER1: DW_TAG_subprogram [7] 260# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000002) address 261# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000014 262# POSTCHECK-DWO-HELPER1-NEXT: [0x0000000000000000, 0x0000000000000004)) 263# POSTCHECK-DWO-HELPER1: DW_TAG_variable [9] 264# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000010: 265# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_startx_length (0x0000000000000001, 0x0000000000000003): DW_OP_reg5 RDI 266# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_startx_length (0x0000000000000003, 0x0000000000000001): DW_OP_reg0 RAX) 267# POSTCHECK-DWO-HELPER1: DW_TAG_inlined_subroutine [10] 268# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_abstract_origin 269# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000002) address 270# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000018 271# POSTCHECK-DWO-HELPER1-NEXT: [0x0000000000000000, 0x0000000000000003)) 272 273# Checking debug line. 274 275# POSTCHECK-LINE: debug_line[ 276# POSTCHECK-LINE: version: 5 277# POSTCHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#%.8x,LINE:]]] = "." 278# POSTCHECK-LINE-NEXT: file_names[ 0]: 279# POSTCHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,LINE:]]] = "main.cpp" 280# POSTCHECK-LINE-NEXT: dir_index: 0 281# POSTCHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab 282 283# POSTCHECK-LINE: debug_line[ 284# POSTCHECK-LINE: version: 4 285# POSTCHECK-LINE: include_directories[ 1] = "/test" 286# POSTCHECK-LINE-NEXT: file_names[ 1]: 287# POSTCHECK-LINE-NEXT: name: "helper0.cpp" 288# POSTCHECK-LINE-NEXT: dir_index: 1 289# POSTCHECK-LINE-NEXT: mod_time: 290# POSTCHECK-LINE-NEXT: length: 291 292# POSTCHECK-LINE: debug_line[ 293# POSTCHECK-LINE: version: 5 294# POSTCHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#%.8x,LINE:]]] = "." 295# POSTCHECK-LINE-NEXT: file_names[ 0]: 296# POSTCHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,LINE:]]] = "helper1.cpp" 297# POSTCHECK-LINE-NEXT: dir_index: 0 298# POSTCHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce 299 300# POSTCHECK-LINE: debug_line[ 301# POSTCHECK-LINE: version: 4 302# POSTCHECK-LINE: include_directories[ 1] = "/test" 303# POSTCHECK-LINE-NEXT: file_names[ 1]: 304# POSTCHECK-LINE-NEXT: name: "helper2.cpp" 305# POSTCHECK-LINE-NEXT: dir_index: 1 306# POSTCHECK-LINE-NEXT: mod_time: 307# POSTCHECK-LINE-NEXT: length: 308