| # REQUIRES: system-linux |
| |
| # RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-main.s -o %tmain.o |
| # RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper0.s -o %t0.o |
| # RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper1.s -o %t1.o |
| # RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper2.s -o %t2.o |
| # RUN: %clang %cflags -dwarf-5 %tmain.o %t0.o %t1.o %t2.o -o %t.exe -Wl,-q |
| # RUN: llvm-bolt --always-convert-to-ranges %t.exe -o %t.bolt --update-debug-sections |
| # RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s |
| # RUN: llvm-dwarfdump --show-form --verbose --debug-line %t.exe > %t_line.txt |
| # RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt > %t.txt |
| # RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t.txt |
| # RUN: cat %t.txt | FileCheck --check-prefix=POSTCHECK %s |
| # RUN: llvm-dwarfdump --show-form --verbose --debug-line %t.bolt >> %t_line.txt |
| # RUN: FileCheck --check-prefix=CHECK-LINE %s --input-file %t_line.txt |
| |
| |
| # Check BOLT handles monolithic mix of DWARF4 and DWARF5. |
| |
| # main.cpp |
| # PRECHECK: version = 0x0005 |
| # PRECHECK: DW_TAG_compile_unit [1] * |
| # PRECHECK-NEXT: DW_AT_producer [DW_FORM_strx1] (indexed (00000000) |
| # PRECHECK-NEXT: DW_AT_language |
| # PRECHECK-NEXT: DW_AT_name |
| # PRECHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008) |
| # PRECHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) |
| # PRECHECK-NEXT: DW_AT_comp_dir |
| # PRECHECK-NEXT: DW_AT_low_pc |
| # PRECHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) |
| # PRECHECK-NEXT: [0x |
| # PRECHECK-NEXT: [0x |
| # PRECHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] (0x00000008) |
| # PRECHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000c) |
| # PRECHECK-NEXT: DW_AT_loclists_base [DW_FORM_sec_offset] (0x0000000c) |
| # PRECHECK: DW_TAG_subprogram [2] * (0x0000000c) |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000000) |
| # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] |
| # PRECHECK: DW_TAG_subprogram [8] |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001) |
| # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] |
| # PRECHECK: DW_TAG_formal_parameter [9] |
| # PRECHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000018 |
| # PRECHECK: DW_TAG_formal_parameter [9] |
| # PRECHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x1) loclist = 0x00000028 |
| # PRECHECK: DW_TAG_variable |
| # PRECHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x2) loclist = 0x00000038 |
| # PRECHECK: DW_TAG_inlined_subroutine [12] |
| # PRECHECK-NEXT: DW_AT_abstract_origin |
| # PRECHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000014 |
| |
| # helper0.cpp |
| # PRECHECK: version = 0x0004 |
| # PRECHECK: DW_TAG_compile_unit |
| # PRECHECK-NEXT: DW_AT_producer |
| # PRECHECK-NEXT: DW_AT_language |
| # PRECHECK-NEXT: DW_AT_name |
| # PRECHECK-NEXT: DW_AT_stmt_list |
| # PRECHECK-NEXT: DW_AT_comp_dir |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] |
| # PRECHECK-NEXT: DW_AT_high_pc |
| # PRECHECK: DW_TAG_subprogram [7] |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] |
| # PRECHECK-NEXT: DW_AT_high_pc |
| # PRECHECK: DW_TAG_variable [9] |
| # PRECHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] (0x00000000: |
| # PRECHECK: DW_TAG_inlined_subroutine [10] |
| # PRECHECK-NEXT: DW_AT_abstract_origin |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] |
| # PRECHECK-NEXT: DW_AT_high_pc |
| |
| # helper1.cpp |
| # PRECHECK: version = 0x0005 |
| # PRECHECK: DW_TAG_compile_unit [1] * |
| # PRECHECK-NEXT: DW_AT_producer |
| # PRECHECK-NEXT: DW_AT_language |
| # PRECHECK-NEXT: DW_AT_name |
| # PRECHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000058) |
| # PRECHECK-NEXT: DW_AT_stmt_list |
| # PRECHECK-NEXT: DW_AT_comp_dir |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001) |
| # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] |
| # PRECHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] (0x00000038) |
| # PRECHECK-NEXT: DW_AT_loclists_base [DW_FORM_sec_offset] (0x00000051) |
| # PRECHECK: DW_TAG_variable [2] |
| # PRECHECK-NEXT: DW_AT_name |
| # PRECHECK-NEXT: DW_AT_type |
| # PRECHECK-NEXT: DW_AT_external |
| # PRECHECK-NEXT: DW_AT_decl_file |
| # PRECHECK-NEXT: DW_AT_decl_line |
| # PRECHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_addrx 0x0) |
| # PRECHECK: DW_TAG_subprogram [7] |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001) |
| # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] |
| # PRECHECK: DW_TAG_variable [9] |
| # PRECHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) |
| # PRECHECK: DW_TAG_inlined_subroutine [10] |
| # PRECHECK-NEXT: DW_AT_abstract_origin |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001) |
| # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] |
| |
| # helper2.cpp |
| # PRECHECK: version = 0x0004 |
| # PRECHECK: DW_TAG_compile_unit [1] * |
| # PRECHECK-NEXT: DW_AT_producer |
| # PRECHECK-NEXT: DW_AT_language |
| # PRECHECK-NEXT: DW_AT_name |
| # PRECHECK-NEXT: DW_AT_stmt_list |
| # PRECHECK-NEXT: DW_AT_comp_dir |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] |
| # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] |
| # PRECHECK: DW_TAG_subprogram [7] |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] |
| # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] |
| # PRECHECK: DW_TAG_variable [9] |
| # PRECHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] |
| # PRECHECK: DW_TAG_inlined_subroutine [10] |
| # PRECHECK-NEXT: DW_AT_abstract_origin |
| # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] |
| # PRECHECK-NEXT: DW_AT_high_pc |
| |
| # Checking debug line. |
| |
| # CHECK-LINE: debug_line[ |
| # CHECK-LINE: version: 5 |
| # CHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#%.8x,TEST_DEBUG_LINE:]]] = "/test" |
| # CHECK-LINE-NEXT: file_names[ 0]: |
| # CHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,MAIN_DEBUG_LINE:]]] = "main.cpp" |
| # CHECK-LINE-NEXT: dir_index: 0 |
| # CHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab |
| |
| # CHECK-LINE: debug_line[ |
| # CHECK-LINE: version: 4 |
| # CHECK-LINE: include_directories[ 1] = "/test" |
| # CHECK-LINE-NEXT: file_names[ 1]: |
| # CHECK-LINE-NEXT: name: "helper0.cpp" |
| # CHECK-LINE-NEXT: dir_index: 1 |
| # CHECK-LINE-NEXT: mod_time: |
| # CHECK-LINE-NEXT: length: |
| |
| # CHECK-LINE: debug_line[ |
| # CHECK-LINE: version: 5 |
| # CHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#TEST_DEBUG_LINE]]] = "/test" |
| # CHECK-LINE-NEXT: file_names[ 0]: |
| # CHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,HELPER_DEBUG_LINE:]]] = "helper1.cpp" |
| # CHECK-LINE-NEXT: dir_index: 0 |
| # CHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce |
| |
| # CHECK-LINE: debug_line[ |
| # CHECK-LINE: version: 4 |
| # CHECK-LINE: include_directories[ 1] = "/test" |
| # CHECK-LINE-NEXT: file_names[ 1]: |
| # CHECK-LINE-NEXT: name: "helper2.cpp" |
| # CHECK-LINE-NEXT: dir_index: 1 |
| # CHECK-LINE-NEXT: mod_time: |
| # CHECK-LINE-NEXT: length: |
| |
| |
| # POST BOLT. |
| |
| # POSTCHECK: Addrs: [ |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDR:]] |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDR1:]] |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDR2:]] |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDR3:]] |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDR4:]] |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDR5:]] |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDR6:]] |
| |
| # POSTCHECK: Addrs: [ |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDRB:]] |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDRB1:]] |
| # POSTCHECK-NEXT: 0x[[#%.16x,ADDRB2:]] |
| |
| |
| # main.cpp |
| # POSTCHECK: version = 0x0005 |
| # POSTCHECK: DW_TAG_compile_unit [1] * |
| # POSTCHECK-NEXT: DW_AT_producer [DW_FORM_strx1] (indexed (00000000) |
| # POSTCHECK-NEXT: DW_AT_language |
| # POSTCHECK-NEXT: DW_AT_name |
| # POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008) |
| # POSTCHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) |
| # POSTCHECK-NEXT: DW_AT_comp_dir |
| # POSTCHECK-NEXT: DW_AT_low_pc |
| # POSTCHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) |
| # POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x7]] |
| # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x51]] |
| # POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] (0x00000008) |
| # POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000c) |
| # POSTCHECK-NEXT: DW_AT_loclists_base [DW_FORM_sec_offset] (0x0000000c) |
| # POSTCHECK: DW_TAG_subprogram [2] |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist |
| # POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x7]] |
| # POSTCHECK: DW_TAG_subprogram [8] |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x2) rangelist = 0x00000029 |
| # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x51]] |
| # POSTCHECK: DW_TAG_formal_parameter [9] |
| # POSTCHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000018 |
| # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x22]] |
| # POSTCHECK-NEXT: [0x[[#ADDR1 + 0x22]], 0x[[#ADDR1 + 0x51]] |
| # POSTCHECK: DW_TAG_formal_parameter [9] |
| # POSTCHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x1) loclist = 0x00000028 |
| # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x27]] |
| # POSTCHECK-NEXT: [0x[[#ADDR1 + 0x27]], 0x[[#ADDR1 + 0x51]] |
| # POSTCHECK: DW_TAG_variable |
| # POSTCHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x2) loclist = 0x00000038 |
| # POSTCHECK-NEXT: [0x[[#ADDR2]], 0x[[#ADDR2 + 0x6]] |
| # POSTCHECK-NEXT: [0x[[#ADDR2 + 0x6]], 0x[[#ADDR2 + 0x46]] |
| # POSTCHECK: DW_TAG_inlined_subroutine [12] |
| # POSTCHECK-NEXT: DW_AT_abstract_origin |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x3) rangelist = 0x0000002d |
| # POSTCHECK-NEXT: [0x[[#ADDR3]], 0x[[#ADDR3 + 0x4]] |
| # POSTCHECK-NEXT: [0x[[#ADDR3 + 0x10]], 0x[[#ADDR3 + 0x16]] |
| |
| # helper0.cpp |
| # POSTCHECK: version = 0x0004 |
| # POSTCHECK: DW_TAG_compile_unit |
| # POSTCHECK-NEXT: DW_AT_producer |
| # POSTCHECK-NEXT: DW_AT_language |
| # POSTCHECK-NEXT: DW_AT_name |
| # POSTCHECK-NEXT: DW_AT_stmt_list |
| # POSTCHECK-NEXT: DW_AT_comp_dir |
| # POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: [0x |
| # POSTCHECK: DW_TAG_subprogram [22] |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: [0x |
| # POSTCHECK: DW_TAG_variable [24] |
| # POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: [0x |
| # POSTCHECK-NEXT: [0x |
| # POSTCHECK: DW_TAG_inlined_subroutine [25] |
| # POSTCHECK-NEXT: DW_AT_abstract_origin |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: [0x |
| |
| # helper1.cpp |
| # POSTCHECK: version = 0x0005 |
| # POSTCHECK: DW_TAG_compile_unit [26] * |
| # POSTCHECK-NEXT: DW_AT_producer |
| # POSTCHECK-NEXT: DW_AT_language |
| # POSTCHECK-NEXT: DW_AT_name |
| # POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000058) |
| # POSTCHECK-NEXT: DW_AT_stmt_list |
| # POSTCHECK-NEXT: DW_AT_comp_dir |
| # POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001) |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) |
| # POSTCHECK-NEXT: [0x[[#ADDRB]], 0x[[#ADDRB + 0x4]] |
| # POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: DW_AT_loclists_base [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] |
| # POSTCHECK: DW_TAG_variable [27] |
| # POSTCHECK-NEXT: DW_AT_name |
| # POSTCHECK-NEXT: DW_AT_type |
| # POSTCHECK-NEXT: DW_AT_external |
| # POSTCHECK-NEXT: DW_AT_decl_file |
| # POSTCHECK-NEXT: DW_AT_decl_line |
| # POSTCHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_addrx 0x2) |
| # POSTCHECK: DW_TAG_subprogram [29] |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) |
| # POSTCHECK-NEXT: [0x[[#ADDRB]], 0x[[#ADDRB + 0x4]] |
| # POSTCHECK: DW_TAG_variable [10] |
| # POSTCHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) |
| # POSTCHECK-NEXT: [0x[[#ADDRB]], 0x[[#ADDRB + 0x3]] |
| # POSTCHECK-NEXT: [0x[[#ADDRB + 0x3]], 0x[[#ADDRB + 0x4]] |
| # POSTCHECK: DW_TAG_inlined_subroutine |
| # POSTCHECK-NEXT: DW_AT_abstract_origin |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x2) rangelist |
| # POSTCHECK-NEXT: [0x[[#ADDRB]], 0x[[#ADDRB + 0x3]] |
| |
| # helper2.cpp |
| # POSTCHECK: version = 0x0004 |
| # POSTCHECK: DW_TAG_compile_unit [17] * |
| # POSTCHECK-NEXT: DW_AT_producer |
| # POSTCHECK-NEXT: DW_AT_language |
| # POSTCHECK-NEXT: DW_AT_name |
| # POSTCHECK-NEXT: DW_AT_stmt_list |
| # POSTCHECK-NEXT: DW_AT_comp_dir |
| # POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: [0x |
| # POSTCHECK: DW_TAG_subprogram [22] |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: [0x |
| # POSTCHECK: DW_TAG_variable [24] |
| # POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: [0x |
| # POSTCHECK-NEXT: [0x |
| # POSTCHECK: DW_TAG_inlined_subroutine [25] |
| # POSTCHECK-NEXT: DW_AT_abstract_origin |
| # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] |
| # POSTCHECK-NEXT: [0x |
| |
| |
| # Checking debug line. |
| |
| # CHECK-LINE: debug_line[ |
| # CHECK-LINE: version: 5 |
| # CHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#TEST_DEBUG_LINE]]] = "/test" |
| # CHECK-LINE-NEXT: file_names[ 0]: |
| # CHECK-LINE-NEXT: name: .debug_line_str[0x[[#MAIN_DEBUG_LINE]]] = "main.cpp" |
| # CHECK-LINE-NEXT: dir_index: 0 |
| # CHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab |
| |
| # CHECK-LINE: debug_line[ |
| # CHECK-LINE: version: 4 |
| # CHECK-LINE: include_directories[ 1] = "/test" |
| # CHECK-LINE-NEXT: file_names[ 1]: |
| # CHECK-LINE-NEXT: name: "helper0.cpp" |
| # CHECK-LINE-NEXT: dir_index: 1 |
| # CHECK-LINE-NEXT: mod_time: |
| # CHECK-LINE-NEXT: length: |
| |
| # CHECK-LINE: debug_line[ |
| # CHECK-LINE: version: 5 |
| # CHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#TEST_DEBUG_LINE]]] = "/test" |
| # CHECK-LINE-NEXT: file_names[ 0]: |
| # CHECK-LINE-NEXT: name: .debug_line_str[0x[[#HELPER_DEBUG_LINE]]] = "helper1.cpp" |
| # CHECK-LINE-NEXT: dir_index: 0 |
| # CHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce |
| |
| # CHECK-LINE: debug_line[ |
| # CHECK-LINE: version: 4 |
| # CHECK-LINE: include_directories[ 1] = "/test" |
| # CHECK-LINE-NEXT: file_names[ 1]: |
| # CHECK-LINE-NEXT: name: "helper2.cpp" |
| # CHECK-LINE-NEXT: dir_index: 1 |
| # CHECK-LINE-NEXT: mod_time: |
| # CHECK-LINE-NEXT: length: |