llvm::AttrBuilder().addAlignmentAttr(llvm::Align(attr.getInt())));
}
- if (auto attr = func.getArgAttrOfType<UnitAttr>(argIdx, "llvm.sret")) {
- auto argTy = mlirArg.getType().dyn_cast<LLVM::LLVMType>();
- 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().dyn_cast<LLVM::LLVMType>();
- 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