//===-- gen/abi-spirv.cpp ---------------------------------------*- C++ -*-===// // // LDC – the LLVM D compiler // // This file is distributed under the BSD-style LDC license. See the LICENSE // file for details. // //===----------------------------------------------------------------------===// #include "gen/abi.h" #include "gen/dcompute/druntime.h" #include "gen/uda.h" #include "dmd/declaration.h" #include "gen/tollvm.h" #include "gen/dcompute/abi-rewrites.h" struct SPIRVTargetABI : TargetABI { DComputePointerRewrite pointerRewite; llvm::CallingConv::ID callingConv(LINK l, TypeFunction *tf = nullptr, FuncDeclaration *fdecl = nullptr) override { assert(fdecl); if (hasKernelAttr(fdecl)) return llvm::CallingConv::SPIR_KERNEL; else return llvm::CallingConv::SPIR_FUNC; } bool passByVal(TypeFunction *, Type *t) override { t = t->toBasetype(); return ((t->ty == Tsarray || t->ty == Tstruct) && t->size() > 64); } bool reverseExplicitParams(TypeFunction *) override { return false; } void rewriteFunctionType(IrFuncTy &fty) override { for (auto arg : fty.args) { if (!arg->byref) rewriteArgument(fty, *arg); } } bool returnInArg(TypeFunction *tf, bool) override { return !tf->isref && DtoIsInMemoryOnly(tf->next); } void rewriteArgument(IrFuncTy &fty, IrFuncTyArg &arg) override { Type *ty = arg.type->toBasetype(); llvm::Optional ptr; if (ty->ty == Tstruct && (ptr = toDcomputePointer(static_cast(ty)->sym))) { pointerRewite.applyTo(arg); } } // There are no exceptions at all, so no need for unwind tables. bool needsUnwindTables() override { return false; } }; TargetABI *createSPIRVABI() { return new SPIRVTargetABI(); }