Skip to content

Commit 240fa6d

Browse files
committed
SIL: make swift ParameterInfo convertible back to C++ SILParameterInfo
1 parent 7a62f15 commit 240fa6d

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

SwiftCompilerSources/Sources/SIL/Argument.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,3 +499,22 @@ extension BridgedArgumentConvention {
499499
}
500500
}
501501
}
502+
503+
extension ArgumentConvention {
504+
var bridged: BridgedArgumentConvention {
505+
switch self {
506+
case .indirectIn: return .Indirect_In
507+
case .indirectInGuaranteed: return .Indirect_In_Guaranteed
508+
case .indirectInout: return .Indirect_Inout
509+
case .indirectInoutAliasable: return .Indirect_InoutAliasable
510+
case .indirectOut: return .Indirect_Out
511+
case .directOwned: return .Direct_Owned
512+
case .directUnowned: return .Direct_Unowned
513+
case .directGuaranteed: return .Direct_Guaranteed
514+
case .packOut: return .Pack_Out
515+
case .packInout: return .Pack_Inout
516+
case .packOwned: return .Pack_Owned
517+
case .packGuaranteed: return .Pack_Guaranteed
518+
}
519+
}
520+
}

SwiftCompilerSources/Sources/SIL/FunctionConvention.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ public struct ParameterInfo : CustomStringConvertible {
165165
/// convention of the parameter.
166166
public let interfaceType: BridgedASTType
167167
public let convention: ArgumentConvention
168+
public let options: UInt8
168169
public let hasLoweredAddresses: Bool
169170

170171
/// Is this parameter passed indirectly in SIL? Most formally
@@ -276,6 +277,11 @@ extension ParameterInfo {
276277
init(bridged: BridgedParameterInfo, hasLoweredAddresses: Bool) {
277278
self.interfaceType = BridgedASTType(type: bridged.type)
278279
self.convention = bridged.convention.convention
280+
self.options = bridged.options
279281
self.hasLoweredAddresses = hasLoweredAddresses
280282
}
283+
284+
public var _bridged: BridgedParameterInfo {
285+
BridgedParameterInfo(interfaceType.type!, convention.bridged, options)
286+
}
281287
}

include/swift/SIL/SILBridging.h

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ enum class BridgedArgumentConvention {
148148
struct BridgedParameterInfo {
149149
swift::TypeBase * _Nonnull type;
150150
BridgedArgumentConvention convention;
151+
uint8_t options;
152+
153+
BridgedParameterInfo(swift::TypeBase * _Nonnull type, BridgedArgumentConvention convention, uint8_t options) :
154+
type(type), convention(convention), options(options) {}
151155

152156
#ifdef USED_IN_CPP_SOURCE
153157
inline static BridgedArgumentConvention
@@ -156,10 +160,34 @@ struct BridgedParameterInfo {
156160
swift::SILArgumentConvention(convention).Value);
157161
}
158162

163+
swift::ParameterConvention getParameterConvention() const {
164+
switch (convention) {
165+
case BridgedArgumentConvention::Indirect_In: return swift::ParameterConvention::Indirect_In;
166+
case BridgedArgumentConvention::Indirect_In_Guaranteed: return swift::ParameterConvention::Indirect_In_Guaranteed;
167+
case BridgedArgumentConvention::Indirect_Inout: return swift::ParameterConvention::Indirect_Inout;
168+
case BridgedArgumentConvention::Indirect_InoutAliasable: return swift::ParameterConvention::Indirect_InoutAliasable;
169+
case BridgedArgumentConvention::Indirect_Out: break;
170+
case BridgedArgumentConvention::Direct_Owned: return swift::ParameterConvention::Direct_Owned;
171+
case BridgedArgumentConvention::Direct_Unowned: return swift::ParameterConvention::Direct_Unowned;
172+
case BridgedArgumentConvention::Direct_Guaranteed: return swift::ParameterConvention::Direct_Guaranteed;
173+
case BridgedArgumentConvention::Pack_Owned: return swift::ParameterConvention::Pack_Owned;
174+
case BridgedArgumentConvention::Pack_Inout: return swift::ParameterConvention::Pack_Inout;
175+
case BridgedArgumentConvention::Pack_Guaranteed: return swift::ParameterConvention::Pack_Guaranteed;
176+
case BridgedArgumentConvention::Pack_Out: break;
177+
}
178+
llvm_unreachable("invalid parameter convention");
179+
}
180+
159181
BridgedParameterInfo(swift::SILParameterInfo parameterInfo):
160182
type(parameterInfo.getInterfaceType().getPointer()),
161-
convention(castToArgumentConvention(parameterInfo.getConvention()))
183+
convention(castToArgumentConvention(parameterInfo.getConvention())),
184+
options(parameterInfo.getOptions().toRaw())
162185
{}
186+
187+
swift::SILParameterInfo unbridged() const {
188+
return swift::SILParameterInfo(swift::CanType(type), getParameterConvention(),
189+
swift::SILParameterInfo::Options(options));
190+
}
163191
#endif
164192
};
165193

0 commit comments

Comments
 (0)