-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[lld-macho][arm64] implement -objc_stubs_small (#78665)
This patch implements `-objc_stubs_small` targeting arm64, aiming to align with ld64's behavior. 1. `-objc_stubs_fast`: As previously implemented, this always uses the Global Offset Table (GOT) to invoke `objc_msgSend`. The alignment of the objc stub is 32 bytes. 2. `-objc_stubs_small`: This behavior depends on whether `objc_msgSend` is defined. If it is, it directly jumps to `objc_msgSend`. If not, it creates another stub to indirectly jump to `objc_msgSend`, minimizing the size. The alignment of the objc stub in this case is 4 bytes.
- Loading branch information
1 parent
291ac25
commit 77e204c
Showing
11 changed files
with
237 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
# REQUIRES: aarch64 | ||
|
||
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %s -o %t.o | ||
# RUN: %lld -arch arm64 -lSystem -U _objc_msgSend -o %t.out %t.o | ||
# RUN: llvm-otool -vs __TEXT __objc_stubs %t.out | FileCheck %s | ||
# RUN: %lld -arch arm64 -lSystem -U _objc_msgSend -o %t.out %t.o -dead_strip | ||
# RUN: llvm-otool -vs __TEXT __objc_stubs %t.out | FileCheck %s | ||
# RUN: %lld -arch arm64 -lSystem -U _objc_msgSend -o %t.out %t.o -objc_stubs_fast | ||
# RUN: llvm-otool -vs __TEXT __objc_stubs %t.out | FileCheck %s | ||
# RUN: %lld -arch arm64 -lSystem -U _objc_msgSend -o %t.out %t.o -objc_stubs_small | ||
# RUN: llvm-otool -vs __TEXT __stubs %t.out | FileCheck %s --check-prefix=STUB | ||
# RUN: llvm-otool -vs __TEXT __objc_stubs %t.out | FileCheck %s --check-prefix=SMALL | ||
|
||
# Unlike arm64-objc-stubs.s, in this test, _objc_msgSend is not defined, | ||
# which usually binds with libobjc.dylib. | ||
# 1. -objc_stubs_fast: No change as it uses GOT. | ||
# 2. -objc_stubs_small: Create a (shared) stub to invoke _objc_msgSend, to minimize the size. | ||
|
||
# CHECK: Contents of (__TEXT,__objc_stubs) section | ||
|
||
# CHECK-NEXT: _objc_msgSend$foo: | ||
# CHECK-NEXT: adrp x1, 8 ; 0x100008000 | ||
# CHECK-NEXT: ldr x1, [x1, #0x10] | ||
# CHECK-NEXT: adrp x16, 4 ; 0x100004000 | ||
# CHECK-NEXT: ldr x16, [x16] | ||
# CHECK-NEXT: br x16 | ||
# CHECK-NEXT: brk #0x1 | ||
# CHECK-NEXT: brk #0x1 | ||
# CHECK-NEXT: brk #0x1 | ||
|
||
# CHECK-NEXT: _objc_msgSend$length: | ||
# CHECK-NEXT: adrp x1, 8 ; 0x100008000 | ||
# CHECK-NEXT: ldr x1, [x1, #0x18] | ||
# CHECK-NEXT: adrp x16, 4 ; 0x100004000 | ||
# CHECK-NEXT: ldr x16, [x16] | ||
# CHECK-NEXT: br x16 | ||
# CHECK-NEXT: brk #0x1 | ||
# CHECK-NEXT: brk #0x1 | ||
# CHECK-NEXT: brk #0x1 | ||
|
||
# CHECK-EMPTY: | ||
|
||
# STUB: Contents of (__TEXT,__stubs) section | ||
# STUB-NEXT: adrp x16, 8 ; 0x100008000 | ||
# STUB-NEXT: ldr x16, [x16] | ||
# STUB-NEXT: br x16 | ||
|
||
# SMALL: Contents of (__TEXT,__objc_stubs) section | ||
# SMALL-NEXT: _objc_msgSend$foo: | ||
# SMALL-NEXT: adrp x1, 8 ; 0x100008000 | ||
# SMALL-NEXT: ldr x1, [x1, #0x18] | ||
# SMALL-NEXT: b | ||
# SMALL-NEXT: _objc_msgSend$length: | ||
# SMALL-NEXT: adrp x1, 8 ; 0x100008000 | ||
# SMALL-NEXT: ldr x1, [x1, #0x20] | ||
# SMALL-NEXT: b | ||
|
||
.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 | ||
|
||
.text | ||
|
||
.globl _main | ||
_main: | ||
bl _objc_msgSend$length | ||
bl _objc_msgSend$foo | ||
bl _objc_msgSend$foo | ||
ret |
Oops, something went wrong.