Skip to content

Commit c5e125c

Browse files
author
Alex B
committed
Address Feedback nr.2
1 parent 2d60e4e commit c5e125c

File tree

2 files changed

+255
-19
lines changed

2 files changed

+255
-19
lines changed

lld/MachO/ObjC.cpp

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -382,9 +382,18 @@ class ObjcCategoryMerger {
382382
// Information about a pointer list in the original categories or class(method
383383
// lists, protocol lists, etc)
384384
struct PointerListInfo {
385+
PointerListInfo() = default;
386+
PointerListInfo(const PointerListInfo &) = default;
385387
PointerListInfo(const char *_categoryPrefix, uint32_t _pointersPerStruct)
386388
: categoryPrefix(_categoryPrefix),
387389
pointersPerStruct(_pointersPerStruct) {}
390+
391+
inline bool operator==(const PointerListInfo &cmp) {
392+
return pointersPerStruct == cmp.pointersPerStruct &&
393+
structSize == cmp.structSize && structCount == cmp.structCount &&
394+
allPtrs == cmp.allPtrs;
395+
}
396+
388397
const char *categoryPrefix;
389398

390399
uint32_t pointersPerStruct = 0;
@@ -449,6 +458,9 @@ class ObjcCategoryMerger {
449458
void parseProtocolListInfo(const ConcatInputSection *isec, uint32_t secOffset,
450459
PointerListInfo &ptrList);
451460

461+
PointerListInfo parseProtocolListInfo(const ConcatInputSection *isec,
462+
uint32_t secOffset);
463+
452464
void parsePointerListInfo(const ConcatInputSection *isec, uint32_t secOffset,
453465
PointerListInfo &ptrList);
454466

@@ -690,6 +702,15 @@ void ObjcCategoryMerger::parseProtocolListInfo(const ConcatInputSection *isec,
690702
"Protocol list end offset does not match expected size");
691703
}
692704

705+
// Parse a protocol list and return the PointerListInfo for it
706+
ObjcCategoryMerger::PointerListInfo
707+
ObjcCategoryMerger::parseProtocolListInfo(const ConcatInputSection *isec,
708+
uint32_t secOffset) {
709+
PointerListInfo ptrList;
710+
parseProtocolListInfo(isec, secOffset, ptrList);
711+
return ptrList;
712+
}
713+
693714
// Parse a pointer list that might be linked to ConcatInputSection at a given
694715
// offset. This can be used for instance methods, class methods, instance props
695716
// and class props since they have the same format.
@@ -1355,18 +1376,26 @@ void ObjcCategoryMerger::mergeCategoriesIntoBaseClass(
13551376

13561377
// Now collect the info from the base class from the various lists in the
13571378
// class metadata
1379+
1380+
// Protocol lists are a special case - the same protocol list is in classRo
1381+
// and metaRo, so we only need to parse it once
13581382
parseProtocolListInfo(classIsec, roClassLayout.baseProtocolsOffset,
13591383
extInfo.protocols);
13601384

1385+
// Check that the classRo and metaRo protocol lists are identical
1386+
assert(
1387+
parseProtocolListInfo(classIsec, roClassLayout.baseProtocolsOffset) ==
1388+
parseProtocolListInfo(metaIsec, roClassLayout.baseProtocolsOffset) &&
1389+
"Category merger expects classRo and metaRo to have the same protocol "
1390+
"list");
1391+
13611392
parsePointerListInfo(metaIsec, roClassLayout.baseMethodsOffset,
13621393
extInfo.classMethods);
1363-
1364-
parsePointerListInfo(metaIsec, roClassLayout.basePropertiesOffset,
1365-
extInfo.classProps);
1366-
13671394
parsePointerListInfo(classIsec, roClassLayout.baseMethodsOffset,
13681395
extInfo.instanceMethods);
13691396

1397+
parsePointerListInfo(metaIsec, roClassLayout.basePropertiesOffset,
1398+
extInfo.classProps);
13701399
parsePointerListInfo(classIsec, roClassLayout.basePropertiesOffset,
13711400
extInfo.instanceProps);
13721401

@@ -1379,26 +1408,23 @@ void ObjcCategoryMerger::mergeCategoriesIntoBaseClass(
13791408
eraseSymbolAtIsecOffset(classIsec, roClassLayout.basePropertiesOffset);
13801409

13811410
// Emit the newly merged lists - first into the meta RO then into the class RO
1411+
// First we emit and link the protocol list into the meta RO. Then we link it
1412+
// in the classRo as well (they're supposed to be identical)
1413+
if (Defined *protoListSym =
1414+
emitAndLinkProtocolList(metaRo, roClassLayout.baseProtocolsOffset,
1415+
extInfo, extInfo.protocols)) {
1416+
createSymbolReference(classRo, protoListSym,
1417+
roClassLayout.baseProtocolsOffset,
1418+
infoCategoryWriter.catBodyInfo.relocTemplate);
1419+
}
1420+
13821421
emitAndLinkPointerList(metaRo, roClassLayout.baseMethodsOffset, extInfo,
13831422
extInfo.classMethods);
1384-
1385-
// Protocols are a special case - the single list is referenced by both the
1386-
// class RO and meta RO. Here we emit it and link it into the meta RO
1387-
Defined *protoListSym = emitAndLinkProtocolList(
1388-
metaRo, roClassLayout.baseProtocolsOffset, extInfo, extInfo.protocols);
1389-
1390-
emitAndLinkPointerList(metaRo, roClassLayout.basePropertiesOffset, extInfo,
1391-
extInfo.classProps);
1392-
13931423
emitAndLinkPointerList(classRo, roClassLayout.baseMethodsOffset, extInfo,
13941424
extInfo.instanceMethods);
13951425

1396-
// If we emitted a new protocol list, link it to the class RO also
1397-
if (protoListSym) {
1398-
createSymbolReference(classRo, protoListSym,
1399-
roClassLayout.baseProtocolsOffset,
1400-
infoCategoryWriter.catBodyInfo.relocTemplate);
1401-
}
1426+
emitAndLinkPointerList(metaRo, roClassLayout.basePropertiesOffset, extInfo,
1427+
extInfo.classProps);
14021428

14031429
emitAndLinkPointerList(classRo, roClassLayout.basePropertiesOffset, extInfo,
14041430
extInfo.instanceProps);

lld/test/MachO/objc-category-merging-complete-test.s

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# REQUIRES: aarch64
22
# RUN: rm -rf %t; split-file %s %t && cd %t
33

4+
############ Test merging multiple categories into a single category ############
45
## Create a dylib to link against(a64_file1.dylib) and merge categories in the main binary (file2_merge_a64.exe)
56
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o a64_file1.o a64_file1.s
67
# RUN: %lld -arch arm64 a64_file1.o -o a64_file1.dylib -dylib
@@ -12,6 +13,10 @@
1213
# RUN: llvm-objdump --objc-meta-data --macho a64_file2_no_merge.exe | FileCheck %s --check-prefixes=NO_MERGE_CATS
1314
# RUN: llvm-objdump --objc-meta-data --macho a64_file2_merge.exe | FileCheck %s --check-prefixes=MERGE_CATS
1415

16+
############ Test merging multiple categories into the base class ############
17+
# RUN: %lld -arch arm64 -o a64_file2_merge_into_class.exe -objc_category_merging a64_file1.o a64_file2.o
18+
# RUN: llvm-objdump --objc-meta-data --macho a64_file2_merge_into_class.exe | FileCheck %s --check-prefixes=MERGE_CATS_CLS
19+
1520

1621
MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass(Category02|Category03)
1722
MERGE_CATS-NEXT: name {{.*}} Category02|Category03
@@ -101,6 +106,211 @@ NO_MERGE_CATS-NEXT: 24
101106
NO_MERGE_CATS-NEXT: 2
102107

103108

109+
MERGE_CATS_CLS: _OBJC_CLASS_$_MyBaseClass
110+
MERGE_CATS_CLS-NEXT: isa {{.*}} _OBJC_METACLASS_$_MyBaseClass
111+
MERGE_CATS_CLS-NEXT: superclass 0x0
112+
MERGE_CATS_CLS-NEXT: cache {{.*}} __objc_empty_cache
113+
MERGE_CATS_CLS-NEXT: vtable 0x0
114+
MERGE_CATS_CLS-NEXT: data {{.*}} (struct class_ro_t *)
115+
MERGE_CATS_CLS-NEXT: flags 0x2 RO_ROOT
116+
MERGE_CATS_CLS-NEXT: instanceStart 0
117+
MERGE_CATS_CLS-NEXT: instanceSize 4
118+
MERGE_CATS_CLS-NEXT: reserved 0x0
119+
MERGE_CATS_CLS-NEXT: ivarLayout 0x0
120+
MERGE_CATS_CLS-NEXT: name {{.*}} MyBaseClass
121+
MERGE_CATS_CLS-NEXT: baseMethods {{.*}} (struct method_list_t *)
122+
MERGE_CATS_CLS-NEXT: entsize 24
123+
MERGE_CATS_CLS-NEXT: count 8
124+
MERGE_CATS_CLS-NEXT: name {{.*}} class02InstanceMethod
125+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
126+
MERGE_CATS_CLS-NEXT: imp -[MyBaseClass(Category02) class02InstanceMethod]
127+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol02Method
128+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
129+
MERGE_CATS_CLS-NEXT: imp -[MyBaseClass(Category02) myProtocol02Method]
130+
MERGE_CATS_CLS-NEXT: name {{.*}} class03InstanceMethod
131+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
132+
MERGE_CATS_CLS-NEXT: imp -[MyBaseClass(Category03) class03InstanceMethod]
133+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol03Method
134+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
135+
MERGE_CATS_CLS-NEXT: imp -[MyBaseClass(Category03) myProtocol03Method]
136+
MERGE_CATS_CLS-NEXT: name {{.*}} baseInstanceMethod
137+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
138+
MERGE_CATS_CLS-NEXT: imp -[MyBaseClass baseInstanceMethod]
139+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol01Method
140+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
141+
MERGE_CATS_CLS-NEXT: imp -[MyBaseClass myProtocol01Method]
142+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol01Prop
143+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
144+
MERGE_CATS_CLS-NEXT: imp -[MyBaseClass MyProtocol01Prop]
145+
MERGE_CATS_CLS-NEXT: name {{.*}} setMyProtocol01Prop:
146+
MERGE_CATS_CLS-NEXT: types {{.*}} v20@0:8i16
147+
MERGE_CATS_CLS-NEXT: imp -[MyBaseClass setMyProtocol01Prop:]
148+
MERGE_CATS_CLS-NEXT: baseProtocols {{.*}}
149+
MERGE_CATS_CLS-NEXT: count 3
150+
MERGE_CATS_CLS-NEXT: list[0] {{.*}} (struct protocol_t *)
151+
MERGE_CATS_CLS-NEXT: isa 0x0
152+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol02
153+
MERGE_CATS_CLS-NEXT: protocols 0x0
154+
MERGE_CATS_CLS-NEXT: instanceMethods {{.*}} (struct method_list_t *)
155+
MERGE_CATS_CLS-NEXT: entsize 24
156+
MERGE_CATS_CLS-NEXT: count 2
157+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol02Method
158+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
159+
MERGE_CATS_CLS-NEXT: imp 0x0
160+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol02Prop
161+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
162+
MERGE_CATS_CLS-NEXT: imp 0x0
163+
MERGE_CATS_CLS-NEXT: classMethods 0x0 (struct method_list_t *)
164+
MERGE_CATS_CLS-NEXT: optionalInstanceMethods 0x0
165+
MERGE_CATS_CLS-NEXT: optionalClassMethods 0x0
166+
MERGE_CATS_CLS-NEXT: instanceProperties {{.*}}
167+
MERGE_CATS_CLS-NEXT: list[1] {{.*}} (struct protocol_t *)
168+
MERGE_CATS_CLS-NEXT: isa 0x0
169+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol03
170+
MERGE_CATS_CLS-NEXT: protocols 0x0
171+
MERGE_CATS_CLS-NEXT: instanceMethods {{.*}} (struct method_list_t *)
172+
MERGE_CATS_CLS-NEXT: entsize 24
173+
MERGE_CATS_CLS-NEXT: count 2
174+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol03Method
175+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
176+
MERGE_CATS_CLS-NEXT: imp 0x0
177+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol03Prop
178+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
179+
MERGE_CATS_CLS-NEXT: imp 0x0
180+
MERGE_CATS_CLS-NEXT: classMethods 0x0 (struct method_list_t *)
181+
MERGE_CATS_CLS-NEXT: optionalInstanceMethods 0x0
182+
MERGE_CATS_CLS-NEXT: optionalClassMethods 0x0
183+
MERGE_CATS_CLS-NEXT: instanceProperties {{.*}}
184+
MERGE_CATS_CLS-NEXT: list[2] {{.*}} (struct protocol_t *)
185+
MERGE_CATS_CLS-NEXT: isa 0x0
186+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol01
187+
MERGE_CATS_CLS-NEXT: protocols 0x0
188+
MERGE_CATS_CLS-NEXT: instanceMethods {{.*}} (struct method_list_t *)
189+
MERGE_CATS_CLS-NEXT: entsize 24
190+
MERGE_CATS_CLS-NEXT: count 3
191+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol01Method
192+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
193+
MERGE_CATS_CLS-NEXT: imp 0x0
194+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol01Prop
195+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
196+
MERGE_CATS_CLS-NEXT: imp 0x0
197+
MERGE_CATS_CLS-NEXT: name {{.*}} setMyProtocol01Prop:
198+
MERGE_CATS_CLS-NEXT: types {{.*}} v20@0:8i16
199+
MERGE_CATS_CLS-NEXT: imp 0x0
200+
MERGE_CATS_CLS-NEXT: classMethods 0x0 (struct method_list_t *)
201+
MERGE_CATS_CLS-NEXT: optionalInstanceMethods 0x0
202+
MERGE_CATS_CLS-NEXT: optionalClassMethods 0x0
203+
MERGE_CATS_CLS-NEXT: instanceProperties {{.*}}
204+
MERGE_CATS_CLS-NEXT: ivars {{.*}}
205+
MERGE_CATS_CLS-NEXT: entsize 32
206+
MERGE_CATS_CLS-NEXT: count 1
207+
MERGE_CATS_CLS-NEXT: offset {{.*}} 0
208+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol01Prop
209+
MERGE_CATS_CLS-NEXT: type {{.*}} i
210+
MERGE_CATS_CLS-NEXT: alignment 2
211+
MERGE_CATS_CLS-NEXT: size 4
212+
MERGE_CATS_CLS-NEXT: weakIvarLayout 0x0
213+
MERGE_CATS_CLS-NEXT: baseProperties {{.*}}
214+
MERGE_CATS_CLS-NEXT: entsize 16
215+
MERGE_CATS_CLS-NEXT: count 3
216+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol02Prop
217+
MERGE_CATS_CLS-NEXT: attributes {{.*}} Ti,R,D
218+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol03Prop
219+
MERGE_CATS_CLS-NEXT: attributes {{.*}} Ti,R,D
220+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol01Prop
221+
MERGE_CATS_CLS-NEXT: attributes {{.*}} Ti,N,VMyProtocol01Prop
222+
MERGE_CATS_CLS-NEXT: Meta Class
223+
MERGE_CATS_CLS-NEXT: isa {{.*}} _OBJC_METACLASS_$_MyBaseClass
224+
MERGE_CATS_CLS-NEXT: superclass {{.*}} _OBJC_CLASS_$_MyBaseClass
225+
MERGE_CATS_CLS-NEXT: cache {{.*}} __objc_empty_cache
226+
MERGE_CATS_CLS-NEXT: vtable 0x0
227+
MERGE_CATS_CLS-NEXT: data {{.*}} (struct class_ro_t *)
228+
MERGE_CATS_CLS-NEXT: flags 0x3 RO_META RO_ROOT
229+
MERGE_CATS_CLS-NEXT: instanceStart 40
230+
MERGE_CATS_CLS-NEXT: instanceSize 40
231+
MERGE_CATS_CLS-NEXT: reserved 0x0
232+
MERGE_CATS_CLS-NEXT: ivarLayout 0x0
233+
MERGE_CATS_CLS-NEXT: name {{.*}} MyBaseClass
234+
MERGE_CATS_CLS-NEXT: baseMethods {{.*}} (struct method_list_t *)
235+
MERGE_CATS_CLS-NEXT: entsize 24
236+
MERGE_CATS_CLS-NEXT: count 5
237+
MERGE_CATS_CLS-NEXT: name {{.*}} class02ClassMethod
238+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
239+
MERGE_CATS_CLS-NEXT: imp +[MyBaseClass(Category02) class02ClassMethod]
240+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol02Prop
241+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
242+
MERGE_CATS_CLS-NEXT: imp +[MyBaseClass(Category02) MyProtocol02Prop]
243+
MERGE_CATS_CLS-NEXT: name {{.*}} class03ClassMethod
244+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
245+
MERGE_CATS_CLS-NEXT: imp +[MyBaseClass(Category03) class03ClassMethod]
246+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol03Prop
247+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
248+
MERGE_CATS_CLS-NEXT: imp +[MyBaseClass(Category03) MyProtocol03Prop]
249+
MERGE_CATS_CLS-NEXT: name {{.*}} baseClassMethod
250+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
251+
MERGE_CATS_CLS-NEXT: imp +[MyBaseClass baseClassMethod]
252+
MERGE_CATS_CLS-NEXT: baseProtocols {{.*}}
253+
MERGE_CATS_CLS-NEXT: count 3
254+
MERGE_CATS_CLS-NEXT: list[0] {{.*}} (struct protocol_t *)
255+
MERGE_CATS_CLS-NEXT: isa 0x0
256+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol02
257+
MERGE_CATS_CLS-NEXT: protocols 0x0
258+
MERGE_CATS_CLS-NEXT: instanceMethods {{.*}} (struct method_list_t *)
259+
MERGE_CATS_CLS-NEXT: entsize 24
260+
MERGE_CATS_CLS-NEXT: count 2
261+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol02Method
262+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
263+
MERGE_CATS_CLS-NEXT: imp 0x0
264+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol02Prop
265+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
266+
MERGE_CATS_CLS-NEXT: imp 0x0
267+
MERGE_CATS_CLS-NEXT: classMethods 0x0 (struct method_list_t *)
268+
MERGE_CATS_CLS-NEXT: optionalInstanceMethods 0x0
269+
MERGE_CATS_CLS-NEXT: optionalClassMethods 0x0
270+
MERGE_CATS_CLS-NEXT: instanceProperties {{.*}}
271+
MERGE_CATS_CLS-NEXT: list[1] {{.*}} (struct protocol_t *)
272+
MERGE_CATS_CLS-NEXT: isa 0x0
273+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol03
274+
MERGE_CATS_CLS-NEXT: protocols 0x0
275+
MERGE_CATS_CLS-NEXT: instanceMethods {{.*}} (struct method_list_t *)
276+
MERGE_CATS_CLS-NEXT: entsize 24
277+
MERGE_CATS_CLS-NEXT: count 2
278+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol03Method
279+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
280+
MERGE_CATS_CLS-NEXT: imp 0x0
281+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol03Prop
282+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
283+
MERGE_CATS_CLS-NEXT: imp 0x0
284+
MERGE_CATS_CLS-NEXT: classMethods 0x0 (struct method_list_t *)
285+
MERGE_CATS_CLS-NEXT: optionalInstanceMethods 0x0
286+
MERGE_CATS_CLS-NEXT: optionalClassMethods 0x0
287+
MERGE_CATS_CLS-NEXT: instanceProperties {{.*}}
288+
MERGE_CATS_CLS-NEXT: list[2] {{.*}} (struct protocol_t *)
289+
MERGE_CATS_CLS-NEXT: isa 0x0
290+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol01
291+
MERGE_CATS_CLS-NEXT: protocols 0x0
292+
MERGE_CATS_CLS-NEXT: instanceMethods {{.*}} (struct method_list_t *)
293+
MERGE_CATS_CLS-NEXT: entsize 24
294+
MERGE_CATS_CLS-NEXT: count 3
295+
MERGE_CATS_CLS-NEXT: name {{.*}} myProtocol01Method
296+
MERGE_CATS_CLS-NEXT: types {{.*}} v16@0:8
297+
MERGE_CATS_CLS-NEXT: imp 0x0
298+
MERGE_CATS_CLS-NEXT: name {{.*}} MyProtocol01Prop
299+
MERGE_CATS_CLS-NEXT: types {{.*}} i16@0:8
300+
MERGE_CATS_CLS-NEXT: imp 0x0
301+
MERGE_CATS_CLS-NEXT: name {{.*}} setMyProtocol01Prop:
302+
MERGE_CATS_CLS-NEXT: types {{.*}} v20@0:8i16
303+
MERGE_CATS_CLS-NEXT: imp 0x0
304+
MERGE_CATS_CLS-NEXT: classMethods 0x0 (struct method_list_t *)
305+
MERGE_CATS_CLS-NEXT: optionalInstanceMethods 0x0
306+
MERGE_CATS_CLS-NEXT: optionalClassMethods 0x0
307+
MERGE_CATS_CLS-NEXT: instanceProperties {{.*}}
308+
MERGE_CATS_CLS-NEXT: ivars 0x0
309+
MERGE_CATS_CLS-NEXT: weakIvarLayout 0x0
310+
MERGE_CATS_CLS-NEXT: baseProperties 0x0
311+
MERGE_CATS_CLS: __OBJC_$_CATEGORY_MyBaseClass_$_Category04
312+
313+
104314
#--- a64_file1.s
105315

106316
## @protocol MyProtocol01

0 commit comments

Comments
 (0)