#include "llvm/Transforms/Utils/AMDGPUEmitPrintf.h"
#include "llvm/ADT/SparseBitVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/MD5.h"
#include "llvm/Support/MathExtras.h"
usingnamespacellvm;
#define DEBUG_TYPE …
static Value *fitArgInto64Bits(IRBuilder<> &Builder, Value *Arg) { … }
static Value *callPrintfBegin(IRBuilder<> &Builder, Value *Version) { … }
static Value *callAppendArgs(IRBuilder<> &Builder, Value *Desc, int NumArgs,
Value *Arg0, Value *Arg1, Value *Arg2, Value *Arg3,
Value *Arg4, Value *Arg5, Value *Arg6,
bool IsLast) { … }
static Value *appendArg(IRBuilder<> &Builder, Value *Desc, Value *Arg,
bool IsLast) { … }
static Value *getStrlenWithNull(IRBuilder<> &Builder, Value *Str) { … }
static Value *callAppendStringN(IRBuilder<> &Builder, Value *Desc, Value *Str,
Value *Length, bool isLast) { … }
static Value *appendString(IRBuilder<> &Builder, Value *Desc, Value *Arg,
bool IsLast) { … }
static Value *processArg(IRBuilder<> &Builder, Value *Desc, Value *Arg,
bool SpecIsCString, bool IsLast) { … }
static void locateCStrings(SparseBitVector<8> &BV, StringRef Str) { … }
struct StringData { … };
static Value *callBufferedPrintfStart(
IRBuilder<> &Builder, ArrayRef<Value *> Args, Value *Fmt,
bool isConstFmtStr, SparseBitVector<8> &SpecIsCString,
SmallVectorImpl<StringData> &StringContents, Value *&ArgSize) { … }
static void processConstantStringArg(StringData *SD, IRBuilder<> &Builder,
SmallVectorImpl<Value *> &WhatToStore) { … }
static Value *processNonStringArg(Value *Arg, IRBuilder<> &Builder) { … }
static void
callBufferedPrintfArgPush(IRBuilder<> &Builder, ArrayRef<Value *> Args,
Value *PtrToStore, SparseBitVector<8> &SpecIsCString,
SmallVectorImpl<StringData> &StringContents,
bool IsConstFmtStr) { … }
Value *llvm::emitAMDGPUPrintfCall(IRBuilder<> &Builder, ArrayRef<Value *> Args,
bool IsBuffered) { … }