File tree 3 files changed +39
-0
lines changed
3 files changed +39
-0
lines changed Original file line number Diff line number Diff line change @@ -1102,6 +1102,22 @@ LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) {
1102
1102
llvm::AttrBuilder ().addAlignmentAttr (llvm::Align (attr.getInt ())));
1103
1103
}
1104
1104
1105
+ if (auto attr = func.getArgAttrOfType <UnitAttr>(argIdx, " llvm.sret" )) {
1106
+ auto argTy = mlirArg.getType ().dyn_cast <LLVM::LLVMType>();
1107
+ if (!argTy.isa <LLVM::LLVMPointerType>())
1108
+ return func.emitError (
1109
+ " llvm.sret attribute attached to LLVM non-pointer argument" );
1110
+ llvmArg.addAttr (llvm::Attribute::AttrKind::StructRet);
1111
+ }
1112
+
1113
+ if (auto attr = func.getArgAttrOfType <UnitAttr>(argIdx, " llvm.byval" )) {
1114
+ auto argTy = mlirArg.getType ().dyn_cast <LLVM::LLVMType>();
1115
+ if (!argTy.isa <LLVM::LLVMPointerType>())
1116
+ return func.emitError (
1117
+ " llvm.byval attribute attached to LLVM non-pointer argument" );
1118
+ llvmArg.addAttr (llvm::Attribute::AttrKind::ByVal);
1119
+ }
1120
+
1105
1121
valueMapping[mlirArg] = &llvmArg;
1106
1122
argIdx++;
1107
1123
}
Original file line number Diff line number Diff line change @@ -87,6 +87,16 @@ module {
87
87
llvm.return
88
88
}
89
89
90
+ // CHECK: llvm.func @byvalattr(%{{.*}}: !llvm.ptr<i32> {llvm.byval})
91
+ llvm.func @byvalattr (%arg0: !llvm.ptr <i32 > {llvm.byval }) {
92
+ llvm.return
93
+ }
94
+
95
+ // CHECK: llvm.func @sretattr(%{{.*}}: !llvm.ptr<i32> {llvm.sret})
96
+ llvm.func @sretattr (%arg0: !llvm.ptr <i32 > {llvm.sret }) {
97
+ llvm.return
98
+ }
99
+
90
100
// CHECK: llvm.func @variadic(...)
91
101
llvm.func @variadic (...)
92
102
Original file line number Diff line number Diff line change @@ -14,6 +14,19 @@ llvm.func @invalid_noalias(%arg0 : !llvm.float {llvm.noalias = true}) -> !llvm.f
14
14
15
15
// -----
16
16
17
+ // expected-error @+1 {{llvm.sret attribute attached to LLVM non-pointer argument}}
18
+ llvm.func @invalid_noalias (%arg0 : !llvm.float {llvm.sret }) -> !llvm.float {
19
+ llvm.return %arg0 : !llvm.float
20
+ }
21
+ // -----
22
+
23
+ // expected-error @+1 {{llvm.byval attribute attached to LLVM non-pointer argument}}
24
+ llvm.func @invalid_noalias (%arg0 : !llvm.float {llvm.byval }) -> !llvm.float {
25
+ llvm.return %arg0 : !llvm.float
26
+ }
27
+
28
+ // -----
29
+
17
30
// expected-error @+1 {{llvm.align attribute attached to LLVM non-pointer argument}}
18
31
llvm.func @invalid_align (%arg0 : !llvm.float {llvm.align = 4 }) -> !llvm.float {
19
32
llvm.return %arg0 : !llvm.float
You can’t perform that action at this time.
0 commit comments