18#include "mlir/ABI/Targets/Test/TestTarget.h"
22using namespace mlir::abi;
28 if (cc == cir::CallingConv::AMDGPUKernel)
29 return llvm::CallingConv::AMDGPU_KERNEL;
30 return llvm::CallingConv::C;
33std::optional<FunctionClassification>
41std::optional<FunctionClassification>
44 const llvm::abi::TargetInfo &targetInfo =
48 if (call.getNumArgOperands() > funcTy.getNumInputs())
50 return classifySignature(
51 funcTy.getReturnType(), funcTy.getInputs(),
requiredArgs(funcTy),
52 targetInfo, llvm::CallingConv::C, [&]() {
return call->emitOpError(); });
62 explicit TestTargetClassifier(
const mlir::DataLayout &dl) : dl(dl) {}
64 std::optional<FunctionClassification>
71 std::optional<FunctionClassification>
72 classifyVariadicCall(cir::CIRCallOpInterface call, cir::FuncOp)
final {
74 <<
"variadic arguments not yet implemented in CallConvLowering";
78 std::optional<FunctionClassification>
79 classifyIndirectCall(cir::CIRCallOpInterface call)
final {
81 if (call.getNumArgOperands() > funcTy.getNumInputs()) {
83 <<
"variadic arguments not yet implemented in CallConvLowering";
87 funcTy.getReturnType(),
89 funcTy.getReturnType());
92 std::optional<ArgClassification> classifyVAArg(cir::VAArgOp vaArg)
final {
94 <<
"not yet implemented in CallConvLowering for the test target";
99 const mlir::DataLayout &dl;
107 InjectedClassifier(
const mlir::DataLayout &dl, llvm::StringRef attrName)
108 : dl(dl), attrName(attrName) {}
110 std::optional<FunctionClassification>
117 std::optional<FunctionClassification>
118 classifyVariadicCall(cir::CIRCallOpInterface call, cir::FuncOp)
final {
120 <<
"variadic arguments not yet implemented in CallConvLowering";
126 std::optional<FunctionClassification>
127 classifyIndirectCall(cir::CIRCallOpInterface call)
final {
128 call->emitOpError() <<
"indirect call cannot be classified in the "
129 "'classification-attr' driver mode";
133 std::optional<ArgClassification> classifyVAArg(cir::VAArgOp vaArg)
final {
134 vaArg->emitOpError() <<
"cannot be classified in the "
135 "'classification-attr' driver mode";
140 const mlir::DataLayout &dl;
141 std::string attrName;
146std::unique_ptr<CIRABIClassifier>
148 return std::make_unique<TestTargetClassifier>(dl);
151std::unique_ptr<CIRABIClassifier>
153 llvm::StringRef attrName) {
154 return std::make_unique<InjectedClassifier>(dl, attrName);
std::optional< mlir::abi::FunctionClassification > classifyVariadicCall(cir::CIRCallOpInterface call, cir::FuncOp callee) override
The call is classified at the callee's features, not the caller's, because the pass rewrites the defi...
std::optional< mlir::abi::FunctionClassification > classifyIndirectCall(cir::CIRCallOpInterface call) override
A callee resolved at run time carries no features of its own, so the call is classified at the featur...
virtual const llvm::abi::TargetInfo & getTargetInfo(cir::FuncOp featureSource)=0
The library classifier for a function whose recorded target features may refine the ABI rules.
Produces the classification CallConvLowering rewrites a signature from.
std::optional< mlir::abi::FunctionClassification > withReturnVoidness(std::optional< mlir::abi::FunctionClassification > fc, mlir::Type returnType)
Record on fc whether returnType is CIR's void.
llvm::CallingConv::ID convertCallingConv(cir::CallingConv cc)
Map a CIR calling convention to the llvm::CallingConv the ABI classifier uses.
cir::FuncType getIndirectCalleeType(cir::CIRCallOpInterface call)
The signature the indirect call call reaches its callee through.
std::optional< mlir::abi::FunctionClassification > classifyFunction(cir::FuncOp func, const mlir::DataLayout &dl, cir::CallConvTarget target, llvm::StringRef classificationAttrName)
Classify func with the test target, or from the attribute named classificationAttrName when that is n...
std::unique_ptr< CIRABIClassifier > createInjectedABIClassifier(const mlir::DataLayout &dl, llvm::StringRef attrName)
A classifier that reads each function's classification from the DictionaryAttr named attrName.
std::unique_ptr< CIRABIClassifier > createTestTargetABIClassifier(const mlir::DataLayout &dl)
The MLIR test ABI target's classifier, whose predictable rules approximate x86_64 SysV.
llvm::abi::RequiredArgs requiredArgs(cir::FuncType fnTy)
Where fnTy's declared parameters end and its ellipsis arguments begin.