diff options
Diffstat (limited to 'clang/lib/CodeGen/CGGPUBuiltin.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGGPUBuiltin.cpp | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGGPUBuiltin.cpp b/clang/lib/CodeGen/CGGPUBuiltin.cpp index d7e2676307623..f860623e2bc37 100644 --- a/clang/lib/CodeGen/CGGPUBuiltin.cpp +++ b/clang/lib/CodeGen/CGGPUBuiltin.cpp @@ -16,6 +16,7 @@ #include "llvm/IR/DataLayout.h" #include "llvm/IR/Instruction.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Transforms/Utils/AMDGPUEmitPrintf.h" using namespace clang; using namespace CodeGen; @@ -110,7 +111,7 @@ CodeGenFunction::EmitNVPTXDevicePrintfCallExpr(const CallExpr *E, for (unsigned I = 1, NumArgs = Args.size(); I < NumArgs; ++I) { llvm::Value *P = Builder.CreateStructGEP(AllocaTy, Alloca, I - 1); llvm::Value *Arg = Args[I].getRValue(*this).getScalarVal(); - Builder.CreateAlignedStore(Arg, P, DL.getPrefTypeAlignment(Arg->getType())); + Builder.CreateAlignedStore(Arg, P, DL.getPrefTypeAlign(Arg->getType())); } BufferPtr = Builder.CreatePointerCast(Alloca, llvm::Type::getInt8PtrTy(Ctx)); } @@ -120,3 +121,36 @@ CodeGenFunction::EmitNVPTXDevicePrintfCallExpr(const CallExpr *E, return RValue::get(Builder.CreateCall( VprintfFunc, {Args[0].getRValue(*this).getScalarVal(), BufferPtr})); } + +RValue +CodeGenFunction::EmitAMDGPUDevicePrintfCallExpr(const CallExpr *E, + ReturnValueSlot ReturnValue) { + assert(getTarget().getTriple().getArch() == llvm::Triple::amdgcn); + assert(E->getBuiltinCallee() == Builtin::BIprintf || + E->getBuiltinCallee() == Builtin::BI__builtin_printf); + assert(E->getNumArgs() >= 1); // printf always has at least one arg. + + CallArgList CallArgs; + EmitCallArgs(CallArgs, + E->getDirectCallee()->getType()->getAs<FunctionProtoType>(), + E->arguments(), E->getDirectCallee(), + /* ParamsToSkip = */ 0); + + SmallVector<llvm::Value *, 8> Args; + for (auto A : CallArgs) { + // We don't know how to emit non-scalar varargs. + if (!A.getRValue(*this).isScalar()) { + CGM.ErrorUnsupported(E, "non-scalar arg to printf"); + return RValue::get(llvm::ConstantInt::get(IntTy, -1)); + } + + llvm::Value *Arg = A.getRValue(*this).getScalarVal(); + Args.push_back(Arg); + } + + llvm::IRBuilder<> IRB(Builder.GetInsertBlock(), Builder.GetInsertPoint()); + IRB.SetCurrentDebugLocation(Builder.getCurrentDebugLocation()); + auto Printf = llvm::emitAMDGPUPrintfCall(IRB, Args); + Builder.SetInsertPoint(IRB.GetInsertBlock(), IRB.GetInsertPoint()); + return RValue::get(Printf); +} |