@@ -81,13 +81,20 @@ class ObjCRuntime {
81
81
// / "non-fragile" ABI?
82
82
bool isNonFragile () const {
83
83
switch (getKind ()) {
84
- case FragileMacOSX: return false ;
85
- case GCC: return false ;
86
- case MacOSX: return true ;
87
- case GNUstep: return true ;
88
- case ObjFW: return true ;
89
- case iOS: return true ;
90
- case WatchOS: return true ;
84
+ case FragileMacOSX:
85
+ return false ;
86
+ case GCC:
87
+ return false ;
88
+ case MacOSX:
89
+ return true ;
90
+ case GNUstep:
91
+ return true ;
92
+ case ObjFW:
93
+ return true ;
94
+ case iOS:
95
+ return true ;
96
+ case WatchOS:
97
+ return true ;
91
98
}
92
99
llvm_unreachable (" bad kind" );
93
100
}
@@ -100,23 +107,24 @@ class ObjCRuntime {
100
107
bool isLegacyDispatchDefaultForArch (llvm::Triple::ArchType Arch) {
101
108
// The GNUstep runtime uses a newer dispatch method by default from
102
109
// version 1.6 onwards
103
- if (getKind () == GNUstep && getVersion () >= VersionTuple ( 1 , 6 ) ) {
110
+ if (getKind () == GNUstep) {
104
111
switch (Arch) {
105
112
case llvm::Triple::arm:
106
113
case llvm::Triple::x86:
107
114
case llvm::Triple::x86_64:
115
+ return !(getVersion () >= VersionTuple (1 , 6 ));
108
116
case llvm::Triple::aarch64:
109
117
case llvm::Triple::mips64:
118
+ return !(getVersion () >= VersionTuple (1 , 9 ));
110
119
case llvm::Triple::riscv64:
111
- return false ;
120
+ return !( getVersion () >= VersionTuple ( 2 , 2 )) ;
112
121
default :
113
122
return true ;
114
123
}
115
- }
116
- else if ((getKind () == MacOSX) && isNonFragile () &&
117
- (getVersion () >= VersionTuple (10 , 0 )) &&
118
- (getVersion () < VersionTuple (10 , 6 )))
119
- return Arch != llvm::Triple::x86_64;
124
+ } else if ((getKind () == MacOSX) && isNonFragile () &&
125
+ (getVersion () >= VersionTuple (10 , 0 )) &&
126
+ (getVersion () < VersionTuple (10 , 6 )))
127
+ return Arch != llvm::Triple::x86_64;
120
128
// Except for deployment target of 10.5 or less,
121
129
// Mac runtimes use legacy dispatch everywhere now.
122
130
return true ;
@@ -151,12 +159,18 @@ class ObjCRuntime {
151
159
case FragileMacOSX:
152
160
// No stub library for the fragile runtime.
153
161
return getVersion () >= VersionTuple (10 , 7 );
154
- case MacOSX: return true ;
155
- case iOS: return true ;
156
- case WatchOS: return true ;
157
- case GCC: return false ;
158
- case GNUstep: return true ;
159
- case ObjFW: return true ;
162
+ case MacOSX:
163
+ return true ;
164
+ case iOS:
165
+ return true ;
166
+ case WatchOS:
167
+ return true ;
168
+ case GCC:
169
+ return false ;
170
+ case GNUstep:
171
+ return true ;
172
+ case ObjFW:
173
+ return true ;
160
174
}
161
175
llvm_unreachable (" bad kind" );
162
176
}
@@ -168,14 +182,21 @@ class ObjCRuntime {
168
182
// / library.
169
183
bool hasNativeARC () const {
170
184
switch (getKind ()) {
171
- case FragileMacOSX: return getVersion () >= VersionTuple (10 , 7 );
172
- case MacOSX: return getVersion () >= VersionTuple (10 , 7 );
173
- case iOS: return getVersion () >= VersionTuple (5 );
174
- case WatchOS: return true ;
175
-
176
- case GCC: return false ;
177
- case GNUstep: return getVersion () >= VersionTuple (1 , 6 );
178
- case ObjFW: return true ;
185
+ case FragileMacOSX:
186
+ return getVersion () >= VersionTuple (10 , 7 );
187
+ case MacOSX:
188
+ return getVersion () >= VersionTuple (10 , 7 );
189
+ case iOS:
190
+ return getVersion () >= VersionTuple (5 );
191
+ case WatchOS:
192
+ return true ;
193
+
194
+ case GCC:
195
+ return false ;
196
+ case GNUstep:
197
+ return getVersion () >= VersionTuple (1 , 6 );
198
+ case ObjFW:
199
+ return true ;
179
200
}
180
201
llvm_unreachable (" bad kind" );
181
202
}
@@ -273,23 +294,21 @@ class ObjCRuntime {
273
294
// / Does this runtime supports optimized setter entrypoints?
274
295
bool hasOptimizedSetter () const {
275
296
switch (getKind ()) {
276
- case MacOSX:
277
- return getVersion () >= VersionTuple (10 , 8 );
278
- case iOS:
279
- return (getVersion () >= VersionTuple (6 ));
280
- case WatchOS:
281
- return true ;
282
- case GNUstep:
283
- return getVersion () >= VersionTuple (1 , 7 );
284
- default :
285
- return false ;
297
+ case MacOSX:
298
+ return getVersion () >= VersionTuple (10 , 8 );
299
+ case iOS:
300
+ return (getVersion () >= VersionTuple (6 ));
301
+ case WatchOS:
302
+ return true ;
303
+ case GNUstep:
304
+ return getVersion () >= VersionTuple (1 , 7 );
305
+ default :
306
+ return false ;
286
307
}
287
308
}
288
309
289
310
// / Does this runtime allow the use of __weak?
290
- bool allowsWeak () const {
291
- return hasNativeWeak ();
292
- }
311
+ bool allowsWeak () const { return hasNativeWeak (); }
293
312
294
313
// / Does this runtime natively provide ARC-compliant 'weak'
295
314
// / entrypoints?
@@ -304,25 +323,30 @@ class ObjCRuntime {
304
323
// / This is really a property of the library, not the runtime.
305
324
bool hasSubscripting () const {
306
325
switch (getKind ()) {
307
- case FragileMacOSX: return false ;
308
- case MacOSX: return getVersion () >= VersionTuple (10 , 11 );
309
- case iOS: return getVersion () >= VersionTuple (9 );
310
- case WatchOS: return true ;
326
+ case FragileMacOSX:
327
+ return false ;
328
+ case MacOSX:
329
+ return getVersion () >= VersionTuple (10 , 11 );
330
+ case iOS:
331
+ return getVersion () >= VersionTuple (9 );
332
+ case WatchOS:
333
+ return true ;
311
334
312
335
// This is really a lie, because some implementations and versions
313
336
// of the runtime do not support ARC. Probably -fgnu-runtime
314
337
// should imply a "maximal" runtime or something?
315
- case GCC: return true ;
316
- case GNUstep: return true ;
317
- case ObjFW: return true ;
338
+ case GCC:
339
+ return true ;
340
+ case GNUstep:
341
+ return true ;
342
+ case ObjFW:
343
+ return true ;
318
344
}
319
345
llvm_unreachable (" bad kind" );
320
346
}
321
347
322
348
// / Does this runtime allow sizeof or alignof on object types?
323
- bool allowsSizeofAlignof () const {
324
- return isFragile ();
325
- }
349
+ bool allowsSizeofAlignof () const { return isFragile (); }
326
350
327
351
// / Does this runtime allow pointer arithmetic on objects?
328
352
// /
@@ -354,41 +378,62 @@ class ObjCRuntime {
354
378
// / without it, abort() must be used in pure ObjC files.
355
379
bool hasTerminate () const {
356
380
switch (getKind ()) {
357
- case FragileMacOSX: return getVersion () >= VersionTuple (10 , 8 );
358
- case MacOSX: return getVersion () >= VersionTuple (10 , 8 );
359
- case iOS: return getVersion () >= VersionTuple (5 );
360
- case WatchOS: return true ;
361
- case GCC: return false ;
362
- case GNUstep: return false ;
363
- case ObjFW: return false ;
381
+ case FragileMacOSX:
382
+ return getVersion () >= VersionTuple (10 , 8 );
383
+ case MacOSX:
384
+ return getVersion () >= VersionTuple (10 , 8 );
385
+ case iOS:
386
+ return getVersion () >= VersionTuple (5 );
387
+ case WatchOS:
388
+ return true ;
389
+ case GCC:
390
+ return false ;
391
+ case GNUstep:
392
+ return false ;
393
+ case ObjFW:
394
+ return false ;
364
395
}
365
396
llvm_unreachable (" bad kind" );
366
397
}
367
398
368
399
// / Does this runtime support weakly importing classes?
369
400
bool hasWeakClassImport () const {
370
401
switch (getKind ()) {
371
- case MacOSX: return true ;
372
- case iOS: return true ;
373
- case WatchOS: return true ;
374
- case FragileMacOSX: return false ;
375
- case GCC: return true ;
376
- case GNUstep: return true ;
377
- case ObjFW: return true ;
402
+ case MacOSX:
403
+ return true ;
404
+ case iOS:
405
+ return true ;
406
+ case WatchOS:
407
+ return true ;
408
+ case FragileMacOSX:
409
+ return false ;
410
+ case GCC:
411
+ return true ;
412
+ case GNUstep:
413
+ return true ;
414
+ case ObjFW:
415
+ return true ;
378
416
}
379
417
llvm_unreachable (" bad kind" );
380
418
}
381
419
382
420
// / Does this runtime use zero-cost exceptions?
383
421
bool hasUnwindExceptions () const {
384
422
switch (getKind ()) {
385
- case MacOSX: return true ;
386
- case iOS: return true ;
387
- case WatchOS: return true ;
388
- case FragileMacOSX: return false ;
389
- case GCC: return true ;
390
- case GNUstep: return true ;
391
- case ObjFW: return true ;
423
+ case MacOSX:
424
+ return true ;
425
+ case iOS:
426
+ return true ;
427
+ case WatchOS:
428
+ return true ;
429
+ case FragileMacOSX:
430
+ return false ;
431
+ case GCC:
432
+ return true ;
433
+ case GNUstep:
434
+ return true ;
435
+ case ObjFW:
436
+ return true ;
392
437
}
393
438
llvm_unreachable (" bad kind" );
394
439
}
@@ -402,7 +447,8 @@ class ObjCRuntime {
402
447
return true ;
403
448
case GNUstep:
404
449
return getVersion () >= VersionTuple (1 , 7 );
405
- default : return false ;
450
+ default :
451
+ return false ;
406
452
}
407
453
}
408
454
@@ -457,13 +503,20 @@ class ObjCRuntime {
457
503
// / Does this runtime supports direct dispatch
458
504
bool allowsDirectDispatch () const {
459
505
switch (getKind ()) {
460
- case FragileMacOSX: return false ;
461
- case MacOSX: return true ;
462
- case iOS: return true ;
463
- case WatchOS: return true ;
464
- case GCC: return false ;
465
- case GNUstep: return false ;
466
- case ObjFW: return false ;
506
+ case FragileMacOSX:
507
+ return false ;
508
+ case MacOSX:
509
+ return true ;
510
+ case iOS:
511
+ return true ;
512
+ case WatchOS:
513
+ return true ;
514
+ case GCC:
515
+ return false ;
516
+ case GNUstep:
517
+ return false ;
518
+ case ObjFW:
519
+ return false ;
467
520
}
468
521
llvm_unreachable (" bad kind" );
469
522
}
0 commit comments