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
84 lines
3.0 KiB
ArmAsm
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
|