| # REQUIRES: x86 |
| ## SHF_GNU_RETAIN is a generic feature defined in the OS specific range. The |
| ## flag marks a section as a GC root. |
| |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o |
| # RUN: ld.lld --gc-sections --print-gc-sections %t.o -o %t | count 0 |
| # RUN: llvm-readobj -hS %t | FileCheck %s |
| # RUN: ld.lld -r -e _start --gc-sections --print-gc-sections %t.o -o %t.ro | count 0 |
| # RUN: llvm-readobj -hS %t.ro | FileCheck %s |
| |
| # CHECK: Name: .retain |
| # CHECK-NEXT: Type: SHT_PROGBITS |
| # CHECK-NEXT: Flags [ |
| # CHECK-NEXT: SHF_ALLOC |
| # CHECK-NEXT: SHF_GNU_RETAIN |
| # CHECK-NEXT: ] |
| |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 --defsym NONALLOC=1 %s -o %t1.o |
| # RUN: not ld.lld --gc-sections %t1.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR |
| |
| # ERR: error: {{.*}}.o:(.nonalloc): sh_link points to discarded section {{.*}}.o:(.discard) |
| |
| .global _start |
| _start: |
| |
| .section .retain,"aR",@progbits |
| .quad .foo |
| |
| .section .foo,"a",@progbits |
| .quad 0 |
| |
| .ifdef NONALLOC |
| .section .discard,"a",@progbits |
| |
| ## With SHF_GNU_RETAIN, .nonalloc is retained while its linked-to section |
| ## .discard is discarded, so there will be an error. |
| .section .nonalloc,"oR",@progbits,.discard |
| .quad .text |
| .endif |