[PATCH] D30964: [ELF] Restore GC handling of LINK_ORDER, C-named sections
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 16 16:57:55 PDT 2017
LGTM
Evgeniy Stepanov via Phabricator <reviews at reviews.llvm.org> writes:
> eugenis updated this revision to Diff 92049.
> eugenis added a comment.
>
> Extend the test case with a check for __start_yy.
>
>
> Repository:
> rL LLVM
>
> https://reviews.llvm.org/D30964
>
> Files:
> ELF/MarkLive.cpp
> test/ELF/gc-sections-metadata-startstop.s
>
>
> Index: test/ELF/gc-sections-metadata-startstop.s
> ===================================================================
> --- /dev/null
> +++ test/ELF/gc-sections-metadata-startstop.s
> @@ -0,0 +1,33 @@
> +# LINK_ORDER cnamed sections are not kept alive by the __start_* reference.
> +# REQUIRES: x86
> +
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
> +# RUN: ld.lld --gc-sections %t.o -o %t
> +# RUN: llvm-objdump -section-headers -t %t | FileCheck %s
> +
> +# CHECK: Sections:
> +# CHECK-NOT: yy
> +# CHECK: xx {{.*}} DATA
> +# CHECK-NOT: yy
> +
> +# CHECK: SYMBOL TABLE:
> +# CHECK: xx 00000000 __start_xx
> +# CHECK: w *UND* 00000000 __start_yy
> +
> +.weak __start_xx
> +.weak __start_yy
> +
> +.global _start
> +_start:
> +.quad __start_xx
> +.quad __start_yy
> +
> +.section xx,"a"
> +.quad 0
> +
> +.section .foo,"a"
> +.quad 0
> +
> +.section yy,"am", at progbits,.foo
> +.quad 0
> +
> Index: ELF/MarkLive.cpp
> ===================================================================
> --- ELF/MarkLive.cpp
> +++ ELF/MarkLive.cpp
> @@ -175,9 +175,6 @@
> case SHT_PREINIT_ARRAY:
> return true;
> default:
> - if (Sec->Flags & SHF_LINK_ORDER)
> - return false;
> -
> if (!(Sec->Flags & SHF_ALLOC))
> return true;
>
> @@ -247,6 +244,8 @@
> // referred by .eh_frame here.
> if (auto *EH = dyn_cast_or_null<EhInputSection>(Sec))
> scanEhFrameSection<ELFT>(*EH, Enqueue);
> + if (Sec->Flags & SHF_LINK_ORDER)
> + continue;
> if (isReserved<ELFT>(Sec) || Script<ELFT>::X->shouldKeep(Sec))
> Enqueue({Sec, 0});
> else if (isValidCIdentifier(Sec->Name)) {
>
>
> Index: test/ELF/gc-sections-metadata-startstop.s
> ===================================================================
> --- /dev/null
> +++ test/ELF/gc-sections-metadata-startstop.s
> @@ -0,0 +1,33 @@
> +# LINK_ORDER cnamed sections are not kept alive by the __start_* reference.
> +# REQUIRES: x86
> +
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
> +# RUN: ld.lld --gc-sections %t.o -o %t
> +# RUN: llvm-objdump -section-headers -t %t | FileCheck %s
> +
> +# CHECK: Sections:
> +# CHECK-NOT: yy
> +# CHECK: xx {{.*}} DATA
> +# CHECK-NOT: yy
> +
> +# CHECK: SYMBOL TABLE:
> +# CHECK: xx 00000000 __start_xx
> +# CHECK: w *UND* 00000000 __start_yy
> +
> +.weak __start_xx
> +.weak __start_yy
> +
> +.global _start
> +_start:
> +.quad __start_xx
> +.quad __start_yy
> +
> +.section xx,"a"
> +.quad 0
> +
> +.section .foo,"a"
> +.quad 0
> +
> +.section yy,"am", at progbits,.foo
> +.quad 0
> +
> Index: ELF/MarkLive.cpp
> ===================================================================
> --- ELF/MarkLive.cpp
> +++ ELF/MarkLive.cpp
> @@ -175,9 +175,6 @@
> case SHT_PREINIT_ARRAY:
> return true;
> default:
> - if (Sec->Flags & SHF_LINK_ORDER)
> - return false;
> -
> if (!(Sec->Flags & SHF_ALLOC))
> return true;
>
> @@ -247,6 +244,8 @@
> // referred by .eh_frame here.
> if (auto *EH = dyn_cast_or_null<EhInputSection>(Sec))
> scanEhFrameSection<ELFT>(*EH, Enqueue);
> + if (Sec->Flags & SHF_LINK_ORDER)
> + continue;
> if (isReserved<ELFT>(Sec) || Script<ELFT>::X->shouldKeep(Sec))
> Enqueue({Sec, 0});
> else if (isValidCIdentifier(Sec->Name)) {
More information about the llvm-commits
mailing list