Skip to content

Commit 81cb43f

Browse files
committed
[ORC][MachOPlatform] Don't add InitSectionSymbols for __objc_imageinfo.
The __objc_imageinfo section may be deleted (leaving dangling references to any symbols that it contains), and shouldn't have any dependencies anyway. This patch verifies that the section has no dependencies and then skips the section. rdar://108469243
1 parent 88ed439 commit 81cb43f

File tree

3 files changed

+139
-1
lines changed

3 files changed

+139
-1
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
.section __TEXT,__text,regular,pure_instructions
2+
.build_version macos, 14, 0 sdk_version 14, 0
3+
.p2align 2
4+
"+[Foo foo]":
5+
mov w0, wzr
6+
ret
7+
8+
.section __TEXT,__objc_classname,cstring_literals
9+
l_OBJC_CLASS_NAME_:
10+
.asciz "Foo"
11+
12+
.section __TEXT,__objc_methname,cstring_literals
13+
l_OBJC_METH_VAR_NAME_:
14+
.asciz "foo"
15+
16+
.section __TEXT,__objc_methtype,cstring_literals
17+
l_OBJC_METH_VAR_TYPE_:
18+
.asciz "i16@0:8"
19+
20+
.section __DATA,__objc_const
21+
.p2align 3
22+
__OBJC_$_CLASS_METHODS_Foo:
23+
.long 24
24+
.long 1
25+
.quad l_OBJC_METH_VAR_NAME_
26+
.quad l_OBJC_METH_VAR_TYPE_
27+
.quad "+[Foo foo]"
28+
29+
.p2align 3
30+
__OBJC_METACLASS_RO_$_Foo:
31+
.long 1
32+
.long 40
33+
.long 40
34+
.space 4
35+
.quad 0
36+
.quad l_OBJC_CLASS_NAME_
37+
.quad __OBJC_$_CLASS_METHODS_Foo
38+
.quad 0
39+
.quad 0
40+
.quad 0
41+
.quad 0
42+
43+
.section __DATA,__objc_data
44+
.globl _OBJC_METACLASS_$_Foo
45+
.p2align 3
46+
_OBJC_METACLASS_$_Foo:
47+
.quad _OBJC_METACLASS_$_NSObject
48+
.quad _OBJC_METACLASS_$_NSObject
49+
.quad __objc_empty_cache
50+
.quad 0
51+
.quad __OBJC_METACLASS_RO_$_Foo
52+
53+
.section __DATA,__objc_const
54+
.p2align 3
55+
__OBJC_CLASS_RO_$_Foo:
56+
.long 0
57+
.long 8
58+
.long 8
59+
.space 4
60+
.quad 0
61+
.quad l_OBJC_CLASS_NAME_
62+
.quad 0
63+
.quad 0
64+
.quad 0
65+
.quad 0
66+
.quad 0
67+
68+
.section __DATA,__objc_data
69+
.globl _OBJC_CLASS_$_Foo
70+
.p2align 3
71+
_OBJC_CLASS_$_Foo:
72+
.quad _OBJC_METACLASS_$_Foo
73+
.quad _OBJC_CLASS_$_NSObject
74+
.quad __objc_empty_cache
75+
.quad 0
76+
.quad __OBJC_CLASS_RO_$_Foo
77+
78+
.section __DATA,__objc_classlist,regular,no_dead_strip
79+
.p2align 3
80+
l_OBJC_LABEL_CLASS_$:
81+
.quad _OBJC_CLASS_$_Foo
82+
83+
.section __DATA,__objc_imageinfo,regular,no_dead_strip
84+
L_OBJC_IMAGE_INFO:
85+
.long 0
86+
.long 64
87+
88+
.subsections_via_symbols
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Test that calls to Objective-C methods in other files work.
2+
//
3+
// RUN: %clang -c -o %t.o %s
4+
// RUN: %clang -c -o %t.aux.o %S/Inputs/objc-Foo-foo-class-method.S
5+
// RUN: %llvm_jitlink -preload libobjc.A.dylib %t.o %t.aux.o
6+
7+
.section __TEXT,__text,regular,pure_instructions
8+
.build_version macos, 14, 0 sdk_version 14, 0
9+
.globl _main
10+
.p2align 2
11+
_main:
12+
adrp x8, _OBJC_CLASSLIST_REFERENCES_$_@PAGE
13+
ldr x0, [x8, _OBJC_CLASSLIST_REFERENCES_$_@PAGEOFF]
14+
adrp x8, _OBJC_SELECTOR_REFERENCES_@PAGE
15+
ldr x1, [x8, _OBJC_SELECTOR_REFERENCES_@PAGEOFF]
16+
b _objc_msgSend
17+
18+
.section __DATA,__objc_classrefs,regular,no_dead_strip
19+
.p2align 3, 0x0
20+
_OBJC_CLASSLIST_REFERENCES_$_:
21+
.quad _OBJC_CLASS_$_Foo
22+
23+
.section __TEXT,__objc_methname,cstring_literals
24+
l_OBJC_METH_VAR_NAME_:
25+
.asciz "foo"
26+
27+
.section __DATA,__objc_selrefs,literal_pointers,no_dead_strip
28+
.p2align 3, 0x0
29+
_OBJC_SELECTOR_REFERENCES_:
30+
.quad l_OBJC_METH_VAR_NAME_
31+
32+
.section __DATA,__objc_imageinfo,regular,no_dead_strip
33+
L_OBJC_IMAGE_INFO:
34+
.long 0
35+
.long 64
36+
37+
.subsections_via_symbols

llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -908,21 +908,34 @@ Error MachOPlatform::MachOPlatformPlugin::preserveImportantSections(
908908
// address in the first graph that it appears in, then verify and discard it
909909
// in all subsequent graphs. In this pass we preserve unconditionally -- we'll
910910
// manually throw it away in the processObjCImageInfo pass.
911-
if (auto *ObjCImageInfoSec = G.findSectionByName("__DATA,__objc_imageinfo")) {
911+
if (auto *ObjCImageInfoSec =
912+
G.findSectionByName(MachOObjCImageInfoSectionName)) {
912913
if (ObjCImageInfoSec->blocks_size() != 1)
913914
return make_error<StringError>(
914915
"In " + G.getName() +
915916
"__DATA,__objc_imageinfo contains multiple blocks",
916917
inconvertibleErrorCode());
917918
G.addAnonymousSymbol(**ObjCImageInfoSec->blocks().begin(), 0, 0, false,
918919
true);
920+
921+
for (auto *B : ObjCImageInfoSec->blocks())
922+
if (!B->edges_empty())
923+
return make_error<StringError>("In " + G.getName() + ", " +
924+
MachOObjCImageInfoSectionName +
925+
" contains references to symbols",
926+
inconvertibleErrorCode());
919927
}
920928

921929
// Init sections are important: We need to preserve them and so that their
922930
// addresses can be captured and reported to the ORC runtime in
923931
// registerObjectPlatformSections.
924932
JITLinkSymbolSet InitSectionSymbols;
925933
for (auto &InitSectionName : MachOInitSectionNames) {
934+
// Skip ObjCImageInfo -- this shouldn't have any dependencies, and we may
935+
// remove it later.
936+
if (InitSectionName == MachOObjCImageInfoSectionName)
937+
continue;
938+
926939
// Skip non-init sections.
927940
auto *InitSection = G.findSectionByName(InitSectionName);
928941
if (!InitSection)

0 commit comments

Comments
 (0)