summaryrefslogtreecommitdiff
path: root/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
diff options
context:
space:
mode:
authorEric Schweitz <eschweitz@nvidia.com>2021-01-04 16:32:48 -0800
committerEric Schweitz <eschweitz@nvidia.com>2021-01-07 09:03:16 -0800
commit82f5ee3c3e601daad546c320a98d9e7860d6347d (patch)
tree3a7f5b9b47c4cd3ff2b8039f9e9c0afba42589f0 /mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
parentdb33f85c7124443e140d0118289fc141bab0c68d (diff)
Adds argument attributes for using LLVM's sret and byval attributes to
the conversion of LLVM IR dialect. These attributes are used in FIR to support the lowering of Fortran using target-specific calling conventions. Add roundtrip tests. Add changes per review comments/concerns. Reviewed By: ftynse Differential Revision: https://reviews.llvm.org/D94052
Diffstat (limited to 'mlir/lib/Target/LLVMIR/ModuleTranslation.cpp')
-rw-r--r--mlir/lib/Target/LLVMIR/ModuleTranslation.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 7700867bb461..86f4e7e3e2c4 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -1102,6 +1102,22 @@ LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) {
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++;
}