300 lines · plain
1# REQUIRES: system-linux2 3; RUN: rm -rf %t4; RUN: mkdir %t5; RUN: cd %t6 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.o8# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper0.s -o helper0.o9# 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.o10# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper2.s -o helper2.o11# RUN: %clang %cflags -dwarf-5 main.o helper0.o helper1.o helper2.o -o main.exe -Wl,-q12# RUN: llvm-bolt --always-convert-to-ranges main.exe -o main.bolt --update-debug-sections --debug-thread-count=4 --cu-processing-batch-size=413# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe | FileCheck --check-prefix=PRECHECK %s14# RUN: llvm-dwarfdump --show-form --verbose --debug-line main.exe | FileCheck --check-prefix=PRECHECK-LINE %s15# RUN: llvm-dwarfdump --show-form --verbose --debug-addr main.bolt > boltout.txt16# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.bolt >> boltout.txt17# RUN: cat boltout.txt | FileCheck --check-prefix=POSTCHECK %s18# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.dwo.dwo | FileCheck --check-prefix=POSTCHECK-DWO-MAIN %s19# RUN: llvm-dwarfdump --show-form --verbose --debug-info helper1.dwo.dwo | FileCheck --check-prefix=POSTCHECK-DWO-HELPER1 %s20# RUN: llvm-dwarfdump --show-form --verbose --debug-line main.bolt | FileCheck --check-prefix=POSTCHECK-LINE %s21 22 23## Check BOLT handles monolithic mix of DWARF4 and DWARF5.24 25# main.cpp26# PRECHECK: version = 0x000527# PRECHECK: DW_TAG_skeleton_unit28# PRECHECK-NEXT: DW_AT_stmt_list29# PRECHECK-NEXT: DW_AT_str_offsets_base30# PRECHECK-NEXT: DW_AT_comp_dir31# 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_pc34# PRECHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x0000001035# PRECHECK-NEXT: [0x36# PRECHECK-NEXT: [0x37# PRECHECK-NEXT: DW_AT_addr_base38# PRECHECK-NEXT: DW_AT_rnglists_base39 40# helper0.cpp41# PRECHECK: version = 0x000442# PRECHECK: DW_TAG_compile_unit43# PRECHECK-NEXT: DW_AT_producer44# PRECHECK-NEXT: DW_AT_language45# PRECHECK-NEXT: DW_AT_name46# PRECHECK-NEXT: DW_AT_stmt_list47# PRECHECK-NEXT: DW_AT_comp_dir48# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]49# PRECHECK-NEXT: DW_AT_high_pc50# PRECHECK: DW_TAG_subprogram [7]51# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]52# PRECHECK-NEXT: DW_AT_high_pc53# 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_origin57# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]58# PRECHECK-NEXT: DW_AT_high_pc59 60# helper1.cpp61# PRECHECK: version = 0x000562# PRECHECK: DW_TAG_skeleton_unit [1]63# PRECHECK-NEXT: DW_AT_stmt_list64# PRECHECK-NEXT: DW_AT_str_offsets_base65# PRECHECK-NEXT: DW_AT_comp_dir66# PRECHECK-NEXT: DW_AT_GNU_pubnames67# 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) address69# PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]70# PRECHECK-NEXT: DW_AT_addr_base71 72# helper2.cpp73# PRECHECK: version = 0x000474# PRECHECK: DW_TAG_compile_unit [1] *75# PRECHECK-NEXT: DW_AT_producer76# PRECHECK-NEXT: DW_AT_language77# PRECHECK-NEXT: DW_AT_name78# PRECHECK-NEXT: DW_AT_stmt_list79# PRECHECK-NEXT: DW_AT_comp_dir80# 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_origin89# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]90# PRECHECK-NEXT: DW_AT_high_pc91 92## Checking debug line.93 94# PRECHECK-LINE: debug_line[95# PRECHECK-LINE: version: 596# 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: 0100# PRECHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab101 102# PRECHECK-LINE: debug_line[103# PRECHECK-LINE: version: 4104# 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: 1108# PRECHECK-LINE-NEXT: mod_time:109# PRECHECK-LINE-NEXT: length:110 111# PRECHECK-LINE: debug_line[112# PRECHECK-LINE: version: 5113# 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: 0117# PRECHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce118 119 120# PRECHECK-LINE: debug_line[121# PRECHECK-LINE: version: 4122# 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: 1126# 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 141# POSTCHECK: Addrs: [142# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB:]]143# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB1:]]144# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB2:]]145 146 147# main.cpp148# POSTCHECK: version = 0x0005149# POSTCHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)150# POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008)151# POSTCHECK-NEXT: DW_AT_comp_dir [DW_FORM_strx1] (indexed (00000000) string = ".")152# POSTCHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true)153# POSTCHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1] (indexed (00000001) string = "main.dwo.dwo")154# POSTCHECK-NEXT: DW_AT_low_pc155# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0)156# POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x7]]157# POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x51]]158# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]159# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset]160 161# helper0.cpp162# POSTCHECK: version = 0x0004163# POSTCHECK: DW_TAG_compile_unit164# POSTCHECK-NEXT: DW_AT_producer165# POSTCHECK-NEXT: DW_AT_language166# POSTCHECK-NEXT: DW_AT_name167# POSTCHECK-NEXT: DW_AT_stmt_list168# POSTCHECK-NEXT: DW_AT_comp_dir169# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)170# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]171# POSTCHECK-NEXT: [0x172# POSTCHECK: DW_TAG_subprogram [8]173# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]174# POSTCHECK-NEXT: [0x175# POSTCHECK: DW_TAG_variable [10]176# POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]177# POSTCHECK-NEXT: [0x178# POSTCHECK-NEXT: [0x179# POSTCHECK: DW_TAG_inlined_subroutine [11]180# POSTCHECK-NEXT: DW_AT_abstract_origin181# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]182# POSTCHECK-NEXT: [0x183 184# helper1.cpp185# POSTCHECK: version = 0x0005186# POSTCHECK: DW_TAG_skeleton_unit [12]187# POSTCHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x000000fe)188# POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000018)189# POSTCHECK-NEXT: DW_AT_comp_dir [DW_FORM_strx1] (indexed (00000000) string = ".")190# POSTCHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true)191# POSTCHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1] (indexed (00000001) string = "helper1.dwo.dwo")192# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000002)193# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0)194# POSTCHECK-NEXT: [0x[[#ADDRB1]], 0x[[#ADDRB1 + 0x4]]195# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]196# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset]197 198# helper2.cpp199# POSTCHECK: version = 0x0004200# POSTCHECK: DW_TAG_compile_unit [2] *201# POSTCHECK-NEXT: DW_AT_producer202# POSTCHECK-NEXT: DW_AT_language203# POSTCHECK-NEXT: DW_AT_name204# POSTCHECK-NEXT: DW_AT_stmt_list205# POSTCHECK-NEXT: DW_AT_comp_dir206# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)207# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]208# POSTCHECK-NEXT: [0x209# POSTCHECK: DW_TAG_subprogram [8]210# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]211# POSTCHECK-NEXT: [0x212# POSTCHECK: DW_TAG_variable [10]213# POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]214# POSTCHECK-NEXT: [0x215# POSTCHECK-NEXT: [0x216# POSTCHECK: DW_TAG_inlined_subroutine [11]217# POSTCHECK-NEXT: DW_AT_abstract_origin218# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]219# POSTCHECK-NEXT: [0x220 221# POSTCHECK-DWO-MAIN: version = 0x0005222# POSTCHECK-DWO-MAIN: DW_TAG_compile_unit223# POSTCHECK-DWO-MAIN: DW_TAG_subprogram [2]224# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000018225# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000007))226# POSTCHECK-DWO-MAIN: DW_TAG_subprogram [8]227# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x0000001c228# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000051))229# POSTCHECK-DWO-MAIN: DW_TAG_formal_parameter [9]230# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000018:231# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_base_addressx (0x0000000000000001)232# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair (0x0000000000000000, 0x0000000000000022): DW_OP_reg5 RDI233# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair (0x0000000000000022, 0x0000000000000051): DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value)234# POSTCHECK-DWO-MAIN: DW_TAG_formal_parameter [9]235# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x1) loclist = 0x00000028:236# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_base_addressx (0x0000000000000001)237# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair (0x0000000000000000, 0x0000000000000027): DW_OP_reg4 RSI238# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair (0x0000000000000027, 0x0000000000000051): DW_OP_entry_value(DW_OP_reg4 RSI), DW_OP_stack_value)239# POSTCHECK-DWO-MAIN: DW_TAG_variable [10]240# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x2) loclist = 0x00000038:241# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_base_addressx (0x0000000000000002)242# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair (0x0000000000000000, 0x0000000000000006): DW_OP_reg5 RDI243# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair (0x0000000000000006, 0x0000000000000046): DW_OP_reg14 R14)244# POSTCHECK-DWO-MAIN: DW_TAG_inlined_subroutine [12]245# POSTCHECK-DWO-MAIN-NEXT: DW_AT_abstract_origin [DW_FORM_ref4]246# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x2) rangelist = 0x00000020247# Encoded as a pair. So it's offset from base address.248# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000003, 0x0000000000000007)249# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000013, 0x0000000000000019))250 251# POSTCHECK-DWO-HELPER1: version = 0x0005252# POSTCHECK-DWO-HELPER1: DW_TAG_subprogram [7]253# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000014254# POSTCHECK-DWO-HELPER1-NEXT: [0x0000000000000000, 0x0000000000000004))255# POSTCHECK-DWO-HELPER1: DW_TAG_variable [9]256# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000010:257# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_base_addressx (0x0000000000000001)258# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_offset_pair (0x0000000000000000, 0x0000000000000003): DW_OP_reg5 RDI259# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_offset_pair (0x0000000000000003, 0x0000000000000004): DW_OP_reg0 RAX)260# POSTCHECK-DWO-HELPER1: DW_TAG_inlined_subroutine [10]261# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_abstract_origin262# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000018263# POSTCHECK-DWO-HELPER1-NEXT: [0x0000000000000000, 0x0000000000000003))264 265## Checking debug line.266 267# POSTCHECK-LINE: debug_line[268# POSTCHECK-LINE: version: 5269# POSTCHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#%.8x,LINE:]]] = "."270# POSTCHECK-LINE-NEXT: file_names[ 0]:271# POSTCHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,LINE:]]] = "main.cpp"272# POSTCHECK-LINE-NEXT: dir_index: 0273# POSTCHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab274 275# POSTCHECK-LINE: debug_line[276# POSTCHECK-LINE: version: 4277# POSTCHECK-LINE: include_directories[ 1] = "/test"278# POSTCHECK-LINE-NEXT: file_names[ 1]:279# POSTCHECK-LINE-NEXT: name: "helper0.cpp"280# POSTCHECK-LINE-NEXT: dir_index: 1281# POSTCHECK-LINE-NEXT: mod_time:282# POSTCHECK-LINE-NEXT: length:283 284# POSTCHECK-LINE: debug_line[285# POSTCHECK-LINE: version: 5286# POSTCHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#%.8x,LINE:]]] = "."287# POSTCHECK-LINE-NEXT: file_names[ 0]:288# POSTCHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,LINE:]]] = "helper1.cpp"289# POSTCHECK-LINE-NEXT: dir_index: 0290# POSTCHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce291 292# POSTCHECK-LINE: debug_line[293# POSTCHECK-LINE: version: 4294# POSTCHECK-LINE: include_directories[ 1] = "/test"295# POSTCHECK-LINE-NEXT: file_names[ 1]:296# POSTCHECK-LINE-NEXT: name: "helper2.cpp"297# POSTCHECK-LINE-NEXT: dir_index: 1298# POSTCHECK-LINE-NEXT: mod_time:299# POSTCHECK-LINE-NEXT: length:300