Skip to content

Commit 3c2096f

Browse files
authored
Merge pull request #19540 from mikeash/reserved-bits-refinement
[IRGen][Runtime] Adjust the ObjC reserved bits on x86-64 to exactly match what the target uses.
2 parents bb79c0b + fa4178c commit 3c2096f

16 files changed

+155
-43
lines changed

docs/Testing.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,9 @@ code for the target that is not the build machine:
311311
* ``%target-os``: the target operating system (``macosx``, ``darwin``,
312312
``linux``, ``freebsd``, ``windows-cygnus``, ``windows-gnu``).
313313

314+
* ``%target-is-simulator``: ``true`` if the target is a simulator (iOS,
315+
watchOS, tvOS), otherwise ``false``.
316+
314317
* ``%target-object-format``: the platform's object format (``elf``, ``macho``,
315318
``coff``).
316319

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)