Skip to content

Commit a0810ec

Browse files
authored
Merge pull request #71684 from jckarter/value-ownership-abi-fix
Fix ABI breakage caused by `ValueOwnership` order change.
2 parents 5a90430 + b9f9114 commit a0810ec

File tree

11 files changed

+85
-32
lines changed

11 files changed

+85
-32
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,22 @@
1414
// includes target-independent information which can be usefully shared
1515
// between them.
1616
//
17+
// This header ought not to include any compiler-specific headers (such as
18+
// those from `swift/AST`, `swift/SIL`, etc.) since doing so may introduce
19+
// accidental ABI dependencies on compiler internals.
20+
//
1721
//===----------------------------------------------------------------------===//
1822

1923
#ifndef SWIFT_ABI_METADATAVALUES_H
2024
#define SWIFT_ABI_METADATAVALUES_H
2125

2226
#include "swift/ABI/KeyPath.h"
2327
#include "swift/ABI/ProtocolDispatchStrategy.h"
28+
29+
// FIXME: this include shouldn't be here, but removing it causes symbol
30+
// mangling mismatches on Windows for some reason?
2431
#include "swift/AST/Ownership.h"
32+
2533
#include "swift/Basic/Debug.h"
2634
#include "swift/Basic/LLVM.h"
2735
#include "swift/Basic/FlagSet.h"
@@ -1248,10 +1256,25 @@ class TargetExtendedFunctionTypeFlags {
12481256
};
12491257
using ExtendedFunctionTypeFlags = TargetExtendedFunctionTypeFlags<uint32_t>;
12501258

1259+
/// Different kinds of value ownership supported by function types.
1260+
enum class ParameterOwnership : uint8_t {
1261+
/// the context-dependent default ownership (sometimes shared,
1262+
/// sometimes owned)
1263+
Default,
1264+
/// an 'inout' exclusive, mutating borrow
1265+
InOut,
1266+
/// a 'borrowing' nonexclusive, usually nonmutating borrow
1267+
Shared,
1268+
/// a 'consuming' ownership transfer
1269+
Owned,
1270+
1271+
Last_Kind = Owned
1272+
};
1273+
12511274
template <typename int_type>
12521275
class TargetParameterTypeFlags {
12531276
enum : int_type {
1254-
ValueOwnershipMask = 0x7F,
1277+
OwnershipMask = 0x7F,
12551278
VariadicMask = 0x80,
12561279
AutoClosureMask = 0x100,
12571280
NoDerivativeMask = 0x200,
@@ -1266,8 +1289,8 @@ class TargetParameterTypeFlags {
12661289
constexpr TargetParameterTypeFlags() : Data(0) {}
12671290

12681291
constexpr TargetParameterTypeFlags<int_type>
1269-
withValueOwnership(ValueOwnership ownership) const {
1270-
return TargetParameterTypeFlags<int_type>((Data & ~ValueOwnershipMask) |
1292+
withOwnership(ParameterOwnership ownership) const {
1293+
return TargetParameterTypeFlags<int_type>((Data & ~OwnershipMask) |
12711294
(int_type)ownership);
12721295
}
12731296

@@ -1308,8 +1331,8 @@ class TargetParameterTypeFlags {
13081331
bool isIsolated() const { return Data & IsolatedMask; }
13091332
bool isTransferring() const { return Data & TransferringMask; }
13101333

1311-
ValueOwnership getValueOwnership() const {
1312-
return (ValueOwnership)(Data & ValueOwnershipMask);
1334+
ParameterOwnership getOwnership() const {
1335+
return (ParameterOwnership)(Data & OwnershipMask);
13131336
}
13141337

13151338
int_type getIntValue() const { return Data; }

include/swift/AST/Ownership.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,14 @@ enum class ValueOwnership : uint8_t {
142142
enum : unsigned { NumValueOwnershipBits =
143143
countBitsUsed(static_cast<unsigned>(ValueOwnership::Last_Kind)) };
144144

145+
enum class ParameterOwnership : uint8_t;
146+
147+
/// Map a `ValueOwnership` to the corresponding ABI-stable constant used by
148+
/// runtime metadata.
149+
ParameterOwnership asParameterOwnership(ValueOwnership o);
150+
/// Map an ABI-stable ownership identifier to a `ValueOwnership`.
151+
ValueOwnership asValueOwnership(ParameterOwnership o);
152+
145153
static inline llvm::StringRef getOwnershipSpelling(ValueOwnership ownership) {
146154
switch (ownership) {
147155
case ValueOwnership::Default:

include/swift/Demangling/TypeDecoder.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ class FunctionParam {
7373

7474
void setVariadic() { Flags = Flags.withVariadic(true); }
7575
void setAutoClosure() { Flags = Flags.withAutoClosure(true); }
76-
void setValueOwnership(ValueOwnership ownership) {
77-
Flags = Flags.withValueOwnership(ownership);
76+
void setOwnership(ParameterOwnership ownership) {
77+
Flags = Flags.withOwnership(ownership);
7878
}
7979
void setNoDerivative() { Flags = Flags.withNoDerivative(true); }
8080
void setIsolated() { Flags = Flags.withIsolated(true); }
@@ -1701,19 +1701,19 @@ class TypeDecoder {
17011701
while (recurse) {
17021702
switch (node->getKind()) {
17031703
case NodeKind::InOut:
1704-
param.setValueOwnership(ValueOwnership::InOut);
1704+
param.setOwnership(ParameterOwnership::InOut);
17051705
node = node->getFirstChild();
17061706
hasParamFlags = true;
17071707
break;
17081708

17091709
case NodeKind::Shared:
1710-
param.setValueOwnership(ValueOwnership::Shared);
1710+
param.setOwnership(ParameterOwnership::Shared);
17111711
node = node->getFirstChild();
17121712
hasParamFlags = true;
17131713
break;
17141714

17151715
case NodeKind::Owned:
1716-
param.setValueOwnership(ValueOwnership::Owned);
1716+
param.setOwnership(ParameterOwnership::Owned);
17171717
node = node->getFirstChild();
17181718
hasParamFlags = true;
17191719
break;

lib/AST/ASTContext.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "ClangTypeConverter.h"
1919
#include "ForeignRepresentationInfo.h"
2020
#include "SubstitutionMapStorage.h"
21+
#include "swift/ABI/MetadataValues.h"
2122
#include "swift/AST/ClangModuleLoader.h"
2223
#include "swift/AST/ConcreteDeclRef.h"
2324
#include "swift/AST/DiagnosticEngine.h"
@@ -6610,3 +6611,24 @@ Type ASTContext::getNamedSwiftType(ModuleDecl *module, StringRef name) {
66106611
return nominalDecl->getDeclaredType();
66116612
return decl->getDeclaredInterfaceType();
66126613
}
6614+
6615+
/// Map a `ValueOwnership` to the corresponding ABI-stable constant used by
6616+
/// runtime metadata.
6617+
ParameterOwnership swift::asParameterOwnership(ValueOwnership o) {
6618+
switch (o) {
6619+
case ValueOwnership::Default: return ParameterOwnership::Default;
6620+
case ValueOwnership::Shared: return ParameterOwnership::Shared;
6621+
case ValueOwnership::InOut: return ParameterOwnership::InOut;
6622+
case ValueOwnership::Owned: return ParameterOwnership::Owned;
6623+
}
6624+
llvm_unreachable("exhaustive switch");
6625+
}
6626+
ValueOwnership swift::asValueOwnership(ParameterOwnership o) {
6627+
switch (o) {
6628+
case ParameterOwnership::Default: return ValueOwnership::Default;
6629+
case ParameterOwnership::Shared: return ValueOwnership::Shared;
6630+
case ParameterOwnership::InOut: return ValueOwnership::InOut;
6631+
case ParameterOwnership::Owned: return ValueOwnership::Owned;
6632+
}
6633+
llvm_unreachable("exhaustive switch");
6634+
}

lib/AST/ASTDemangler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ Type ASTBuilder::createFunctionType(
408408
auto label = Ctx.getIdentifier(param.getLabel());
409409
auto flags = param.getFlags();
410410
auto ownership =
411-
ParamDecl::getParameterSpecifierForValueOwnership(flags.getValueOwnership());
411+
ParamDecl::getParameterSpecifierForValueOwnership(asValueOwnership(flags.getOwnership()));
412412
auto parameterFlags = ParameterTypeFlags()
413413
.withOwnershipSpecifier(ownership)
414414
.withVariadic(flags.isVariadic())

lib/IRGen/MetadataRequest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1379,7 +1379,7 @@ static llvm::Value *getFunctionParameterRef(IRGenFunction &IGF,
13791379
/// Mapping type-level parameter flags to ABI parameter flags.
13801380
ParameterFlags irgen::getABIParameterFlags(ParameterTypeFlags flags) {
13811381
return ParameterFlags()
1382-
.withValueOwnership(flags.getValueOwnership())
1382+
.withOwnership(asParameterOwnership(flags.getValueOwnership()))
13831383
.withVariadic(flags.isVariadic())
13841384
.withAutoClosure(flags.isAutoClosure())
13851385
.withNoDerivative(flags.isNoDerivative())

lib/Serialization/Deserialization.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1180,7 +1180,7 @@ GenericParamList *ModuleFile::maybeReadGenericParams(DeclContext *DC) {
11801180
static llvm::Optional<RequirementKind>
11811181
getActualRequirementKind(uint64_t rawKind) {
11821182
#define CASE(KIND) \
1183-
case GenericRequirementKind::KIND: \
1183+
case serialization::GenericRequirementKind::KIND: \
11841184
return RequirementKind::KIND;
11851185

11861186
switch (rawKind) {

lib/Serialization/Serialization.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1462,7 +1462,7 @@ getRawStableMetatypeRepresentation(const AnyMetatypeType *metatype) {
14621462
static uint8_t getRawStableRequirementKind(RequirementKind kind) {
14631463
#define CASE(KIND) \
14641464
case RequirementKind::KIND: \
1465-
return GenericRequirementKind::KIND;
1465+
return serialization::GenericRequirementKind::KIND;
14661466

14671467
switch (kind) {
14681468
CASE(SameShape)

stdlib/public/RemoteInspection/TypeRef.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -192,17 +192,17 @@ class PrintTypeRef : public TypeRefVisitor<PrintTypeRef, void> {
192192
stream << "\n";
193193
}
194194

195-
switch (flags.getValueOwnership()) {
196-
case ValueOwnership::Default:
195+
switch (flags.getOwnership()) {
196+
case ParameterOwnership::Default:
197197
/* nothing */
198198
break;
199-
case ValueOwnership::InOut:
199+
case ParameterOwnership::InOut:
200200
printHeader("inout");
201201
break;
202-
case ValueOwnership::Shared:
202+
case ParameterOwnership::Shared:
203203
printHeader("shared");
204204
break;
205-
case ValueOwnership::Owned:
205+
case ParameterOwnership::Owned:
206206
printHeader("owned");
207207
break;
208208
}
@@ -681,17 +681,17 @@ class DemanglingForTypeRef
681681
if (flags.isNoDerivative()) {
682682
wrapInput(Node::Kind::NoDerivative);
683683
}
684-
switch (flags.getValueOwnership()) {
685-
case ValueOwnership::Default:
684+
switch (flags.getOwnership()) {
685+
case ParameterOwnership::Default:
686686
/* nothing */
687687
break;
688-
case ValueOwnership::InOut:
688+
case ParameterOwnership::InOut:
689689
wrapInput(Node::Kind::InOut);
690690
break;
691-
case ValueOwnership::Shared:
691+
case ParameterOwnership::Shared:
692692
wrapInput(Node::Kind::Shared);
693693
break;
694-
case ValueOwnership::Owned:
694+
case ParameterOwnership::Owned:
695695
wrapInput(Node::Kind::Owned);
696696
break;
697697
}

stdlib/public/runtime/Demangle.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -622,17 +622,17 @@ swift::_swift_buildDemanglingForMetadata(const Metadata *type,
622622
if (flags.isNoDerivative()) {
623623
wrapInput(Node::Kind::NoDerivative);
624624
}
625-
switch (flags.getValueOwnership()) {
626-
case ValueOwnership::Default:
625+
switch (flags.getOwnership()) {
626+
case ParameterOwnership::Default:
627627
/* nothing */
628628
break;
629-
case ValueOwnership::InOut:
629+
case ParameterOwnership::InOut:
630630
wrapInput(Node::Kind::InOut);
631631
break;
632-
case ValueOwnership::Shared:
632+
case ParameterOwnership::Shared:
633633
wrapInput(Node::Kind::Shared);
634634
break;
635-
case ValueOwnership::Owned:
635+
case ParameterOwnership::Owned:
636636
wrapInput(Node::Kind::Owned);
637637
break;
638638
}

unittests/Reflection/TypeRef.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,10 @@ TEST(TypeRefTest, UniqueFunctionTypeRef) {
160160

161161
// Test parameter with and without inout/shared/variadic and/or label.
162162
ParameterFlags paramFlags;
163-
auto inoutFlags = paramFlags.withValueOwnership(ValueOwnership::InOut);
163+
auto inoutFlags = paramFlags.withOwnership(ParameterOwnership::InOut);
164164
auto variadicFlags = paramFlags.withVariadic(true);
165-
auto sharedFlags = paramFlags.withValueOwnership(ValueOwnership::Shared);
166-
auto ownedFlags = paramFlags.withValueOwnership(ValueOwnership::Owned);
165+
auto sharedFlags = paramFlags.withOwnership(ParameterOwnership::Shared);
166+
auto ownedFlags = paramFlags.withOwnership(ParameterOwnership::Owned);
167167

168168
auto F6 = Builder.createFunctionType(
169169
{Param1.withFlags(inoutFlags)}, Result, FunctionTypeFlags(),

0 commit comments

Comments
 (0)