# REQUIRES: x86 ## Check that group members are retained or discarded as a unit, and ## non-SHF_ALLOC sections in a group are subject to garbage collection, ## if at least one member has the SHF_ALLOC flag. # RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o # RUN: ld.lld --gc-sections %t.o -o %t.dead # RUN: llvm-readobj -S %t.dead | FileCheck %s --check-prefix=CHECK-DEAD ## .mynote.ccc is retained because it is not in a group. # CHECK-DEAD-NOT: Name: .myanote.aaa # CHECK-DEAD-NOT: Name: .mytext.aaa # CHECK-DEAD-NOT: Name: .mybss.aaa # CHECK-DEAD-NOT: Name: .mynote.aaa # CHECK-DEAD-NOT: Name: .myanote.bbb # CHECK-DEAD-NOT: Name: .mytext.bbb # CHECK-DEAD-NOT: Name: .mybss.bbb # CHECK-DEAD-NOT: Name: .mynote.bbb # CHECK-DEAD: Name: .mynote.ccc # RUN: ld.lld --gc-sections %t.o -o %t -e anote_aaa # RUN: llvm-readobj -S %t | FileCheck %s --check-prefix=CHECK-LIVE-GROUP # RUN: ld.lld --gc-sections %t.o -o %t -e aaa # RUN: llvm-readobj -S %t | FileCheck %s --check-prefix=CHECK-LIVE-GROUP # RUN: ld.lld --gc-sections %t.o -o %t -e bss_aaa # RUN: llvm-readobj -S %t | FileCheck %s --check-prefix=CHECK-LIVE-GROUP ## note_zero as the entry point does not make much sense because it is defined ## in a non-SHF_ALLOC section. This is just to demonstrate the behavior. # RUN: ld.lld --gc-sections %t.o -o %t -e note_aaa # RUN: llvm-readobj -S %t | FileCheck %s --check-prefix=CHECK-LIVE-GROUP # CHECK-LIVE-GROUP: Name: .myanote.aaa # CHECK-LIVE-GROUP: Name: .mytext.aaa # CHECK-LIVE-GROUP: Name: .mybss.aaa # CHECK-LIVE-GROUP: Name: .mynote.aaa # CHECK-LIVE-GROUP-NOT: Name: .myanote.bbb # CHECK-LIVE-GROUP-NOT: Name: .mytext.bbb # CHECK-LIVE-GROUP-NOT: Name: .mybss.bbb # CHECK-LIVE-GROUP-NOT: Name: .mynote.bbb # CHECK-LIVE-GROUP: Name: .mynote.ccc # RUN: ld.lld --gc-sections %t.o -o %t -e anote_bbb # RUN: llvm-readobj -S %t | FileCheck %s --check-prefix=CHECK-LIVE-COMDAT # RUN: ld.lld --gc-sections %t.o -o %t -e bbb # RUN: llvm-readobj -S %t | FileCheck %s --check-prefix=CHECK-LIVE-COMDAT # RUN: ld.lld --gc-sections %t.o -o %t -e bss_bbb # RUN: llvm-readobj -S %t | FileCheck %s --check-prefix=CHECK-LIVE-COMDAT ## note_bbb as the entry point does not make much sense because it is defined ## in a non-SHF_ALLOC section. This is just to demonstrate the behavior. # RUN: ld.lld --gc-sections %t.o -o %t -e note_bbb # RUN: llvm-readobj -S %t | FileCheck %s --check-prefix=CHECK-LIVE-COMDAT # CHECK-LIVE-COMDAT-NOT: Name: .myanote.aaa # CHECK-LIVE-COMDAT-NOT: Name: .mytext.aaa # CHECK-LIVE-COMDAT-NOT: Name: .mybss.aaa # CHECK-LIVE-COMDAT-NOT: Name: .mynote.aaa # CHECK-LIVE-COMDAT: Name: .myanote.bbb # CHECK-LIVE-COMDAT: Name: .mytext.bbb # CHECK-LIVE-COMDAT: Name: .mybss.bbb # CHECK-LIVE-COMDAT: Name: .mynote.bbb # CHECK-LIVE-COMDAT: Name: .mynote.ccc ## These sections are in a zero flag group `aaa`. .globl anote_aaa, aaa, bss_aaa, note_aaa .section .myanote.aaa,"aG",@note,aaa anote_aaa: .byte 0 .section .mytext.aaa,"axG",@progbits,aaa aaa: .byte 0 .section .mybss.aaa,"awG",@nobits,aaa bss_aaa: .byte 0 .section .mynote.aaa,"G",@note,aaa note_aaa: .byte 0 ## These sections are in a COMDAT group `bbb`. .globl anote_bbb, bbb, bss_bbb, note_bbb .section .myanote.bbb,"aG",@note,bbb,comdat anote_bbb: .byte 0 .section .mytext.bbb,"axG",@progbits,bbb,comdat bbb: .byte 0 .section .mybss.bbb,"awG",@nobits,bbb,comdat bss_bbb: .byte 0 .section .mynote.bbb,"G",@note,bbb,comdat note_bbb: .byte 0 ## This section isn't in any group. .section .mynote.ccc,"",@note .byte 0