If a global object is listed in `@llvm.used`, place it in a unique section with the `SHF_GNU_RETAIN` flag. The section is a GC root under `ld --gc-sections` with LLD>=13 or GNU ld>=2.36. For front ends which do not expect to see multiple sections of the same name, consider emitting `@llvm.compiler.used` instead of `@llvm.used`. SHF_GNU_RETAIN is restricted to ELFOSABI_GNU and ELFOSABI_FREEBSD in binutils. We don't do the restriction - see the rationale in D95749. The integrated assembler has supported SHF_GNU_RETAIN since D95730. GNU as>=2.36 supports section flag 'R'. We don't need to worry about GNU ld support because older GNU ld just ignores the unknown SHF_GNU_RETAIN. With this change, `__attribute__((retain))` functions/variables emitted by clang will get the SHF_GNU_RETAIN flag. Differential Revision: https://reviews.llvm.org/D97448
17 lines
567 B
LLVM
17 lines
567 B
LLVM
; RUN: llc < %s | FileCheck %s
|
|
target datalayout = "E-m:e-i64:64-n32:64"
|
|
target triple = "powerpc64--linux"
|
|
|
|
@g = internal constant i8* bitcast (void ()* @f to i8*), section "gsection", align 8
|
|
@h = constant i8* bitcast (void ()* @f to i8*), section "hsection", align 8
|
|
@llvm.used = appending global [2 x i8*] [i8* bitcast (i8** @g to i8*), i8* bitcast (i8** @h to i8*)], section "llvm.metadata"
|
|
|
|
; Function Attrs: nounwind uwtable
|
|
define internal void @f() {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: .section gsection,"awR",@progbits
|
|
; CHECK: .section hsection,"awR",@progbits
|