13
13
14
14
#include " CodeGenFunction.h"
15
15
#include " clang/Basic/Builtins.h"
16
+ #include " clang/Basic/TargetBuiltins.h"
16
17
#include " llvm/IR/DataLayout.h"
17
18
#include " llvm/IR/Instruction.h"
18
19
#include " llvm/Support/MathExtras.h"
@@ -178,17 +179,29 @@ RValue CodeGenFunction::EmitNVPTXDevicePrintfCallExpr(const CallExpr *E) {
178
179
E, this , GetVprintfDeclaration (CGM.getModule ()), false );
179
180
}
180
181
182
+ // Deterimines if an argument is a string
183
+ static bool isString (const clang::Type *argXTy) {
184
+ if ((argXTy->isPointerType () || argXTy->isConstantArrayType ()) &&
185
+ argXTy->getPointeeOrArrayElementType ()->isCharType ())
186
+ return true ;
187
+ else
188
+ return false ;
189
+ }
190
+
181
191
RValue CodeGenFunction::EmitAMDGPUDevicePrintfCallExpr (const CallExpr *E) {
182
192
assert (getTarget ().getTriple ().getArch () == llvm::Triple::amdgcn);
183
193
assert (E->getBuiltinCallee () == Builtin::BIprintf ||
184
- E->getBuiltinCallee () == Builtin::BI__builtin_printf);
194
+ E->getBuiltinCallee () == Builtin::BI__builtin_printf ||
195
+ E->getBuiltinCallee () == AMDGPU::BIprintf);
185
196
assert (E->getNumArgs () >= 1 ); // printf always has at least one arg.
186
197
187
198
CallArgList CallArgs;
188
199
EmitCallArgs (CallArgs,
189
200
E->getDirectCallee ()->getType ()->getAs <FunctionProtoType>(),
190
201
E->arguments (), E->getDirectCallee (),
191
202
/* ParamsToSkip = */ 0 );
203
+ llvm::IRBuilder<> IRB (Builder.GetInsertBlock (), Builder.GetInsertPoint ());
204
+ IRB.SetCurrentDebugLocation (Builder.getCurrentDebugLocation ());
192
205
193
206
SmallVector<llvm::Value *, 8 > Args;
194
207
for (const auto &A : CallArgs) {
@@ -199,14 +212,14 @@ RValue CodeGenFunction::EmitAMDGPUDevicePrintfCallExpr(const CallExpr *E) {
199
212
}
200
213
201
214
llvm::Value *Arg = A.getRValue (*this ).getScalarVal ();
215
+ if (isString (A.getType ().getTypePtr ()) && CGM.getLangOpts ().OpenCL )
216
+ Arg = Builder.CreateAddrSpaceCast (Arg, CGM.Int8PtrTy );
202
217
Args.push_back (Arg);
203
218
}
204
219
205
- llvm::IRBuilder<> IRB (Builder.GetInsertBlock (), Builder.GetInsertPoint ());
206
- IRB.SetCurrentDebugLocation (Builder.getCurrentDebugLocation ());
207
-
208
- bool isBuffered = (CGM.getTarget ().getTargetOpts ().AMDGPUPrintfKindVal ==
209
- clang::TargetOptions::AMDGPUPrintfKind::Buffered);
220
+ auto PFK = CGM.getTarget ().getTargetOpts ().AMDGPUPrintfKindVal ;
221
+ bool isBuffered =
222
+ (PFK == clang::TargetOptions::AMDGPUPrintfKind::Buffered);
210
223
auto Printf = llvm::emitAMDGPUPrintfCall (IRB, Args, isBuffered);
211
224
Builder.SetInsertPoint (IRB.GetInsertBlock (), IRB.GetInsertPoint ());
212
225
return RValue::get (Printf);
0 commit comments