llvm-project/lld/test/MachO/objc-selrefs.s
Jez Ng 118bfde90a [lld-macho] Have ICF dedup explicitly-defined selrefs
This is what ld64 does (though it doesn't use ICF to do this; instead it
always dedups selrefs by default).

We'll want to dedup implicitly-defined selrefs as well, but I will leave
that for future work.

Additionally, I'm not *super* happy with the current LLD implementation
because I think it is rather janky and inefficient. But at least it
moves us toward the goal of closing the size gap with ld64. I've
described ideas for cleaning up our implementation here:
https://github.com/llvm/llvm-project/issues/57714

Differential Revision: https://reviews.llvm.org/D133780
2022-09-14 17:59:22 -04:00

84 lines
3.0 KiB
ArmAsm

# REQUIRES: aarch64
# RUN: rm -rf %t; split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/explicit-selrefs-1.s -o %t/explicit-selrefs-1.o
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/explicit-selrefs-2.s -o %t/explicit-selrefs-2.o
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/implicit-selrefs.s -o %t/implicit-selrefs.o
# RUN: %lld -dylib -arch arm64 -lSystem -o %t/explicit-only-no-icf \
# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o
# RUN: llvm-otool -vs __DATA __objc_selrefs %t/explicit-only-no-icf | \
# RUN: FileCheck %s --check-prefix=EXPLICIT-NO-ICF
## NOTE: ld64 always dedups the selrefs unconditionally, but we only do it when
## ICF is enabled.
# RUN: %lld -dylib -arch arm64 -lSystem -o %t/explicit-only-with-icf \
# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o
# RUN: llvm-otool -vs __DATA __objc_selrefs %t/explicit-only-with-icf \
# RUN: | FileCheck %s --check-prefix=EXPLICIT-WITH-ICF
# SELREFS: Contents of (__DATA,__objc_selrefs) section
# SELREFS-NEXT: __TEXT:__objc_methname:foo
# SELREFS-NEXT: __TEXT:__objc_methname:bar
# SELREFS-NEXT: __TEXT:__objc_methname:foo
# SELREFS-NEXT: __TEXT:__objc_methname:length
# SELREFS-EMPTY:
## We don't yet support dedup'ing implicitly-defined selrefs.
# RUN: %lld -dylib -arch arm64 -lSystem --icf=all -o %t/explicit-and-implicit \
# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o %t/implicit-selrefs.o
# RUN: llvm-otool -vs __DATA __objc_selrefs %t/explicit-and-implicit \
# RUN: | FileCheck %s --check-prefix=EXPLICIT-AND-IMPLICIT
# EXPLICIT-NO-ICF: Contents of (__DATA,__objc_selrefs) section
# EXPLICIT-NO-ICF-NEXT: __TEXT:__objc_methname:foo
# EXPLICIT-NO-ICF-NEXT: __TEXT:__objc_methname:bar
# EXPLICIT-NO-ICF-NEXT: __TEXT:__objc_methname:bar
# EXPLICIT-NO-ICF-NEXT: __TEXT:__objc_methname:foo
# EXPLICIT-WITH-ICF: Contents of (__DATA,__objc_selrefs) section
# EXPLICIT-WITH-ICF-NEXT: __TEXT:__objc_methname:foo
# EXPLICIT-WITH-ICF-NEXT: __TEXT:__objc_methname:bar
# EXPLICIT-AND-IMPLICIT: Contents of (__DATA,__objc_selrefs) section
# EXPLICIT-AND-IMPLICIT-NEXT: __TEXT:__objc_methname:foo
# EXPLICIT-AND-IMPLICIT-NEXT: __TEXT:__objc_methname:bar
# NOTE: Ideally this wouldn't exist, but while it does it needs to point to the deduplicated string
# EXPLICIT-AND-IMPLICIT-NEXT: __TEXT:__objc_methname:foo
# EXPLICIT-AND-IMPLICIT-NEXT: __TEXT:__objc_methname:length
#--- explicit-selrefs-1.s
.section __TEXT,__objc_methname,cstring_literals
lselref1:
.asciz "foo"
lselref2:
.asciz "bar"
.section __DATA,__objc_selrefs,literal_pointers,no_dead_strip
.p2align 3
.quad lselref1
.quad lselref2
.quad lselref2
#--- explicit-selrefs-2.s
.section __TEXT,__objc_methname,cstring_literals
lselref1:
.asciz "foo"
.section __DATA,__objc_selrefs,literal_pointers,no_dead_strip
.p2align 3
.quad lselref1
#--- implicit-selrefs.s
.text
.globl _objc_msgSend
.p2align 2
_objc_msgSend:
ret
.p2align 2
_sender:
bl _objc_msgSend$length
bl _objc_msgSend$foo
ret