Skip to content

Commit 42bc49d

Browse files
authored
Add a new parameter convention @in_cxx for non-trivial C++ classes that are passed indirectly and destructed by the caller (#73019)
This corresponds to the parameter-passing convention of the Itanium C++ ABI, in which the argument is passed indirectly and possibly modified, but not destroyed, by the callee. @in_cxx is handled the same way as @in in callers and @in_guaranteed in callees. OwnershipModelEliminator emits the call to destroy_addr that is needed to destroy the argument in the caller. rdar://122707697
1 parent 9d6e36b commit 42bc49d

File tree

64 files changed

+736
-45
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+736
-45
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/ComputeSideEffects.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ private struct CollectedEffects {
287287
private mutating func addEffects<Arguments: Sequence>(ofFunctions callees: FunctionArray?,
288288
withArguments arguments: Arguments)
289289
where Arguments.Element == (calleeArgumentIndex: Int, callerArgument: Value) {
290+
// The argument summary for @in_cxx is insufficient in OSSA because the function body does not contain the
291+
// destroy. But the call is still effectively a release from the caller's perspective.
290292
guard let callees = callees else {
291293
// We don't know which function(s) are called.
292294
globalEffects = .worstEffects

SwiftCompilerSources/Sources/SIL/Argument.swift

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,12 @@ public enum ArgumentConvention : CustomStringConvertible {
352352
/// convention used by mutable captures in @noescape closures.
353353
case indirectInoutAliasable
354354

355+
/// This argument is passed indirectly, i.e. by directly passing the address
356+
/// of an object in memory. The callee may modify, but does not destroy the
357+
/// object. This corresponds to the parameter-passing convention of the
358+
/// Itanium C++ ABI, which is used ubiquitously on non-Windows targets.
359+
case indirectInCXX
360+
355361
/// This argument represents an indirect return value address. The callee stores
356362
/// the returned value to this argument. At the time when the function is called,
357363
/// the memory location referenced by the argument is uninitialized.
@@ -407,8 +413,9 @@ public enum ArgumentConvention : CustomStringConvertible {
407413
public var isIndirect: Bool {
408414
switch self {
409415
case .indirectIn, .indirectInGuaranteed,
410-
.indirectInout, .indirectInoutAliasable, .indirectOut,
411-
.packOut, .packInout, .packOwned, .packGuaranteed:
416+
.indirectInout, .indirectInoutAliasable, .indirectInCXX,
417+
.indirectOut, .packOut, .packInout, .packOwned,
418+
.packGuaranteed:
412419
return true
413420
case .directOwned, .directUnowned, .directGuaranteed:
414421
return false
@@ -417,11 +424,12 @@ public enum ArgumentConvention : CustomStringConvertible {
417424

418425
public var isIndirectIn: Bool {
419426
switch self {
420-
case .indirectIn, .indirectInGuaranteed,
427+
case .indirectIn, .indirectInGuaranteed, .indirectInCXX,
421428
.packOwned, .packGuaranteed:
422429
return true
423430
case .directOwned, .directUnowned, .directGuaranteed,
424-
.indirectInout, .indirectInoutAliasable, .indirectOut,
431+
.indirectInout, .indirectInoutAliasable,
432+
.indirectOut,
425433
.packOut, .packInout:
426434
return false
427435
}
@@ -433,7 +441,7 @@ public enum ArgumentConvention : CustomStringConvertible {
433441
return true
434442
case .indirectInGuaranteed, .directGuaranteed, .packGuaranteed,
435443
.indirectIn, .directOwned, .directUnowned,
436-
.indirectInout, .indirectInoutAliasable,
444+
.indirectInout, .indirectInoutAliasable, .indirectInCXX,
437445
.packInout, .packOwned:
438446
return false
439447
}
@@ -444,15 +452,15 @@ public enum ArgumentConvention : CustomStringConvertible {
444452
case .indirectInGuaranteed, .directGuaranteed, .packGuaranteed:
445453
return true
446454
case .indirectIn, .directOwned, .directUnowned,
447-
.indirectInout, .indirectInoutAliasable, .indirectOut,
448-
.packOut, .packInout, .packOwned:
455+
.indirectInout, .indirectInoutAliasable, .indirectInCXX,
456+
.indirectOut, .packOut, .packInout, .packOwned:
449457
return false
450458
}
451459
}
452460

453461
public var isConsumed: Bool {
454462
switch self {
455-
case .indirectIn, .directOwned, .packOwned:
463+
case .indirectIn, .indirectInCXX, .directOwned, .packOwned:
456464
return true
457465
case .indirectInGuaranteed, .directGuaranteed, .packGuaranteed,
458466
.indirectInout, .indirectInoutAliasable, .indirectOut,
@@ -467,6 +475,7 @@ public enum ArgumentConvention : CustomStringConvertible {
467475
.indirectOut,
468476
.indirectInGuaranteed,
469477
.indirectInout,
478+
.indirectInCXX,
470479
.packOut,
471480
.packInout,
472481
.packOwned,
@@ -491,6 +500,7 @@ public enum ArgumentConvention : CustomStringConvertible {
491500
case .indirectIn,
492501
.indirectOut,
493502
.indirectInGuaranteed,
503+
.indirectInCXX,
494504
.directUnowned,
495505
.directGuaranteed,
496506
.directOwned,
@@ -511,6 +521,8 @@ public enum ArgumentConvention : CustomStringConvertible {
511521
return "indirectInout"
512522
case .indirectInoutAliasable:
513523
return "indirectInoutAliasable"
524+
case .indirectInCXX:
525+
return "indirectInCXX"
514526
case .indirectOut:
515527
return "indirectOut"
516528
case .directOwned:
@@ -545,6 +557,7 @@ extension BridgedArgumentConvention {
545557
case .Indirect_In_Guaranteed: return .indirectInGuaranteed
546558
case .Indirect_Inout: return .indirectInout
547559
case .Indirect_InoutAliasable: return .indirectInoutAliasable
560+
case .Indirect_In_CXX: return .indirectInCXX
548561
case .Indirect_Out: return .indirectOut
549562
case .Direct_Owned: return .directOwned
550563
case .Direct_Unowned: return .directUnowned
@@ -566,6 +579,7 @@ extension ArgumentConvention {
566579
case .indirectInGuaranteed: return .Indirect_In_Guaranteed
567580
case .indirectInout: return .Indirect_Inout
568581
case .indirectInoutAliasable: return .Indirect_InoutAliasable
582+
case .indirectInCXX: return .Indirect_In_CXX
569583
case .indirectOut: return .Indirect_Out
570584
case .directOwned: return .Direct_Owned
571585
case .directUnowned: return .Direct_Unowned

SwiftCompilerSources/Sources/SIL/Effects.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ public struct SideEffects : CustomStringConvertible, NoReflectionChildren {
561561
result.memory = SideEffects.Memory()
562562
}
563563

564-
case .indirectInout, .indirectInoutAliasable:
564+
case .indirectInout, .indirectInoutAliasable, .indirectInCXX:
565565
break
566566
}
567567
return result

SwiftCompilerSources/Sources/SIL/FunctionConvention.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public struct ParameterInfo : CustomStringConvertible {
171171
switch convention {
172172
case .indirectIn, .indirectInGuaranteed:
173173
return hasLoweredAddresses || type.isOpenedExistentialWithError()
174-
case .indirectInout, .indirectInoutAliasable:
174+
case .indirectInout, .indirectInoutAliasable, .indirectInCXX:
175175
return true
176176
case .directOwned, .directUnowned, .directGuaranteed:
177177
return false

docs/ABI/Mangling.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,7 @@ mangled in to disambiguate.
867867
PARAM-CONVENTION ::= 'l' // indirect inout
868868
PARAM-CONVENTION ::= 'b' // indirect inout aliasable
869869
PARAM-CONVENTION ::= 'n' // indirect in guaranteed
870+
PARAM-CONVENTION ::= 'X' // indirect in C++
870871
PARAM-CONVENTION ::= 'x' // direct owned
871872
PARAM-CONVENTION ::= 'y' // direct unowned
872873
PARAM-CONVENTION ::= 'g' // direct guaranteed

include/swift/AST/TypeAttr.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ SIMPLE_SIL_TYPE_ATTR(in, In)
8282
SIMPLE_SIL_TYPE_ATTR(inout, Inout)
8383
SIMPLE_SIL_TYPE_ATTR(inout_aliasable, InoutAliasable)
8484
SIMPLE_SIL_TYPE_ATTR(in_guaranteed, InGuaranteed)
85+
SIMPLE_SIL_TYPE_ATTR(in_cxx, InCXX)
8586
SIMPLE_SIL_TYPE_ATTR(in_constant, InConstant)
8687
SIMPLE_SIL_TYPE_ATTR(pack_owned, PackOwned)
8788
SIMPLE_SIL_TYPE_ATTR(pack_guaranteed, PackGuaranteed)

include/swift/AST/Types.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4068,6 +4068,12 @@ enum class ParameterConvention : uint8_t {
40684068
/// convention used by mutable captures in @noescape closures.
40694069
Indirect_InoutAliasable,
40704070

4071+
/// This argument is passed indirectly, i.e. by directly passing the address
4072+
/// of an object in memory. The callee may modify, but does not destroy the
4073+
/// object. This corresponds to the parameter-passing convention of the
4074+
/// Itanium C++ ABI, which is used ubiquitously on non-Windows targets.
4075+
Indirect_In_CXX,
4076+
40714077
/// This argument is passed directly. Its type is non-trivial, and the callee
40724078
/// is responsible for destroying it.
40734079
Direct_Owned,
@@ -4108,6 +4114,7 @@ inline bool isIndirectFormalParameter(ParameterConvention conv) {
41084114
case ParameterConvention::Indirect_In:
41094115
case ParameterConvention::Indirect_Inout:
41104116
case ParameterConvention::Indirect_InoutAliasable:
4117+
case ParameterConvention::Indirect_In_CXX:
41114118
case ParameterConvention::Indirect_In_Guaranteed:
41124119
return true;
41134120

@@ -4129,7 +4136,8 @@ bool isConsumedParameter(ParameterConvention conv) {
41294136
case ParameterConvention::Direct_Owned:
41304137
case ParameterConvention::Pack_Owned:
41314138
return true;
4132-
4139+
case ParameterConvention::Indirect_In_CXX:
4140+
return !InCallee;
41334141
case ParameterConvention::Indirect_Inout:
41344142
case ParameterConvention::Indirect_InoutAliasable:
41354143
case ParameterConvention::Direct_Unowned:
@@ -4160,7 +4168,8 @@ bool isGuaranteedParameter(ParameterConvention conv) {
41604168
case ParameterConvention::Indirect_In_Guaranteed:
41614169
case ParameterConvention::Pack_Guaranteed:
41624170
return true;
4163-
4171+
case ParameterConvention::Indirect_In_CXX:
4172+
return InCallee;
41644173
case ParameterConvention::Indirect_Inout:
41654174
case ParameterConvention::Indirect_InoutAliasable:
41664175
case ParameterConvention::Indirect_In:
@@ -4185,6 +4194,7 @@ inline bool isMutatingParameter(ParameterConvention conv) {
41854194
switch (conv) {
41864195
case ParameterConvention::Indirect_Inout:
41874196
case ParameterConvention::Indirect_InoutAliasable:
4197+
case ParameterConvention::Indirect_In_CXX:
41884198
case ParameterConvention::Pack_Inout:
41894199
return true;
41904200

@@ -4211,6 +4221,7 @@ inline bool isPackParameter(ParameterConvention conv) {
42114221
case ParameterConvention::Indirect_In_Guaranteed:
42124222
case ParameterConvention::Indirect_Inout:
42134223
case ParameterConvention::Indirect_InoutAliasable:
4224+
case ParameterConvention::Indirect_In_CXX:
42144225
case ParameterConvention::Indirect_In:
42154226
case ParameterConvention::Direct_Guaranteed:
42164227
case ParameterConvention::Direct_Unowned:
@@ -4291,6 +4302,10 @@ class SILParameterInfo {
42914302
return getConvention() == ParameterConvention::Indirect_In;
42924303
}
42934304

4305+
bool isIndirectInCXX() const {
4306+
return getConvention() == ParameterConvention::Indirect_In_CXX;
4307+
}
4308+
42944309
bool isIndirectInOut() const {
42954310
return getConvention() == ParameterConvention::Indirect_Inout;
42964311
}

include/swift/SIL/ApplySite.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ class ApplySite {
412412
: SILArgumentConvention::Direct_Owned;
413413
case SILArgumentConvention::Indirect_In:
414414
case SILArgumentConvention::Indirect_In_Guaranteed:
415+
case SILArgumentConvention::Indirect_In_CXX:
415416
return pai->isOnStack() ? SILArgumentConvention::Indirect_In_Guaranteed
416417
: SILArgumentConvention::Indirect_In;
417418
case SILArgumentConvention::Pack_Guaranteed:

include/swift/SIL/SILArgumentConvention.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ struct SILArgumentConvention {
2828
Indirect_In_Guaranteed,
2929
Indirect_Inout,
3030
Indirect_InoutAliasable,
31+
Indirect_In_CXX,
3132
Indirect_Out,
3233
Direct_Owned,
3334
Direct_Unowned,
@@ -55,6 +56,9 @@ struct SILArgumentConvention {
5556
case ParameterConvention::Indirect_In_Guaranteed:
5657
Value = SILArgumentConvention::Indirect_In_Guaranteed;
5758
return;
59+
case ParameterConvention::Indirect_In_CXX:
60+
Value = SILArgumentConvention::Indirect_In_CXX;
61+
return;
5862
case ParameterConvention::Direct_Unowned:
5963
Value = SILArgumentConvention::Direct_Unowned;
6064
return;
@@ -92,6 +96,7 @@ struct SILArgumentConvention {
9296
case SILArgumentConvention::Indirect_In_Guaranteed:
9397
case SILArgumentConvention::Indirect_In:
9498
case SILArgumentConvention::Indirect_Out:
99+
case SILArgumentConvention::Indirect_In_CXX:
95100
case SILArgumentConvention::Direct_Unowned:
96101
case SILArgumentConvention::Direct_Owned:
97102
case SILArgumentConvention::Direct_Guaranteed:
@@ -110,6 +115,8 @@ struct SILArgumentConvention {
110115
case SILArgumentConvention::Direct_Owned:
111116
case SILArgumentConvention::Pack_Owned:
112117
return true;
118+
case SILArgumentConvention::Indirect_In_CXX:
119+
return !InCallee;
113120
case SILArgumentConvention::Indirect_In_Guaranteed:
114121
case SILArgumentConvention::Direct_Guaranteed:
115122
case SILArgumentConvention::Indirect_Inout:
@@ -135,6 +142,8 @@ struct SILArgumentConvention {
135142
case SILArgumentConvention::Direct_Guaranteed:
136143
case SILArgumentConvention::Pack_Guaranteed:
137144
return true;
145+
case SILArgumentConvention::Indirect_In_CXX:
146+
return InCallee;
138147
case SILArgumentConvention::Indirect_Inout:
139148
case SILArgumentConvention::Indirect_In:
140149
case SILArgumentConvention::Indirect_Out:
@@ -164,6 +173,7 @@ struct SILArgumentConvention {
164173
case SILArgumentConvention::Indirect_Out:
165174
case SILArgumentConvention::Indirect_In_Guaranteed:
166175
case SILArgumentConvention::Indirect_Inout:
176+
case SILArgumentConvention::Indirect_In_CXX:
167177
return true;
168178

169179
case SILArgumentConvention::Indirect_InoutAliasable:
@@ -190,6 +200,7 @@ struct SILArgumentConvention {
190200
case SILArgumentConvention::Indirect_In_Guaranteed:
191201
case SILArgumentConvention::Indirect_Inout:
192202
case SILArgumentConvention::Indirect_InoutAliasable:
203+
case SILArgumentConvention::Indirect_In_CXX:
193204
case SILArgumentConvention::Direct_Unowned:
194205
case SILArgumentConvention::Direct_Guaranteed:
195206
case SILArgumentConvention::Direct_Owned:

include/swift/SIL/SILBridging.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ enum class BridgedArgumentConvention {
136136
Indirect_In_Guaranteed,
137137
Indirect_Inout,
138138
Indirect_InoutAliasable,
139+
Indirect_In_CXX,
139140
Indirect_Out,
140141
Direct_Owned,
141142
Direct_Unowned,
@@ -153,6 +154,7 @@ inline swift::ParameterConvention getParameterConvention(BridgedArgumentConventi
153154
case BridgedArgumentConvention::Indirect_In_Guaranteed: return swift::ParameterConvention::Indirect_In_Guaranteed;
154155
case BridgedArgumentConvention::Indirect_Inout: return swift::ParameterConvention::Indirect_Inout;
155156
case BridgedArgumentConvention::Indirect_InoutAliasable: return swift::ParameterConvention::Indirect_InoutAliasable;
157+
case BridgedArgumentConvention::Indirect_In_CXX: return swift::ParameterConvention::Indirect_In_CXX;
156158
case BridgedArgumentConvention::Indirect_Out: break;
157159
case BridgedArgumentConvention::Direct_Owned: return swift::ParameterConvention::Direct_Owned;
158160
case BridgedArgumentConvention::Direct_Unowned: return swift::ParameterConvention::Direct_Unowned;
@@ -171,6 +173,7 @@ inline BridgedArgumentConvention getArgumentConvention(swift::ParameterConventio
171173
case swift::ParameterConvention::Indirect_In_Guaranteed: return BridgedArgumentConvention::Indirect_In_Guaranteed;
172174
case swift::ParameterConvention::Indirect_Inout: return BridgedArgumentConvention::Indirect_Inout;
173175
case swift::ParameterConvention::Indirect_InoutAliasable: return BridgedArgumentConvention::Indirect_InoutAliasable;
176+
case swift::ParameterConvention::Indirect_In_CXX: return BridgedArgumentConvention::Indirect_In_CXX;
174177
case swift::ParameterConvention::Direct_Owned: return BridgedArgumentConvention::Direct_Owned;
175178
case swift::ParameterConvention::Direct_Unowned: return BridgedArgumentConvention::Direct_Unowned;
176179
case swift::ParameterConvention::Direct_Guaranteed: return BridgedArgumentConvention::Direct_Guaranteed;

include/swift/SIL/SILFunctionConventions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ inline bool SILModuleConventions::isIndirectSILParam(SILParameterInfo param,
610610

611611
case ParameterConvention::Indirect_In:
612612
case ParameterConvention::Indirect_In_Guaranteed:
613+
case ParameterConvention::Indirect_In_CXX:
613614
return isTypeIndirectForIndirectParamConvention(param.getInterfaceType(),
614615
loweredAddresses);
615616
case ParameterConvention::Indirect_Inout:

lib/AST/ASTMangler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,6 +1138,7 @@ static char getParamConvention(ParameterConvention conv) {
11381138
case ParameterConvention::Indirect_Inout: return 'l';
11391139
case ParameterConvention::Indirect_InoutAliasable: return 'b';
11401140
case ParameterConvention::Indirect_In_Guaranteed: return 'n';
1141+
case ParameterConvention::Indirect_In_CXX: return 'X';
11411142
case ParameterConvention::Direct_Owned: return 'x';
11421143
case ParameterConvention::Direct_Unowned: return 'y';
11431144
case ParameterConvention::Direct_Guaranteed: return 'g';

lib/AST/ASTPrinter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6757,6 +6757,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
67576757
case ParameterConvention::Indirect_In:
67586758
case ParameterConvention::Indirect_Inout:
67596759
case ParameterConvention::Indirect_InoutAliasable:
6760+
case ParameterConvention::Indirect_In_CXX:
67606761
case ParameterConvention::Indirect_In_Guaranteed:
67616762
llvm_unreachable("callee convention cannot be indirect");
67626763
case ParameterConvention::Pack_Guaranteed:
@@ -7526,6 +7527,7 @@ StringRef swift::getStringForParameterConvention(ParameterConvention conv) {
75267527
case ParameterConvention::Indirect_In_Guaranteed: return "@in_guaranteed ";
75277528
case ParameterConvention::Indirect_Inout: return "@inout ";
75287529
case ParameterConvention::Indirect_InoutAliasable: return "@inout_aliasable ";
7530+
case ParameterConvention::Indirect_In_CXX: return "@in_cxx ";
75297531
case ParameterConvention::Direct_Owned: return "@owned ";
75307532
case ParameterConvention::Direct_Unowned: return "";
75317533
case ParameterConvention::Direct_Guaranteed: return "@guaranteed ";

lib/ASTGen/Sources/ASTGen/TypeAttrs.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ extension ASTGenVisitor {
107107
.in,
108108
.inConstant,
109109
.inGuaranteed,
110+
.inCXX,
110111
.inout,
111112
.inoutAliasable,
112113
.moveOnly,

lib/Demangling/Demangler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,6 +2161,7 @@ NodePointer Demangler::demangleImplParamConvention(Node::Kind ConvKind) {
21612161
case 'l': attr = "@inout"; break;
21622162
case 'b': attr = "@inout_aliasable"; break;
21632163
case 'n': attr = "@in_guaranteed"; break;
2164+
case 'X': attr = "@in_cxx"; break;
21642165
case 'x': attr = "@owned"; break;
21652166
case 'g': attr = "@guaranteed"; break;
21662167
case 'e': attr = "@deallocating"; break;

lib/Demangling/Remangler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2107,6 +2107,7 @@ ManglingError Remangler::mangleImplFunctionType(Node *node, unsigned depth) {
21072107
.Case("@inout", 'l')
21082108
.Case("@inout_aliasable", 'b')
21092109
.Case("@in_guaranteed", 'n')
2110+
.Case("@in_cxx", 'X')
21102111
.Case("@in_constant", 'c')
21112112
.Case("@owned", 'x')
21122113
.Case("@guaranteed", 'g')

lib/IRGen/GenCall.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,6 +1755,7 @@ const TypeInfo &SignatureExpansion::expand(SILParameterInfo param) {
17551755
switch (auto conv = param.getConvention()) {
17561756
case ParameterConvention::Indirect_In:
17571757
case ParameterConvention::Indirect_In_Guaranteed:
1758+
case ParameterConvention::Indirect_In_CXX:
17581759
addIndirectValueParameterAttributes(IGM, Attrs, ti, ParamIRTypes.size());
17591760
addPointerParameter(IGM.getStorageType(getSILFuncConventions().getSILType(
17601761
param, IGM.getMaximalTypeExpansionContext())));

lib/IRGen/GenDistributed.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@ void DistributedAccessor::decodeArgument(unsigned argumentIdx,
527527
}
528528

529529
switch (param.getConvention()) {
530+
case ParameterConvention::Indirect_In_CXX:
530531
case ParameterConvention::Indirect_In: {
531532
// The only way to load opaque type is to allocate a temporary
532533
// variable on the stack for it and initialize from the given address

0 commit comments

Comments
 (0)