Skip to content

Commit fa4178c

Browse files
committed
[IRGen][Runtime] Adjust the ObjC reserved bits on x86-64 to exactly match what the target uses.
Previously we had a single mask for all x86-64 targets which included both the top and bottom bits. This accommodated simulators, which use the top bit, while macOS uses the bottom bit, but reserved one bit more than necessary on each. This change breaks out x86-64 simulators from non-simulators and reserves only the one bit used on each. rdar://problem/34805348 rdar://problem/29765919
1 parent 1131507 commit fa4178c

14 files changed

+141
-43
lines changed

lib/IRGen/SwiftTargetInfo.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/ABI/System.h"
2323
#include "swift/AST/ASTContext.h"
2424
#include "swift/AST/IRGenOptions.h"
25+
#include "swift/Basic/Platform.h"
2526

2627
using namespace swift;
2728
using namespace irgen;
@@ -66,10 +67,16 @@ static void configureX86_64(IRGenModule &IGM, const llvm::Triple &triple,
6667
SwiftTargetInfo &target) {
6768
setToMask(target.PointerSpareBits, 64,
6869
SWIFT_ABI_X86_64_SWIFT_SPARE_BITS_MASK);
69-
setToMask(target.ObjCPointerReservedBits, 64,
70-
SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK);
7170
setToMask(target.IsObjCPointerBit, 64, SWIFT_ABI_X86_64_IS_OBJC_BIT);
7271

72+
if (tripleIsAnySimulator(triple)) {
73+
setToMask(target.ObjCPointerReservedBits, 64,
74+
SWIFT_ABI_X86_64_SIMULATOR_OBJC_RESERVED_BITS_MASK);
75+
} else {
76+
setToMask(target.ObjCPointerReservedBits, 64,
77+
SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK);
78+
}
79+
7380
if (triple.isOSDarwin()) {
7481
target.LeastValidPointerValue =
7582
SWIFT_ABI_DARWIN_X86_64_LEAST_VALID_POINTER;

stdlib/public/SwiftShims/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ set(sources
1313
SwiftStddef.h
1414
SwiftStdint.h
1515
System.h
16+
Target.h
1617
ThreadLocalStorage.h
1718
UnicodeShims.h
1819
Visibility.h

stdlib/public/SwiftShims/HeapObject.h

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "RefCount.h"
1616
#include "SwiftStddef.h"
1717
#include "System.h"
18+
#include "Target.h"
1819

1920
#define SWIFT_ABI_HEAP_OBJECT_HEADER_SIZE_64 16
2021
#define SWIFT_ABI_HEAP_OBJECT_HEADER_SIZE_32 8
@@ -117,10 +118,20 @@ static_assert(alignof(HeapObject) == alignof(void*),
117118
#endif
118119
#define _swift_abi_SwiftSpareBitsMask \
119120
(__swift_uintptr_t) SWIFT_ABI_X86_64_SWIFT_SPARE_BITS_MASK
121+
#if SWIFT_TARGET_OS_SIMULATOR
122+
#define _swift_abi_ObjCReservedBitsMask \
123+
(__swift_uintptr_t) SWIFT_ABI_X86_64_SIMULATOR_OBJC_RESERVED_BITS_MASK
124+
#define _swift_abi_ObjCReservedLowBits \
125+
(unsigned) SWIFT_ABI_X86_64_SIMULATOR_OBJC_NUM_RESERVED_LOW_BITS
126+
#else
120127
#define _swift_abi_ObjCReservedBitsMask \
121128
(__swift_uintptr_t) SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK
122129
#define _swift_abi_ObjCReservedLowBits \
123130
(unsigned) SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS
131+
#endif
132+
133+
#define _swift_BridgeObject_TaggedPointerBits \
134+
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64
124135

125136
#elif defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64)
126137

@@ -137,6 +148,8 @@ static_assert(alignof(HeapObject) == alignof(void*),
137148
(__swift_uintptr_t) SWIFT_ABI_ARM64_OBJC_RESERVED_BITS_MASK
138149
#define _swift_abi_ObjCReservedLowBits \
139150
(unsigned) SWIFT_ABI_ARM64_OBJC_NUM_RESERVED_LOW_BITS
151+
#define _swift_BridgeObject_TaggedPointerBits \
152+
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64
140153

141154
#elif defined(__powerpc64__)
142155

@@ -148,6 +161,8 @@ static_assert(alignof(HeapObject) == alignof(void*),
148161
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK
149162
#define _swift_abi_ObjCReservedLowBits \
150163
(unsigned) SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS
164+
#define _swift_BridgeObject_TaggedPointerBits \
165+
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64
151166

152167
#elif defined(__s390x__)
153168

@@ -159,6 +174,8 @@ static_assert(alignof(HeapObject) == alignof(void*),
159174
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK
160175
#define _swift_abi_ObjCReservedLowBits \
161176
(unsigned) SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS
177+
#define _swift_BridgeObject_TaggedPointerBits \
178+
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64
162179

163180
#else
164181

@@ -180,6 +197,15 @@ static_assert(alignof(HeapObject) == alignof(void*),
180197
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK
181198
#define _swift_abi_ObjCReservedLowBits \
182199
(unsigned) SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS
200+
201+
#if __POINTER_WIDTH__ == 64
202+
#define _swift_BridgeObject_TaggedPointerBits \
203+
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64
204+
#else
205+
#define _swift_BridgeObject_TaggedPointerBits \
206+
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_32
207+
#endif
208+
183209
#endif
184210

185211
/// Corresponding namespaced decls
@@ -191,13 +217,11 @@ static const __swift_uintptr_t SwiftSpareBitsMask =
191217
_swift_abi_SwiftSpareBitsMask;
192218
static const __swift_uintptr_t ObjCReservedBitsMask =
193219
_swift_abi_ObjCReservedBitsMask;
194-
static const unsigned ObjCReservedLowBits = _swift_abi_ObjCReservedLowBits;
220+
static const unsigned ObjCReservedLowBits =
221+
_swift_abi_ObjCReservedLowBits;
222+
static const __swift_uintptr_t BridgeObjectTagBitsMask =
223+
_swift_BridgeObject_TaggedPointerBits;
195224
} // heap_object_abi
196225
#endif // __cplusplus
197226

198-
/// BridgeObject masks
199-
200-
#define _swift_BridgeObject_TaggedPointerBits _swift_abi_ObjCReservedBitsMask
201-
202-
203227
#endif // SWIFT_STDLIB_SHIMS_HEAPOBJECT_H

stdlib/public/SwiftShims/System.h

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@
6262
#define SWIFT_ABI_DEFAULT_OBJC_WEAK_REFERENCE_MARKER_MASK 0
6363
#define SWIFT_ABI_DEFAULT_OBJC_WEAK_REFERENCE_MARKER_VALUE 0
6464

65+
// BridgeObject uses this bit to indicate a tagged value.
66+
#define SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_32 0U
67+
#define SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64 0x8000000000000000ULL
68+
6569
/*********************************** i386 *************************************/
6670

6771
// Heap objects are pointer-aligned, so the low two bits are unused.
@@ -102,22 +106,30 @@
102106
// Only the bottom 56 bits are used, and heap objects are eight-byte-aligned.
103107
#define SWIFT_ABI_X86_64_SWIFT_SPARE_BITS_MASK 0xFF00000000000007ULL
104108

105-
// Objective-C reserves the high and low bits for tagged pointers.
106-
// Systems exist which use either bit.
107-
#define SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK 0x8000000000000001ULL
109+
// Objective-C reserves the low bit for tagged pointers on macOS, but
110+
// reserves the high bit on simulators.
111+
#define SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK 0x0000000000000001ULL
108112
#define SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS 1
113+
#define SWIFT_ABI_X86_64_SIMULATOR_OBJC_RESERVED_BITS_MASK 0x8000000000000000ULL
114+
#define SWIFT_ABI_X86_64_SIMULATOR_OBJC_NUM_RESERVED_LOW_BITS 0
115+
109116

110117
// BridgeObject uses this bit to indicate whether it holds an ObjC object or
111118
// not.
112119
#define SWIFT_ABI_X86_64_IS_OBJC_BIT 0x4000000000000000ULL
113120

114-
// ObjC weak reference discriminator is the two bits
115-
// reserved for ObjC tagged pointers plus one more low bit.
121+
// ObjC weak reference discriminator is the bit reserved for ObjC tagged
122+
// pointers plus one more low bit.
116123
#define SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_MASK \
117124
(SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK | \
118125
1<<SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS)
119126
#define SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_VALUE \
120127
(1<<SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS)
128+
#define SWIFT_ABI_X86_64_SIMULATOR_OBJC_WEAK_REFERENCE_MARKER_MASK \
129+
(SWIFT_ABI_X86_64_SIMULATOR_OBJC_RESERVED_BITS_MASK | \
130+
1<<SWIFT_ABI_X86_64_SIMULATOR_OBJC_NUM_RESERVED_LOW_BITS)
131+
#define SWIFT_ABI_X86_64_SIMULATOR_OBJC_WEAK_REFERENCE_MARKER_VALUE \
132+
(1<<SWIFT_ABI_X86_64_SIMULATOR_OBJC_NUM_RESERVED_LOW_BITS)
121133

122134
/*********************************** arm64 ************************************/
123135

stdlib/public/SwiftShims/Target.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//===--- Target.h - Info about the current compilation target ---*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
//
13+
// Info about the current compilation target.
14+
//
15+
//===----------------------------------------------------------------------===//
16+
17+
#ifndef SWIFT_ABI_TARGET_H
18+
#define SWIFT_ABI_TARGET_H
19+
20+
#if !defined(__has_builtin)
21+
#define __has_builtin(x) 0
22+
#endif
23+
24+
// Is the target platform a simulator? We can't use TargetConditionals
25+
// when included from SwiftShims, so use the builtin.
26+
#if __has_builtin(__is_target_environment)
27+
# if __is_target_environment(simulator)
28+
# define SWIFT_TARGET_OS_SIMULATOR 1
29+
# endif
30+
#endif
31+
32+
#endif /* SWIFT_ABI_TARGET_H */

stdlib/public/core/BridgeStorage.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ struct _BridgeStorage<
9393
public // @testable
9494
func isNativeWithClearedSpareBits(_ bits: Int) -> Bool {
9595
return (_bitPattern(rawValue) &
96-
(_objCTaggedPointerBits | _objectPointerIsObjCBit |
96+
(_bridgeObjectTaggedPointerBits | _objCTaggedPointerBits |
97+
_objectPointerIsObjCBit |
9798
(UInt(bits)) << _objectPointerLowSpareBitShift)) == 0
9899
}
99100

stdlib/public/core/Builtin.swift

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -340,13 +340,17 @@ internal func _isValidAddress(_ address: UInt) -> Bool {
340340
// TODO(<rdar://problem/34837023>): Get rid of superfluous UInt constructor
341341
// calls
342342
@inlinable
343-
internal var _objCTaggedPointerBits: UInt {
343+
internal var _bridgeObjectTaggedPointerBits: UInt {
344344
@inline(__always) get { return UInt(_swift_BridgeObject_TaggedPointerBits) }
345345
}
346346
@inlinable
347+
internal var _objCTaggedPointerBits: UInt {
348+
@inline(__always) get { return UInt(_swift_abi_ObjCReservedBitsMask) }
349+
}
350+
@inlinable
347351
internal var _objectPointerSpareBits: UInt {
348352
@inline(__always) get {
349-
return UInt(_swift_abi_SwiftSpareBitsMask) & ~_objCTaggedPointerBits
353+
return UInt(_swift_abi_SwiftSpareBitsMask) & ~_bridgeObjectTaggedPointerBits
350354
}
351355
}
352356
@inlinable
@@ -400,12 +404,12 @@ internal func _isObjCTaggedPointer(_ x: UInt) -> Bool {
400404

401405
@inlinable @inline(__always) public // FIXME
402406
func _isTaggedObject(_ x: Builtin.BridgeObject) -> Bool {
403-
return _bitPattern(x) & _objCTaggedPointerBits != 0
407+
return _bitPattern(x) & _bridgeObjectTaggedPointerBits != 0
404408
}
405409
@inlinable @inline(__always) public // FIXME
406410
func _isNativePointer(_ x: Builtin.BridgeObject) -> Bool {
407411
return (
408-
_bitPattern(x) & (_objCTaggedPointerBits | _objectPointerIsObjCBit)
412+
_bitPattern(x) & (_bridgeObjectTaggedPointerBits | _objectPointerIsObjCBit)
409413
) == 0
410414
}
411415
@inlinable @inline(__always) public // FIXME
@@ -418,7 +422,7 @@ func _isNonTaggedObjCPointer(_ x: Builtin.BridgeObject) -> Bool {
418422
func _getNonTagBits(_ x: Builtin.BridgeObject) -> UInt {
419423
// Zero out the tag bits, and leave them all at the top.
420424
_sanityCheck(_isTaggedObject(x), "not tagged!")
421-
return (_bitPattern(x) & ~_objCTaggedPointerBits)
425+
return (_bitPattern(x) & ~_bridgeObjectTaggedPointerBits)
422426
>> _objectPointerLowSpareBitShift
423427
}
424428

@@ -446,7 +450,7 @@ public func _bridgeObject(
446450
@inline(__always)
447451
@inlinable
448452
public func _bridgeObject(fromTagged x: UInt) -> Builtin.BridgeObject {
449-
_sanityCheck(x & _objCTaggedPointerBits != 0)
453+
_sanityCheck(x & _bridgeObjectTaggedPointerBits != 0)
450454
let object: Builtin.BridgeObject = Builtin.valueToBridgeObject(x)
451455
_sanityCheck(_isTaggedObject(object))
452456
return object
@@ -458,9 +462,9 @@ public func _bridgeObject(taggingPayload x: UInt) -> Builtin.BridgeObject {
458462
let shifted = x &<< _objectPointerLowSpareBitShift
459463
_sanityCheck(x == (shifted &>> _objectPointerLowSpareBitShift),
460464
"out-of-range: limited bit range requires some zero top bits")
461-
_sanityCheck(shifted & _objCTaggedPointerBits == 0,
465+
_sanityCheck(shifted & _bridgeObjectTaggedPointerBits == 0,
462466
"out-of-range: post-shift use of tag bits")
463-
return _bridgeObject(fromTagged: shifted | _objCTaggedPointerBits)
467+
return _bridgeObject(fromTagged: shifted | _bridgeObjectTaggedPointerBits)
464468
}
465469

466470
// BridgeObject -> Values
@@ -485,7 +489,7 @@ public func _bridgeObject(
485489
public func _bridgeObject(toTagged x: Builtin.BridgeObject) -> UInt {
486490
_sanityCheck(_isTaggedObject(x))
487491
let bits = _bitPattern(x)
488-
_sanityCheck(bits & _objCTaggedPointerBits != 0)
492+
_sanityCheck(bits & _bridgeObjectTaggedPointerBits != 0)
489493
return bits
490494
}
491495
@inline(__always)

stdlib/public/runtime/SwiftObject.mm

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -489,10 +489,11 @@ - (BOOL)isNSValue__ { return NO; }
489489
#endif
490490
}
491491

492-
// The non-pointer bits, excluding the ObjC tag bits.
492+
// The non-pointer bits, excluding the tag bits.
493493
static auto const unTaggedNonNativeBridgeObjectBits
494494
= heap_object_abi::SwiftSpareBitsMask
495-
& ~heap_object_abi::ObjCReservedBitsMask;
495+
& ~heap_object_abi::ObjCReservedBitsMask
496+
& ~heap_object_abi::BridgeObjectTagBitsMask;
496497

497498
#if SWIFT_OBJC_INTEROP
498499

@@ -579,7 +580,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
579580
static_assert((heap_object_abi::SwiftSpareBitsMask & objectPointerIsObjCBit) ==
580581
objectPointerIsObjCBit,
581582
"isObjC bit not within spare bits");
582-
return (uintptr_t(object) & objectPointerIsObjCBit) != 0;
583+
return (uintptr_t(object) & objectPointerIsObjCBit) != 0 && (uintptr_t(object) & heap_object_abi::BridgeObjectTagBitsMask) == 0;
583584
}
584585
#endif
585586

stdlib/public/runtime/WeakReference.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "swift/Runtime/Config.h"
2121
#include "swift/Runtime/HeapObject.h"
2222
#include "swift/Runtime/Metadata.h"
23+
#include "../../../stdlib/public/SwiftShims/Target.h"
2324

2425
#if SWIFT_OBJC_INTEROP
2526
#include "swift/Runtime/ObjCBridge.h"
@@ -78,6 +79,9 @@ class WeakReferenceBits {
7879
#if !SWIFT_OBJC_INTEROP
7980
NativeMarkerMask = 0,
8081
NativeMarkerValue = 0
82+
#elif defined(__x86_64__) && SWIFT_TARGET_OS_SIMULATOR
83+
NativeMarkerMask = SWIFT_ABI_X86_64_SIMULATOR_OBJC_WEAK_REFERENCE_MARKER_MASK,
84+
NativeMarkerValue = SWIFT_ABI_X86_64_SIMULATOR_OBJC_WEAK_REFERENCE_MARKER_VALUE
8185
#elif defined(__x86_64__)
8286
NativeMarkerMask = SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_MASK,
8387
NativeMarkerValue = SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_VALUE

test/IRGen/bridge_object_x86_64.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ entry(%c : $C, %w : $Builtin.Word):
3434
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %objc_object*, i64 } @convert_from_bridge_object
3535
// CHECK: [[BOBITS:%.*]] = ptrtoint [[BRIDGE]] %0 to i64
3636
// -- 0x8000_0000_0000_0001
37-
// CHECK: [[TAGBITS:%.*]] = and i64 [[BOBITS]], -9223372036854775807
37+
// CHECK: [[TAGBITS:%.*]] = and i64 [[BOBITS]], 1
3838
// CHECK: [[TAGGED:%.*]] = icmp eq i64 [[TAGBITS]], 0
3939
// CHECK: br i1 [[TAGGED]], label %not-tagged-pointer, label %tagged-pointer
4040
// CHECK: tagged-pointer:

test/IRGen/enum.sil

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// #if directives don't work with SIL keywords, therefore please put ObjC tests
22
// in `enum_objc.sil`.
3-
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize
3+
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator
44
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize
55

66
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -1134,8 +1134,10 @@ enum SinglePayloadClass {
11341134
// CHECK-64: entry:
11351135
// CHECK-64: switch i64 %0, label {{%.*}} [
11361136
// CHECK-64: i64 0, label {{%.*}}
1137-
// CHECK-objc-64: i64 2, label {{%.*}}
1138-
// CHECK-objc-64: i64 4, label {{%.*}}
1137+
// CHECK-objc-64-simulator-false: i64 2, label {{%.*}}
1138+
// CHECK-objc-64-simulator-false: i64 4, label {{%.*}}
1139+
// CHECK-objc-64-simulator-true: i64 1, label {{%.*}}
1140+
// CHECK-objc-64-simulator-true: i64 2, label {{%.*}}
11391141
// CHECK-native-64: i64 1, label {{%.*}}
11401142
// CHECK-native-64: i64 2, label {{%.*}}
11411143
// CHECK-64: ]
@@ -1179,8 +1181,10 @@ enum SinglePayloadClassProtocol {
11791181
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_protocol_switch(i64, i64) {{.*}} {
11801182
// CHECK-64: switch i64 %0, label {{%.*}} [
11811183
// CHECK-64: i64 0, label {{%.*}}
1182-
// CHECK-objc-64: i64 2, label {{%.*}}
1183-
// CHECK-objc-64: i64 4, label {{%.*}}
1184+
// CHECK-objc-64-simulator-false: i64 2, label {{%.*}}
1185+
// CHECK-objc-64-simulator-false: i64 4, label {{%.*}}
1186+
// CHECK-objc-64-simulator-true: i64 1, label {{%.*}}
1187+
// CHECK-objc-64-simulator-true: i64 2, label {{%.*}}
11841188
// CHECK-native-64: i64 1, label {{%.*}}
11851189
// CHECK-native-64: i64 2, label {{%.*}}
11861190
// CHECK-64: ]
@@ -2457,7 +2461,8 @@ entry(%0 : $DynamicSingleton<NoPayloads>):
24572461
// Check that payloads get properly masked in nested single-payload enums.
24582462
// rdar://problem/18841262
24592463
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @optional_optional_class_protocol(i64, i64)
2460-
// CHECK-objc-64: icmp eq i64 %0, 2
2464+
// CHECK-objc-64-simulator-false: icmp eq i64 %0, 2
2465+
// CHECK-objc-64-simulator-true: icmp eq i64 %0, 1
24612466
// CHECK-native-64: icmp eq i64 %0, 1
24622467
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @optional_optional_class_protocol(i32, i32)
24632468
// CHECK-32: icmp eq i32 %0, 1

0 commit comments

Comments
 (0)