LLVM 23.0.0git
AMDGPUEmitPrintf.cpp
Go to the documentation of this file.
1//===- AMDGPUEmitPrintf.cpp -----------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Utility function to lower a printf call into a series of device
10// library calls on the AMDGPU target.
11//
12// WARNING: This file knows about certain library functions. It recognizes them
13// by name, and hardwires knowledge of their semantics.
14//
15//===----------------------------------------------------------------------===//
16
21#include "llvm/IR/Module.h"
23#include "llvm/Support/MD5.h"
25
26using namespace llvm;
27
28#define DEBUG_TYPE "amdgpu-emit-printf"
29
30static Value *fitArgInto64Bits(IRBuilder<> &Builder, Value *Arg) {
31 auto Int64Ty = Builder.getInt64Ty();
32 auto Ty = Arg->getType();
33
34 if (auto IntTy = dyn_cast<IntegerType>(Ty)) {
35 switch (IntTy->getBitWidth()) {
36 case 32:
37 return Builder.CreateZExt(Arg, Int64Ty);
38 case 64:
39 return Arg;
40 }
41 }
42
43 if (Ty->getTypeID() == Type::DoubleTyID) {
44 return Builder.CreateBitCast(Arg, Int64Ty);
45 }
46
47 if (isa<PointerType>(Ty)) {
48 return Builder.CreatePtrToInt(Arg, Int64Ty);
49 }
50
51 llvm_unreachable("unexpected type");
52}
53
54static Value *callPrintfBegin(IRBuilder<> &Builder, Value *Version) {
55 auto Int64Ty = Builder.getInt64Ty();
56 auto M = Builder.GetInsertBlock()->getModule();
57 auto Fn = M->getOrInsertFunction("__ockl_printf_begin", Int64Ty, Int64Ty);
58 return Builder.CreateCall(Fn, Version);
59}
60
61static Value *callAppendArgs(IRBuilder<> &Builder, Value *Desc, int NumArgs,
62 Value *Arg0, Value *Arg1, Value *Arg2, Value *Arg3,
63 Value *Arg4, Value *Arg5, Value *Arg6,
64 bool IsLast) {
65 auto Int64Ty = Builder.getInt64Ty();
66 auto Int32Ty = Builder.getInt32Ty();
67 auto M = Builder.GetInsertBlock()->getModule();
68 auto Fn = M->getOrInsertFunction("__ockl_printf_append_args", Int64Ty,
69 Int64Ty, Int32Ty, Int64Ty, Int64Ty, Int64Ty,
70 Int64Ty, Int64Ty, Int64Ty, Int64Ty, Int32Ty);
71 auto IsLastValue = Builder.getInt32(IsLast);
72 auto NumArgsValue = Builder.getInt32(NumArgs);
73 return Builder.CreateCall(Fn, {Desc, NumArgsValue, Arg0, Arg1, Arg2, Arg3,
74 Arg4, Arg5, Arg6, IsLastValue});
75}
76
77static Value *appendArg(IRBuilder<> &Builder, Value *Desc, Value *Arg,
78 bool IsLast) {
79 auto Arg0 = fitArgInto64Bits(Builder, Arg);
80 auto Zero = Builder.getInt64(0);
81 return callAppendArgs(Builder, Desc, 1, Arg0, Zero, Zero, Zero, Zero, Zero,
82 Zero, IsLast);
83}
84
85// The device library does not provide strlen, so we build our own loop
86// here. While we are at it, we also include the terminating null in the length.
87static Value *getStrlenWithNull(IRBuilder<> &Builder, Value *Str) {
88 auto *Prev = Builder.GetInsertBlock();
89 Module *M = Prev->getModule();
90
91 auto CharZero = Builder.getInt8(0);
92 auto One = Builder.getInt64(1);
93 auto Zero = Builder.getInt64(0);
94 auto Int64Ty = Builder.getInt64Ty();
95
96 // The length is either zero for a null pointer, or the computed value for an
97 // actual string. We need a join block for a phi that represents the final
98 // value.
99 //
100 // Strictly speaking, the zero does not matter since
101 // __ockl_printf_append_string_n ignores the length if the pointer is null.
102 BasicBlock *Join = nullptr;
103 if (Prev->getTerminator()) {
104 Join = Prev->splitBasicBlock(Builder.GetInsertPoint(),
105 "strlen.join");
107 } else {
108 Join = BasicBlock::Create(M->getContext(), "strlen.join",
109 Prev->getParent());
110 }
111 BasicBlock *While =
112 BasicBlock::Create(M->getContext(), "strlen.while",
113 Prev->getParent(), Join);
114 BasicBlock *WhileDone = BasicBlock::Create(
115 M->getContext(), "strlen.while.done",
116 Prev->getParent(), Join);
117
118 // Emit an early return for when the pointer is null.
119 Builder.SetInsertPoint(Prev);
120 auto CmpNull =
121 Builder.CreateICmpEQ(Str, Constant::getNullValue(Str->getType()));
122 BranchInst::Create(Join, While, CmpNull, Prev);
123
124 // Entry to the while loop.
125 Builder.SetInsertPoint(While);
126
127 auto PtrPhi = Builder.CreatePHI(Str->getType(), 2);
128 PtrPhi->addIncoming(Str, Prev);
129 auto PtrNext = Builder.CreateGEP(Builder.getInt8Ty(), PtrPhi, One);
130 PtrPhi->addIncoming(PtrNext, While);
131
132 // Condition for the while loop.
133 auto Data = Builder.CreateLoad(Builder.getInt8Ty(), PtrPhi);
134 auto Cmp = Builder.CreateICmpEQ(Data, CharZero);
135 Builder.CreateCondBr(Cmp, WhileDone, While);
136
137 // Add one to the computed length.
138 Builder.SetInsertPoint(WhileDone, WhileDone->begin());
139 auto Len = Builder.CreatePtrDiff(PtrPhi, Str);
140 Len = Builder.CreateZExt(Len, Int64Ty);
141 Len = Builder.CreateAdd(Len, One);
142
143 // Final join.
144 BranchInst::Create(Join, WhileDone);
145 Builder.SetInsertPoint(Join, Join->begin());
146 auto LenPhi = Builder.CreatePHI(Len->getType(), 2);
147 LenPhi->addIncoming(Len, WhileDone);
148 LenPhi->addIncoming(Zero, Prev);
149
150 return LenPhi;
151}
152
154 Value *Length, bool isLast) {
155 auto Int64Ty = Builder.getInt64Ty();
156 auto IsLastInt32 = Builder.getInt32(isLast);
157 auto M = Builder.GetInsertBlock()->getModule();
158 auto Fn = M->getOrInsertFunction("__ockl_printf_append_string_n", Int64Ty,
159 Desc->getType(), Str->getType(),
160 Length->getType(), IsLastInt32->getType());
161 return Builder.CreateCall(Fn, {Desc, Str, Length, IsLastInt32});
162}
163
164static Value *appendString(IRBuilder<> &Builder, Value *Desc, Value *Arg,
165 bool IsLast) {
166 auto Length = getStrlenWithNull(Builder, Arg);
167 return callAppendStringN(Builder, Desc, Arg, Length, IsLast);
168}
169
170static Value *processArg(IRBuilder<> &Builder, Value *Desc, Value *Arg,
171 bool SpecIsCString, bool IsLast) {
172 if (SpecIsCString && isa<PointerType>(Arg->getType())) {
173 return appendString(Builder, Desc, Arg, IsLast);
174 }
175 // If the format specifies a string but the argument is not, the frontend will
176 // have printed a warning. We just rely on undefined behaviour and send the
177 // argument anyway.
178 return appendArg(Builder, Desc, Arg, IsLast);
179}
180
181// Scan the format string to locate all specifiers, and mark the ones that
182// specify a string, i.e, the "%s" specifier with optional '*' characters.
184 static const char ConvSpecifiers[] = "diouxXfFeEgGaAcspn";
185 size_t SpecPos = 0;
186 // Skip the first argument, the format string.
187 unsigned ArgIdx = 1;
188
189 while ((SpecPos = Str.find_first_of('%', SpecPos)) != StringRef::npos) {
190 if (Str[SpecPos + 1] == '%') {
191 SpecPos += 2;
192 continue;
193 }
194 auto SpecEnd = Str.find_first_of(ConvSpecifiers, SpecPos);
195 if (SpecEnd == StringRef::npos)
196 return;
197 auto Spec = Str.slice(SpecPos, SpecEnd + 1);
198 ArgIdx += Spec.count('*');
199 if (Str[SpecEnd] == 's') {
200 BV.set(ArgIdx);
201 }
202 SpecPos = SpecEnd + 1;
203 ++ArgIdx;
204 }
205}
206
207// helper struct to package the string related data
210 Value *RealSize = nullptr;
211 Value *AlignedSize = nullptr;
212 bool IsConst = true;
213
214 StringData(StringRef ST, Value *RS, Value *AS, bool IC)
215 : Str(ST), RealSize(RS), AlignedSize(AS), IsConst(IC) {}
216};
217
218// Calculates frame size required for current printf expansion and allocates
219// space on printf buffer. Printf frame includes following contents
220// [ ControlDWord , format string/Hash , Arguments (each aligned to 8 byte) ]
222 IRBuilder<> &Builder, ArrayRef<Value *> Args, Value *Fmt,
223 bool isConstFmtStr, SparseBitVector<8> &SpecIsCString,
224 SmallVectorImpl<StringData> &StringContents, Value *&ArgSize) {
225 Module *M = Builder.GetInsertBlock()->getModule();
226 Value *NonConstStrLen = nullptr;
227 Value *LenWithNull = nullptr;
228 Value *LenWithNullAligned = nullptr;
229 Value *TempAdd = nullptr;
230
231 // First 4 bytes to be reserved for control dword
232 size_t BufSize = 4;
233 if (isConstFmtStr)
234 // First 8 bytes of MD5 hash
235 BufSize += 8;
236 else {
237 LenWithNull = getStrlenWithNull(Builder, Fmt);
238
239 // Align the computed length to next 8 byte boundary
240 TempAdd = Builder.CreateAdd(LenWithNull,
241 ConstantInt::get(LenWithNull->getType(), 7U));
242 NonConstStrLen = Builder.CreateAnd(
243 TempAdd, ConstantInt::get(LenWithNull->getType(), ~7U));
244
245 StringContents.push_back(
246 StringData(StringRef(), LenWithNull, NonConstStrLen, false));
247 }
248
249 for (size_t i = 1; i < Args.size(); i++) {
250 if (SpecIsCString.test(i)) {
251 StringRef ArgStr;
252 if (getConstantStringInfo(Args[i], ArgStr)) {
253 auto alignedLen = alignTo(ArgStr.size() + 1, 8);
254 StringContents.push_back(StringData(
255 ArgStr,
256 /*RealSize*/ nullptr, /*AlignedSize*/ nullptr, /*IsConst*/ true));
257 BufSize += alignedLen;
258 } else {
259 LenWithNull = getStrlenWithNull(Builder, Args[i]);
260
261 // Align the computed length to next 8 byte boundary
262 TempAdd = Builder.CreateAdd(
263 LenWithNull, ConstantInt::get(LenWithNull->getType(), 7U));
264 LenWithNullAligned = Builder.CreateAnd(
265 TempAdd, ConstantInt::get(LenWithNull->getType(), ~7U));
266
267 if (NonConstStrLen) {
268 auto Val = Builder.CreateAdd(LenWithNullAligned, NonConstStrLen,
269 "cumulativeAdd");
270 NonConstStrLen = Val;
271 } else
272 NonConstStrLen = LenWithNullAligned;
273
274 StringContents.push_back(
275 StringData(StringRef(), LenWithNull, LenWithNullAligned, false));
276 }
277 } else {
278 int AllocSize = M->getDataLayout().getTypeAllocSize(Args[i]->getType());
279 // We end up expanding non string arguments to 8 bytes
280 // (args smaller than 8 bytes)
281 BufSize += std::max(AllocSize, 8);
282 }
283 }
284
285 // calculate final size value to be passed to printf_alloc
286 Value *SizeToReserve = ConstantInt::get(Builder.getInt64Ty(), BufSize, false);
287 SmallVector<Value *, 1> Alloc_args;
288 if (NonConstStrLen)
289 SizeToReserve = Builder.CreateAdd(NonConstStrLen, SizeToReserve);
290
291 ArgSize = Builder.CreateTrunc(SizeToReserve, Builder.getInt32Ty());
292 Alloc_args.push_back(ArgSize);
293
294 // call the printf_alloc function
295 AttributeList Attr = AttributeList::get(
296 Builder.getContext(), AttributeList::FunctionIndex, Attribute::NoUnwind);
297
298 Type *Tys_alloc[1] = {Builder.getInt32Ty()};
299 Type *PtrTy =
300 Builder.getPtrTy(M->getDataLayout().getDefaultGlobalsAddressSpace());
301 FunctionType *FTy_alloc = FunctionType::get(PtrTy, Tys_alloc, false);
302 auto PrintfAllocFn =
303 M->getOrInsertFunction(StringRef("__printf_alloc"), FTy_alloc, Attr);
304
305 return Builder.CreateCall(PrintfAllocFn, Alloc_args, "printf_alloc_fn");
306}
307
308// Prepare constant string argument to push onto the buffer
310 SmallVectorImpl<Value *> &WhatToStore) {
311 std::string Str(SD->Str.str() + '\0');
312
313 DataExtractor Extractor(Str, /*IsLittleEndian=*/true, 8);
315 while (Offset && Offset.tell() < Str.size()) {
316 const uint64_t ReadSize = 4;
317 uint64_t ReadNow = std::min(ReadSize, Str.size() - Offset.tell());
318 uint64_t ReadBytes = 0;
319 switch (ReadNow) {
320 default:
321 llvm_unreachable("min(4, X) > 4?");
322 case 1:
323 ReadBytes = Extractor.getU8(Offset);
324 break;
325 case 2:
326 ReadBytes = Extractor.getU16(Offset);
327 break;
328 case 3:
329 ReadBytes = Extractor.getU24(Offset);
330 break;
331 case 4:
332 ReadBytes = Extractor.getU32(Offset);
333 break;
334 }
335 cantFail(Offset.takeError(), "failed to read bytes from constant array");
336
337 APInt IntVal(8 * ReadSize, ReadBytes);
338
339 // TODO: Should not bother aligning up.
340 if (ReadNow < ReadSize)
341 IntVal = IntVal.zext(8 * ReadSize);
342
343 Type *IntTy = Type::getIntNTy(Builder.getContext(), IntVal.getBitWidth());
344 WhatToStore.push_back(ConstantInt::get(IntTy, IntVal));
345 }
346 // Additional padding for 8 byte alignment
347 int Rem = (Str.size() % 8);
348 if (Rem > 0 && Rem <= 4)
349 WhatToStore.push_back(ConstantInt::get(Builder.getInt32Ty(), 0));
350}
351
353 const DataLayout &DL = Builder.GetInsertBlock()->getDataLayout();
354 auto Ty = Arg->getType();
355
356 if (auto IntTy = dyn_cast<IntegerType>(Ty)) {
357 if (IntTy->getBitWidth() < 64) {
358 return Builder.CreateZExt(Arg, Builder.getInt64Ty());
359 }
360 }
361
362 if (Ty->isFloatingPointTy()) {
363 if (DL.getTypeAllocSize(Ty) < 8) {
364 return Builder.CreateFPExt(Arg, Builder.getDoubleTy());
365 }
366 }
367
368 return Arg;
369}
370
371static void
373 Value *PtrToStore, SparseBitVector<8> &SpecIsCString,
374 SmallVectorImpl<StringData> &StringContents,
375 bool IsConstFmtStr) {
376 Module *M = Builder.GetInsertBlock()->getModule();
377 const DataLayout &DL = M->getDataLayout();
378 auto StrIt = StringContents.begin();
379 size_t i = IsConstFmtStr ? 1 : 0;
380 for (; i < Args.size(); i++) {
381 SmallVector<Value *, 32> WhatToStore;
382 if ((i == 0) || SpecIsCString.test(i)) {
383 if (StrIt->IsConst) {
384 processConstantStringArg(StrIt, Builder, WhatToStore);
385 StrIt++;
386 } else {
387 // This copies the contents of the string, however the next offset
388 // is at aligned length, the extra space that might be created due
389 // to alignment padding is not populated with any specific value
390 // here. This would be safe as long as runtime is sync with
391 // the offsets.
392 Builder.CreateMemCpy(PtrToStore, /*DstAlign*/ Align(1), Args[i],
393 /*SrcAlign*/ Args[i]->getPointerAlignment(DL),
394 StrIt->RealSize);
395
396 PtrToStore =
397 Builder.CreateInBoundsGEP(Builder.getInt8Ty(), PtrToStore,
398 {StrIt->AlignedSize}, "PrintBuffNextPtr");
399 LLVM_DEBUG(dbgs() << "inserting gep to the printf buffer:"
400 << *PtrToStore << '\n');
401
402 // done with current argument, move to next
403 StrIt++;
404 continue;
405 }
406 } else {
407 WhatToStore.push_back(processNonStringArg(Args[i], Builder));
408 }
409
410 for (Value *toStore : WhatToStore) {
411 StoreInst *StBuff = Builder.CreateStore(toStore, PtrToStore);
412 LLVM_DEBUG(dbgs() << "inserting store to printf buffer:" << *StBuff
413 << '\n');
414 (void)StBuff;
415 PtrToStore = Builder.CreateConstInBoundsGEP1_32(
416 Builder.getInt8Ty(), PtrToStore,
417 M->getDataLayout().getTypeAllocSize(toStore->getType()),
418 "PrintBuffNextPtr");
419 LLVM_DEBUG(dbgs() << "inserting gep to the printf buffer:" << *PtrToStore
420 << '\n');
421 }
422 }
423}
424
426 bool IsBuffered) {
427 auto NumOps = Args.size();
428 assert(NumOps >= 1);
429
430 auto Fmt = Args[0];
431 SparseBitVector<8> SpecIsCString;
432 StringRef FmtStr;
433
434 if (getConstantStringInfo(Fmt, FmtStr))
435 locateCStrings(SpecIsCString, FmtStr);
436
437 if (IsBuffered) {
438 SmallVector<StringData, 8> StringContents;
439 Module *M = Builder.GetInsertBlock()->getModule();
440 LLVMContext &Ctx = Builder.getContext();
441 auto Int8Ty = Builder.getInt8Ty();
442 auto Int32Ty = Builder.getInt32Ty();
443 bool IsConstFmtStr = !FmtStr.empty();
444
445 Value *ArgSize = nullptr;
446 Value *Ptr =
447 callBufferedPrintfStart(Builder, Args, Fmt, IsConstFmtStr,
448 SpecIsCString, StringContents, ArgSize);
449
450 // The buffered version still follows OpenCL printf standards for
451 // printf return value, i.e 0 on success, -1 on failure.
452 ConstantPointerNull *zeroIntPtr =
454
455 auto *Cmp = cast<ICmpInst>(Builder.CreateICmpNE(Ptr, zeroIntPtr, ""));
456
457 BasicBlock *End = BasicBlock::Create(Ctx, "end.block",
458 Builder.GetInsertBlock()->getParent());
460 Ctx, "argpush.block", Builder.GetInsertBlock()->getParent());
461
462 BranchInst::Create(ArgPush, End, Cmp, Builder.GetInsertBlock());
463 Builder.SetInsertPoint(ArgPush);
464
465 // Create controlDWord and store as the first entry, format as follows
466 // Bit 0 (LSB) -> stream (1 if stderr, 0 if stdout, printf always outputs to
467 // stdout) Bit 1 -> constant format string (1 if constant) Bits 2-31 -> size
468 // of printf data frame
469 auto ConstantTwo = Builder.getInt32(2);
470 auto ControlDWord = Builder.CreateShl(ArgSize, ConstantTwo);
471 if (IsConstFmtStr)
472 ControlDWord = Builder.CreateOr(ControlDWord, ConstantTwo);
473
474 Builder.CreateStore(ControlDWord, Ptr);
475
476 Ptr = Builder.CreateConstInBoundsGEP1_32(Int8Ty, Ptr, 4);
477
478 // Create MD5 hash for costant format string, push low 64 bits of the
479 // same onto buffer and metadata.
480 NamedMDNode *metaD = M->getOrInsertNamedMetadata("llvm.printf.fmts");
481 if (IsConstFmtStr) {
482 MD5 Hasher;
483 MD5::MD5Result Hash;
484 Hasher.update(FmtStr);
485 Hasher.final(Hash);
486
487 // Try sticking to llvm.printf.fmts format, although we are not going to
488 // use the ID and argument size fields while printing,
489 std::string MetadataStr =
490 "0:0:" + llvm::utohexstr(Hash.low(), /*LowerCase=*/true) + "," +
491 FmtStr.str();
492 MDString *fmtStrArray = MDString::get(Ctx, MetadataStr);
493 MDNode *myMD = MDNode::get(Ctx, fmtStrArray);
494 metaD->addOperand(myMD);
495
496 Builder.CreateStore(Builder.getInt64(Hash.low()), Ptr);
497 Ptr = Builder.CreateConstInBoundsGEP1_32(Int8Ty, Ptr, 8);
498 } else {
499 // Include a dummy metadata instance in case of only non constant
500 // format string usage, This might be an absurd usecase but needs to
501 // be done for completeness
502 if (metaD->getNumOperands() == 0) {
503 MDString *fmtStrArray =
504 MDString::get(Ctx, "0:0:ffffffff,\"Non const format string\"");
505 MDNode *myMD = MDNode::get(Ctx, fmtStrArray);
506 metaD->addOperand(myMD);
507 }
508 }
509
510 // Push The printf arguments onto buffer
511 callBufferedPrintfArgPush(Builder, Args, Ptr, SpecIsCString, StringContents,
512 IsConstFmtStr);
513
514 // End block, returns -1 on failure
515 BranchInst::Create(End, ArgPush);
516 Builder.SetInsertPoint(End);
517 return Builder.CreateSExt(Builder.CreateNot(Cmp), Int32Ty, "printf_result");
518 }
519
520 auto Desc = callPrintfBegin(Builder, Builder.getIntN(64, 0));
521 Desc = appendString(Builder, Desc, Fmt, NumOps == 1);
522
523 // FIXME: This invokes hostcall once for each argument. We can pack up to
524 // seven scalar printf arguments in a single hostcall. See the signature of
525 // callAppendArgs().
526 for (unsigned int i = 1; i != NumOps; ++i) {
527 bool IsLast = i == NumOps - 1;
528 bool IsCString = SpecIsCString.test(i);
529 Desc = processArg(Builder, Desc, Args[i], IsCString, IsLast);
530 }
531
532 return Builder.CreateTrunc(Desc, Builder.getInt32Ty());
533}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static Value * appendString(IRBuilder<> &Builder, Value *Desc, Value *Arg, bool IsLast)
static void callBufferedPrintfArgPush(IRBuilder<> &Builder, ArrayRef< Value * > Args, Value *PtrToStore, SparseBitVector< 8 > &SpecIsCString, SmallVectorImpl< StringData > &StringContents, bool IsConstFmtStr)
static void processConstantStringArg(StringData *SD, IRBuilder<> &Builder, SmallVectorImpl< Value * > &WhatToStore)
static Value * callBufferedPrintfStart(IRBuilder<> &Builder, ArrayRef< Value * > Args, Value *Fmt, bool isConstFmtStr, SparseBitVector< 8 > &SpecIsCString, SmallVectorImpl< StringData > &StringContents, Value *&ArgSize)
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 * callPrintfBegin(IRBuilder<> &Builder, Value *Version)
static Value * fitArgInto64Bits(IRBuilder<> &Builder, Value *Arg)
static void locateCStrings(SparseBitVector< 8 > &BV, StringRef Str)
static Value * callAppendStringN(IRBuilder<> &Builder, Value *Desc, Value *Str, Value *Length, bool isLast)
static Value * appendArg(IRBuilder<> &Builder, Value *Desc, Value *Arg, bool IsLast)
static Value * processNonStringArg(Value *Arg, IRBuilder<> &Builder)
static Value * processArg(IRBuilder<> &Builder, Value *Desc, Value *Arg, bool SpecIsCString, bool IsLast)
static Value * getStrlenWithNull(IRBuilder<> &Builder, Value *Str)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Module.h This file contains the declarations for the Module class.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
This file defines the SparseBitVector class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Class for arbitrary precision integers.
Definition APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:470
LLVM_ABI BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="")
Split the basic block into two basic blocks at the specified instruction.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
A constant pointer value that points to null.
Definition Constants.h:563
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A class representing a position in a DataExtractor, as well as any error encountered during extractio...
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2788
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void update(ArrayRef< uint8_t > Data)
Updates the hash for the byte stream provided.
Definition MD5.cpp:188
LLVM_ABI void final(MD5Result &Result)
Finishes off the hash and puts the result in result.
Definition MD5.cpp:233
Metadata node.
Definition Metadata.h:1080
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1572
A single uniqued string.
Definition Metadata.h:722
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:614
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
A tuple of MDNodes.
Definition Metadata.h:1760
LLVM_ABI unsigned getNumOperands() const
LLVM_ABI void addOperand(MDNode *M)
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
void set(unsigned Idx)
bool test(unsigned Idx) const
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
static constexpr size_t npos
Definition StringRef.h:57
std::string str() const
str - Get the contents as an std::string.
Definition StringRef.h:222
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:143
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
@ DoubleTyID
64-bit floating point type
Definition Type.h:59
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:300
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
@ Length
Definition DWP.cpp:532
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
Definition InstrProf.h:296
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str, bool TrimAtNul=true)
This function computes the length of a null-terminated C string pointed to by V.
std::string utohexstr(uint64_t X, bool LowerCase=false, unsigned Width=0)
Op::Description Desc
LLVM_ABI Value * emitAMDGPUPrintfCall(IRBuilder<> &Builder, ArrayRef< Value * > Args, bool isBuffered)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
Definition Error.h:769
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
StringData(StringRef ST, Value *RS, Value *AS, bool IC)
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
uint64_t low() const
Definition MD5.h:47