llvm::AttrBuilder().addAlignmentAttr(llvm::Align(attr.getInt())));
}
+ if (auto attr = func.getArgAttrOfType<UnitAttr>(argIdx, "llvm.sret")) {
+ auto argTy = mlirArg.getType();
+ if (!argTy.isa<LLVM::LLVMPointerType>())
+ return func.emitError(
+ "llvm.sret attribute attached to LLVM non-pointer argument");
+ llvmArg.addAttr(llvm::Attribute::AttrKind::StructRet);
+ }
+
+ if (auto attr = func.getArgAttrOfType<UnitAttr>(argIdx, "llvm.byval")) {
+ auto argTy = mlirArg.getType();
+ if (!argTy.isa<LLVM::LLVMPointerType>())
+ return func.emitError(
+ "llvm.byval attribute attached to LLVM non-pointer argument");
+ llvmArg.addAttr(llvm::Attribute::AttrKind::ByVal);
+ }
+
valueMapping[mlirArg] = &llvmArg;
argIdx++;
}
llvm.return
}
+ // CHECK: llvm.func @byvalattr(%{{.*}}: !llvm.ptr<i32> {llvm.byval})
+ llvm.func @byvalattr(%arg0: !llvm.ptr<i32> {llvm.byval}) {
+ llvm.return
+ }
+
+ // CHECK: llvm.func @sretattr(%{{.*}}: !llvm.ptr<i32> {llvm.sret})
+ llvm.func @sretattr(%arg0: !llvm.ptr<i32> {llvm.sret}) {
+ llvm.return
+ }
+
// CHECK: llvm.func @variadic(...)
llvm.func @variadic(...)
// -----
+// expected-error @+1 {{llvm.sret attribute attached to LLVM non-pointer argument}}
+llvm.func @invalid_noalias(%arg0 : !llvm.float {llvm.sret}) -> !llvm.float {
+ llvm.return %arg0 : !llvm.float
+}
+// -----
+
+// expected-error @+1 {{llvm.byval attribute attached to LLVM non-pointer argument}}
+llvm.func @invalid_noalias(%arg0 : !llvm.float {llvm.byval}) -> !llvm.float {
+ llvm.return %arg0 : !llvm.float
+}
+
+// -----
+
// expected-error @+1 {{llvm.align attribute attached to LLVM non-pointer argument}}
llvm.func @invalid_align(%arg0 : !llvm.float {llvm.align = 4}) -> !llvm.float {
llvm.return %arg0 : !llvm.float