From 26551c1c9497dacb1f56808802e17cc8611cef8e Mon Sep 17 00:00:00 2001 From: AdUhTkJm <2292398666@qq.com> Date: Mon, 3 Feb 2025 22:07:56 +0000 Subject: [PATCH] [CIR][CUDA] Add NVPTX ABI info skeleton --- clang/lib/CIR/CodeGen/TargetInfo.cpp | 56 ++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/clang/lib/CIR/CodeGen/TargetInfo.cpp b/clang/lib/CIR/CodeGen/TargetInfo.cpp index d613167677a9..7669dad59eb8 100644 --- a/clang/lib/CIR/CodeGen/TargetInfo.cpp +++ b/clang/lib/CIR/CodeGen/TargetInfo.cpp @@ -305,6 +305,30 @@ class SPIRVTargetCIRGenInfo : public CommonSPIRTargetCIRGenInfo { } // namespace +//===----------------------------------------------------------------------===// +// NVPTX ABI Implementation +//===----------------------------------------------------------------------===// + +namespace { + +class NVPTXABIInfo : public ABIInfo { +public: + NVPTXABIInfo(CIRGenTypes &cgt) : ABIInfo(cgt) {} + + cir::ABIArgInfo classifyReturnType(QualType retTy) const; + cir::ABIArgInfo classifyArgumentType(QualType ty) const; + + void computeInfo(CIRGenFunctionInfo &fnInfo) const override; +}; + +class NVPTXTargetCIRGenInfo : public TargetCIRGenInfo { +public: + NVPTXTargetCIRGenInfo(CIRGenTypes &cgt) + : TargetCIRGenInfo(std::make_unique(cgt)) {} +}; + +} // namespace + // TODO(cir): remove the attribute once this gets used. LLVM_ATTRIBUTE_UNUSED static bool classifyReturnType(const CIRGenCXXABI &CXXABI, @@ -443,6 +467,34 @@ cir::ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, return cir::ABIArgInfo::getDirect(ResType); } +// Skeleton only. Implement when used in TargetLower stage. +cir::ABIArgInfo NVPTXABIInfo::classifyReturnType(QualType retTy) const { + llvm_unreachable("not yet implemented"); +} + +cir::ABIArgInfo NVPTXABIInfo::classifyArgumentType(QualType ty) const { + llvm_unreachable("not yet implemented"); +} + +void NVPTXABIInfo::computeInfo(CIRGenFunctionInfo &fnInfo) const { + // Top level CIR has unlimited arguments and return types. Lowering for ABI + // specific concerns should happen during a lowering phase. Assume everything + // is direct for now. + for (CIRGenFunctionInfo::arg_iterator it = fnInfo.arg_begin(), + ie = fnInfo.arg_end(); + it != ie; ++it) { + if (testIfIsVoidTy(it->type)) + it->info = cir::ABIArgInfo::getIgnore(); + else + it->info = cir::ABIArgInfo::getDirect(CGT.convertType(it->type)); + } + auto retTy = fnInfo.getReturnType(); + if (testIfIsVoidTy(retTy)) + fnInfo.getReturnInfo() = cir::ABIArgInfo::getIgnore(); + else + fnInfo.getReturnInfo() = cir::ABIArgInfo::getDirect(CGT.convertType(retTy)); +} + ABIInfo::~ABIInfo() {} bool ABIInfo::isPromotableIntegerTypeForABI(QualType Ty) const { @@ -634,5 +686,9 @@ const TargetCIRGenInfo &CIRGenModule::getTargetCIRGenInfo() { case llvm::Triple::spirv64: { return SetCIRGenInfo(new SPIRVTargetCIRGenInfo(genTypes)); } + + case llvm::Triple::nvptx64: { + return SetCIRGenInfo(new NVPTXTargetCIRGenInfo(genTypes)); + } } }