38 enum class IntegerExtension { None, Zero, Sign };
40 Attributes(
unsigned short alignment = 0,
bool byval =
false,
41 bool sret =
false,
bool append =
false,
42 IntegerExtension intExt = IntegerExtension::None,
43 bool indirect =
false)
44 : alignment{alignment}, byval{byval}, sret{sret}, append{append},
45 indirect{indirect}, intExt{intExt} {}
47 unsigned getAlignment()
const {
return alignment; }
48 bool hasAlignment()
const {
return alignment != 0; }
49 bool isByVal()
const {
return byval; }
50 bool isSRet()
const {
return sret; }
59 bool isAppend()
const {
return append; }
60 bool isZeroExt()
const {
return intExt == IntegerExtension::Zero; }
61 bool isSignExt()
const {
return intExt == IntegerExtension::Sign; }
62 llvm::StringRef getIntExtensionAttrName()
const;
65 unsigned short alignment{};
70 IntegerExtension intExt;
78class CodeGenSpecifics {
81 using TypeAndAttr = std::tuple<mlir::Type, Attributes>;
82 using Marshalling = std::vector<TypeAndAttr>;
84 static std::unique_ptr<CodeGenSpecifics>
85 get(mlir::MLIRContext *ctx, llvm::Triple &&trp,
KindMapping &&kindMap,
86 llvm::StringRef targetCPU, mlir::LLVM::TargetFeaturesAttr targetFeatures,
87 llvm::StringRef targetABI,
const mlir::DataLayout &dl);
89 static std::unique_ptr<CodeGenSpecifics>
90 get(mlir::MLIRContext *ctx, llvm::Triple &&trp,
KindMapping &&kindMap,
91 llvm::StringRef targetCPU, mlir::LLVM::TargetFeaturesAttr targetFeatures,
92 llvm::StringRef targetABI,
const mlir::DataLayout &dl,
93 llvm::StringRef tuneCPU);
95 static TypeAndAttr getTypeAndAttr(mlir::Type t) {
return TypeAndAttr{t, {}}; }
97 CodeGenSpecifics(mlir::MLIRContext *ctx, llvm::Triple &&trp,
99 mlir::LLVM::TargetFeaturesAttr targetFeatures,
100 llvm::StringRef targetABI,
const mlir::DataLayout &dl)
101 : context{*ctx}, triple{std::move(trp)}, kindMap{std::move(kindMap)},
102 targetCPU{targetCPU}, targetFeatures{targetFeatures},
103 targetABI{targetABI}, dataLayout{&dl}, tuneCPU{
""} {}
105 CodeGenSpecifics(mlir::MLIRContext *ctx, llvm::Triple &&trp,
107 mlir::LLVM::TargetFeaturesAttr targetFeatures,
108 llvm::StringRef targetABI,
const mlir::DataLayout &dl,
109 llvm::StringRef tuneCPU)
110 : context{*ctx}, triple{std::move(trp)}, kindMap{std::move(kindMap)},
111 targetCPU{targetCPU}, targetFeatures{targetFeatures},
112 targetABI{targetABI}, dataLayout{&dl}, tuneCPU{tuneCPU} {}
114 CodeGenSpecifics() =
delete;
115 virtual ~CodeGenSpecifics() {}
124 mlir::Type eleTy)
const = 0;
129 mlir::Type eleTy)
const = 0;
139 const Marshalling &previousArguments)
const = 0;
144 fir::RecordType eleTy)
const = 0;
180 virtual Marshalling integerArgumentType(mlir::Location loc,
181 mlir::IntegerType argTy)
const = 0;
185 virtual Marshalling integerReturnType(mlir::Location loc,
186 mlir::IntegerType argTy)
const = 0;
189 virtual unsigned char getCIntTypeWidth()
const = 0;
191 llvm::StringRef getTargetCPU()
const {
return targetCPU; }
192 llvm::StringRef
getTuneCPU()
const {
return tuneCPU; }
194 mlir::LLVM::TargetFeaturesAttr getTargetFeatures()
const {
195 return targetFeatures;
198 llvm::StringRef getTargetABI()
const {
return targetABI; }
200 const mlir::DataLayout &getDataLayout()
const {
201 assert(dataLayout &&
"dataLayout must be set");
206 mlir::MLIRContext &context;
209 llvm::StringRef targetCPU;
210 mlir::LLVM::TargetFeaturesAttr targetFeatures;
211 llvm::StringRef targetABI;
212 const mlir::DataLayout *dataLayout =
nullptr;
213 llvm::StringRef tuneCPU;