Skip to content

Commit a31e89d

Browse files
committed
Also add inreg to sreg that's added by CreateCallOrInvoke
This case was missed by #76159. This is a partial fix for #74866
1 parent 6e055d3 commit a31e89d

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed

lib/IRGen/GenCall.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3306,6 +3306,8 @@ llvm::CallBase *IRBuilder::CreateCallOrInvoke(
33063306
if (!ty)
33073307
ty = func->getParamStructRetType(argIndex);
33083308
builder.addStructRetAttr(ty);
3309+
if (func->hasParamAttribute(argIndex, llvm::Attribute::InReg))
3310+
builder.addAttribute(llvm::Attribute::InReg);
33093311
attrs = attrs.addParamAttributes(func->getContext(), argIndex, builder);
33103312
}
33113313
if (func->hasParamAttribute(argIndex, llvm::Attribute::ByVal)) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#ifndef TEST_INTEROP_CXX_CLASS_METHOD_INREG_SRET_H
2+
#define TEST_INTEROP_CXX_CLASS_METHOD_INREG_SRET_H
3+
4+
struct OptionalBridgedBasicBlock {
5+
};
6+
7+
struct BridgedFunction {
8+
OptionalBridgedBasicBlock getFirstBlock() const { return {}; }
9+
};
10+
11+
#endif // TEST_INTEROP_CXX_CLASS_METHOD_INREG_SRET_H

test/Interop/Cxx/class/method/Inputs/module.modulemap

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,8 @@ module SRetWinARM64 {
1919
header "sret-win-arm64.h"
2020
requires cplusplus
2121
}
22+
23+
module InRegSRet {
24+
header "inreg-sret.h"
25+
requires cplusplus
26+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: %target-swift-emit-irgen -I %S/Inputs -cxx-interoperability-mode=default %s | %FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-%target-cpu
2+
3+
// REQUIRES: OS=windows-msvc
4+
5+
import InRegSRet
6+
7+
final public class BasicBlock {
8+
}
9+
10+
extension OptionalBridgedBasicBlock {
11+
public var block: BasicBlock? { nil }
12+
}
13+
14+
final public class Function {
15+
public var bridged: BridgedFunction {
16+
BridgedFunction()
17+
}
18+
19+
public var firstBlock : BasicBlock? { bridged.getFirstBlock().block }
20+
}
21+
22+
// Check that inreg on the sret isn't missing
23+
24+
// CHECK-x86_64: call void @"?getFirstBlock@BridgedFunction@@QEBA?AUOptionalBridgedBasicBlock@@XZ"(ptr {{.*}}, ptr sret(%struct.OptionalBridgedBasicBlock) {{.*}})
25+
// CHECK-aarch64: call void @"?getFirstBlock@BridgedFunction@@QEBA?AUOptionalBridgedBasicBlock@@XZ"(ptr {{.*}}, ptr inreg sret(%struct.OptionalBridgedBasicBlock) {{.*}})
26+
27+
// CHECK-x86_64: define {{.*}} void @"?getFirstBlock@BridgedFunction@@QEBA?AUOptionalBridgedBasicBlock@@XZ"(ptr {{.*}} %{{.*}}, ptr noalias sret(%struct.OptionalBridgedBasicBlock) {{.*}} %{{.*}})
28+
// CHECK-aarch64: define {{.*}} void @"?getFirstBlock@BridgedFunction@@QEBA?AUOptionalBridgedBasicBlock@@XZ"(ptr {{.*}} %{{.*}}, ptr inreg noalias sret(%struct.OptionalBridgedBasicBlock) {{.*}} %{{.*}})

0 commit comments

Comments
 (0)