From c5bee3212b099b345e5f49ebab53d43874cd826e Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Mon, 15 May 2017 17:53:26 +0000 Subject: [PATCH] ELF: --gdb-index: Do not add dead sections to the address area. Fixes PR33032. Differential Revision: https://reviews.llvm.org/D33175 llvm-svn: 303088 --- lld/ELF/SyntheticSections.cpp | 2 +- lld/test/ELF/gdb-index-gc-sections.s | 157 +++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/gdb-index-gc-sections.s diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 3eebc4e..a42d158 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -1704,7 +1704,7 @@ readCuList(DWARFContext &Dwarf, InputSection *Sec) { static InputSectionBase *findSection(ArrayRef Arr, uint64_t Offset) { for (InputSectionBase *S : Arr) - if (S && S != &InputSection::Discarded) + if (S && S != &InputSection::Discarded && S->Live) if (Offset >= S->getOffsetInFile() && Offset < S->getOffsetInFile() + S->getSize()) return S; diff --git a/lld/test/ELF/gdb-index-gc-sections.s b/lld/test/ELF/gdb-index-gc-sections.s new file mode 100644 index 0000000..70a1475 --- /dev/null +++ b/lld/test/ELF/gdb-index-gc-sections.s @@ -0,0 +1,157 @@ +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux -o %t %s +# RUN: ld.lld --gdb-index --gc-sections -o %t2 %t +# RUN: llvm-dwarfdump -debug-dump=gdb_index %t2 | FileCheck %s + +# CHECK: Address area offset = 0x28, has 1 entries: +# CHECK-NEXT: Low/High address = [0x201000, 0x201001) (Size: 0x1), CU id = 0 + +# Generated with: (clang r302976) +# echo "void _start() {} void dead() {}" | \ +# clang -Os -g -S -ffunction-sections -o gdb-index-gc-sections.s -x c - -Xclang -fdebug-compilation-dir -Xclang . + + .text + .file "-" + .section .text._start,"ax",@progbits + .globl _start + .type _start,@function +_start: # @_start +.Lfunc_begin0: + .file 1 "" + .loc 1 1 0 # :1:0 + .cfi_startproc +# BB#0: # %entry + .loc 1 1 16 prologue_end # :1:16 + retq +.Ltmp0: +.Lfunc_end0: + .size _start, .Lfunc_end0-_start + .cfi_endproc + + .section .text.dead,"ax",@progbits + .globl dead + .type dead,@function +dead: # @dead +.Lfunc_begin1: + .loc 1 1 0 # :1:0 + .cfi_startproc +# BB#0: # %entry + .loc 1 1 31 prologue_end # :1:31 + retq +.Ltmp1: +.Lfunc_end1: + .size dead, .Lfunc_end1-dead + .cfi_endproc + + .section .debug_str,"MS",@progbits,1 +.Linfo_string0: + .asciz "clang version 5.0.0 " # string offset=0 +.Linfo_string1: + .asciz "-" # string offset=21 +.Linfo_string2: + .asciz "." # string offset=23 +.Linfo_string3: + .asciz "_start" # string offset=25 +.Linfo_string4: + .asciz "dead" # string offset=32 + .section .debug_loc,"",@progbits + .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 14 # DW_FORM_strp + .byte 19 # DW_AT_language + .byte 5 # DW_FORM_data2 + .byte 3 # DW_AT_name + .byte 14 # DW_FORM_strp + .byte 16 # DW_AT_stmt_list + .byte 23 # DW_FORM_sec_offset + .byte 27 # DW_AT_comp_dir + .byte 14 # DW_FORM_strp + .byte 17 # DW_AT_low_pc + .byte 1 # DW_FORM_addr + .byte 85 # DW_AT_ranges + .byte 23 # DW_FORM_sec_offset + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 2 # Abbreviation Code + .byte 46 # DW_TAG_subprogram + .byte 0 # DW_CHILDREN_no + .byte 17 # DW_AT_low_pc + .byte 1 # DW_FORM_addr + .byte 18 # DW_AT_high_pc + .byte 6 # DW_FORM_data4 + .byte 64 # DW_AT_frame_base + .byte 24 # DW_FORM_exprloc + .byte 3 # DW_AT_name + .byte 14 # DW_FORM_strp + .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 0 # EOM(3) + .section .debug_info,"",@progbits +.Lcu_begin0: + .long 81 # Length of Unit + .short 4 # DWARF version number + .long .debug_abbrev # Offset Into Abbrev. Section + .byte 8 # Address Size (in bytes) + .byte 1 # Abbrev [1] 0xb:0x4a DW_TAG_compile_unit + .long .Linfo_string0 # DW_AT_producer + .short 12 # DW_AT_language + .long .Linfo_string1 # DW_AT_name + .long .Lline_table_start0 # DW_AT_stmt_list + .long .Linfo_string2 # DW_AT_comp_dir + .quad 0 # DW_AT_low_pc + .long .Ldebug_ranges0 # DW_AT_ranges + .byte 2 # Abbrev [2] 0x2a:0x15 DW_TAG_subprogram + .quad .Lfunc_begin0 # DW_AT_low_pc + .long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc + .byte 1 # DW_AT_frame_base + .byte 87 + .long .Linfo_string3 # DW_AT_name + .byte 1 # DW_AT_decl_file + .byte 1 # DW_AT_decl_line + # DW_AT_external + .byte 2 # Abbrev [2] 0x3f:0x15 DW_TAG_subprogram + .quad .Lfunc_begin1 # DW_AT_low_pc + .long .Lfunc_end1-.Lfunc_begin1 # DW_AT_high_pc + .byte 1 # DW_AT_frame_base + .byte 87 + .long .Linfo_string4 # DW_AT_name + .byte 1 # DW_AT_decl_file + .byte 1 # DW_AT_decl_line + # DW_AT_external + .byte 0 # End Of Children Mark + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .quad .Lfunc_begin0 + .quad .Lfunc_end0 + .quad .Lfunc_begin1 + .quad .Lfunc_end1 + .quad 0 + .quad 0 + .section .debug_macinfo,"",@progbits +.Lcu_macro_begin0: + .byte 0 # End Of Macro List Mark + .section .debug_pubnames,"",@progbits + .long .LpubNames_end0-.LpubNames_begin0 # Length of Public Names Info +.LpubNames_begin0: + .short 2 # DWARF Version + .long .Lcu_begin0 # Offset of Compilation Unit Info + .long 85 # Compilation Unit Length + .long 42 # DIE offset + .asciz "_start" # External Name + .long 63 # DIE offset + .asciz "dead" # External Name + .long 0 # End Mark +.LpubNames_end0: + + .ident "clang version 5.0.0 " + .section ".note.GNU-stack","",@progbits + .section .debug_line,"",@progbits +.Lline_table_start0: -- 2.7.4