Skip to content

Commit 925ba6f

Browse files
authored
Merge pull request #60051 from WANGJIEKE/fix-value-witness-table-type
Change return type of getEnumTag in value witness table
2 parents 2c40a85 + baac27d commit 925ba6f

File tree

7 files changed

+46
-15
lines changed

7 files changed

+46
-15
lines changed

include/swift/ABI/ValueWitness.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ END_VALUE_WITNESS_RANGE(TypeLayoutWitness,
262262
/// [0..NumElements-1].
263263
FUNCTION_VALUE_WITNESS(getEnumTag,
264264
GetEnumTag,
265-
INT_TYPE,
265+
UINT_TYPE,
266266
(IMMUTABLE_VALUE_TYPE, TYPE_TYPE))
267267

268268
BEGIN_VALUE_WITNESS_RANGE(EnumValueWitness,

lib/PrintAsClang/PrintClangValueType.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ void ClangValueTypePrinter::printValueTypeDecl(
158158
os << typeDecl->getName().str() << '\n';
159159
os << "extern \"C\" {\n";
160160
for (const auto &pair : elementTagMapping) {
161-
os << "extern int "
161+
os << "extern unsigned "
162162
<< pair.second.globalVariableName << ";\n";
163163
}
164164
os << "}\n";
@@ -270,8 +270,7 @@ void ClangValueTypePrinter::printValueTypeDecl(
270270
"metadata._0);\n";
271271
os << " return _getOpaquePointer();\n";
272272
os << " }\n";
273-
// FIXME: (tongjie) return type should be unsigned
274-
os << " inline int _getEnumTag() const {\n";
273+
os << " inline unsigned _getEnumTag() const {\n";
275274
printEnumVWTableVariable();
276275
os << " return enumVWTable->getEnumTag(_getOpaquePointer(), "
277276
"metadata._0);\n";

test/Interop/SwiftToCxx/core/swift-impl-defs-in-cxx.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
// CHECK-NEXT: constexpr size_t getAlignment() const { return (flags & 255) + 1; }
5656
// CHECK-NEXT: };
5757
// CHECK-EMPTY:
58-
// CHECK-NEXT: using EnumValueWitnessGetEnumTagTy = int(* __ptrauth_swift_value_witness_function_pointer(41909))(const void * _Nonnull, void * _Nonnull) SWIFT_NOEXCEPT_FUNCTION_PTR;
58+
// CHECK-NEXT: using EnumValueWitnessGetEnumTagTy = unsigned(* __ptrauth_swift_value_witness_function_pointer(41909))(const void * _Nonnull, void * _Nonnull) SWIFT_NOEXCEPT_FUNCTION_PTR;
5959
// CHECK-NEXT: using EnumValueWitnessDestructiveProjectEnumDataTy = void(* __ptrauth_swift_value_witness_function_pointer(1053))(void * _Nonnull, void * _Nonnull) SWIFT_NOEXCEPT_FUNCTION_PTR;
6060
// CHECK-NEXT: using EnumValueWitnessDestructiveInjectEnumTagTy = void(* __ptrauth_swift_value_witness_function_pointer(45796))(void * _Nonnull, unsigned, void * _Nonnull) SWIFT_NOEXCEPT_FUNCTION_PTR;
6161
// CHECK-EMPTY:
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: %target-interop-build-clangxx -c %s -I %t -S -emit-llvm -o %t/ir.ll
4+
// RUN: %FileCheck %s < %t/ir.ll
5+
6+
// REQUIRES: OS=windows-msvc
7+
8+
unsigned char getEnumTagi8(void *p);
9+
unsigned getEnumTagi32(void *p);
10+
11+
void test(void *p) {
12+
getEnumTagi8(p);
13+
getEnumTagi32(p);
14+
}
15+
16+
// CHECK: declare dso_local noundef i8 @"?getEnumTagi8@@YAEPEAX@Z"(i8* noundef) #1
17+
// CHECK: declare dso_local noundef i32 @"?getEnumTagi32@@YAIPEAX@Z"(i8* noundef) #1
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: %target-interop-build-clangxx -c %s -I %t -S -emit-llvm -o %t/ir.ll
4+
// RUN: %FileCheck %s < %t/ir.ll
5+
6+
// UNSUPPORTED: OS=windows-msvc
7+
8+
unsigned char getEnumTagi8(void *p);
9+
unsigned getEnumTagi32(void *p);
10+
11+
void test(void *p) {
12+
getEnumTagi8(p);
13+
getEnumTagi32(p);
14+
}
15+
16+
// CHECK: declare noundef zeroext i8 @_Z12getEnumTagi8Pv(i8* noundef) #1
17+
// CHECK: declare noundef i32 @_Z13getEnumTagi32Pv(i8* noundef) #1

test/Interop/SwiftToCxx/enums/resilient-enum-in-cxx.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ public func printFoo(_ x: Foo) {
3434

3535
// CHECK: // Tags for resilient enum Foo
3636
// CHECK-NEXT: extern "C" {
37-
// CHECK-NEXT: extern int $s5Enums3FooO1ayACSdcACmFWC;
38-
// NEW_CASE-NEXT: extern int $s5Enums3FooO1byACSicACmFWC;
37+
// CHECK-NEXT: extern unsigned $s5Enums3FooO1ayACSdcACmFWC;
38+
// NEW_CASE-NEXT: extern unsigned $s5Enums3FooO1byACSicACmFWC;
3939
// CHECK-NEXT: }
4040
// CHECK-EMPTY:
4141
// CHECK-NEXT: } // namespace _impl

test/Interop/SwiftToCxx/enums/swift-enum-case-functions.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,7 @@ public func checkIntDoubleOrBignum(_ x: IntDoubleOrBignum, tag: Int) -> Bool {
207207
// CHECK-NEXT: default: abort();
208208
// CHECK-NEXT: }
209209
// CHECK-NEXT: }
210-
// CHECK: private:
211-
// CHECK: inline int _getEnumTag() const {
210+
// CHECK: inline unsigned _getEnumTag() const {
212211
// CHECK-NEXT: auto metadata = _impl::$s5Enums12BoolWithCaseOMa(0);
213212
// CHECK-NEXT: auto *vwTableAddr = reinterpret_cast<swift::_impl::ValueWitnessTable **>(metadata._0) - 1;
214213
// CHECK-NEXT: #ifdef __arm64e__
@@ -271,7 +270,7 @@ public func checkIntDoubleOrBignum(_ x: IntDoubleOrBignum, tag: Int) -> Bool {
271270
// CHECK-NEXT: default: abort();
272271
// CHECK-NEXT: }
273272
// CHECK-NEXT: }
274-
// CHECK: inline int _getEnumTag() const {
273+
// CHECK: inline unsigned _getEnumTag() const {
275274
// CHECK-NEXT: auto metadata = _impl::$s5Enums9CLikeEnumOMa(0);
276275
// CHECK-NEXT: auto *vwTableAddr = reinterpret_cast<swift::_impl::ValueWitnessTable **>(metadata._0) - 1;
277276
// CHECK-NEXT: #ifdef __arm64e__
@@ -317,7 +316,7 @@ public func checkIntDoubleOrBignum(_ x: IntDoubleOrBignum, tag: Int) -> Bool {
317316
// CHECK-NEXT: default: abort();
318317
// CHECK-NEXT: }
319318
// CHECK-NEXT: }
320-
// CHECK: inline int _getEnumTag() const {
319+
// CHECK: inline unsigned _getEnumTag() const {
321320
// CHECK-NEXT: auto metadata = _impl::$s5Enums8DataCaseOMa(0);
322321
// CHECK-NEXT: auto *vwTableAddr = reinterpret_cast<swift::_impl::ValueWitnessTable **>(metadata._0) - 1;
323322
// CHECK-NEXT: #ifdef __arm64e__
@@ -402,7 +401,7 @@ public func checkIntDoubleOrBignum(_ x: IntDoubleOrBignum, tag: Int) -> Bool {
402401
// CHECK-NEXT: default: abort();
403402
// CHECK-NEXT: }
404403
// CHECK-NEXT: }
405-
// CHECK: inline int _getEnumTag() const {
404+
// CHECK: inline unsigned _getEnumTag() const {
406405
// CHECK-NEXT: auto metadata = _impl::$s5Enums17IntDoubleOrBignumOMa(0);
407406
// CHECK-NEXT: auto *vwTableAddr = reinterpret_cast<swift::_impl::ValueWitnessTable **>(metadata._0) - 1;
408407
// CHECK-NEXT: #ifdef __arm64e__
@@ -473,8 +472,7 @@ public func checkIntDoubleOrBignum(_ x: IntDoubleOrBignum, tag: Int) -> Bool {
473472
// CHECK-NEXT: case 2: return cases::PosInfinity;
474473
// CHECK-NEXT: default: abort();
475474
// CHECK-NEXT: }
476-
// CHECK-NEXT: }
477-
// CHECK: inline int _getEnumTag() const {
475+
// CHECK: inline unsigned _getEnumTag() const {
478476
// CHECK-NEXT: auto metadata = _impl::$s5Enums13IntOrInfinityOMa(0);
479477
// CHECK-NEXT: auto *vwTableAddr = reinterpret_cast<swift::_impl::ValueWitnessTable **>(metadata._0) - 1;
480478
// CHECK-NEXT: #ifdef __arm64e__
@@ -568,7 +566,7 @@ public func checkIntDoubleOrBignum(_ x: IntDoubleOrBignum, tag: Int) -> Bool {
568566
// CHECK-NEXT: default: abort();
569567
// CHECK-NEXT: }
570568
// CHECK-NEXT: }
571-
// CHECK: inline int _getEnumTag() const {
569+
// CHECK: inline unsigned _getEnumTag() const {
572570
// CHECK-NEXT: auto metadata = _impl::$s5Enums20MultipleBoolWithCaseOMa(0);
573571
// CHECK-NEXT: auto *vwTableAddr = reinterpret_cast<swift::_impl::ValueWitnessTable **>(metadata._0) - 1;
574572
// CHECK-NEXT: #ifdef __arm64e__

0 commit comments

Comments
 (0)