Skip to content

Commit fb979de

Browse files
author
Alex B
committed
Address feedback nr.1
1 parent 1d28d05 commit fb979de

File tree

2 files changed

+365
-2
lines changed

2 files changed

+365
-2
lines changed

lld/MachO/ObjC.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,8 @@ ObjcCategoryMerger::tryGetSymbolAtIsecOffset(const ConcatInputSection *isec,
574574
Defined *definedSym = cast<Defined>(sym);
575575
sym = tryFindDefinedOnIsec(definedSym->isec(),
576576
definedSym->value + reloc->addend);
577+
578+
auto *defSym = dyn_cast<Defined>(sym);
577579
}
578580

579581
return sym;
@@ -1307,8 +1309,12 @@ void ObjcCategoryMerger::eraseMergedCategories() {
13071309
continue;
13081310

13091311
eraseISec(catInfo.catBodyIsec);
1310-
1311-
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec, catLayout.nameOffset);
1312+
// We can't erase 'catLayout.nameOffset' for Swift categories because the
1313+
// name will be referenced for generating relative offsets
1314+
// See usages of 'l_.str.11.SimpleClass' in objc-category-merging-swift.s
1315+
// TODO: handle the above in a smarter way
1316+
if (catInfo.sourceLanguage != SourceLanguage::Swift)
1317+
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec, catLayout.nameOffset);
13121318
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec,
13131319
catLayout.instanceMethodsOffset);
13141320
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec,
Lines changed: 357 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,357 @@
1+
# REQUIRES: aarch64
2+
# RUN: rm -rf %t; mkdir %t && cd %t
3+
4+
############ Test merging multiple categories into a single category ############
5+
## Apply category merging to swiftc code just make sure we can handle addends
6+
## and don't erase cateogry names for swift -- in order to not crash
7+
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o cat_swift.o %s
8+
# RUN: %lld -arch arm64 -dylib -o cat_swift.dylib cat_swift.o -objc_category_merging
9+
10+
; ================== Generated from Swift: ==================
11+
;; > xcrun swiftc -S SimpleClass.swift -o SimpleClass.s
12+
; import Foundation
13+
; @objc class SimpleClass: NSObject {
14+
; @objc func baseClassInstanceMethod() -> Int32 {
15+
; return 2
16+
; }
17+
; }
18+
; extension SimpleClass {
19+
; @objc func categoryInstanceMethod() -> Int {
20+
; return 3
21+
; }
22+
; }
23+
24+
; ================== Generated from Swift: ==================
25+
.section __TEXT,__text,regular,pure_instructions
26+
.build_version macos, 11, 0 sdk_version 12, 0
27+
.globl _main
28+
.p2align 2
29+
_main:
30+
.cfi_startproc
31+
mov w0, #0
32+
ret
33+
.cfi_endproc
34+
35+
.private_extern _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF
36+
.globl _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF
37+
.p2align 2
38+
_$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF:
39+
.cfi_startproc
40+
ret
41+
.cfi_endproc
42+
43+
.p2align 2
44+
_$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTo:
45+
.cfi_startproc
46+
ret
47+
.cfi_endproc
48+
49+
.private_extern _$s11SimpleClassAACABycfC
50+
.globl _$s11SimpleClassAACABycfC
51+
.p2align 2
52+
_$s11SimpleClassAACABycfC:
53+
.cfi_startproc
54+
ret
55+
.cfi_endproc
56+
57+
.private_extern _$s11SimpleClassAACABycfc
58+
.globl _$s11SimpleClassAACABycfc
59+
.p2align 2
60+
_$s11SimpleClassAACABycfc:
61+
.cfi_startproc
62+
ret
63+
.cfi_endproc
64+
65+
.private_extern _$s11SimpleClassAACMa
66+
.globl _$s11SimpleClassAACMa
67+
.p2align 2
68+
_$s11SimpleClassAACMa:
69+
ret
70+
71+
.p2align 2
72+
_$s11SimpleClassAACABycfcTo:
73+
.cfi_startproc
74+
ret
75+
.cfi_endproc
76+
77+
.private_extern _$s11SimpleClassAACfD
78+
.globl _$s11SimpleClassAACfD
79+
.p2align 2
80+
_$s11SimpleClassAACfD:
81+
.cfi_startproc
82+
ret
83+
.cfi_endproc
84+
85+
.private_extern _$s11SimpleClassAAC22categoryInstanceMethodSiyF
86+
.globl _$s11SimpleClassAAC22categoryInstanceMethodSiyF
87+
.p2align 2
88+
_$s11SimpleClassAAC22categoryInstanceMethodSiyF:
89+
.cfi_startproc
90+
ret
91+
.cfi_endproc
92+
93+
.p2align 2
94+
_$s11SimpleClassAAC22categoryInstanceMethodSiyFTo:
95+
.cfi_startproc
96+
ret
97+
.cfi_endproc
98+
99+
.section __TEXT,__objc_methname,cstring_literals
100+
"L_selector_data(init)":
101+
.asciz "init"
102+
103+
.section __DATA,__objc_selrefs,literal_pointers,no_dead_strip
104+
.p2align 3, 0x0
105+
"L_selector(init)":
106+
.quad "L_selector_data(init)"
107+
108+
.section __TEXT,__objc_methname,cstring_literals
109+
"L_selector_data(dealloc)":
110+
.asciz "dealloc"
111+
112+
.section __DATA,__objc_selrefs,literal_pointers,no_dead_strip
113+
.p2align 3, 0x0
114+
"L_selector(dealloc)":
115+
.quad "L_selector_data(dealloc)"
116+
117+
.section __TEXT,__swift5_entry,regular,no_dead_strip
118+
.p2align 2, 0x0
119+
l_entry_point:
120+
.long _main-l_entry_point
121+
.long 0
122+
123+
.private_extern _OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass
124+
.section __DATA,__data
125+
.globl _OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass
126+
.p2align 3, 0x0
127+
_OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass:
128+
.quad _OBJC_METACLASS_$_NSObject
129+
.quad _OBJC_METACLASS_$_NSObject
130+
.quad __objc_empty_cache
131+
.quad 0
132+
.quad __METACLASS_DATA__TtC11SimpleClass11SimpleClass
133+
134+
.section __TEXT,__cstring,cstring_literals
135+
.p2align 4, 0x0
136+
l_.str.30._TtC11SimpleClass11SimpleClass:
137+
.asciz "_TtC11SimpleClass11SimpleClass"
138+
139+
.section __DATA,__objc_const
140+
.p2align 3, 0x0
141+
__METACLASS_DATA__TtC11SimpleClass11SimpleClass:
142+
.long 129
143+
.long 40
144+
.long 40
145+
.long 0
146+
.quad 0
147+
.quad l_.str.30._TtC11SimpleClass11SimpleClass
148+
.quad 0
149+
.quad 0
150+
.quad 0
151+
.quad 0
152+
.quad 0
153+
154+
.section __TEXT,__objc_methname,cstring_literals
155+
"L_selector_data(baseClassInstanceMethod)":
156+
.asciz "baseClassInstanceMethod"
157+
158+
.section __TEXT,__cstring,cstring_literals
159+
"l_.str.7.i16@0:8":
160+
.asciz "i16@0:8"
161+
162+
"l_.str.7.@16@0:8":
163+
.asciz "@16@0:8"
164+
165+
.section __DATA,__objc_data
166+
.p2align 3, 0x0
167+
__INSTANCE_METHODS__TtC11SimpleClass11SimpleClass:
168+
.long 24
169+
.long 2
170+
.quad "L_selector_data(baseClassInstanceMethod)"
171+
.quad "l_.str.7.i16@0:8"
172+
.quad _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTo
173+
.quad "L_selector_data(init)"
174+
.quad "l_.str.7.@16@0:8"
175+
.quad _$s11SimpleClassAACABycfcTo
176+
177+
.p2align 3, 0x0
178+
__DATA__TtC11SimpleClass11SimpleClass:
179+
.long 128
180+
.long 8
181+
.long 8
182+
.long 0
183+
.quad 0
184+
.quad l_.str.30._TtC11SimpleClass11SimpleClass
185+
.quad __INSTANCE_METHODS__TtC11SimpleClass11SimpleClass
186+
.quad 0
187+
.quad 0
188+
.quad 0
189+
.quad 0
190+
191+
.section __TEXT,__const
192+
l_.str.11.SimpleClass:
193+
.asciz "SimpleClass"
194+
195+
.private_extern _$s11SimpleClassMXM
196+
.section __TEXT,__constg_swiftt
197+
.globl _$s11SimpleClassMXM
198+
.weak_definition _$s11SimpleClassMXM
199+
.p2align 2, 0x0
200+
_$s11SimpleClassMXM:
201+
.long 0
202+
.long 0
203+
.long (l_.str.11.SimpleClass-_$s11SimpleClassMXM)-8
204+
205+
.private_extern "_symbolic So8NSObjectC"
206+
.section __TEXT,__swift5_typeref
207+
.globl "_symbolic So8NSObjectC"
208+
.weak_definition "_symbolic So8NSObjectC"
209+
.p2align 1, 0x0
210+
"_symbolic So8NSObjectC":
211+
.ascii "So8NSObjectC"
212+
.byte 0
213+
214+
.private_extern _$s11SimpleClassAACMn
215+
.section __TEXT,__constg_swiftt
216+
.globl _$s11SimpleClassAACMn
217+
.p2align 2, 0x0
218+
_$s11SimpleClassAACMn:
219+
.long 2147483728
220+
.long (_$s11SimpleClassMXM-_$s11SimpleClassAACMn)-4
221+
.long (l_.str.11.SimpleClass-_$s11SimpleClassAACMn)-8
222+
.long (_$s11SimpleClassAACMa-_$s11SimpleClassAACMn)-12
223+
.long (_$s11SimpleClassAACMF-_$s11SimpleClassAACMn)-16
224+
.long ("_symbolic So8NSObjectC"-_$s11SimpleClassAACMn)-20
225+
.long 3
226+
.long 11
227+
.long 1
228+
.long 0
229+
.long 10
230+
.long 10
231+
.long 1
232+
.long 16
233+
.long (_$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF-_$s11SimpleClassAACMn)-56
234+
235+
.section __DATA,__objc_data
236+
.p2align 3, 0x0
237+
_$s11SimpleClassAACMf:
238+
.quad 0
239+
.quad _$s11SimpleClassAACfD
240+
.quad _$sBOWV
241+
.quad _OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass
242+
.quad _OBJC_CLASS_$_NSObject
243+
.quad __objc_empty_cache
244+
.quad 0
245+
.quad __DATA__TtC11SimpleClass11SimpleClass+2
246+
.long 0
247+
.long 0
248+
.long 8
249+
.short 7
250+
.short 0
251+
.long 112
252+
.long 24
253+
.quad _$s11SimpleClassAACMn
254+
.quad 0
255+
.quad _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF
256+
257+
.private_extern "_symbolic _____ 11SimpleClassAAC"
258+
.section __TEXT,__swift5_typeref
259+
.globl "_symbolic _____ 11SimpleClassAAC"
260+
.weak_definition "_symbolic _____ 11SimpleClassAAC"
261+
.p2align 1, 0x0
262+
"_symbolic _____ 11SimpleClassAAC":
263+
.byte 1
264+
.long (_$s11SimpleClassAACMn-"_symbolic _____ 11SimpleClassAAC")-1
265+
.byte 0
266+
267+
.section __TEXT,__swift5_fieldmd
268+
.p2align 2, 0x0
269+
_$s11SimpleClassAACMF:
270+
.long "_symbolic _____ 11SimpleClassAAC"-_$s11SimpleClassAACMF
271+
.long ("_symbolic So8NSObjectC"-_$s11SimpleClassAACMF)-4
272+
.short 7
273+
.short 12
274+
.long 0
275+
276+
.section __TEXT,__objc_methname,cstring_literals
277+
"L_selector_data(categoryInstanceMethod)":
278+
.asciz "categoryInstanceMethod"
279+
280+
.section __TEXT,__cstring,cstring_literals
281+
"l_.str.7.q16@0:8":
282+
.asciz "q16@0:8"
283+
284+
.section __DATA,__objc_data
285+
.p2align 3, 0x0
286+
__CATEGORY_INSTANCE_METHODS__TtC11SimpleClass11SimpleClass_$_SimpleClass:
287+
.long 24
288+
.long 1
289+
.quad "L_selector_data(categoryInstanceMethod)"
290+
.quad "l_.str.7.q16@0:8"
291+
.quad _$s11SimpleClassAAC22categoryInstanceMethodSiyFTo
292+
293+
.section __DATA,__objc_const
294+
.p2align 3, 0x0
295+
__CATEGORY__TtC11SimpleClass11SimpleClass_$_SimpleClass:
296+
.quad l_.str.11.SimpleClass
297+
.quad _$s11SimpleClassAACMf+24
298+
.quad __CATEGORY_INSTANCE_METHODS__TtC11SimpleClass11SimpleClass_$_SimpleClass
299+
.quad 0
300+
.quad 0
301+
.quad 0
302+
.quad 0
303+
.long 60
304+
.space 4
305+
306+
.section __TEXT,__swift5_types
307+
.p2align 2, 0x0
308+
l_$s11SimpleClassAACHn:
309+
.long _$s11SimpleClassAACMn-l_$s11SimpleClassAACHn
310+
311+
.private_extern ___swift_reflection_version
312+
.section __TEXT,__const
313+
.globl ___swift_reflection_version
314+
.weak_definition ___swift_reflection_version
315+
.p2align 1, 0x0
316+
___swift_reflection_version:
317+
.short 3
318+
319+
.section __DATA,__objc_classlist,regular,no_dead_strip
320+
.p2align 3, 0x0
321+
_objc_classes_$s11SimpleClassAACN:
322+
.quad _$s11SimpleClassAACN
323+
324+
.section __DATA,__objc_catlist,regular,no_dead_strip
325+
.p2align 3, 0x0
326+
_objc_categories:
327+
.quad __CATEGORY__TtC11SimpleClass11SimpleClass_$_SimpleClass
328+
329+
.no_dead_strip _main
330+
.no_dead_strip l_entry_point
331+
.no_dead_strip _$s11SimpleClassAACMF
332+
.no_dead_strip l_$s11SimpleClassAACHn
333+
.no_dead_strip ___swift_reflection_version
334+
.no_dead_strip _objc_classes_$s11SimpleClassAACN
335+
.no_dead_strip _objc_categories
336+
.section __DATA,__objc_imageinfo,regular,no_dead_strip
337+
L_OBJC_IMAGE_INFO:
338+
.long 0
339+
.long 100665152
340+
341+
.globl _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTq
342+
.private_extern _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTq
343+
.alt_entry _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTq
344+
.set _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTq, _$s11SimpleClassAACMn+52
345+
.globl _$s11SimpleClassAACN
346+
.private_extern _$s11SimpleClassAACN
347+
.alt_entry _$s11SimpleClassAACN
348+
.set _$s11SimpleClassAACN, _$s11SimpleClassAACMf+24
349+
.globl _OBJC_CLASS_$__TtC11SimpleClass11SimpleClass
350+
.private_extern _OBJC_CLASS_$__TtC11SimpleClass11SimpleClass
351+
.subsections_via_symbols
352+
353+
_OBJC_CLASS_$_NSObject:
354+
_OBJC_METACLASS_$_NSObject:
355+
__objc_empty_cache:
356+
_$sBOWV:
357+
.quad 0

0 commit comments

Comments
 (0)