@@ -1424,22 +1424,7 @@ void SignatureExpansion::expandExternalSignatureTypes() {
1424
1424
attrKindForExtending (signExt));
1425
1425
}
1426
1426
1427
- // If we return indirectly, that is the first parameter type.
1428
- if (returnInfo.isIndirect ()) {
1429
- addIndirectResult ();
1430
- }
1431
-
1432
- size_t firstParamToLowerNormally = 0 ;
1433
-
1434
- // Use a special IR type for passing block pointers.
1435
- if (FnType->getRepresentation () == SILFunctionTypeRepresentation::Block) {
1436
- assert (FI.arg_begin ()[0 ].info .isDirect () &&
1437
- " block pointer not passed directly?" );
1438
- ParamIRTypes.push_back (IGM.ObjCBlockPtrTy );
1439
- firstParamToLowerNormally = 1 ;
1440
- }
1441
-
1442
- for (auto i : indices (paramTys).slice (firstParamToLowerNormally)) {
1427
+ auto emitArg = [&](size_t i) {
1443
1428
auto &AI = FI.arg_begin ()[i].info ;
1444
1429
1445
1430
// Add a padding argument if required.
@@ -1528,8 +1513,35 @@ void SignatureExpansion::expandExternalSignatureTypes() {
1528
1513
case clang::CodeGen::ABIArgInfo::InAlloca:
1529
1514
llvm_unreachable (" Need to handle InAlloca during signature expansion" );
1530
1515
}
1516
+ };
1517
+
1518
+ size_t firstParamToLowerNormally = 0 ;
1519
+
1520
+ // If we return indirectly, that is the first parameter type.
1521
+ if (returnInfo.isIndirect ()) {
1522
+ if (IGM.Triple .isWindowsMSVCEnvironment () &&
1523
+ FnType->getRepresentation () ==
1524
+ SILFunctionTypeRepresentation::CXXMethod) {
1525
+ // Windows ABI places `this` before the
1526
+ // returned indirect values.
1527
+ emitArg (0 );
1528
+ firstParamToLowerNormally = 1 ;
1529
+ addIndirectResult ();
1530
+ } else
1531
+ addIndirectResult ();
1531
1532
}
1532
1533
1534
+ // Use a special IR type for passing block pointers.
1535
+ if (FnType->getRepresentation () == SILFunctionTypeRepresentation::Block) {
1536
+ assert (FI.arg_begin ()[0 ].info .isDirect () &&
1537
+ " block pointer not passed directly?" );
1538
+ ParamIRTypes.push_back (IGM.ObjCBlockPtrTy );
1539
+ firstParamToLowerNormally = 1 ;
1540
+ }
1541
+
1542
+ for (auto i : indices (paramTys).slice (firstParamToLowerNormally))
1543
+ emitArg (i);
1544
+
1533
1545
if (returnInfo.isIndirect () || returnInfo.isIgnore ()) {
1534
1546
ResultIRType = IGM.VoidTy ;
1535
1547
} else {
0 commit comments