LLVM 23.0.0git
AsmWriter.cpp
Go to the documentation of this file.
1//===- AsmWriter.cpp - Printing LLVM as an assembly file ------------------===//
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// This library implements `print` family of functions in classes like
10// Module, Function, Value, etc. In-memory representation of those classes is
11// converted to IR strings.
12//
13// Note that these routines must be extremely tolerant of various errors in the
14// LLVM code, because it can be used for debugging transformations.
15//
16//===----------------------------------------------------------------------===//
17
18#include "llvm/ADT/APFloat.h"
19#include "llvm/ADT/APInt.h"
20#include "llvm/ADT/ArrayRef.h"
21#include "llvm/ADT/DenseMap.h"
22#include "llvm/ADT/STLExtras.h"
23#include "llvm/ADT/SetVector.h"
28#include "llvm/ADT/StringRef.h"
31#include "llvm/Config/llvm-config.h"
32#include "llvm/IR/Argument.h"
34#include "llvm/IR/Attributes.h"
35#include "llvm/IR/BasicBlock.h"
36#include "llvm/IR/CFG.h"
37#include "llvm/IR/CallingConv.h"
38#include "llvm/IR/Comdat.h"
39#include "llvm/IR/Constant.h"
40#include "llvm/IR/Constants.h"
44#include "llvm/IR/Function.h"
45#include "llvm/IR/GlobalAlias.h"
46#include "llvm/IR/GlobalIFunc.h"
48#include "llvm/IR/GlobalValue.h"
51#include "llvm/IR/InlineAsm.h"
52#include "llvm/IR/InstrTypes.h"
53#include "llvm/IR/Instruction.h"
56#include "llvm/IR/Intrinsics.h"
57#include "llvm/IR/LLVMContext.h"
58#include "llvm/IR/Metadata.h"
59#include "llvm/IR/Module.h"
62#include "llvm/IR/Operator.h"
63#include "llvm/IR/Type.h"
64#include "llvm/IR/TypeFinder.h"
66#include "llvm/IR/Use.h"
67#include "llvm/IR/User.h"
68#include "llvm/IR/Value.h"
72#include "llvm/Support/Debug.h"
74#include "llvm/Support/Format.h"
78#include <cassert>
79#include <cctype>
80#include <cstddef>
81#include <cstdint>
82#include <iterator>
83#include <memory>
84#include <optional>
85#include <string>
86#include <tuple>
87#include <utility>
88#include <vector>
89
90using namespace llvm;
91
92// See https://llvm.org/docs/DebuggingLLVM.html for why these flags are useful.
93
94static cl::opt<bool>
95 PrintInstAddrs("print-inst-addrs", cl::Hidden,
96 cl::desc("Print addresses of instructions when dumping"));
97
99 "print-inst-debug-locs", cl::Hidden,
100 cl::desc("Pretty print debug locations of instructions when dumping"));
101
103 "print-prof-data", cl::Hidden,
104 cl::desc("Pretty print perf data (branch weights, etc) when dumping"));
105
107 "preserve-ll-uselistorder", cl::Hidden, cl::init(false),
108 cl::desc("Preserve use-list order when writing LLVM assembly."));
109
110static cl::opt<bool> PrintAddrspaceName("print-addrspace-name", cl::Hidden,
111 cl::init(false),
112 cl::desc("Print address space names"));
113
114// Make virtual table appear in this compilation unit.
116
117//===----------------------------------------------------------------------===//
118// Helper Functions
119//===----------------------------------------------------------------------===//
120
122
125
126/// Look for a value that might be wrapped as metadata, e.g. a value in a
127/// metadata operand. Returns the input value as-is if it is not wrapped.
128static const Value *skipMetadataWrapper(const Value *V) {
129 if (const auto *MAV = dyn_cast<MetadataAsValue>(V))
130 if (const auto *VAM = dyn_cast<ValueAsMetadata>(MAV->getMetadata()))
131 return VAM->getValue();
132 return V;
133}
134
135static void orderValue(const Value *V, OrderMap &OM) {
136 if (OM.lookup(V))
137 return;
138
139 if (const auto *C = dyn_cast<Constant>(V)) {
140 if (isa<ConstantData>(C))
141 return;
142
143 if (C->getNumOperands() && !isa<GlobalValue>(C))
144 for (const Value *Op : C->operands())
146 orderValue(Op, OM);
147 }
148
149 // Note: we cannot cache this lookup above, since inserting into the map
150 // changes the map's size, and thus affects the other IDs.
151 unsigned ID = OM.size() + 1;
152 OM[V] = ID;
153}
154
155static OrderMap orderModule(const Module *M) {
156 OrderMap OM;
157
158 auto OrderConstantValue = [&OM](const Value *V) {
159 if (isa<Constant>(V) || isa<InlineAsm>(V))
160 orderValue(V, OM);
161 };
162
163 auto OrderConstantFromMetadata = [&](Metadata *MD) {
164 if (const auto *VAM = dyn_cast<ValueAsMetadata>(MD)) {
165 OrderConstantValue(VAM->getValue());
166 } else if (const auto *AL = dyn_cast<DIArgList>(MD)) {
167 for (const auto *VAM : AL->getArgs())
168 OrderConstantValue(VAM->getValue());
169 }
170 };
171
172 for (const GlobalVariable &G : M->globals()) {
173 if (G.hasInitializer())
174 if (!isa<GlobalValue>(G.getInitializer()))
175 orderValue(G.getInitializer(), OM);
176 orderValue(&G, OM);
177 }
178 for (const GlobalAlias &A : M->aliases()) {
179 if (!isa<GlobalValue>(A.getAliasee()))
180 orderValue(A.getAliasee(), OM);
181 orderValue(&A, OM);
182 }
183 for (const GlobalIFunc &I : M->ifuncs()) {
184 if (!isa<GlobalValue>(I.getResolver()))
185 orderValue(I.getResolver(), OM);
186 orderValue(&I, OM);
187 }
188 for (const Function &F : *M) {
189 for (const Use &U : F.operands())
190 if (!isa<GlobalValue>(U.get()))
191 orderValue(U.get(), OM);
192
193 orderValue(&F, OM);
194
195 if (F.isDeclaration())
196 continue;
197
198 for (const Argument &A : F.args())
199 orderValue(&A, OM);
200 for (const BasicBlock &BB : F) {
201 orderValue(&BB, OM);
202 for (const Instruction &I : BB) {
203 // Debug records can contain Value references, that can then contain
204 // Values disconnected from the rest of the Value hierachy, if wrapped
205 // in some kind of constant-expression. Find and order any Values that
206 // are wrapped in debug-info.
207 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
208 OrderConstantFromMetadata(DVR.getRawLocation());
209 if (DVR.isDbgAssign())
210 OrderConstantFromMetadata(DVR.getRawAddress());
211 }
212
213 for (const Value *Op : I.operands()) {
215 if ((isa<Constant>(*Op) && !isa<GlobalValue>(*Op)) ||
217 orderValue(Op, OM);
218 }
219 orderValue(&I, OM);
220 }
221 }
222 }
223 return OM;
224}
225
226static std::vector<unsigned>
227predictValueUseListOrder(const Value *V, unsigned ID, const OrderMap &OM) {
228 // Predict use-list order for this one.
229 using Entry = std::pair<const Use *, unsigned>;
231 for (const Use &U : V->uses())
232 // Check if this user will be serialized.
233 if (OM.lookup(U.getUser()))
234 List.push_back(std::make_pair(&U, List.size()));
235
236 if (List.size() < 2)
237 // We may have lost some users.
238 return {};
239
240 // When referencing a value before its declaration, a temporary value is
241 // created, which will later be RAUWed with the actual value. This reverses
242 // the use list. This happens for all values apart from basic blocks.
243 bool GetsReversed = !isa<BasicBlock>(V);
244 if (auto *BA = dyn_cast<BlockAddress>(V))
245 ID = OM.lookup(BA->getBasicBlock());
246 llvm::sort(List, [&](const Entry &L, const Entry &R) {
247 const Use *LU = L.first;
248 const Use *RU = R.first;
249 if (LU == RU)
250 return false;
251
252 auto LID = OM.lookup(LU->getUser());
253 auto RID = OM.lookup(RU->getUser());
254
255 // If ID is 4, then expect: 7 6 5 1 2 3.
256 if (LID < RID) {
257 if (GetsReversed)
258 if (RID <= ID)
259 return true;
260 return false;
261 }
262 if (RID < LID) {
263 if (GetsReversed)
264 if (LID <= ID)
265 return false;
266 return true;
267 }
268
269 // LID and RID are equal, so we have different operands of the same user.
270 // Assume operands are added in order for all instructions.
271 if (GetsReversed)
272 if (LID <= ID)
273 return LU->getOperandNo() < RU->getOperandNo();
274 return LU->getOperandNo() > RU->getOperandNo();
275 });
276
278 // Order is already correct.
279 return {};
280
281 // Store the shuffle.
282 std::vector<unsigned> Shuffle(List.size());
283 for (size_t I = 0, E = List.size(); I != E; ++I)
284 Shuffle[I] = List[I].second;
285 return Shuffle;
286}
287
289 OrderMap OM = orderModule(M);
290 UseListOrderMap ULOM;
291 for (const auto &Pair : OM) {
292 const Value *V = Pair.first;
293 if (V->use_empty() || std::next(V->use_begin()) == V->use_end())
294 continue;
295
296 std::vector<unsigned> Shuffle =
297 predictValueUseListOrder(V, Pair.second, OM);
298 if (Shuffle.empty())
299 continue;
300
301 const Function *F = nullptr;
302 if (auto *I = dyn_cast<Instruction>(V))
303 F = I->getFunction();
304 if (auto *A = dyn_cast<Argument>(V))
305 F = A->getParent();
306 if (auto *BB = dyn_cast<BasicBlock>(V))
307 F = BB->getParent();
308 ULOM[F][V] = std::move(Shuffle);
309 }
310 return ULOM;
311}
312
313static const Module *getModuleFromVal(const Value *V) {
314 if (const auto *MA = dyn_cast<Argument>(V))
315 return MA->getParent() ? MA->getParent()->getParent() : nullptr;
316
317 if (const auto *BB = dyn_cast<BasicBlock>(V))
318 return BB->getParent() ? BB->getParent()->getParent() : nullptr;
319
320 if (const auto *I = dyn_cast<Instruction>(V)) {
321 const Function *M = I->getParent() ? I->getParent()->getParent() : nullptr;
322 return M ? M->getParent() : nullptr;
323 }
324
325 if (const auto *GV = dyn_cast<GlobalValue>(V))
326 return GV->getParent();
327
328 if (const auto *MAV = dyn_cast<MetadataAsValue>(V)) {
329 for (const User *U : MAV->users())
330 if (isa<Instruction>(U))
331 if (const Module *M = getModuleFromVal(U))
332 return M;
333 return nullptr;
334 }
335
336 return nullptr;
337}
338
339static const Module *getModuleFromDPI(const DbgMarker *Marker) {
340 const Function *M =
341 Marker->getParent() ? Marker->getParent()->getParent() : nullptr;
342 return M ? M->getParent() : nullptr;
343}
344
345static const Module *getModuleFromDPI(const DbgRecord *DR) {
346 return DR->getMarker() ? getModuleFromDPI(DR->getMarker()) : nullptr;
347}
348
349static void printCallingConv(unsigned cc, raw_ostream &Out) {
350 switch (cc) {
351 default: Out << "cc" << cc; break;
352 case CallingConv::Fast: Out << "fastcc"; break;
353 case CallingConv::Cold: Out << "coldcc"; break;
354 case CallingConv::AnyReg: Out << "anyregcc"; break;
355 case CallingConv::PreserveMost: Out << "preserve_mostcc"; break;
356 case CallingConv::PreserveAll: Out << "preserve_allcc"; break;
357 case CallingConv::PreserveNone: Out << "preserve_nonecc"; break;
358 case CallingConv::CXX_FAST_TLS: Out << "cxx_fast_tlscc"; break;
359 case CallingConv::GHC: Out << "ghccc"; break;
360 case CallingConv::Tail: Out << "tailcc"; break;
361 case CallingConv::GRAAL: Out << "graalcc"; break;
362 case CallingConv::CFGuard_Check: Out << "cfguard_checkcc"; break;
363 case CallingConv::X86_StdCall: Out << "x86_stdcallcc"; break;
364 case CallingConv::X86_FastCall: Out << "x86_fastcallcc"; break;
365 case CallingConv::X86_ThisCall: Out << "x86_thiscallcc"; break;
366 case CallingConv::X86_RegCall: Out << "x86_regcallcc"; break;
367 case CallingConv::X86_VectorCall:Out << "x86_vectorcallcc"; break;
368 case CallingConv::Intel_OCL_BI: Out << "intel_ocl_bicc"; break;
369 case CallingConv::ARM_APCS: Out << "arm_apcscc"; break;
370 case CallingConv::ARM_AAPCS: Out << "arm_aapcscc"; break;
371 case CallingConv::ARM_AAPCS_VFP: Out << "arm_aapcs_vfpcc"; break;
372 case CallingConv::AArch64_VectorCall: Out << "aarch64_vector_pcs"; break;
374 Out << "aarch64_sve_vector_pcs";
375 break;
377 Out << "aarch64_sme_preservemost_from_x0";
378 break;
380 Out << "aarch64_sme_preservemost_from_x1";
381 break;
383 Out << "aarch64_sme_preservemost_from_x2";
384 break;
385 case CallingConv::MSP430_INTR: Out << "msp430_intrcc"; break;
386 case CallingConv::AVR_INTR: Out << "avr_intrcc "; break;
387 case CallingConv::AVR_SIGNAL: Out << "avr_signalcc "; break;
388 case CallingConv::PTX_Kernel: Out << "ptx_kernel"; break;
389 case CallingConv::PTX_Device: Out << "ptx_device"; break;
390 case CallingConv::X86_64_SysV: Out << "x86_64_sysvcc"; break;
391 case CallingConv::Win64: Out << "win64cc"; break;
392 case CallingConv::SPIR_FUNC: Out << "spir_func"; break;
393 case CallingConv::SPIR_KERNEL: Out << "spir_kernel"; break;
394 case CallingConv::Swift: Out << "swiftcc"; break;
395 case CallingConv::SwiftTail: Out << "swifttailcc"; break;
396 case CallingConv::X86_INTR: Out << "x86_intrcc"; break;
398 Out << "hhvmcc";
399 break;
401 Out << "hhvm_ccc";
402 break;
403 case CallingConv::AMDGPU_VS: Out << "amdgpu_vs"; break;
404 case CallingConv::AMDGPU_LS: Out << "amdgpu_ls"; break;
405 case CallingConv::AMDGPU_HS: Out << "amdgpu_hs"; break;
406 case CallingConv::AMDGPU_ES: Out << "amdgpu_es"; break;
407 case CallingConv::AMDGPU_GS: Out << "amdgpu_gs"; break;
408 case CallingConv::AMDGPU_PS: Out << "amdgpu_ps"; break;
409 case CallingConv::AMDGPU_CS: Out << "amdgpu_cs"; break;
411 Out << "amdgpu_cs_chain";
412 break;
414 Out << "amdgpu_cs_chain_preserve";
415 break;
416 case CallingConv::AMDGPU_KERNEL: Out << "amdgpu_kernel"; break;
417 case CallingConv::AMDGPU_Gfx: Out << "amdgpu_gfx"; break;
419 Out << "amdgpu_gfx_whole_wave";
420 break;
421 case CallingConv::M68k_RTD: Out << "m68k_rtdcc"; break;
423 Out << "riscv_vector_cc";
424 break;
425#define CC_VLS_CASE(ABI_VLEN) \
426 case CallingConv::RISCV_VLSCall_##ABI_VLEN: \
427 Out << "riscv_vls_cc(" #ABI_VLEN ")"; \
428 break;
429 CC_VLS_CASE(32)
430 CC_VLS_CASE(64)
431 CC_VLS_CASE(128)
432 CC_VLS_CASE(256)
433 CC_VLS_CASE(512)
434 CC_VLS_CASE(1024)
435 CC_VLS_CASE(2048)
436 CC_VLS_CASE(4096)
437 CC_VLS_CASE(8192)
438 CC_VLS_CASE(16384)
439 CC_VLS_CASE(32768)
440 CC_VLS_CASE(65536)
441#undef CC_VLS_CASE
443 Out << "cheriot_compartmentcallcc";
444 break;
446 Out << "cheriot_compartmentcalleecc";
447 break;
449 Out << "cheriot_librarycallcc";
450 break;
451 }
452}
453
461
463 assert(!Name.empty() && "Cannot get empty name!");
464
465 // Scan the name to see if it needs quotes first.
466 bool NeedsQuotes = isdigit(static_cast<unsigned char>(Name[0]));
467 if (!NeedsQuotes) {
468 for (unsigned char C : Name) {
469 // By making this unsigned, the value passed in to isalnum will always be
470 // in the range 0-255. This is important when building with MSVC because
471 // its implementation will assert. This situation can arise when dealing
472 // with UTF-8 multibyte characters.
473 if (!isalnum(C) && C != '-' && C != '.' && C != '_') {
474 NeedsQuotes = true;
475 break;
476 }
477 }
478 }
479
480 // If we didn't need any quotes, just write out the name in one blast.
481 if (!NeedsQuotes) {
482 OS << Name;
483 return;
484 }
485
486 // Okay, we need quotes. Output the quotes and escape any scary characters as
487 // needed.
488 OS << '"';
489 printEscapedString(Name, OS);
490 OS << '"';
491}
492
493/// Turn the specified name into an 'LLVM name', which is either prefixed with %
494/// (if the string only contains simple characters) or is surrounded with ""'s
495/// (if it has special chars in it). Print it out.
496static void printLLVMName(raw_ostream &OS, StringRef Name, PrefixType Prefix) {
497 switch (Prefix) {
498 case NoPrefix:
499 break;
500 case GlobalPrefix:
501 OS << '@';
502 break;
503 case ComdatPrefix:
504 OS << '$';
505 break;
506 case LabelPrefix:
507 break;
508 case LocalPrefix:
509 OS << '%';
510 break;
511 }
513}
514
515/// Turn the specified name into an 'LLVM name', which is either prefixed with %
516/// (if the string only contains simple characters) or is surrounded with ""'s
517/// (if it has special chars in it). Print it out.
518static void printLLVMName(raw_ostream &OS, const Value *V) {
519 printLLVMName(OS, V->getName(),
521}
522
523static void printShuffleMask(raw_ostream &Out, Type *Ty, ArrayRef<int> Mask) {
524 Out << ", <";
526 Out << "vscale x ";
527 Out << Mask.size() << " x i32> ";
528 if (all_of(Mask, equal_to(0))) {
529 Out << "zeroinitializer";
530 } else if (all_of(Mask, equal_to(PoisonMaskElem))) {
531 Out << "poison";
532 } else {
533 Out << "<";
534 ListSeparator LS;
535 for (int Elt : Mask) {
536 Out << LS << "i32 ";
537 if (Elt == PoisonMaskElem)
538 Out << "poison";
539 else
540 Out << Elt;
541 }
542 Out << ">";
543 }
544}
545
546namespace {
547
548class TypePrinting {
549public:
550 TypePrinting(const Module *M = nullptr)
551 : M(M), TypesIncorporated(M == nullptr) {}
552
553 TypePrinting(const TypePrinting &) = delete;
554 TypePrinting &operator=(const TypePrinting &) = delete;
555
556 /// The named types that are used by the current module.
557 TypeFinder &getNamedTypes();
558
559 /// The numbered types, number to type mapping.
560 std::vector<StructType *> &getNumberedTypes();
561
562 bool empty();
563
564 void print(Type *Ty, raw_ostream &OS);
565
566 void printStructBody(StructType *Ty, raw_ostream &OS);
567
568private:
569 void incorporateTypes();
570
571 /// A module to process lazily.
572 const Module *M;
573 bool TypesIncorporated;
574
575 TypeFinder NamedTypes;
576
577 // The numbered types, along with their value.
578 DenseMap<StructType *, unsigned> Type2Number;
579
580 std::vector<StructType *> NumberedTypes;
581};
582
583} // end anonymous namespace
584
585TypeFinder &TypePrinting::getNamedTypes() {
586 incorporateTypes();
587 return NamedTypes;
588}
589
590std::vector<StructType *> &TypePrinting::getNumberedTypes() {
591 incorporateTypes();
592
593 // We know all the numbers that each type is used and we know that it is a
594 // dense assignment. Convert the map to an index table, if it's not done
595 // already (judging from the sizes):
596 if (NumberedTypes.size() == Type2Number.size())
597 return NumberedTypes;
598
599 NumberedTypes.resize(Type2Number.size());
600 for (const auto &P : Type2Number) {
601 assert(P.second < NumberedTypes.size() && "Didn't get a dense numbering?");
602 assert(!NumberedTypes[P.second] && "Didn't get a unique numbering?");
603 NumberedTypes[P.second] = P.first;
604 }
605 return NumberedTypes;
606}
607
608bool TypePrinting::empty() {
609 incorporateTypes();
610 return NamedTypes.empty() && Type2Number.empty();
611}
612
613void TypePrinting::incorporateTypes() {
614 if (TypesIncorporated)
615 return;
616
617 NamedTypes.run(*M, false);
618 TypesIncorporated = true;
619
620 // The list of struct types we got back includes all the struct types, split
621 // the unnamed ones out to a numbering and remove the anonymous structs.
622 unsigned NextNumber = 0;
623
624 std::vector<StructType *>::iterator NextToUse = NamedTypes.begin();
625 for (StructType *STy : NamedTypes) {
626 // Ignore anonymous types.
627 if (STy->isLiteral())
628 continue;
629
630 if (STy->getName().empty())
631 Type2Number[STy] = NextNumber++;
632 else
633 *NextToUse++ = STy;
634 }
635
636 NamedTypes.erase(NextToUse, NamedTypes.end());
637}
638
639static void printAddressSpace(const Module *M, unsigned AS, raw_ostream &OS,
640 StringRef Prefix = " ", StringRef Suffix = "",
641 bool ForcePrint = false) {
642 if (AS == 0 && !ForcePrint)
643 return;
644 OS << Prefix << "addrspace(";
645 StringRef ASName =
646 PrintAddrspaceName && M ? M->getDataLayout().getAddressSpaceName(AS) : "";
647 if (!ASName.empty())
648 OS << "\"" << ASName << "\"";
649 else
650 OS << AS;
651 OS << ")" << Suffix;
652}
653
654/// Write the specified type to the specified raw_ostream, making use of type
655/// names or up references to shorten the type name where possible.
656void TypePrinting::print(Type *Ty, raw_ostream &OS) {
657 switch (Ty->getTypeID()) {
658 case Type::VoidTyID: OS << "void"; return;
659 case Type::HalfTyID: OS << "half"; return;
660 case Type::BFloatTyID: OS << "bfloat"; return;
661 case Type::FloatTyID: OS << "float"; return;
662 case Type::DoubleTyID: OS << "double"; return;
663 case Type::X86_FP80TyID: OS << "x86_fp80"; return;
664 case Type::FP128TyID: OS << "fp128"; return;
665 case Type::PPC_FP128TyID: OS << "ppc_fp128"; return;
666 case Type::LabelTyID: OS << "label"; return;
667 case Type::MetadataTyID:
668 OS << "metadata";
669 return;
670 case Type::X86_AMXTyID: OS << "x86_amx"; return;
671 case Type::TokenTyID: OS << "token"; return;
672 case Type::IntegerTyID:
673 OS << 'i' << cast<IntegerType>(Ty)->getBitWidth();
674 return;
675
676 case Type::FunctionTyID: {
677 FunctionType *FTy = cast<FunctionType>(Ty);
678 print(FTy->getReturnType(), OS);
679 OS << " (";
680 ListSeparator LS;
681 for (Type *Ty : FTy->params()) {
682 OS << LS;
683 print(Ty, OS);
684 }
685 if (FTy->isVarArg())
686 OS << LS << "...";
687 OS << ')';
688 return;
689 }
690 case Type::StructTyID: {
691 StructType *STy = cast<StructType>(Ty);
692
693 if (STy->isLiteral())
694 return printStructBody(STy, OS);
695
696 if (!STy->getName().empty())
697 return printLLVMName(OS, STy->getName(), LocalPrefix);
698
699 incorporateTypes();
700 const auto I = Type2Number.find(STy);
701 if (I != Type2Number.end())
702 OS << '%' << I->second;
703 else // Not enumerated, print the hex address.
704 OS << "%\"type " << STy << '\"';
705 return;
706 }
707 case Type::PointerTyID: {
709 OS << "ptr";
710 printAddressSpace(M, PTy->getAddressSpace(), OS);
711 return;
712 }
713 case Type::ArrayTyID: {
714 ArrayType *ATy = cast<ArrayType>(Ty);
715 OS << '[' << ATy->getNumElements() << " x ";
716 print(ATy->getElementType(), OS);
717 OS << ']';
718 return;
719 }
720 case Type::FixedVectorTyID:
721 case Type::ScalableVectorTyID: {
722 VectorType *PTy = cast<VectorType>(Ty);
723 ElementCount EC = PTy->getElementCount();
724 OS << "<";
725 if (EC.isScalable())
726 OS << "vscale x ";
727 OS << EC.getKnownMinValue() << " x ";
728 print(PTy->getElementType(), OS);
729 OS << '>';
730 return;
731 }
732 case Type::TypedPointerTyID: {
733 TypedPointerType *TPTy = cast<TypedPointerType>(Ty);
734 OS << "typedptr(" << *TPTy->getElementType() << ", "
735 << TPTy->getAddressSpace() << ")";
736 return;
737 }
738 case Type::TargetExtTyID:
739 TargetExtType *TETy = cast<TargetExtType>(Ty);
740 OS << "target(\"";
742 OS << "\"";
743 for (Type *Inner : TETy->type_params()) {
744 OS << ", ";
745 Inner->print(OS, /*IsForDebug=*/false, /*NoDetails=*/true);
746 }
747 for (unsigned IntParam : TETy->int_params())
748 OS << ", " << IntParam;
749 OS << ")";
750 return;
751 }
752 llvm_unreachable("Invalid TypeID");
753}
754
755void TypePrinting::printStructBody(StructType *STy, raw_ostream &OS) {
756 if (STy->isOpaque()) {
757 OS << "opaque";
758 return;
759 }
760
761 if (STy->isPacked())
762 OS << '<';
763
764 if (STy->getNumElements() == 0) {
765 OS << "{}";
766 } else {
767 OS << "{ ";
768 ListSeparator LS;
769 for (Type *Ty : STy->elements()) {
770 OS << LS;
771 print(Ty, OS);
772 }
773
774 OS << " }";
775 }
776 if (STy->isPacked())
777 OS << '>';
778}
779
781
782//===----------------------------------------------------------------------===//
783// SlotTracker Class: Enumerate slot numbers for unnamed values
784//===----------------------------------------------------------------------===//
785/// This class provides computation of slot numbers for LLVM Assembly writing.
786///
788public:
789 /// ValueMap - A mapping of Values to slot numbers.
791
792private:
793 /// TheModule - The module for which we are holding slot numbers.
794 const Module* TheModule;
795
796 /// TheFunction - The function for which we are holding slot numbers.
797 const Function* TheFunction = nullptr;
798 bool FunctionProcessed = false;
799 bool ShouldInitializeAllMetadata;
800
801 std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
802 ProcessModuleHookFn;
803 std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
804 ProcessFunctionHookFn;
805
806 /// The summary index for which we are holding slot numbers.
807 const ModuleSummaryIndex *TheIndex = nullptr;
808
809 /// mMap - The slot map for the module level data.
810 ValueMap mMap;
811 unsigned mNext = 0;
812
813 /// fMap - The slot map for the function level data.
814 ValueMap fMap;
815 unsigned fNext = 0;
816
817 /// mdnMap - Map for MDNodes.
819 unsigned mdnNext = 0;
820
821 /// asMap - The slot map for attribute sets.
823 unsigned asNext = 0;
824
825 /// ModulePathMap - The slot map for Module paths used in the summary index.
826 StringMap<unsigned> ModulePathMap;
827 unsigned ModulePathNext = 0;
828
829 /// GUIDMap - The slot map for GUIDs used in the summary index.
831 unsigned GUIDNext = 0;
832
833 /// TypeIdMap - The slot map for type ids used in the summary index.
834 StringMap<unsigned> TypeIdMap;
835 unsigned TypeIdNext = 0;
836
837 /// TypeIdCompatibleVtableMap - The slot map for type compatible vtable ids
838 /// used in the summary index.
839 StringMap<unsigned> TypeIdCompatibleVtableMap;
840 unsigned TypeIdCompatibleVtableNext = 0;
841
842public:
843 /// Construct from a module.
844 ///
845 /// If \c ShouldInitializeAllMetadata, initializes all metadata in all
846 /// functions, giving correct numbering for metadata referenced only from
847 /// within a function (even if no functions have been initialized).
848 explicit SlotTracker(const Module *M,
849 bool ShouldInitializeAllMetadata = false);
850
851 /// Construct from a function, starting out in incorp state.
852 ///
853 /// If \c ShouldInitializeAllMetadata, initializes all metadata in all
854 /// functions, giving correct numbering for metadata referenced only from
855 /// within a function (even if no functions have been initialized).
856 explicit SlotTracker(const Function *F,
857 bool ShouldInitializeAllMetadata = false);
858
859 /// Construct from a module summary index.
860 explicit SlotTracker(const ModuleSummaryIndex *Index);
861
862 SlotTracker(const SlotTracker &) = delete;
864
865 ~SlotTracker() override = default;
866
867 void setProcessHook(
868 std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>);
869 void setProcessHook(std::function<void(AbstractSlotTrackerStorage *,
870 const Function *, bool)>);
871
872 unsigned getNextMetadataSlot() override { return mdnNext; }
873
874 void createMetadataSlot(const MDNode *N) override;
875
876 /// Return the slot number of the specified value in it's type
877 /// plane. If something is not in the SlotTracker, return -1.
878 int getLocalSlot(const Value *V);
879 int getGlobalSlot(const GlobalValue *V);
880 int getMetadataSlot(const MDNode *N) override;
881 int getAttributeGroupSlot(AttributeSet AS);
882 int getModulePathSlot(StringRef Path);
883 int getGUIDSlot(GlobalValue::GUID GUID);
884 int getTypeIdSlot(StringRef Id);
885 int getTypeIdCompatibleVtableSlot(StringRef Id);
886
887 /// If you'd like to deal with a function instead of just a module, use
888 /// this method to get its data into the SlotTracker.
890 TheFunction = F;
891 FunctionProcessed = false;
892 }
893
894 const Function *getFunction() const { return TheFunction; }
895
896 /// After calling incorporateFunction, use this method to remove the
897 /// most recently incorporated function from the SlotTracker. This
898 /// will reset the state of the machine back to just the module contents.
899 void purgeFunction();
900
901 /// MDNode map iterators.
903
904 mdn_iterator mdn_begin() { return mdnMap.begin(); }
905 mdn_iterator mdn_end() { return mdnMap.end(); }
906 unsigned mdn_size() const { return mdnMap.size(); }
907 bool mdn_empty() const { return mdnMap.empty(); }
908
909 /// AttributeSet map iterators.
911
912 as_iterator as_begin() { return asMap.begin(); }
913 as_iterator as_end() { return asMap.end(); }
914 unsigned as_size() const { return asMap.size(); }
915 bool as_empty() const { return asMap.empty(); }
916
917 /// GUID map iterators.
919
920 /// These functions do the actual initialization.
921 inline void initializeIfNeeded();
923
924 // Implementation Details
925private:
926 /// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.
927 void CreateModuleSlot(const GlobalValue *V);
928
929 /// CreateMetadataSlot - Insert the specified MDNode* into the slot table.
930 void CreateMetadataSlot(const MDNode *N);
931
932 /// CreateFunctionSlot - Insert the specified Value* into the slot table.
933 void CreateFunctionSlot(const Value *V);
934
935 /// Insert the specified AttributeSet into the slot table.
936 void CreateAttributeSetSlot(AttributeSet AS);
937
938 inline void CreateModulePathSlot(StringRef Path);
939 void CreateGUIDSlot(GlobalValue::GUID GUID);
940 void CreateTypeIdSlot(StringRef Id);
941 void CreateTypeIdCompatibleVtableSlot(StringRef Id);
942
943 /// Add all of the module level global variables (and their initializers)
944 /// and function declarations, but not the contents of those functions.
945 void processModule();
946 // Returns number of allocated slots
947 int processIndex();
948
949 /// Add all of the functions arguments, basic blocks, and instructions.
950 void processFunction();
951
952 /// Add the metadata directly attached to a GlobalObject.
953 void processGlobalObjectMetadata(const GlobalObject &GO);
954
955 /// Add all of the metadata from a function.
956 void processFunctionMetadata(const Function &F);
957
958 /// Add all of the metadata from an instruction.
959 void processInstructionMetadata(const Instruction &I);
960
961 /// Add all of the metadata from a DbgRecord.
962 void processDbgRecordMetadata(const DbgRecord &DVR);
963};
964
966 const Function *F)
967 : M(M), F(F), Machine(&Machine) {}
968
970 bool ShouldInitializeAllMetadata)
971 : ShouldCreateStorage(M),
972 ShouldInitializeAllMetadata(ShouldInitializeAllMetadata), M(M) {}
973
975
977 if (!ShouldCreateStorage)
978 return Machine;
979
980 ShouldCreateStorage = false;
981 MachineStorage =
982 std::make_unique<SlotTracker>(M, ShouldInitializeAllMetadata);
983 Machine = MachineStorage.get();
984 if (ProcessModuleHookFn)
985 Machine->setProcessHook(ProcessModuleHookFn);
986 if (ProcessFunctionHookFn)
987 Machine->setProcessHook(ProcessFunctionHookFn);
988 return Machine;
989}
990
992 // Using getMachine() may lazily create the slot tracker.
993 if (!getMachine())
994 return;
995
996 // Nothing to do if this is the right function already.
997 if (this->F == &F)
998 return;
999 if (this->F)
1000 Machine->purgeFunction();
1001 Machine->incorporateFunction(&F);
1002 this->F = &F;
1003}
1004
1006 assert(F && "No function incorporated");
1007 return Machine->getLocalSlot(V);
1008}
1009
1011 std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
1012 Fn) {
1013 ProcessModuleHookFn = std::move(Fn);
1014}
1015
1017 std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
1018 Fn) {
1019 ProcessFunctionHookFn = std::move(Fn);
1020}
1021
1023 if (const auto *FA = dyn_cast<Argument>(V))
1024 return new SlotTracker(FA->getParent());
1025
1026 if (const auto *I = dyn_cast<Instruction>(V))
1027 if (I->getParent())
1028 return new SlotTracker(I->getParent()->getParent());
1029
1030 if (const auto *BB = dyn_cast<BasicBlock>(V))
1031 return new SlotTracker(BB->getParent());
1032
1033 if (const auto *GV = dyn_cast<GlobalVariable>(V))
1034 return new SlotTracker(GV->getParent());
1035
1036 if (const auto *GA = dyn_cast<GlobalAlias>(V))
1037 return new SlotTracker(GA->getParent());
1038
1039 if (const auto *GIF = dyn_cast<GlobalIFunc>(V))
1040 return new SlotTracker(GIF->getParent());
1041
1042 if (const auto *Func = dyn_cast<Function>(V))
1043 return new SlotTracker(Func);
1044
1045 return nullptr;
1046}
1047
1048#if 0
1049#define ST_DEBUG(X) dbgs() << X
1050#else
1051#define ST_DEBUG(X)
1052#endif
1053
1054// Module level constructor. Causes the contents of the Module (sans functions)
1055// to be added to the slot table.
1056SlotTracker::SlotTracker(const Module *M, bool ShouldInitializeAllMetadata)
1057 : TheModule(M), ShouldInitializeAllMetadata(ShouldInitializeAllMetadata) {}
1058
1059// Function level constructor. Causes the contents of the Module and the one
1060// function provided to be added to the slot table.
1061SlotTracker::SlotTracker(const Function *F, bool ShouldInitializeAllMetadata)
1062 : TheModule(F ? F->getParent() : nullptr), TheFunction(F),
1063 ShouldInitializeAllMetadata(ShouldInitializeAllMetadata) {}
1064
1066 : TheModule(nullptr), ShouldInitializeAllMetadata(false), TheIndex(Index) {}
1067
1069 if (TheModule) {
1070 processModule();
1071 TheModule = nullptr; ///< Prevent re-processing next time we're called.
1072 }
1073
1074 if (TheFunction && !FunctionProcessed)
1075 processFunction();
1076}
1077
1079 if (!TheIndex)
1080 return 0;
1081 int NumSlots = processIndex();
1082 TheIndex = nullptr; ///< Prevent re-processing next time we're called.
1083 return NumSlots;
1084}
1085
1086// Iterate through all the global variables, functions, and global
1087// variable initializers and create slots for them.
1088void SlotTracker::processModule() {
1089 ST_DEBUG("begin processModule!\n");
1090
1091 // Add all of the unnamed global variables to the value table.
1092 for (const GlobalVariable &Var : TheModule->globals()) {
1093 if (!Var.hasName())
1094 CreateModuleSlot(&Var);
1095 processGlobalObjectMetadata(Var);
1096 auto Attrs = Var.getAttributes();
1097 if (Attrs.hasAttributes())
1098 CreateAttributeSetSlot(Attrs);
1099 }
1100
1101 for (const GlobalAlias &A : TheModule->aliases()) {
1102 if (!A.hasName())
1103 CreateModuleSlot(&A);
1104 }
1105
1106 for (const GlobalIFunc &I : TheModule->ifuncs()) {
1107 if (!I.hasName())
1108 CreateModuleSlot(&I);
1109 processGlobalObjectMetadata(I);
1110 }
1111
1112 // Add metadata used by named metadata.
1113 for (const NamedMDNode &NMD : TheModule->named_metadata()) {
1114 for (const MDNode *N : NMD.operands())
1115 CreateMetadataSlot(N);
1116 }
1117
1118 for (const Function &F : *TheModule) {
1119 if (!F.hasName())
1120 // Add all the unnamed functions to the table.
1121 CreateModuleSlot(&F);
1122
1123 if (ShouldInitializeAllMetadata)
1124 processFunctionMetadata(F);
1125
1126 // Add all the function attributes to the table.
1127 // FIXME: Add attributes of other objects?
1128 AttributeSet FnAttrs = F.getAttributes().getFnAttrs();
1129 if (FnAttrs.hasAttributes())
1130 CreateAttributeSetSlot(FnAttrs);
1131 }
1132
1133 if (ProcessModuleHookFn)
1134 ProcessModuleHookFn(this, TheModule, ShouldInitializeAllMetadata);
1135
1136 ST_DEBUG("end processModule!\n");
1137}
1138
1139// Process the arguments, basic blocks, and instructions of a function.
1140void SlotTracker::processFunction() {
1141 ST_DEBUG("begin processFunction!\n");
1142 fNext = 0;
1143
1144 // Process function metadata if it wasn't hit at the module-level.
1145 if (!ShouldInitializeAllMetadata)
1146 processFunctionMetadata(*TheFunction);
1147
1148 // Add all the function arguments with no names.
1149 for(Function::const_arg_iterator AI = TheFunction->arg_begin(),
1150 AE = TheFunction->arg_end(); AI != AE; ++AI)
1151 if (!AI->hasName())
1152 CreateFunctionSlot(&*AI);
1153
1154 ST_DEBUG("Inserting Instructions:\n");
1155
1156 // Add all of the basic blocks and instructions with no names.
1157 for (auto &BB : *TheFunction) {
1158 if (!BB.hasName())
1159 CreateFunctionSlot(&BB);
1160
1161 for (auto &I : BB) {
1162 if (!I.getType()->isVoidTy() && !I.hasName())
1163 CreateFunctionSlot(&I);
1164
1165 // We allow direct calls to any llvm.foo function here, because the
1166 // target may not be linked into the optimizer.
1167 if (const auto *Call = dyn_cast<CallBase>(&I)) {
1168 // Add all the call attributes to the table.
1169 AttributeSet Attrs = Call->getAttributes().getFnAttrs();
1170 if (Attrs.hasAttributes())
1171 CreateAttributeSetSlot(Attrs);
1172 }
1173 }
1174 }
1175
1176 if (ProcessFunctionHookFn)
1177 ProcessFunctionHookFn(this, TheFunction, ShouldInitializeAllMetadata);
1178
1179 FunctionProcessed = true;
1180
1181 ST_DEBUG("end processFunction!\n");
1182}
1183
1184// Iterate through all the GUID in the index and create slots for them.
1185int SlotTracker::processIndex() {
1186 ST_DEBUG("begin processIndex!\n");
1187 assert(TheIndex);
1188
1189 // The first block of slots are just the module ids, which start at 0 and are
1190 // assigned consecutively. Since the StringMap iteration order isn't
1191 // guaranteed, order by path string before assigning slots.
1192 std::vector<StringRef> ModulePaths;
1193 for (auto &[ModPath, _] : TheIndex->modulePaths())
1194 ModulePaths.push_back(ModPath);
1195 llvm::sort(ModulePaths);
1196 for (auto &ModPath : ModulePaths)
1197 CreateModulePathSlot(ModPath);
1198
1199 // Start numbering the GUIDs after the module ids.
1200 GUIDNext = ModulePathNext;
1201
1202 for (auto &GlobalList : *TheIndex)
1203 CreateGUIDSlot(GlobalList.first);
1204
1205 // Start numbering the TypeIdCompatibleVtables after the GUIDs.
1206 TypeIdCompatibleVtableNext = GUIDNext;
1207 for (auto &TId : TheIndex->typeIdCompatibleVtableMap())
1208 CreateTypeIdCompatibleVtableSlot(TId.first);
1209
1210 // Start numbering the TypeIds after the TypeIdCompatibleVtables.
1211 TypeIdNext = TypeIdCompatibleVtableNext;
1212 for (const auto &TID : TheIndex->typeIds())
1213 CreateTypeIdSlot(TID.second.first);
1214
1215 ST_DEBUG("end processIndex!\n");
1216 return TypeIdNext;
1217}
1218
1219void SlotTracker::processGlobalObjectMetadata(const GlobalObject &GO) {
1221 GO.getAllMetadata(MDs);
1222 for (auto &MD : MDs)
1223 CreateMetadataSlot(MD.second);
1224}
1225
1226void SlotTracker::processFunctionMetadata(const Function &F) {
1227 processGlobalObjectMetadata(F);
1228 for (auto &BB : F) {
1229 for (auto &I : BB) {
1230 for (const DbgRecord &DR : I.getDbgRecordRange())
1231 processDbgRecordMetadata(DR);
1232 processInstructionMetadata(I);
1233 }
1234 }
1235}
1236
1237void SlotTracker::processDbgRecordMetadata(const DbgRecord &DR) {
1238 // Tolerate null metadata pointers: it's a completely illegal debug record,
1239 // but we can have faulty metadata from debug-intrinsic days being
1240 // autoupgraded into debug records. This gets caught by the verifier, which
1241 // then will print the faulty IR, hitting this code path.
1242 if (const auto *DVR = dyn_cast<const DbgVariableRecord>(&DR)) {
1243 // Process metadata used by DbgRecords; we only specifically care about the
1244 // DILocalVariable, DILocation, and DIAssignID fields, as the Value and
1245 // Expression fields should only be printed inline and so do not use a slot.
1246 // Note: The above doesn't apply for empty-metadata operands.
1247 if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawLocation()))
1248 CreateMetadataSlot(Empty);
1249 if (DVR->getRawVariable())
1250 CreateMetadataSlot(DVR->getRawVariable());
1251 if (DVR->isDbgAssign()) {
1252 if (auto *AssignID = DVR->getRawAssignID())
1253 CreateMetadataSlot(cast<MDNode>(AssignID));
1254 if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawAddress()))
1255 CreateMetadataSlot(Empty);
1256 }
1257 } else if (const auto *DLR = dyn_cast<const DbgLabelRecord>(&DR)) {
1258 CreateMetadataSlot(DLR->getRawLabel());
1259 } else {
1260 llvm_unreachable("unsupported DbgRecord kind");
1261 }
1262 if (DR.getDebugLoc())
1263 CreateMetadataSlot(DR.getDebugLoc().getAsMDNode());
1264}
1265
1266void SlotTracker::processInstructionMetadata(const Instruction &I) {
1267 // Process metadata used directly by intrinsics.
1268 if (const auto *CI = dyn_cast<CallInst>(&I))
1269 if (Function *F = CI->getCalledFunction())
1270 if (F->isIntrinsic())
1271 for (auto &Op : I.operands())
1273 if (auto *N = dyn_cast<MDNode>(V->getMetadata()))
1274 CreateMetadataSlot(N);
1275
1276 // Process metadata attached to this instruction.
1278 I.getAllMetadata(MDs);
1279 for (auto &MD : MDs)
1280 CreateMetadataSlot(MD.second);
1281}
1282
1283/// Clean up after incorporating a function. This is the only way to get out of
1284/// the function incorporation state that affects get*Slot/Create*Slot. Function
1285/// incorporation state is indicated by TheFunction != 0.
1287 ST_DEBUG("begin purgeFunction!\n");
1288 fMap.clear(); // Simply discard the function level map
1289 TheFunction = nullptr;
1290 FunctionProcessed = false;
1291 ST_DEBUG("end purgeFunction!\n");
1292}
1293
1294/// getGlobalSlot - Get the slot number of a global value.
1296 // Check for uninitialized state and do lazy initialization.
1298
1299 // Find the value in the module map
1300 ValueMap::iterator MI = mMap.find(V);
1301 return MI == mMap.end() ? -1 : (int)MI->second;
1302}
1303
1305 std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
1306 Fn) {
1307 ProcessModuleHookFn = std::move(Fn);
1308}
1309
1311 std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
1312 Fn) {
1313 ProcessFunctionHookFn = std::move(Fn);
1314}
1315
1316/// getMetadataSlot - Get the slot number of a MDNode.
1317void SlotTracker::createMetadataSlot(const MDNode *N) { CreateMetadataSlot(N); }
1318
1319/// getMetadataSlot - Get the slot number of a MDNode.
1321 // Check for uninitialized state and do lazy initialization.
1323
1324 // Find the MDNode in the module map
1325 mdn_iterator MI = mdnMap.find(N);
1326 return MI == mdnMap.end() ? -1 : (int)MI->second;
1327}
1328
1329/// getLocalSlot - Get the slot number for a value that is local to a function.
1331 assert(!isa<Constant>(V) && "Can't get a constant or global slot with this!");
1332
1333 // Check for uninitialized state and do lazy initialization.
1335
1336 ValueMap::iterator FI = fMap.find(V);
1337 return FI == fMap.end() ? -1 : (int)FI->second;
1338}
1339
1341 // Check for uninitialized state and do lazy initialization.
1343
1344 // Find the AttributeSet in the module map.
1345 as_iterator AI = asMap.find(AS);
1346 return AI == asMap.end() ? -1 : (int)AI->second;
1347}
1348
1350 // Check for uninitialized state and do lazy initialization.
1352
1353 // Find the Module path in the map
1354 auto I = ModulePathMap.find(Path);
1355 return I == ModulePathMap.end() ? -1 : (int)I->second;
1356}
1357
1359 // Check for uninitialized state and do lazy initialization.
1361
1362 // Find the GUID in the map
1363 guid_iterator I = GUIDMap.find(GUID);
1364 return I == GUIDMap.end() ? -1 : (int)I->second;
1365}
1366
1368 // Check for uninitialized state and do lazy initialization.
1370
1371 // Find the TypeId string in the map
1372 auto I = TypeIdMap.find(Id);
1373 return I == TypeIdMap.end() ? -1 : (int)I->second;
1374}
1375
1377 // Check for uninitialized state and do lazy initialization.
1379
1380 // Find the TypeIdCompatibleVtable string in the map
1381 auto I = TypeIdCompatibleVtableMap.find(Id);
1382 return I == TypeIdCompatibleVtableMap.end() ? -1 : (int)I->second;
1383}
1384
1385/// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.
1386void SlotTracker::CreateModuleSlot(const GlobalValue *V) {
1387 assert(V && "Can't insert a null Value into SlotTracker!");
1388 assert(!V->getType()->isVoidTy() && "Doesn't need a slot!");
1389 assert(!V->hasName() && "Doesn't need a slot!");
1390
1391 unsigned DestSlot = mNext++;
1392 mMap[V] = DestSlot;
1393
1394 ST_DEBUG(" Inserting value [" << V->getType() << "] = " << V << " slot=" <<
1395 DestSlot << " [");
1396 // G = Global, F = Function, A = Alias, I = IFunc, o = other
1397 ST_DEBUG((isa<GlobalVariable>(V) ? 'G' :
1398 (isa<Function>(V) ? 'F' :
1399 (isa<GlobalAlias>(V) ? 'A' :
1400 (isa<GlobalIFunc>(V) ? 'I' : 'o')))) << "]\n");
1401}
1402
1403/// CreateSlot - Create a new slot for the specified value if it has no name.
1404void SlotTracker::CreateFunctionSlot(const Value *V) {
1405 assert(!V->getType()->isVoidTy() && !V->hasName() && "Doesn't need a slot!");
1406
1407 unsigned DestSlot = fNext++;
1408 fMap[V] = DestSlot;
1409
1410 // G = Global, F = Function, o = other
1411 ST_DEBUG(" Inserting value [" << V->getType() << "] = " << V << " slot=" <<
1412 DestSlot << " [o]\n");
1413}
1414
1415/// CreateModuleSlot - Insert the specified MDNode* into the slot table.
1416void SlotTracker::CreateMetadataSlot(const MDNode *N) {
1417 assert(N && "Can't insert a null Value into SlotTracker!");
1418
1419 // Don't make slots for DIExpressions. We just print them inline everywhere.
1420 if (isa<DIExpression>(N))
1421 return;
1422
1423 unsigned DestSlot = mdnNext;
1424 if (!mdnMap.insert(std::make_pair(N, DestSlot)).second)
1425 return;
1426 ++mdnNext;
1427
1428 // Recursively add any MDNodes referenced by operands.
1429 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
1430 if (const auto *Op = dyn_cast_or_null<MDNode>(N->getOperand(i)))
1431 CreateMetadataSlot(Op);
1432}
1433
1434void SlotTracker::CreateAttributeSetSlot(AttributeSet AS) {
1435 assert(AS.hasAttributes() && "Doesn't need a slot!");
1436
1437 if (asMap.try_emplace(AS, asNext).second)
1438 ++asNext;
1439}
1440
1441/// Create a new slot for the specified Module
1442void SlotTracker::CreateModulePathSlot(StringRef Path) {
1443 ModulePathMap[Path] = ModulePathNext++;
1444}
1445
1446/// Create a new slot for the specified GUID
1447void SlotTracker::CreateGUIDSlot(GlobalValue::GUID GUID) {
1448 GUIDMap[GUID] = GUIDNext++;
1449}
1450
1451/// Create a new slot for the specified Id
1452void SlotTracker::CreateTypeIdSlot(StringRef Id) {
1453 TypeIdMap[Id] = TypeIdNext++;
1454}
1455
1456/// Create a new slot for the specified Id
1457void SlotTracker::CreateTypeIdCompatibleVtableSlot(StringRef Id) {
1458 TypeIdCompatibleVtableMap[Id] = TypeIdCompatibleVtableNext++;
1459}
1460
1461namespace {
1462/// Common instances used by most of the printer functions.
1463struct AsmWriterContext {
1464 TypePrinting *TypePrinter = nullptr;
1465 SlotTracker *Machine = nullptr;
1466 const Module *Context = nullptr;
1467
1468 AsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M = nullptr)
1469 : TypePrinter(TP), Machine(ST), Context(M) {}
1470
1471 static AsmWriterContext &getEmpty() {
1472 static AsmWriterContext EmptyCtx(nullptr, nullptr);
1473 return EmptyCtx;
1474 }
1475
1476 /// A callback that will be triggered when the underlying printer
1477 /// prints a Metadata as operand.
1478 virtual void onWriteMetadataAsOperand(const Metadata *) {}
1479
1480 virtual ~AsmWriterContext() = default;
1481};
1482} // end anonymous namespace
1483
1484//===----------------------------------------------------------------------===//
1485// AsmWriter Implementation
1486//===----------------------------------------------------------------------===//
1487
1488static void writeAsOperandInternal(raw_ostream &Out, const Value *V,
1489 AsmWriterContext &WriterCtx,
1490 bool PrintType = false);
1491
1492static void writeAsOperandInternal(raw_ostream &Out, const Metadata *MD,
1493 AsmWriterContext &WriterCtx,
1494 bool FromValue = false);
1495
1496static void writeOptimizationInfo(raw_ostream &Out, const User *U) {
1497 if (const auto *FPO = dyn_cast<const FPMathOperator>(U))
1498 Out << FPO->getFastMathFlags();
1499
1500 if (const auto *OBO = dyn_cast<OverflowingBinaryOperator>(U)) {
1501 if (OBO->hasNoUnsignedWrap())
1502 Out << " nuw";
1503 if (OBO->hasNoSignedWrap())
1504 Out << " nsw";
1505 } else if (const auto *Div = dyn_cast<PossiblyExactOperator>(U)) {
1506 if (Div->isExact())
1507 Out << " exact";
1508 } else if (const auto *PDI = dyn_cast<PossiblyDisjointInst>(U)) {
1509 if (PDI->isDisjoint())
1510 Out << " disjoint";
1511 } else if (const auto *GEP = dyn_cast<GEPOperator>(U)) {
1512 if (GEP->isInBounds())
1513 Out << " inbounds";
1514 else if (GEP->hasNoUnsignedSignedWrap())
1515 Out << " nusw";
1516 if (GEP->hasNoUnsignedWrap())
1517 Out << " nuw";
1518 if (auto InRange = GEP->getInRange()) {
1519 Out << " inrange(" << InRange->getLower() << ", " << InRange->getUpper()
1520 << ")";
1521 }
1522 } else if (const auto *NNI = dyn_cast<PossiblyNonNegInst>(U)) {
1523 if (NNI->hasNonNeg())
1524 Out << " nneg";
1525 } else if (const auto *TI = dyn_cast<TruncInst>(U)) {
1526 if (TI->hasNoUnsignedWrap())
1527 Out << " nuw";
1528 if (TI->hasNoSignedWrap())
1529 Out << " nsw";
1530 } else if (const auto *ICmp = dyn_cast<ICmpInst>(U)) {
1531 if (ICmp->hasSameSign())
1532 Out << " samesign";
1533 }
1534}
1535
1536static void writeAPFloatInternal(raw_ostream &Out, const APFloat &APF) {
1537 if (&APF.getSemantics() == &APFloat::IEEEsingle() ||
1538 &APF.getSemantics() == &APFloat::IEEEdouble()) {
1539 // We would like to output the FP constant value in exponential notation,
1540 // but we cannot do this if doing so will lose precision. Check here to
1541 // make sure that we only output it in exponential format if we can parse
1542 // the value back and get the same value.
1543 //
1544 bool ignored;
1545 bool isDouble = &APF.getSemantics() == &APFloat::IEEEdouble();
1546 bool isInf = APF.isInfinity();
1547 bool isNaN = APF.isNaN();
1548
1549 if (!isInf && !isNaN) {
1550 double Val = APF.convertToDouble();
1551 SmallString<128> StrVal;
1552 APF.toString(StrVal, 6, 0, false);
1553 // Check to make sure that the stringized number is not some string like
1554 // "Inf" or NaN, that atof will accept, but the lexer will not. Check
1555 // that the string matches the "[-+]?[0-9]" regex.
1556 //
1557 assert((isDigit(StrVal[0]) ||
1558 ((StrVal[0] == '-' || StrVal[0] == '+') && isDigit(StrVal[1]))) &&
1559 "[-+]?[0-9] regex does not match!");
1560 // Reparse stringized version!
1561 if (APFloat(APFloat::IEEEdouble(), StrVal).convertToDouble() == Val) {
1562 Out << StrVal;
1563 return;
1564 }
1565 }
1566
1567 // Otherwise we could not reparse it to exactly the same value, so we must
1568 // output the string in hexadecimal format! Note that loading and storing
1569 // floating point types changes the bits of NaNs on some hosts, notably
1570 // x86, so we must not use these types.
1571 static_assert(sizeof(double) == sizeof(uint64_t),
1572 "assuming that double is 64 bits!");
1573 APFloat apf = APF;
1574
1575 // Floats are represented in ASCII IR as double, convert.
1576 // FIXME: We should allow 32-bit hex float and remove this.
1577 if (!isDouble) {
1578 // A signaling NaN is quieted on conversion, so we need to recreate the
1579 // expected value after convert (quiet bit of the payload is clear).
1580 bool IsSNAN = apf.isSignaling();
1582 &ignored);
1583 if (IsSNAN) {
1584 APInt Payload = apf.bitcastToAPInt();
1585 apf =
1587 }
1588 }
1589
1590 Out << format_hex(apf.bitcastToAPInt().getZExtValue(), 0, /*Upper=*/true);
1591 return;
1592 }
1593
1594 // Either half, bfloat or some form of long double.
1595 // These appear as a magic letter identifying the type, then a
1596 // fixed number of hex digits.
1597 Out << "0x";
1598 APInt API = APF.bitcastToAPInt();
1599 if (&APF.getSemantics() == &APFloat::x87DoubleExtended()) {
1600 Out << 'K';
1601 Out << format_hex_no_prefix(API.getHiBits(16).getZExtValue(), 4,
1602 /*Upper=*/true);
1603 Out << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,
1604 /*Upper=*/true);
1605 } else if (&APF.getSemantics() == &APFloat::IEEEquad()) {
1606 Out << 'L';
1607 Out << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,
1608 /*Upper=*/true);
1609 Out << format_hex_no_prefix(API.getHiBits(64).getZExtValue(), 16,
1610 /*Upper=*/true);
1611 } else if (&APF.getSemantics() == &APFloat::PPCDoubleDouble()) {
1612 Out << 'M';
1613 Out << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,
1614 /*Upper=*/true);
1615 Out << format_hex_no_prefix(API.getHiBits(64).getZExtValue(), 16,
1616 /*Upper=*/true);
1617 } else if (&APF.getSemantics() == &APFloat::IEEEhalf()) {
1618 Out << 'H';
1619 Out << format_hex_no_prefix(API.getZExtValue(), 4,
1620 /*Upper=*/true);
1621 } else if (&APF.getSemantics() == &APFloat::BFloat()) {
1622 Out << 'R';
1623 Out << format_hex_no_prefix(API.getZExtValue(), 4,
1624 /*Upper=*/true);
1625 } else
1626 llvm_unreachable("Unsupported floating point type");
1627}
1628
1629static void writeConstantInternal(raw_ostream &Out, const Constant *CV,
1630 AsmWriterContext &WriterCtx) {
1631 if (const auto *CI = dyn_cast<ConstantInt>(CV)) {
1632 Type *Ty = CI->getType();
1633
1634 if (Ty->isVectorTy()) {
1635 Out << "splat (";
1636 WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);
1637 Out << " ";
1638 }
1639
1640 if (Ty->getScalarType()->isIntegerTy(1))
1641 Out << (CI->getZExtValue() ? "true" : "false");
1642 else
1643 Out << CI->getValue();
1644
1645 if (Ty->isVectorTy())
1646 Out << ")";
1647
1648 return;
1649 }
1650
1651 if (const auto *CFP = dyn_cast<ConstantFP>(CV)) {
1652 Type *Ty = CFP->getType();
1653
1654 if (Ty->isVectorTy()) {
1655 Out << "splat (";
1656 WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);
1657 Out << " ";
1658 }
1659
1660 writeAPFloatInternal(Out, CFP->getValueAPF());
1661
1662 if (Ty->isVectorTy())
1663 Out << ")";
1664
1665 return;
1666 }
1667
1669 Out << "zeroinitializer";
1670 return;
1671 }
1672
1673 if (const auto *BA = dyn_cast<BlockAddress>(CV)) {
1674 Out << "blockaddress(";
1675 writeAsOperandInternal(Out, BA->getFunction(), WriterCtx);
1676 Out << ", ";
1677 writeAsOperandInternal(Out, BA->getBasicBlock(), WriterCtx);
1678 Out << ")";
1679 return;
1680 }
1681
1682 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(CV)) {
1683 Out << "dso_local_equivalent ";
1684 writeAsOperandInternal(Out, Equiv->getGlobalValue(), WriterCtx);
1685 return;
1686 }
1687
1688 if (const auto *NC = dyn_cast<NoCFIValue>(CV)) {
1689 Out << "no_cfi ";
1690 writeAsOperandInternal(Out, NC->getGlobalValue(), WriterCtx);
1691 return;
1692 }
1693
1694 if (const auto *CPA = dyn_cast<ConstantPtrAuth>(CV)) {
1695 Out << "ptrauth (";
1696
1697 // ptrauth (ptr CST, i32 KEY[, i64 DISC[, ptr ADDRDISC[, ptr DS]?]?]?)
1698 unsigned NumOpsToWrite = 2;
1699 if (!CPA->getOperand(2)->isNullValue())
1700 NumOpsToWrite = 3;
1701 if (!CPA->getOperand(3)->isNullValue())
1702 NumOpsToWrite = 4;
1703 if (!CPA->getOperand(4)->isNullValue())
1704 NumOpsToWrite = 5;
1705
1706 ListSeparator LS;
1707 for (unsigned i = 0, e = NumOpsToWrite; i != e; ++i) {
1708 Out << LS;
1709 writeAsOperandInternal(Out, CPA->getOperand(i), WriterCtx,
1710 /*PrintType=*/true);
1711 }
1712 Out << ')';
1713 return;
1714 }
1715
1716 if (const auto *CA = dyn_cast<ConstantArray>(CV)) {
1717 Out << '[';
1718 ListSeparator LS;
1719 for (const Value *Op : CA->operands()) {
1720 Out << LS;
1721 writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
1722 }
1723 Out << ']';
1724 return;
1725 }
1726
1727 if (const auto *CA = dyn_cast<ConstantDataArray>(CV)) {
1728 // As a special case, print the array as a string if it is an array of
1729 // i8 with ConstantInt values.
1730 if (CA->isString()) {
1731 Out << "c\"";
1732 printEscapedString(CA->getAsString(), Out);
1733 Out << '"';
1734 return;
1735 }
1736
1737 Out << '[';
1738 ListSeparator LS;
1739 for (uint64_t i = 0, e = CA->getNumElements(); i != e; ++i) {
1740 Out << LS;
1741 writeAsOperandInternal(Out, CA->getElementAsConstant(i), WriterCtx,
1742 /*PrintType=*/true);
1743 }
1744 Out << ']';
1745 return;
1746 }
1747
1748 if (const auto *CS = dyn_cast<ConstantStruct>(CV)) {
1749 if (CS->getType()->isPacked())
1750 Out << '<';
1751 Out << '{';
1752 if (CS->getNumOperands() != 0) {
1753 Out << ' ';
1754 ListSeparator LS;
1755 for (const Value *Op : CS->operands()) {
1756 Out << LS;
1757 writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
1758 }
1759 Out << ' ';
1760 }
1761 Out << '}';
1762 if (CS->getType()->isPacked())
1763 Out << '>';
1764 return;
1765 }
1766
1768 auto *CVVTy = cast<FixedVectorType>(CV->getType());
1769
1770 // Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is
1771 // permitted on IR input to reduce the output changes when enabling
1772 // UseConstant{Int,FP}ForFixedLengthSplat.
1773 // TODO: Remove this block when the UseConstant{Int,FP}ForFixedLengthSplat
1774 // options are removed.
1775 if (auto *SplatVal = CV->getSplatValue()) {
1776 if (isa<ConstantInt>(SplatVal) || isa<ConstantFP>(SplatVal)) {
1777 Out << "splat (";
1778 writeAsOperandInternal(Out, SplatVal, WriterCtx, /*PrintType=*/true);
1779 Out << ')';
1780 return;
1781 }
1782 }
1783
1784 Out << '<';
1785 ListSeparator LS;
1786 for (unsigned i = 0, e = CVVTy->getNumElements(); i != e; ++i) {
1787 Out << LS;
1788 writeAsOperandInternal(Out, CV->getAggregateElement(i), WriterCtx,
1789 /*PrintType=*/true);
1790 }
1791 Out << '>';
1792 return;
1793 }
1794
1795 if (isa<ConstantPointerNull>(CV)) {
1796 Out << "null";
1797 return;
1798 }
1799
1800 if (isa<ConstantTokenNone>(CV)) {
1801 Out << "none";
1802 return;
1803 }
1804
1805 if (isa<PoisonValue>(CV)) {
1806 Out << "poison";
1807 return;
1808 }
1809
1810 if (isa<UndefValue>(CV)) {
1811 Out << "undef";
1812 return;
1813 }
1814
1815 if (const auto *CE = dyn_cast<ConstantExpr>(CV)) {
1816 // Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is
1817 // permitted on IR input to reduce the output changes when enabling
1818 // UseConstant{Int,FP}ForScalableSplat.
1819 // TODO: Remove this block when the UseConstant{Int,FP}ForScalableSplat
1820 // options are removed.
1821 if (CE->getOpcode() == Instruction::ShuffleVector) {
1822 if (auto *SplatVal = CE->getSplatValue()) {
1823 if (isa<ConstantInt>(SplatVal) || isa<ConstantFP>(SplatVal)) {
1824 Out << "splat (";
1825 writeAsOperandInternal(Out, SplatVal, WriterCtx, /*PrintType=*/true);
1826 Out << ')';
1827 return;
1828 }
1829 }
1830 }
1831
1832 Out << CE->getOpcodeName();
1833 writeOptimizationInfo(Out, CE);
1834 Out << " (";
1835
1836 if (const auto *GEP = dyn_cast<GEPOperator>(CE)) {
1837 WriterCtx.TypePrinter->print(GEP->getSourceElementType(), Out);
1838 Out << ", ";
1839 }
1840
1841 ListSeparator LS;
1842 for (const Value *Op : CE->operands()) {
1843 Out << LS;
1844 writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
1845 }
1846
1847 if (CE->isCast()) {
1848 Out << " to ";
1849 WriterCtx.TypePrinter->print(CE->getType(), Out);
1850 }
1851
1852 if (CE->getOpcode() == Instruction::ShuffleVector)
1853 printShuffleMask(Out, CE->getType(), CE->getShuffleMask());
1854
1855 Out << ')';
1856 return;
1857 }
1858
1859 Out << "<placeholder or erroneous Constant>";
1860}
1861
1862static void writeMDTuple(raw_ostream &Out, const MDTuple *Node,
1863 AsmWriterContext &WriterCtx) {
1864 Out << "!{";
1865 ListSeparator LS;
1866 for (const Metadata *MD : Node->operands()) {
1867 Out << LS;
1868 if (!MD) {
1869 Out << "null";
1870 } else if (auto *MDV = dyn_cast<ValueAsMetadata>(MD)) {
1871 Value *V = MDV->getValue();
1872 writeAsOperandInternal(Out, V, WriterCtx, /*PrintType=*/true);
1873 } else {
1874 writeAsOperandInternal(Out, MD, WriterCtx);
1875 WriterCtx.onWriteMetadataAsOperand(MD);
1876 }
1877 }
1878
1879 Out << "}";
1880}
1881
1882namespace {
1883
1884struct MDFieldPrinter {
1885 raw_ostream &Out;
1886 ListSeparator FS;
1887 AsmWriterContext &WriterCtx;
1888
1889 explicit MDFieldPrinter(raw_ostream &Out)
1890 : Out(Out), WriterCtx(AsmWriterContext::getEmpty()) {}
1891 MDFieldPrinter(raw_ostream &Out, AsmWriterContext &Ctx)
1892 : Out(Out), WriterCtx(Ctx) {}
1893
1894 void printTag(const DINode *N);
1895 void printMacinfoType(const DIMacroNode *N);
1896 void printChecksum(const DIFile::ChecksumInfo<StringRef> &N);
1897 void printString(StringRef Name, StringRef Value,
1898 bool ShouldSkipEmpty = true);
1899 void printMetadata(StringRef Name, const Metadata *MD,
1900 bool ShouldSkipNull = true);
1901 void printMetadataOrInt(StringRef Name, const Metadata *MD, bool IsUnsigned,
1902 bool ShouldSkipZero = true);
1903 template <class IntTy>
1904 void printInt(StringRef Name, IntTy Int, bool ShouldSkipZero = true);
1905 void printAPInt(StringRef Name, const APInt &Int, bool IsUnsigned,
1906 bool ShouldSkipZero);
1907 void printBool(StringRef Name, bool Value,
1908 std::optional<bool> Default = std::nullopt);
1909 void printDIFlags(StringRef Name, DINode::DIFlags Flags);
1910 void printDISPFlags(StringRef Name, DISubprogram::DISPFlags Flags);
1911 template <class IntTy, class Stringifier>
1912 void printDwarfEnum(StringRef Name, IntTy Value, Stringifier toString,
1913 bool ShouldSkipZero = true);
1914 void printEmissionKind(StringRef Name, DICompileUnit::DebugEmissionKind EK);
1915 void printNameTableKind(StringRef Name,
1917 void printFixedPointKind(StringRef Name, DIFixedPointType::FixedPointKind V);
1918};
1919
1920} // end anonymous namespace
1921
1922void MDFieldPrinter::printTag(const DINode *N) {
1923 Out << FS << "tag: ";
1924 auto Tag = dwarf::TagString(N->getTag());
1925 if (!Tag.empty())
1926 Out << Tag;
1927 else
1928 Out << N->getTag();
1929}
1930
1931void MDFieldPrinter::printMacinfoType(const DIMacroNode *N) {
1932 Out << FS << "type: ";
1933 auto Type = dwarf::MacinfoString(N->getMacinfoType());
1934 if (!Type.empty())
1935 Out << Type;
1936 else
1937 Out << N->getMacinfoType();
1938}
1939
1940void MDFieldPrinter::printChecksum(
1941 const DIFile::ChecksumInfo<StringRef> &Checksum) {
1942 Out << FS << "checksumkind: " << Checksum.getKindAsString();
1943 printString("checksum", Checksum.Value, /* ShouldSkipEmpty */ false);
1944}
1945
1946void MDFieldPrinter::printString(StringRef Name, StringRef Value,
1947 bool ShouldSkipEmpty) {
1948 if (ShouldSkipEmpty && Value.empty())
1949 return;
1950
1951 Out << FS << Name << ": \"";
1953 Out << "\"";
1954}
1955
1956static void writeMetadataAsOperand(raw_ostream &Out, const Metadata *MD,
1957 AsmWriterContext &WriterCtx) {
1958 if (!MD) {
1959 Out << "null";
1960 return;
1961 }
1962 writeAsOperandInternal(Out, MD, WriterCtx);
1963 WriterCtx.onWriteMetadataAsOperand(MD);
1964}
1965
1966void MDFieldPrinter::printMetadata(StringRef Name, const Metadata *MD,
1967 bool ShouldSkipNull) {
1968 if (ShouldSkipNull && !MD)
1969 return;
1970
1971 Out << FS << Name << ": ";
1972 writeMetadataAsOperand(Out, MD, WriterCtx);
1973}
1974
1975void MDFieldPrinter::printMetadataOrInt(StringRef Name, const Metadata *MD,
1976 bool IsUnsigned, bool ShouldSkipZero) {
1977 if (!MD)
1978 return;
1979
1980 if (auto *CI = dyn_cast<ConstantAsMetadata>(MD)) {
1981 auto *CV = cast<ConstantInt>(CI->getValue());
1982 if (IsUnsigned)
1983 printInt(Name, CV->getZExtValue(), ShouldSkipZero);
1984 else
1985 printInt(Name, CV->getSExtValue(), ShouldSkipZero);
1986 } else
1987 printMetadata(Name, MD);
1988}
1989
1990template <class IntTy>
1991void MDFieldPrinter::printInt(StringRef Name, IntTy Int, bool ShouldSkipZero) {
1992 if (ShouldSkipZero && !Int)
1993 return;
1994
1995 Out << FS << Name << ": " << Int;
1996}
1997
1998void MDFieldPrinter::printAPInt(StringRef Name, const APInt &Int,
1999 bool IsUnsigned, bool ShouldSkipZero) {
2000 if (ShouldSkipZero && Int.isZero())
2001 return;
2002
2003 Out << FS << Name << ": ";
2004 Int.print(Out, !IsUnsigned);
2005}
2006
2007void MDFieldPrinter::printBool(StringRef Name, bool Value,
2008 std::optional<bool> Default) {
2009 if (Default && Value == *Default)
2010 return;
2011 Out << FS << Name << ": " << (Value ? "true" : "false");
2012}
2013
2014void MDFieldPrinter::printDIFlags(StringRef Name, DINode::DIFlags Flags) {
2015 if (!Flags)
2016 return;
2017
2018 Out << FS << Name << ": ";
2019
2021 auto Extra = DINode::splitFlags(Flags, SplitFlags);
2022
2023 ListSeparator FlagsFS(" | ");
2024 for (auto F : SplitFlags) {
2025 auto StringF = DINode::getFlagString(F);
2026 assert(!StringF.empty() && "Expected valid flag");
2027 Out << FlagsFS << StringF;
2028 }
2029 if (Extra || SplitFlags.empty())
2030 Out << FlagsFS << Extra;
2031}
2032
2033void MDFieldPrinter::printDISPFlags(StringRef Name,
2035 // Always print this field, because no flags in the IR at all will be
2036 // interpreted as old-style isDefinition: true.
2037 Out << FS << Name << ": ";
2038
2039 if (!Flags) {
2040 Out << 0;
2041 return;
2042 }
2043
2045 auto Extra = DISubprogram::splitFlags(Flags, SplitFlags);
2046
2047 ListSeparator FlagsFS(" | ");
2048 for (auto F : SplitFlags) {
2049 auto StringF = DISubprogram::getFlagString(F);
2050 assert(!StringF.empty() && "Expected valid flag");
2051 Out << FlagsFS << StringF;
2052 }
2053 if (Extra || SplitFlags.empty())
2054 Out << FlagsFS << Extra;
2055}
2056
2057void MDFieldPrinter::printEmissionKind(StringRef Name,
2059 Out << FS << Name << ": " << DICompileUnit::emissionKindString(EK);
2060}
2061
2062void MDFieldPrinter::printNameTableKind(StringRef Name,
2065 return;
2066 Out << FS << Name << ": " << DICompileUnit::nameTableKindString(NTK);
2067}
2068
2069void MDFieldPrinter::printFixedPointKind(StringRef Name,
2071 Out << FS << Name << ": " << DIFixedPointType::fixedPointKindString(V);
2072}
2073
2074template <class IntTy, class Stringifier>
2075void MDFieldPrinter::printDwarfEnum(StringRef Name, IntTy Value,
2076 Stringifier toString, bool ShouldSkipZero) {
2077 if (ShouldSkipZero && !Value)
2078 return;
2079
2080 Out << FS << Name << ": ";
2081 auto S = toString(Value);
2082 if (!S.empty())
2083 Out << S;
2084 else
2085 Out << Value;
2086}
2087
2089 AsmWriterContext &WriterCtx) {
2090 Out << "!GenericDINode(";
2091 MDFieldPrinter Printer(Out, WriterCtx);
2092 Printer.printTag(N);
2093 Printer.printString("header", N->getHeader());
2094 if (N->getNumDwarfOperands()) {
2095 Out << Printer.FS << "operands: {";
2096 ListSeparator IFS;
2097 for (auto &I : N->dwarf_operands()) {
2098 Out << IFS;
2099 writeMetadataAsOperand(Out, I, WriterCtx);
2100 }
2101 Out << "}";
2102 }
2103 Out << ")";
2104}
2105
2106static void writeDILocation(raw_ostream &Out, const DILocation *DL,
2107 AsmWriterContext &WriterCtx) {
2108 Out << "!DILocation(";
2109 MDFieldPrinter Printer(Out, WriterCtx);
2110 // Always output the line, since 0 is a relevant and important value for it.
2111 Printer.printInt("line", DL->getLine(), /* ShouldSkipZero */ false);
2112 Printer.printInt("column", DL->getColumn());
2113 Printer.printMetadata("scope", DL->getRawScope(), /* ShouldSkipNull */ false);
2114 Printer.printMetadata("inlinedAt", DL->getRawInlinedAt());
2115 Printer.printBool("isImplicitCode", DL->isImplicitCode(),
2116 /* Default */ false);
2117 Printer.printInt("atomGroup", DL->getAtomGroup());
2118 Printer.printInt<unsigned>("atomRank", DL->getAtomRank());
2119 Out << ")";
2120}
2121
2122static void writeDIAssignID(raw_ostream &Out, const DIAssignID *DL,
2123 AsmWriterContext &WriterCtx) {
2124 Out << "!DIAssignID()";
2125 MDFieldPrinter Printer(Out, WriterCtx);
2126}
2127
2128static void writeDISubrange(raw_ostream &Out, const DISubrange *N,
2129 AsmWriterContext &WriterCtx) {
2130 Out << "!DISubrange(";
2131 MDFieldPrinter Printer(Out, WriterCtx);
2132
2133 Printer.printMetadataOrInt("count", N->getRawCountNode(),
2134 /* IsUnsigned */ false,
2135 /* ShouldSkipZero */ false);
2136
2137 // A lowerBound of constant 0 should not be skipped, since it is different
2138 // from an unspecified lower bound (= nullptr).
2139 Printer.printMetadataOrInt("lowerBound", N->getRawLowerBound(),
2140 /* IsUnsigned */ false,
2141 /* ShouldSkipZero */ false);
2142 Printer.printMetadataOrInt("upperBound", N->getRawUpperBound(),
2143 /* IsUnsigned */ false,
2144 /* ShouldSkipZero */ false);
2145 Printer.printMetadataOrInt("stride", N->getRawStride(),
2146 /* IsUnsigned */ false,
2147 /* ShouldSkipZero */ false);
2148
2149 Out << ")";
2150}
2151
2153 AsmWriterContext &WriterCtx) {
2154 Out << "!DIGenericSubrange(";
2155 MDFieldPrinter Printer(Out, WriterCtx);
2156
2157 auto GetConstant = [&](Metadata *Bound) -> std::optional<int64_t> {
2158 auto *BE = dyn_cast_or_null<DIExpression>(Bound);
2159 if (!BE)
2160 return std::nullopt;
2161 if (BE->isConstant() &&
2163 *BE->isConstant()) {
2164 return static_cast<int64_t>(BE->getElement(1));
2165 }
2166 return std::nullopt;
2167 };
2168
2169 auto *Count = N->getRawCountNode();
2170 if (auto ConstantCount = GetConstant(Count))
2171 Printer.printInt("count", *ConstantCount,
2172 /* ShouldSkipZero */ false);
2173 else
2174 Printer.printMetadata("count", Count, /*ShouldSkipNull */ true);
2175
2176 auto *LBound = N->getRawLowerBound();
2177 if (auto ConstantLBound = GetConstant(LBound))
2178 Printer.printInt("lowerBound", *ConstantLBound,
2179 /* ShouldSkipZero */ false);
2180 else
2181 Printer.printMetadata("lowerBound", LBound, /*ShouldSkipNull */ true);
2182
2183 auto *UBound = N->getRawUpperBound();
2184 if (auto ConstantUBound = GetConstant(UBound))
2185 Printer.printInt("upperBound", *ConstantUBound,
2186 /* ShouldSkipZero */ false);
2187 else
2188 Printer.printMetadata("upperBound", UBound, /*ShouldSkipNull */ true);
2189
2190 auto *Stride = N->getRawStride();
2191 if (auto ConstantStride = GetConstant(Stride))
2192 Printer.printInt("stride", *ConstantStride,
2193 /* ShouldSkipZero */ false);
2194 else
2195 Printer.printMetadata("stride", Stride, /*ShouldSkipNull */ true);
2196
2197 Out << ")";
2198}
2199
2201 AsmWriterContext &) {
2202 Out << "!DIEnumerator(";
2203 MDFieldPrinter Printer(Out);
2204 Printer.printString("name", N->getName(), /* ShouldSkipEmpty */ false);
2205 Printer.printAPInt("value", N->getValue(), N->isUnsigned(),
2206 /*ShouldSkipZero=*/false);
2207 if (N->isUnsigned())
2208 Printer.printBool("isUnsigned", true);
2209 Out << ")";
2210}
2211
2213 AsmWriterContext &WriterCtx) {
2214 Out << "!DIBasicType(";
2215 MDFieldPrinter Printer(Out, WriterCtx);
2216 if (N->getTag() != dwarf::DW_TAG_base_type)
2217 Printer.printTag(N);
2218 Printer.printString("name", N->getName());
2219 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2220 Printer.printInt("align", N->getAlignInBits());
2221 Printer.printInt("dataSize", N->getDataSizeInBits());
2222 Printer.printDwarfEnum("encoding", N->getEncoding(),
2224 Printer.printInt("num_extra_inhabitants", N->getNumExtraInhabitants());
2225 Printer.printDIFlags("flags", N->getFlags());
2226 Out << ")";
2227}
2228
2230 AsmWriterContext &WriterCtx) {
2231 Out << "!DIFixedPointType(";
2232 MDFieldPrinter Printer(Out, WriterCtx);
2233 if (N->getTag() != dwarf::DW_TAG_base_type)
2234 Printer.printTag(N);
2235 Printer.printString("name", N->getName());
2236 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2237 Printer.printInt("align", N->getAlignInBits());
2238 Printer.printDwarfEnum("encoding", N->getEncoding(),
2240 Printer.printDIFlags("flags", N->getFlags());
2241 Printer.printFixedPointKind("kind", N->getKind());
2242 if (N->isRational()) {
2243 bool IsUnsigned = !N->isSigned();
2244 Printer.printAPInt("numerator", N->getNumerator(), IsUnsigned, false);
2245 Printer.printAPInt("denominator", N->getDenominator(), IsUnsigned, false);
2246 } else {
2247 Printer.printInt("factor", N->getFactor());
2248 }
2249 Out << ")";
2250}
2251
2253 AsmWriterContext &WriterCtx) {
2254 Out << "!DIStringType(";
2255 MDFieldPrinter Printer(Out, WriterCtx);
2256 if (N->getTag() != dwarf::DW_TAG_string_type)
2257 Printer.printTag(N);
2258 Printer.printString("name", N->getName());
2259 Printer.printMetadata("stringLength", N->getRawStringLength());
2260 Printer.printMetadata("stringLengthExpression", N->getRawStringLengthExp());
2261 Printer.printMetadata("stringLocationExpression",
2262 N->getRawStringLocationExp());
2263 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2264 Printer.printInt("align", N->getAlignInBits());
2265 Printer.printDwarfEnum("encoding", N->getEncoding(),
2267 Out << ")";
2268}
2269
2271 AsmWriterContext &WriterCtx) {
2272 Out << "!DIDerivedType(";
2273 MDFieldPrinter Printer(Out, WriterCtx);
2274 Printer.printTag(N);
2275 Printer.printString("name", N->getName());
2276 Printer.printMetadata("scope", N->getRawScope());
2277 Printer.printMetadata("file", N->getRawFile());
2278 Printer.printInt("line", N->getLine());
2279 Printer.printMetadata("baseType", N->getRawBaseType(),
2280 /* ShouldSkipNull */ false);
2281 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2282 Printer.printInt("align", N->getAlignInBits());
2283 Printer.printMetadataOrInt("offset", N->getRawOffsetInBits(), true);
2284 Printer.printDIFlags("flags", N->getFlags());
2285 Printer.printMetadata("extraData", N->getRawExtraData());
2286 if (const auto &DWARFAddressSpace = N->getDWARFAddressSpace())
2287 Printer.printInt("dwarfAddressSpace", *DWARFAddressSpace,
2288 /* ShouldSkipZero */ false);
2289 Printer.printMetadata("annotations", N->getRawAnnotations());
2290 if (auto PtrAuthData = N->getPtrAuthData()) {
2291 Printer.printInt("ptrAuthKey", PtrAuthData->key());
2292 Printer.printBool("ptrAuthIsAddressDiscriminated",
2293 PtrAuthData->isAddressDiscriminated());
2294 Printer.printInt("ptrAuthExtraDiscriminator",
2295 PtrAuthData->extraDiscriminator());
2296 Printer.printBool("ptrAuthIsaPointer", PtrAuthData->isaPointer());
2297 Printer.printBool("ptrAuthAuthenticatesNullValues",
2298 PtrAuthData->authenticatesNullValues());
2299 }
2300 Out << ")";
2301}
2302
2304 AsmWriterContext &WriterCtx) {
2305 Out << "!DISubrangeType(";
2306 MDFieldPrinter Printer(Out, WriterCtx);
2307 Printer.printString("name", N->getName());
2308 Printer.printMetadata("scope", N->getRawScope());
2309 Printer.printMetadata("file", N->getRawFile());
2310 Printer.printInt("line", N->getLine());
2311 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2312 Printer.printInt("align", N->getAlignInBits());
2313 Printer.printDIFlags("flags", N->getFlags());
2314 Printer.printMetadata("baseType", N->getRawBaseType(),
2315 /* ShouldSkipNull */ false);
2316 Printer.printMetadata("lowerBound", N->getRawLowerBound());
2317 Printer.printMetadata("upperBound", N->getRawUpperBound());
2318 Printer.printMetadata("stride", N->getRawStride());
2319 Printer.printMetadata("bias", N->getRawBias());
2320 Out << ")";
2321}
2322
2324 AsmWriterContext &WriterCtx) {
2325 Out << "!DICompositeType(";
2326 MDFieldPrinter Printer(Out, WriterCtx);
2327 Printer.printTag(N);
2328 Printer.printString("name", N->getName());
2329 Printer.printMetadata("scope", N->getRawScope());
2330 Printer.printMetadata("file", N->getRawFile());
2331 Printer.printInt("line", N->getLine());
2332 Printer.printMetadata("baseType", N->getRawBaseType());
2333 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2334 Printer.printInt("align", N->getAlignInBits());
2335 Printer.printMetadataOrInt("offset", N->getRawOffsetInBits(), true);
2336 Printer.printInt("num_extra_inhabitants", N->getNumExtraInhabitants());
2337 Printer.printDIFlags("flags", N->getFlags());
2338 Printer.printMetadata("elements", N->getRawElements());
2339 Printer.printDwarfEnum("runtimeLang", N->getRuntimeLang(),
2341 Printer.printMetadata("vtableHolder", N->getRawVTableHolder());
2342 Printer.printMetadata("templateParams", N->getRawTemplateParams());
2343 Printer.printString("identifier", N->getIdentifier());
2344 Printer.printMetadata("discriminator", N->getRawDiscriminator());
2345 Printer.printMetadata("dataLocation", N->getRawDataLocation());
2346 Printer.printMetadata("associated", N->getRawAssociated());
2347 Printer.printMetadata("allocated", N->getRawAllocated());
2348 if (auto *RankConst = N->getRankConst())
2349 Printer.printInt("rank", RankConst->getSExtValue(),
2350 /* ShouldSkipZero */ false);
2351 else
2352 Printer.printMetadata("rank", N->getRawRank(), /*ShouldSkipNull */ true);
2353 Printer.printMetadata("annotations", N->getRawAnnotations());
2354 if (auto *Specification = N->getRawSpecification())
2355 Printer.printMetadata("specification", Specification);
2356
2357 if (auto EnumKind = N->getEnumKind())
2358 Printer.printDwarfEnum("enumKind", *EnumKind, dwarf::EnumKindString,
2359 /*ShouldSkipZero=*/false);
2360
2361 Printer.printMetadata("bitStride", N->getRawBitStride());
2362 Out << ")";
2363}
2364
2366 AsmWriterContext &WriterCtx) {
2367 Out << "!DISubroutineType(";
2368 MDFieldPrinter Printer(Out, WriterCtx);
2369 Printer.printDIFlags("flags", N->getFlags());
2370 Printer.printDwarfEnum("cc", N->getCC(), dwarf::ConventionString);
2371 Printer.printMetadata("types", N->getRawTypeArray(),
2372 /* ShouldSkipNull */ false);
2373 Out << ")";
2374}
2375
2376static void writeDIFile(raw_ostream &Out, const DIFile *N, AsmWriterContext &) {
2377 Out << "!DIFile(";
2378 MDFieldPrinter Printer(Out);
2379 Printer.printString("filename", N->getFilename(),
2380 /* ShouldSkipEmpty */ false);
2381 Printer.printString("directory", N->getDirectory(),
2382 /* ShouldSkipEmpty */ false);
2383 // Print all values for checksum together, or not at all.
2384 if (N->getChecksum())
2385 Printer.printChecksum(*N->getChecksum());
2386 if (N->getSource())
2387 Printer.printString("source", *N->getSource(),
2388 /* ShouldSkipEmpty */ false);
2389 Out << ")";
2390}
2391
2393 AsmWriterContext &WriterCtx) {
2394 Out << "!DICompileUnit(";
2395 MDFieldPrinter Printer(Out, WriterCtx);
2396
2397 DISourceLanguageName Lang = N->getSourceLanguage();
2398
2399 if (Lang.hasVersionedName()) {
2400 Printer.printDwarfEnum(
2401 "sourceLanguageName",
2402 static_cast<llvm::dwarf::SourceLanguageName>(Lang.getName()),
2404 /* ShouldSkipZero */ false);
2405
2406 Printer.printInt("sourceLanguageVersion", Lang.getVersion(),
2407 /*ShouldSkipZero=*/true);
2408 } else {
2409 Printer.printDwarfEnum("language", Lang.getName(), dwarf::LanguageString,
2410 /* ShouldSkipZero */ false);
2411 }
2412
2413 Printer.printMetadata("file", N->getRawFile(), /* ShouldSkipNull */ false);
2414 Printer.printString("producer", N->getProducer());
2415 Printer.printBool("isOptimized", N->isOptimized());
2416 Printer.printString("flags", N->getFlags());
2417 Printer.printInt("runtimeVersion", N->getRuntimeVersion(),
2418 /* ShouldSkipZero */ false);
2419 Printer.printString("splitDebugFilename", N->getSplitDebugFilename());
2420 Printer.printEmissionKind("emissionKind", N->getEmissionKind());
2421 Printer.printMetadata("enums", N->getRawEnumTypes());
2422 Printer.printMetadata("retainedTypes", N->getRawRetainedTypes());
2423 Printer.printMetadata("globals", N->getRawGlobalVariables());
2424 Printer.printMetadata("imports", N->getRawImportedEntities());
2425 Printer.printMetadata("macros", N->getRawMacros());
2426 Printer.printInt("dwoId", N->getDWOId());
2427 Printer.printBool("splitDebugInlining", N->getSplitDebugInlining(), true);
2428 Printer.printBool("debugInfoForProfiling", N->getDebugInfoForProfiling(),
2429 false);
2430 Printer.printNameTableKind("nameTableKind", N->getNameTableKind());
2431 Printer.printBool("rangesBaseAddress", N->getRangesBaseAddress(), false);
2432 Printer.printString("sysroot", N->getSysRoot());
2433 Printer.printString("sdk", N->getSDK());
2434 Out << ")";
2435}
2436
2438 AsmWriterContext &WriterCtx) {
2439 Out << "!DISubprogram(";
2440 MDFieldPrinter Printer(Out, WriterCtx);
2441 Printer.printString("name", N->getName());
2442 Printer.printString("linkageName", N->getLinkageName());
2443 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2444 Printer.printMetadata("file", N->getRawFile());
2445 Printer.printInt("line", N->getLine());
2446 Printer.printMetadata("type", N->getRawType());
2447 Printer.printInt("scopeLine", N->getScopeLine());
2448 Printer.printMetadata("containingType", N->getRawContainingType());
2449 if (N->getVirtuality() != dwarf::DW_VIRTUALITY_none ||
2450 N->getVirtualIndex() != 0)
2451 Printer.printInt("virtualIndex", N->getVirtualIndex(), false);
2452 Printer.printInt("thisAdjustment", N->getThisAdjustment());
2453 Printer.printDIFlags("flags", N->getFlags());
2454 Printer.printDISPFlags("spFlags", N->getSPFlags());
2455 Printer.printMetadata("unit", N->getRawUnit());
2456 Printer.printMetadata("templateParams", N->getRawTemplateParams());
2457 Printer.printMetadata("declaration", N->getRawDeclaration());
2458 Printer.printMetadata("retainedNodes", N->getRawRetainedNodes());
2459 Printer.printMetadata("thrownTypes", N->getRawThrownTypes());
2460 Printer.printMetadata("annotations", N->getRawAnnotations());
2461 Printer.printString("targetFuncName", N->getTargetFuncName());
2462 Printer.printBool("keyInstructions", N->getKeyInstructionsEnabled(), false);
2463 Out << ")";
2464}
2465
2467 AsmWriterContext &WriterCtx) {
2468 Out << "!DILexicalBlock(";
2469 MDFieldPrinter Printer(Out, WriterCtx);
2470 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2471 Printer.printMetadata("file", N->getRawFile());
2472 Printer.printInt("line", N->getLine());
2473 Printer.printInt("column", N->getColumn());
2474 Out << ")";
2475}
2476
2478 const DILexicalBlockFile *N,
2479 AsmWriterContext &WriterCtx) {
2480 Out << "!DILexicalBlockFile(";
2481 MDFieldPrinter Printer(Out, WriterCtx);
2482 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2483 Printer.printMetadata("file", N->getRawFile());
2484 Printer.printInt("discriminator", N->getDiscriminator(),
2485 /* ShouldSkipZero */ false);
2486 Out << ")";
2487}
2488
2490 AsmWriterContext &WriterCtx) {
2491 Out << "!DINamespace(";
2492 MDFieldPrinter Printer(Out, WriterCtx);
2493 Printer.printString("name", N->getName());
2494 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2495 Printer.printBool("exportSymbols", N->getExportSymbols(), false);
2496 Out << ")";
2497}
2498
2500 AsmWriterContext &WriterCtx) {
2501 Out << "!DICommonBlock(";
2502 MDFieldPrinter Printer(Out, WriterCtx);
2503 Printer.printMetadata("scope", N->getRawScope(), false);
2504 Printer.printMetadata("declaration", N->getRawDecl(), false);
2505 Printer.printString("name", N->getName());
2506 Printer.printMetadata("file", N->getRawFile());
2507 Printer.printInt("line", N->getLineNo());
2508 Out << ")";
2509}
2510
2511static void writeDIMacro(raw_ostream &Out, const DIMacro *N,
2512 AsmWriterContext &WriterCtx) {
2513 Out << "!DIMacro(";
2514 MDFieldPrinter Printer(Out, WriterCtx);
2515 Printer.printMacinfoType(N);
2516 Printer.printInt("line", N->getLine());
2517 Printer.printString("name", N->getName());
2518 Printer.printString("value", N->getValue());
2519 Out << ")";
2520}
2521
2523 AsmWriterContext &WriterCtx) {
2524 Out << "!DIMacroFile(";
2525 MDFieldPrinter Printer(Out, WriterCtx);
2526 Printer.printInt("line", N->getLine());
2527 Printer.printMetadata("file", N->getRawFile(), /* ShouldSkipNull */ false);
2528 Printer.printMetadata("nodes", N->getRawElements());
2529 Out << ")";
2530}
2531
2532static void writeDIModule(raw_ostream &Out, const DIModule *N,
2533 AsmWriterContext &WriterCtx) {
2534 Out << "!DIModule(";
2535 MDFieldPrinter Printer(Out, WriterCtx);
2536 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2537 Printer.printString("name", N->getName());
2538 Printer.printString("configMacros", N->getConfigurationMacros());
2539 Printer.printString("includePath", N->getIncludePath());
2540 Printer.printString("apinotes", N->getAPINotesFile());
2541 Printer.printMetadata("file", N->getRawFile());
2542 Printer.printInt("line", N->getLineNo());
2543 Printer.printBool("isDecl", N->getIsDecl(), /* Default */ false);
2544 Out << ")";
2545}
2546
2549 AsmWriterContext &WriterCtx) {
2550 Out << "!DITemplateTypeParameter(";
2551 MDFieldPrinter Printer(Out, WriterCtx);
2552 Printer.printString("name", N->getName());
2553 Printer.printMetadata("type", N->getRawType(), /* ShouldSkipNull */ false);
2554 Printer.printBool("defaulted", N->isDefault(), /* Default= */ false);
2555 Out << ")";
2556}
2557
2560 AsmWriterContext &WriterCtx) {
2561 Out << "!DITemplateValueParameter(";
2562 MDFieldPrinter Printer(Out, WriterCtx);
2563 if (N->getTag() != dwarf::DW_TAG_template_value_parameter)
2564 Printer.printTag(N);
2565 Printer.printString("name", N->getName());
2566 Printer.printMetadata("type", N->getRawType());
2567 Printer.printBool("defaulted", N->isDefault(), /* Default= */ false);
2568 Printer.printMetadata("value", N->getValue(), /* ShouldSkipNull */ false);
2569 Out << ")";
2570}
2571
2573 AsmWriterContext &WriterCtx) {
2574 Out << "!DIGlobalVariable(";
2575 MDFieldPrinter Printer(Out, WriterCtx);
2576 Printer.printString("name", N->getName());
2577 Printer.printString("linkageName", N->getLinkageName());
2578 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2579 Printer.printMetadata("file", N->getRawFile());
2580 Printer.printInt("line", N->getLine());
2581 Printer.printMetadata("type", N->getRawType());
2582 Printer.printBool("isLocal", N->isLocalToUnit());
2583 Printer.printBool("isDefinition", N->isDefinition());
2584 Printer.printMetadata("declaration", N->getRawStaticDataMemberDeclaration());
2585 Printer.printMetadata("templateParams", N->getRawTemplateParams());
2586 Printer.printInt("align", N->getAlignInBits());
2587 Printer.printMetadata("annotations", N->getRawAnnotations());
2588 Out << ")";
2589}
2590
2592 AsmWriterContext &WriterCtx) {
2593 Out << "!DILocalVariable(";
2594 MDFieldPrinter Printer(Out, WriterCtx);
2595 Printer.printString("name", N->getName());
2596 Printer.printInt("arg", N->getArg());
2597 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2598 Printer.printMetadata("file", N->getRawFile());
2599 Printer.printInt("line", N->getLine());
2600 Printer.printMetadata("type", N->getRawType());
2601 Printer.printDIFlags("flags", N->getFlags());
2602 Printer.printInt("align", N->getAlignInBits());
2603 Printer.printMetadata("annotations", N->getRawAnnotations());
2604 Out << ")";
2605}
2606
2607static void writeDILabel(raw_ostream &Out, const DILabel *N,
2608 AsmWriterContext &WriterCtx) {
2609 Out << "!DILabel(";
2610 MDFieldPrinter Printer(Out, WriterCtx);
2611 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2612 Printer.printString("name", N->getName());
2613 Printer.printMetadata("file", N->getRawFile());
2614 Printer.printInt("line", N->getLine());
2615 Printer.printInt("column", N->getColumn());
2616 Printer.printBool("isArtificial", N->isArtificial(), false);
2617 if (N->getCoroSuspendIdx())
2618 Printer.printInt("coroSuspendIdx", *N->getCoroSuspendIdx(),
2619 /* ShouldSkipZero */ false);
2620 Out << ")";
2621}
2622
2624 AsmWriterContext &WriterCtx) {
2625 Out << "!DIExpression(";
2626 ListSeparator FS;
2627 if (N->isValid()) {
2628 for (const DIExpression::ExprOperand &Op : N->expr_ops()) {
2629 auto OpStr = dwarf::OperationEncodingString(Op.getOp());
2630 assert(!OpStr.empty() && "Expected valid opcode");
2631
2632 Out << FS << OpStr;
2633 if (Op.getOp() == dwarf::DW_OP_LLVM_convert) {
2634 Out << FS << Op.getArg(0);
2635 Out << FS << dwarf::AttributeEncodingString(Op.getArg(1));
2636 } else {
2637 for (unsigned A = 0, AE = Op.getNumArgs(); A != AE; ++A)
2638 Out << FS << Op.getArg(A);
2639 }
2640 }
2641 } else {
2642 for (const auto &I : N->getElements())
2643 Out << FS << I;
2644 }
2645 Out << ")";
2646}
2647
2648static void writeDIArgList(raw_ostream &Out, const DIArgList *N,
2649 AsmWriterContext &WriterCtx,
2650 bool FromValue = false) {
2651 assert(FromValue &&
2652 "Unexpected DIArgList metadata outside of value argument");
2653 Out << "!DIArgList(";
2654 ListSeparator FS;
2655 MDFieldPrinter Printer(Out, WriterCtx);
2656 for (const Metadata *Arg : N->getArgs()) {
2657 Out << FS;
2658 writeAsOperandInternal(Out, Arg, WriterCtx, true);
2659 }
2660 Out << ")";
2661}
2662
2665 AsmWriterContext &WriterCtx) {
2666 Out << "!DIGlobalVariableExpression(";
2667 MDFieldPrinter Printer(Out, WriterCtx);
2668 Printer.printMetadata("var", N->getVariable());
2669 Printer.printMetadata("expr", N->getExpression());
2670 Out << ")";
2671}
2672
2674 AsmWriterContext &WriterCtx) {
2675 Out << "!DIObjCProperty(";
2676 MDFieldPrinter Printer(Out, WriterCtx);
2677 Printer.printString("name", N->getName());
2678 Printer.printMetadata("file", N->getRawFile());
2679 Printer.printInt("line", N->getLine());
2680 Printer.printString("setter", N->getSetterName());
2681 Printer.printString("getter", N->getGetterName());
2682 Printer.printInt("attributes", N->getAttributes());
2683 Printer.printMetadata("type", N->getRawType());
2684 Out << ")";
2685}
2686
2688 AsmWriterContext &WriterCtx) {
2689 Out << "!DIImportedEntity(";
2690 MDFieldPrinter Printer(Out, WriterCtx);
2691 Printer.printTag(N);
2692 Printer.printString("name", N->getName());
2693 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2694 Printer.printMetadata("entity", N->getRawEntity());
2695 Printer.printMetadata("file", N->getRawFile());
2696 Printer.printInt("line", N->getLine());
2697 Printer.printMetadata("elements", N->getRawElements());
2698 Out << ")";
2699}
2700
2702 AsmWriterContext &Ctx) {
2703 if (Node->isDistinct())
2704 Out << "distinct ";
2705 else if (Node->isTemporary())
2706 Out << "<temporary!> "; // Handle broken code.
2707
2708 switch (Node->getMetadataID()) {
2709 default:
2710 llvm_unreachable("Expected uniquable MDNode");
2711#define HANDLE_MDNODE_LEAF(CLASS) \
2712 case Metadata::CLASS##Kind: \
2713 write##CLASS(Out, cast<CLASS>(Node), Ctx); \
2714 break;
2715#include "llvm/IR/Metadata.def"
2716 }
2717}
2718
2719// Full implementation of printing a Value as an operand with support for
2720// TypePrinting, etc.
2721static void writeAsOperandInternal(raw_ostream &Out, const Value *V,
2722 AsmWriterContext &WriterCtx,
2723 bool PrintType) {
2724 if (PrintType) {
2725 WriterCtx.TypePrinter->print(V->getType(), Out);
2726 Out << ' ';
2727 }
2728
2729 if (V->hasName()) {
2730 printLLVMName(Out, V);
2731 return;
2732 }
2733
2734 const auto *CV = dyn_cast<Constant>(V);
2735 if (CV && !isa<GlobalValue>(CV)) {
2736 assert(WriterCtx.TypePrinter && "Constants require TypePrinting!");
2737 writeConstantInternal(Out, CV, WriterCtx);
2738 return;
2739 }
2740
2741 if (const auto *IA = dyn_cast<InlineAsm>(V)) {
2742 Out << "asm ";
2743 if (IA->hasSideEffects())
2744 Out << "sideeffect ";
2745 if (IA->isAlignStack())
2746 Out << "alignstack ";
2747 // We don't emit the AD_ATT dialect as it's the assumed default.
2748 if (IA->getDialect() == InlineAsm::AD_Intel)
2749 Out << "inteldialect ";
2750 if (IA->canThrow())
2751 Out << "unwind ";
2752 Out << '"';
2753 printEscapedString(IA->getAsmString(), Out);
2754 Out << "\", \"";
2755 printEscapedString(IA->getConstraintString(), Out);
2756 Out << '"';
2757 return;
2758 }
2759
2760 if (auto *MD = dyn_cast<MetadataAsValue>(V)) {
2761 writeAsOperandInternal(Out, MD->getMetadata(), WriterCtx,
2762 /* FromValue */ true);
2763 return;
2764 }
2765
2766 char Prefix = '%';
2767 int Slot;
2768 auto *Machine = WriterCtx.Machine;
2769 // If we have a SlotTracker, use it.
2770 if (Machine) {
2771 if (const auto *GV = dyn_cast<GlobalValue>(V)) {
2772 Slot = Machine->getGlobalSlot(GV);
2773 Prefix = '@';
2774 } else {
2775 Slot = Machine->getLocalSlot(V);
2776
2777 // If the local value didn't succeed, then we may be referring to a value
2778 // from a different function. Translate it, as this can happen when using
2779 // address of blocks.
2780 if (Slot == -1)
2781 if ((Machine = createSlotTracker(V))) {
2782 Slot = Machine->getLocalSlot(V);
2783 delete Machine;
2784 }
2785 }
2786 } else if ((Machine = createSlotTracker(V))) {
2787 // Otherwise, create one to get the # and then destroy it.
2788 if (const auto *GV = dyn_cast<GlobalValue>(V)) {
2789 Slot = Machine->getGlobalSlot(GV);
2790 Prefix = '@';
2791 } else {
2792 Slot = Machine->getLocalSlot(V);
2793 }
2794 delete Machine;
2795 Machine = nullptr;
2796 } else {
2797 Slot = -1;
2798 }
2799
2800 if (Slot != -1)
2801 Out << Prefix << Slot;
2802 else
2803 Out << "<badref>";
2804}
2805
2806static void writeAsOperandInternal(raw_ostream &Out, const Metadata *MD,
2807 AsmWriterContext &WriterCtx,
2808 bool FromValue) {
2809 // Write DIExpressions and DIArgLists inline when used as a value. Improves
2810 // readability of debug info intrinsics.
2811 if (const auto *Expr = dyn_cast<DIExpression>(MD)) {
2812 writeDIExpression(Out, Expr, WriterCtx);
2813 return;
2814 }
2815 if (const auto *ArgList = dyn_cast<DIArgList>(MD)) {
2816 writeDIArgList(Out, ArgList, WriterCtx, FromValue);
2817 return;
2818 }
2819
2820 if (const auto *N = dyn_cast<MDNode>(MD)) {
2821 std::unique_ptr<SlotTracker> MachineStorage;
2822 SaveAndRestore SARMachine(WriterCtx.Machine);
2823 if (!WriterCtx.Machine) {
2824 MachineStorage = std::make_unique<SlotTracker>(WriterCtx.Context);
2825 WriterCtx.Machine = MachineStorage.get();
2826 }
2827 int Slot = WriterCtx.Machine->getMetadataSlot(N);
2828 if (Slot == -1) {
2829 if (const auto *Loc = dyn_cast<DILocation>(N)) {
2830 writeDILocation(Out, Loc, WriterCtx);
2831 return;
2832 }
2833 // Give the pointer value instead of "badref", since this comes up all
2834 // the time when debugging.
2835 Out << "<" << N << ">";
2836 } else
2837 Out << '!' << Slot;
2838 return;
2839 }
2840
2841 if (const auto *MDS = dyn_cast<MDString>(MD)) {
2842 Out << "!\"";
2843 printEscapedString(MDS->getString(), Out);
2844 Out << '"';
2845 return;
2846 }
2847
2848 auto *V = cast<ValueAsMetadata>(MD);
2849 assert(WriterCtx.TypePrinter && "TypePrinter required for metadata values");
2850 assert((FromValue || !isa<LocalAsMetadata>(V)) &&
2851 "Unexpected function-local metadata outside of value argument");
2852
2853 writeAsOperandInternal(Out, V->getValue(), WriterCtx, /*PrintType=*/true);
2854}
2855
2856namespace {
2857
2858class AssemblyWriter {
2859 formatted_raw_ostream &Out;
2860 const Module *TheModule = nullptr;
2861 const ModuleSummaryIndex *TheIndex = nullptr;
2862 std::unique_ptr<SlotTracker> SlotTrackerStorage;
2863 SlotTracker &Machine;
2864 TypePrinting TypePrinter;
2865 AssemblyAnnotationWriter *AnnotationWriter = nullptr;
2866 SetVector<const Comdat *> Comdats;
2867 bool IsForDebug;
2868 bool ShouldPreserveUseListOrder;
2869 UseListOrderMap UseListOrders;
2871 /// Synchronization scope names registered with LLVMContext.
2873 DenseMap<const GlobalValueSummary *, GlobalValue::GUID> SummaryToGUIDMap;
2874
2875public:
2876 /// Construct an AssemblyWriter with an external SlotTracker
2877 AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac, const Module *M,
2878 AssemblyAnnotationWriter *AAW, bool IsForDebug,
2879 bool ShouldPreserveUseListOrder = false);
2880
2881 AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
2882 const ModuleSummaryIndex *Index, bool IsForDebug);
2883
2884 AsmWriterContext getContext() {
2885 return AsmWriterContext(&TypePrinter, &Machine, TheModule);
2886 }
2887
2888 void printMDNodeBody(const MDNode *MD);
2889 void printNamedMDNode(const NamedMDNode *NMD);
2890
2891 void printModule(const Module *M);
2892
2893 void writeOperand(const Value *Op, bool PrintType);
2894 void writeParamOperand(const Value *Operand, AttributeSet Attrs);
2895 void writeOperandBundles(const CallBase *Call);
2896 void writeSyncScope(const LLVMContext &Context,
2897 SyncScope::ID SSID);
2898 void writeAtomic(const LLVMContext &Context,
2899 AtomicOrdering Ordering,
2900 SyncScope::ID SSID);
2901 void writeAtomicCmpXchg(const LLVMContext &Context,
2902 AtomicOrdering SuccessOrdering,
2903 AtomicOrdering FailureOrdering,
2904 SyncScope::ID SSID);
2905
2906 void writeAllMDNodes();
2907 void writeMDNode(unsigned Slot, const MDNode *Node);
2908 void writeAttribute(const Attribute &Attr, bool InAttrGroup = false);
2909 void writeAttributeSet(const AttributeSet &AttrSet, bool InAttrGroup = false);
2910 void writeAllAttributeGroups();
2911
2912 void printTypeIdentities();
2913 void printGlobal(const GlobalVariable *GV);
2914 void printAlias(const GlobalAlias *GA);
2915 void printIFunc(const GlobalIFunc *GI);
2916 void printComdat(const Comdat *C);
2917 void printFunction(const Function *F);
2918 void printArgument(const Argument *FA, AttributeSet Attrs);
2919 void printBasicBlock(const BasicBlock *BB);
2920 void printInstructionLine(const Instruction &I);
2921 void printInstruction(const Instruction &I);
2922 void printDbgMarker(const DbgMarker &DPI);
2923 void printDbgVariableRecord(const DbgVariableRecord &DVR);
2924 void printDbgLabelRecord(const DbgLabelRecord &DLR);
2925 void printDbgRecord(const DbgRecord &DR);
2926 void printDbgRecordLine(const DbgRecord &DR);
2927
2928 void printUseListOrder(const Value *V, ArrayRef<unsigned> Shuffle);
2929 void printUseLists(const Function *F);
2930
2931 void printModuleSummaryIndex();
2932 void printSummaryInfo(unsigned Slot, const ValueInfo &VI);
2933 void printSummary(const GlobalValueSummary &Summary);
2934 void printAliasSummary(const AliasSummary *AS);
2935 void printGlobalVarSummary(const GlobalVarSummary *GS);
2936 void printFunctionSummary(const FunctionSummary *FS);
2937 void printTypeIdSummary(const TypeIdSummary &TIS);
2938 void printTypeIdCompatibleVtableSummary(const TypeIdCompatibleVtableInfo &TI);
2939 void printTypeTestResolution(const TypeTestResolution &TTRes);
2940 void printArgs(ArrayRef<uint64_t> Args);
2941 void printWPDRes(const WholeProgramDevirtResolution &WPDRes);
2942 void printTypeIdInfo(const FunctionSummary::TypeIdInfo &TIDInfo);
2943 void printVFuncId(const FunctionSummary::VFuncId VFId);
2944 void printNonConstVCalls(ArrayRef<FunctionSummary::VFuncId> VCallList,
2945 const char *Tag);
2946 void printConstVCalls(ArrayRef<FunctionSummary::ConstVCall> VCallList,
2947 const char *Tag);
2948
2949private:
2950 /// Print out metadata attachments.
2951 void printMetadataAttachments(
2952 const SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs,
2953 StringRef Separator);
2954
2955 // printInfoComment - Print a little comment after the instruction indicating
2956 // which slot it occupies.
2957 void printInfoComment(const Value &V, bool isMaterializable = false);
2958
2959 // printGCRelocateComment - print comment after call to the gc.relocate
2960 // intrinsic indicating base and derived pointer names.
2961 void printGCRelocateComment(const GCRelocateInst &Relocate);
2962};
2963
2964} // end anonymous namespace
2965
2966AssemblyWriter::AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
2967 const Module *M, AssemblyAnnotationWriter *AAW,
2968 bool IsForDebug, bool ShouldPreserveUseListOrder)
2969 : Out(o), TheModule(M), Machine(Mac), TypePrinter(M), AnnotationWriter(AAW),
2970 IsForDebug(IsForDebug),
2971 ShouldPreserveUseListOrder(
2972 PreserveAssemblyUseListOrder.getNumOccurrences()
2974 : ShouldPreserveUseListOrder) {
2975 if (!TheModule)
2976 return;
2977 for (const GlobalObject &GO : TheModule->global_objects())
2978 if (const Comdat *C = GO.getComdat())
2979 Comdats.insert(C);
2980}
2981
2982AssemblyWriter::AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
2983 const ModuleSummaryIndex *Index, bool IsForDebug)
2984 : Out(o), TheIndex(Index), Machine(Mac), TypePrinter(/*Module=*/nullptr),
2985 IsForDebug(IsForDebug),
2986 ShouldPreserveUseListOrder(PreserveAssemblyUseListOrder) {}
2987
2988void AssemblyWriter::writeOperand(const Value *Operand, bool PrintType) {
2989 if (!Operand) {
2990 Out << "<null operand!>";
2991 return;
2992 }
2993 auto WriteCtx = getContext();
2994 writeAsOperandInternal(Out, Operand, WriteCtx, PrintType);
2995}
2996
2997void AssemblyWriter::writeSyncScope(const LLVMContext &Context,
2998 SyncScope::ID SSID) {
2999 switch (SSID) {
3000 case SyncScope::System: {
3001 break;
3002 }
3003 default: {
3004 if (SSNs.empty())
3005 Context.getSyncScopeNames(SSNs);
3006
3007 Out << " syncscope(\"";
3008 printEscapedString(SSNs[SSID], Out);
3009 Out << "\")";
3010 break;
3011 }
3012 }
3013}
3014
3015void AssemblyWriter::writeAtomic(const LLVMContext &Context,
3016 AtomicOrdering Ordering,
3017 SyncScope::ID SSID) {
3018 if (Ordering == AtomicOrdering::NotAtomic)
3019 return;
3020
3021 writeSyncScope(Context, SSID);
3022 Out << " " << toIRString(Ordering);
3023}
3024
3025void AssemblyWriter::writeAtomicCmpXchg(const LLVMContext &Context,
3026 AtomicOrdering SuccessOrdering,
3027 AtomicOrdering FailureOrdering,
3028 SyncScope::ID SSID) {
3029 assert(SuccessOrdering != AtomicOrdering::NotAtomic &&
3030 FailureOrdering != AtomicOrdering::NotAtomic);
3031
3032 writeSyncScope(Context, SSID);
3033 Out << " " << toIRString(SuccessOrdering);
3034 Out << " " << toIRString(FailureOrdering);
3035}
3036
3037void AssemblyWriter::writeParamOperand(const Value *Operand,
3038 AttributeSet Attrs) {
3039 if (!Operand) {
3040 Out << "<null operand!>";
3041 return;
3042 }
3043
3044 // Print the type
3045 TypePrinter.print(Operand->getType(), Out);
3046 // Print parameter attributes list
3047 if (Attrs.hasAttributes()) {
3048 Out << ' ';
3049 writeAttributeSet(Attrs);
3050 }
3051 Out << ' ';
3052 // Print the operand
3053 auto WriterCtx = getContext();
3054 writeAsOperandInternal(Out, Operand, WriterCtx);
3055}
3056
3057void AssemblyWriter::writeOperandBundles(const CallBase *Call) {
3058 if (!Call->hasOperandBundles())
3059 return;
3060
3061 Out << " [ ";
3062
3063 ListSeparator LS;
3064 for (unsigned i = 0, e = Call->getNumOperandBundles(); i != e; ++i) {
3065 OperandBundleUse BU = Call->getOperandBundleAt(i);
3066
3067 Out << LS << '"';
3068 printEscapedString(BU.getTagName(), Out);
3069 Out << '"';
3070
3071 Out << '(';
3072
3073 ListSeparator InnerLS;
3074 auto WriterCtx = getContext();
3075 for (const auto &Input : BU.Inputs) {
3076 Out << InnerLS;
3077 if (Input == nullptr)
3078 Out << "<null operand bundle!>";
3079 else
3080 writeAsOperandInternal(Out, Input, WriterCtx, /*PrintType=*/true);
3081 }
3082
3083 Out << ')';
3084 }
3085
3086 Out << " ]";
3087}
3088
3089void AssemblyWriter::printModule(const Module *M) {
3090 Machine.initializeIfNeeded();
3091
3092 if (ShouldPreserveUseListOrder)
3093 UseListOrders = predictUseListOrder(M);
3094
3095 if (!M->getModuleIdentifier().empty() &&
3096 // Don't print the ID if it will start a new line (which would
3097 // require a comment char before it).
3098 M->getModuleIdentifier().find('\n') == std::string::npos)
3099 Out << "; ModuleID = '" << M->getModuleIdentifier() << "'\n";
3100
3101 if (!M->getSourceFileName().empty()) {
3102 Out << "source_filename = \"";
3103 printEscapedString(M->getSourceFileName(), Out);
3104 Out << "\"\n";
3105 }
3106
3107 const std::string &DL = M->getDataLayoutStr();
3108 if (!DL.empty())
3109 Out << "target datalayout = \"" << DL << "\"\n";
3110 if (!M->getTargetTriple().empty())
3111 Out << "target triple = \"" << M->getTargetTriple().str() << "\"\n";
3112
3113 if (!M->getModuleInlineAsm().empty()) {
3114 Out << '\n';
3115
3116 // Split the string into lines, to make it easier to read the .ll file.
3117 StringRef Asm = M->getModuleInlineAsm();
3118 do {
3119 StringRef Front;
3120 std::tie(Front, Asm) = Asm.split('\n');
3121
3122 // We found a newline, print the portion of the asm string from the
3123 // last newline up to this newline.
3124 Out << "module asm \"";
3125 printEscapedString(Front, Out);
3126 Out << "\"\n";
3127 } while (!Asm.empty());
3128 }
3129
3130 printTypeIdentities();
3131
3132 // Output all comdats.
3133 if (!Comdats.empty())
3134 Out << '\n';
3135 for (const Comdat *C : Comdats) {
3136 printComdat(C);
3137 if (C != Comdats.back())
3138 Out << '\n';
3139 }
3140
3141 // Output all globals.
3142 if (!M->global_empty()) Out << '\n';
3143 for (const GlobalVariable &GV : M->globals()) {
3144 printGlobal(&GV); Out << '\n';
3145 }
3146
3147 // Output all aliases.
3148 if (!M->alias_empty()) Out << "\n";
3149 for (const GlobalAlias &GA : M->aliases())
3150 printAlias(&GA);
3151
3152 // Output all ifuncs.
3153 if (!M->ifunc_empty()) Out << "\n";
3154 for (const GlobalIFunc &GI : M->ifuncs())
3155 printIFunc(&GI);
3156
3157 // Output all of the functions.
3158 for (const Function &F : *M) {
3159 Out << '\n';
3160 printFunction(&F);
3161 }
3162
3163 // Output global use-lists.
3164 printUseLists(nullptr);
3165
3166 // Output all attribute groups.
3167 if (!Machine.as_empty()) {
3168 Out << '\n';
3169 writeAllAttributeGroups();
3170 }
3171
3172 // Output named metadata.
3173 if (!M->named_metadata_empty()) Out << '\n';
3174
3175 for (const NamedMDNode &Node : M->named_metadata())
3176 printNamedMDNode(&Node);
3177
3178 // Output metadata.
3179 if (!Machine.mdn_empty()) {
3180 Out << '\n';
3181 writeAllMDNodes();
3182 }
3183}
3184
3185void AssemblyWriter::printModuleSummaryIndex() {
3186 assert(TheIndex);
3187 int NumSlots = Machine.initializeIndexIfNeeded();
3188
3189 Out << "\n";
3190
3191 // Print module path entries. To print in order, add paths to a vector
3192 // indexed by module slot.
3193 std::vector<std::pair<std::string, ModuleHash>> moduleVec;
3194 std::string RegularLTOModuleName =
3196 moduleVec.resize(TheIndex->modulePaths().size());
3197 for (auto &[ModPath, ModHash] : TheIndex->modulePaths())
3198 moduleVec[Machine.getModulePathSlot(ModPath)] = std::make_pair(
3199 // An empty module path is a special entry for a regular LTO module
3200 // created during the thin link.
3201 ModPath.empty() ? RegularLTOModuleName : std::string(ModPath), ModHash);
3202
3203 unsigned i = 0;
3204 for (auto &ModPair : moduleVec) {
3205 Out << "^" << i++ << " = module: (";
3206 Out << "path: \"";
3207 printEscapedString(ModPair.first, Out);
3208 Out << "\", hash: (";
3209 ListSeparator FS;
3210 for (auto Hash : ModPair.second)
3211 Out << FS << Hash;
3212 Out << "))\n";
3213 }
3214
3215 // FIXME: Change AliasSummary to hold a ValueInfo instead of summary pointer
3216 // for aliasee (then update BitcodeWriter.cpp and remove get/setAliaseeGUID).
3217 for (auto &GlobalList : *TheIndex) {
3218 auto GUID = GlobalList.first;
3219 for (auto &Summary : GlobalList.second.getSummaryList())
3220 SummaryToGUIDMap[Summary.get()] = GUID;
3221 }
3222
3223 // Print the global value summary entries.
3224 for (auto &GlobalList : *TheIndex) {
3225 auto GUID = GlobalList.first;
3226 auto VI = TheIndex->getValueInfo(GlobalList);
3227 printSummaryInfo(Machine.getGUIDSlot(GUID), VI);
3228 }
3229
3230 // Print the TypeIdMap entries.
3231 for (const auto &TID : TheIndex->typeIds()) {
3232 Out << "^" << Machine.getTypeIdSlot(TID.second.first)
3233 << " = typeid: (name: \"" << TID.second.first << "\"";
3234 printTypeIdSummary(TID.second.second);
3235 Out << ") ; guid = " << TID.first << "\n";
3236 }
3237
3238 // Print the TypeIdCompatibleVtableMap entries.
3239 for (auto &TId : TheIndex->typeIdCompatibleVtableMap()) {
3241 Out << "^" << Machine.getTypeIdCompatibleVtableSlot(TId.first)
3242 << " = typeidCompatibleVTable: (name: \"" << TId.first << "\"";
3243 printTypeIdCompatibleVtableSummary(TId.second);
3244 Out << ") ; guid = " << GUID << "\n";
3245 }
3246
3247 // Don't emit flags when it's not really needed (value is zero by default).
3248 if (TheIndex->getFlags()) {
3249 Out << "^" << NumSlots << " = flags: " << TheIndex->getFlags() << "\n";
3250 ++NumSlots;
3251 }
3252
3253 Out << "^" << NumSlots << " = blockcount: " << TheIndex->getBlockCount()
3254 << "\n";
3255}
3256
3257static const char *
3259 switch (K) {
3261 return "indir";
3263 return "singleImpl";
3265 return "branchFunnel";
3266 }
3267 llvm_unreachable("invalid WholeProgramDevirtResolution kind");
3268}
3269
3272 switch (K) {
3274 return "indir";
3276 return "uniformRetVal";
3278 return "uniqueRetVal";
3280 return "virtualConstProp";
3281 }
3282 llvm_unreachable("invalid WholeProgramDevirtResolution::ByArg kind");
3283}
3284
3286 switch (K) {
3288 return "unknown";
3290 return "unsat";
3292 return "byteArray";
3294 return "inline";
3296 return "single";
3298 return "allOnes";
3299 }
3300 llvm_unreachable("invalid TypeTestResolution kind");
3301}
3302
3303void AssemblyWriter::printTypeTestResolution(const TypeTestResolution &TTRes) {
3304 Out << "typeTestRes: (kind: " << getTTResKindName(TTRes.TheKind)
3305 << ", sizeM1BitWidth: " << TTRes.SizeM1BitWidth;
3306
3307 // The following fields are only used if the target does not support the use
3308 // of absolute symbols to store constants. Print only if non-zero.
3309 if (TTRes.AlignLog2)
3310 Out << ", alignLog2: " << TTRes.AlignLog2;
3311 if (TTRes.SizeM1)
3312 Out << ", sizeM1: " << TTRes.SizeM1;
3313 if (TTRes.BitMask)
3314 // BitMask is uint8_t which causes it to print the corresponding char.
3315 Out << ", bitMask: " << (unsigned)TTRes.BitMask;
3316 if (TTRes.InlineBits)
3317 Out << ", inlineBits: " << TTRes.InlineBits;
3318
3319 Out << ")";
3320}
3321
3322void AssemblyWriter::printTypeIdSummary(const TypeIdSummary &TIS) {
3323 Out << ", summary: (";
3324 printTypeTestResolution(TIS.TTRes);
3325 if (!TIS.WPDRes.empty()) {
3326 Out << ", wpdResolutions: (";
3327 ListSeparator FS;
3328 for (auto &WPDRes : TIS.WPDRes) {
3329 Out << FS;
3330 Out << "(offset: " << WPDRes.first << ", ";
3331 printWPDRes(WPDRes.second);
3332 Out << ")";
3333 }
3334 Out << ")";
3335 }
3336 Out << ")";
3337}
3338
3339void AssemblyWriter::printTypeIdCompatibleVtableSummary(
3340 const TypeIdCompatibleVtableInfo &TI) {
3341 Out << ", summary: (";
3342 ListSeparator FS;
3343 for (auto &P : TI) {
3344 Out << FS;
3345 Out << "(offset: " << P.AddressPointOffset << ", ";
3346 Out << "^" << Machine.getGUIDSlot(P.VTableVI.getGUID());
3347 Out << ")";
3348 }
3349 Out << ")";
3350}
3351
3352void AssemblyWriter::printArgs(ArrayRef<uint64_t> Args) {
3353 Out << "args: (" << llvm::interleaved(Args) << ')';
3354}
3355
3356void AssemblyWriter::printWPDRes(const WholeProgramDevirtResolution &WPDRes) {
3357 Out << "wpdRes: (kind: ";
3359
3361 Out << ", singleImplName: \"" << WPDRes.SingleImplName << "\"";
3362
3363 if (!WPDRes.ResByArg.empty()) {
3364 Out << ", resByArg: (";
3365 ListSeparator FS;
3366 for (auto &ResByArg : WPDRes.ResByArg) {
3367 Out << FS;
3368 printArgs(ResByArg.first);
3369 Out << ", byArg: (kind: ";
3370 Out << getWholeProgDevirtResByArgKindName(ResByArg.second.TheKind);
3371 if (ResByArg.second.TheKind ==
3373 ResByArg.second.TheKind ==
3375 Out << ", info: " << ResByArg.second.Info;
3376
3377 // The following fields are only used if the target does not support the
3378 // use of absolute symbols to store constants. Print only if non-zero.
3379 if (ResByArg.second.Byte || ResByArg.second.Bit)
3380 Out << ", byte: " << ResByArg.second.Byte
3381 << ", bit: " << ResByArg.second.Bit;
3382
3383 Out << ")";
3384 }
3385 Out << ")";
3386 }
3387 Out << ")";
3388}
3389
3391 switch (SK) {
3393 return "alias";
3395 return "function";
3397 return "variable";
3398 }
3399 llvm_unreachable("invalid summary kind");
3400}
3401
3402void AssemblyWriter::printAliasSummary(const AliasSummary *AS) {
3403 Out << ", aliasee: ";
3404 // The indexes emitted for distributed backends may not include the
3405 // aliasee summary (only if it is being imported directly). Handle
3406 // that case by just emitting "null" as the aliasee.
3407 if (AS->hasAliasee())
3408 Out << "^" << Machine.getGUIDSlot(SummaryToGUIDMap[&AS->getAliasee()]);
3409 else
3410 Out << "null";
3411}
3412
3413void AssemblyWriter::printGlobalVarSummary(const GlobalVarSummary *GS) {
3414 auto VTableFuncs = GS->vTableFuncs();
3415 Out << ", varFlags: (readonly: " << GS->VarFlags.MaybeReadOnly << ", "
3416 << "writeonly: " << GS->VarFlags.MaybeWriteOnly << ", "
3417 << "constant: " << GS->VarFlags.Constant;
3418 if (!VTableFuncs.empty())
3419 Out << ", "
3420 << "vcall_visibility: " << GS->VarFlags.VCallVisibility;
3421 Out << ")";
3422
3423 if (!VTableFuncs.empty()) {
3424 Out << ", vTableFuncs: (";
3425 ListSeparator FS;
3426 for (auto &P : VTableFuncs) {
3427 Out << FS;
3428 Out << "(virtFunc: ^" << Machine.getGUIDSlot(P.FuncVI.getGUID())
3429 << ", offset: " << P.VTableOffset;
3430 Out << ")";
3431 }
3432 Out << ")";
3433 }
3434}
3435
3437 switch (LT) {
3439 return "external";
3441 return "private";
3443 return "internal";
3445 return "linkonce";
3447 return "linkonce_odr";
3449 return "weak";
3451 return "weak_odr";
3453 return "common";
3455 return "appending";
3457 return "extern_weak";
3459 return "available_externally";
3460 }
3461 llvm_unreachable("invalid linkage");
3462}
3463
3464// When printing the linkage types in IR where the ExternalLinkage is
3465// not printed, and other linkage types are expected to be printed with
3466// a space after the name.
3469 return "";
3470 return getLinkageName(LT) + " ";
3471}
3472
3474 switch (Vis) {
3476 return "default";
3478 return "hidden";
3480 return "protected";
3481 }
3482 llvm_unreachable("invalid visibility");
3483}
3484
3486 switch (IK) {
3488 return "definition";
3490 return "declaration";
3491 }
3492 llvm_unreachable("invalid import kind");
3493}
3494
3495void AssemblyWriter::printFunctionSummary(const FunctionSummary *FS) {
3496 Out << ", insts: " << FS->instCount();
3497 if (FS->fflags().anyFlagSet())
3498 Out << ", " << FS->fflags();
3499
3500 if (!FS->calls().empty()) {
3501 Out << ", calls: (";
3502 ListSeparator IFS;
3503 for (auto &Call : FS->calls()) {
3504 Out << IFS;
3505 Out << "(callee: ^" << Machine.getGUIDSlot(Call.first.getGUID());
3506 if (Call.second.getHotness() != CalleeInfo::HotnessType::Unknown)
3507 Out << ", hotness: " << getHotnessName(Call.second.getHotness());
3508 // Follow the convention of emitting flags as a boolean value, but only
3509 // emit if true to avoid unnecessary verbosity and test churn.
3510 if (Call.second.HasTailCall)
3511 Out << ", tail: 1";
3512 Out << ")";
3513 }
3514 Out << ")";
3515 }
3516
3517 if (const auto *TIdInfo = FS->getTypeIdInfo())
3518 printTypeIdInfo(*TIdInfo);
3519
3520 // The AllocationType identifiers capture the profiled context behavior
3521 // reaching a specific static allocation site (possibly cloned).
3522 auto AllocTypeName = [](uint8_t Type) -> const char * {
3523 switch (Type) {
3524 case (uint8_t)AllocationType::None:
3525 return "none";
3526 case (uint8_t)AllocationType::NotCold:
3527 return "notcold";
3528 case (uint8_t)AllocationType::Cold:
3529 return "cold";
3530 case (uint8_t)AllocationType::Hot:
3531 return "hot";
3532 }
3533 llvm_unreachable("Unexpected alloc type");
3534 };
3535
3536 if (!FS->allocs().empty()) {
3537 Out << ", allocs: (";
3538 ListSeparator AFS;
3539 for (auto &AI : FS->allocs()) {
3540 Out << AFS;
3541 Out << "(versions: (";
3542 ListSeparator VFS;
3543 for (auto V : AI.Versions) {
3544 Out << VFS;
3545 Out << AllocTypeName(V);
3546 }
3547 Out << "), memProf: (";
3548 ListSeparator MIBFS;
3549 for (auto &MIB : AI.MIBs) {
3550 Out << MIBFS;
3551 Out << "(type: " << AllocTypeName((uint8_t)MIB.AllocType);
3552 Out << ", stackIds: (";
3553 ListSeparator SIDFS;
3554 for (auto Id : MIB.StackIdIndices) {
3555 Out << SIDFS;
3556 Out << TheIndex->getStackIdAtIndex(Id);
3557 }
3558 Out << "))";
3559 }
3560 Out << "))";
3561 }
3562 Out << ")";
3563 }
3564
3565 if (!FS->callsites().empty()) {
3566 Out << ", callsites: (";
3567 ListSeparator SNFS;
3568 for (auto &CI : FS->callsites()) {
3569 Out << SNFS;
3570 if (CI.Callee)
3571 Out << "(callee: ^" << Machine.getGUIDSlot(CI.Callee.getGUID());
3572 else
3573 Out << "(callee: null";
3574 Out << ", clones: (";
3575 ListSeparator VFS;
3576 for (auto V : CI.Clones) {
3577 Out << VFS;
3578 Out << V;
3579 }
3580 Out << "), stackIds: (";
3581 ListSeparator SIDFS;
3582 for (auto Id : CI.StackIdIndices) {
3583 Out << SIDFS;
3584 Out << TheIndex->getStackIdAtIndex(Id);
3585 }
3586 Out << "))";
3587 }
3588 Out << ")";
3589 }
3590
3591 auto PrintRange = [&](const ConstantRange &Range) {
3592 Out << "[" << Range.getSignedMin() << ", " << Range.getSignedMax() << "]";
3593 };
3594
3595 if (!FS->paramAccesses().empty()) {
3596 Out << ", params: (";
3597 ListSeparator IFS;
3598 for (auto &PS : FS->paramAccesses()) {
3599 Out << IFS;
3600 Out << "(param: " << PS.ParamNo;
3601 Out << ", offset: ";
3602 PrintRange(PS.Use);
3603 if (!PS.Calls.empty()) {
3604 Out << ", calls: (";
3605 ListSeparator IFS;
3606 for (auto &Call : PS.Calls) {
3607 Out << IFS;
3608 Out << "(callee: ^" << Machine.getGUIDSlot(Call.Callee.getGUID());
3609 Out << ", param: " << Call.ParamNo;
3610 Out << ", offset: ";
3611 PrintRange(Call.Offsets);
3612 Out << ")";
3613 }
3614 Out << ")";
3615 }
3616 Out << ")";
3617 }
3618 Out << ")";
3619 }
3620}
3621
3622void AssemblyWriter::printTypeIdInfo(
3623 const FunctionSummary::TypeIdInfo &TIDInfo) {
3624 Out << ", typeIdInfo: (";
3625 ListSeparator TIDFS;
3626 if (!TIDInfo.TypeTests.empty()) {
3627 Out << TIDFS;
3628 Out << "typeTests: (";
3629 ListSeparator FS;
3630 for (auto &GUID : TIDInfo.TypeTests) {
3631 auto TidIter = TheIndex->typeIds().equal_range(GUID);
3632 if (TidIter.first == TidIter.second) {
3633 Out << FS;
3634 Out << GUID;
3635 continue;
3636 }
3637 // Print all type id that correspond to this GUID.
3638 for (const auto &[GUID, TypeIdPair] : make_range(TidIter)) {
3639 Out << FS;
3640 auto Slot = Machine.getTypeIdSlot(TypeIdPair.first);
3641 assert(Slot != -1);
3642 Out << "^" << Slot;
3643 }
3644 }
3645 Out << ")";
3646 }
3647 if (!TIDInfo.TypeTestAssumeVCalls.empty()) {
3648 Out << TIDFS;
3649 printNonConstVCalls(TIDInfo.TypeTestAssumeVCalls, "typeTestAssumeVCalls");
3650 }
3651 if (!TIDInfo.TypeCheckedLoadVCalls.empty()) {
3652 Out << TIDFS;
3653 printNonConstVCalls(TIDInfo.TypeCheckedLoadVCalls, "typeCheckedLoadVCalls");
3654 }
3655 if (!TIDInfo.TypeTestAssumeConstVCalls.empty()) {
3656 Out << TIDFS;
3657 printConstVCalls(TIDInfo.TypeTestAssumeConstVCalls,
3658 "typeTestAssumeConstVCalls");
3659 }
3660 if (!TIDInfo.TypeCheckedLoadConstVCalls.empty()) {
3661 Out << TIDFS;
3662 printConstVCalls(TIDInfo.TypeCheckedLoadConstVCalls,
3663 "typeCheckedLoadConstVCalls");
3664 }
3665 Out << ")";
3666}
3667
3668void AssemblyWriter::printVFuncId(const FunctionSummary::VFuncId VFId) {
3669 auto TidIter = TheIndex->typeIds().equal_range(VFId.GUID);
3670 if (TidIter.first == TidIter.second) {
3671 Out << "vFuncId: (";
3672 Out << "guid: " << VFId.GUID;
3673 Out << ", offset: " << VFId.Offset;
3674 Out << ")";
3675 return;
3676 }
3677 // Print all type id that correspond to this GUID.
3678 ListSeparator FS;
3679 for (const auto &[GUID, TypeIdPair] : make_range(TidIter)) {
3680 Out << FS;
3681 Out << "vFuncId: (";
3682 auto Slot = Machine.getTypeIdSlot(TypeIdPair.first);
3683 assert(Slot != -1);
3684 Out << "^" << Slot;
3685 Out << ", offset: " << VFId.Offset;
3686 Out << ")";
3687 }
3688}
3689
3690void AssemblyWriter::printNonConstVCalls(
3691 ArrayRef<FunctionSummary::VFuncId> VCallList, const char *Tag) {
3692 Out << Tag << ": (";
3693 ListSeparator FS;
3694 for (auto &VFuncId : VCallList) {
3695 Out << FS;
3696 printVFuncId(VFuncId);
3697 }
3698 Out << ")";
3699}
3700
3701void AssemblyWriter::printConstVCalls(
3702 ArrayRef<FunctionSummary::ConstVCall> VCallList, const char *Tag) {
3703 Out << Tag << ": (";
3704 ListSeparator FS;
3705 for (auto &ConstVCall : VCallList) {
3706 Out << FS;
3707 Out << "(";
3708 printVFuncId(ConstVCall.VFunc);
3709 if (!ConstVCall.Args.empty()) {
3710 Out << ", ";
3711 printArgs(ConstVCall.Args);
3712 }
3713 Out << ")";
3714 }
3715 Out << ")";
3716}
3717
3718void AssemblyWriter::printSummary(const GlobalValueSummary &Summary) {
3719 GlobalValueSummary::GVFlags GVFlags = Summary.flags();
3721 Out << getSummaryKindName(Summary.getSummaryKind()) << ": ";
3722 Out << "(module: ^" << Machine.getModulePathSlot(Summary.modulePath())
3723 << ", flags: (";
3724 Out << "linkage: " << getLinkageName(LT);
3725 Out << ", visibility: "
3727 Out << ", notEligibleToImport: " << GVFlags.NotEligibleToImport;
3728 Out << ", live: " << GVFlags.Live;
3729 Out << ", dsoLocal: " << GVFlags.DSOLocal;
3730 Out << ", canAutoHide: " << GVFlags.CanAutoHide;
3731 Out << ", importType: "
3733 Out << ")";
3734
3735 if (Summary.getSummaryKind() == GlobalValueSummary::AliasKind)
3736 printAliasSummary(cast<AliasSummary>(&Summary));
3737 else if (Summary.getSummaryKind() == GlobalValueSummary::FunctionKind)
3738 printFunctionSummary(cast<FunctionSummary>(&Summary));
3739 else
3740 printGlobalVarSummary(cast<GlobalVarSummary>(&Summary));
3741
3742 auto RefList = Summary.refs();
3743 if (!RefList.empty()) {
3744 Out << ", refs: (";
3745 ListSeparator FS;
3746 for (auto &Ref : RefList) {
3747 Out << FS;
3748 if (Ref.isReadOnly())
3749 Out << "readonly ";
3750 else if (Ref.isWriteOnly())
3751 Out << "writeonly ";
3752 Out << "^" << Machine.getGUIDSlot(Ref.getGUID());
3753 }
3754 Out << ")";
3755 }
3756
3757 Out << ")";
3758}
3759
3760void AssemblyWriter::printSummaryInfo(unsigned Slot, const ValueInfo &VI) {
3761 Out << "^" << Slot << " = gv: (";
3762 if (VI.hasName() && !VI.name().empty())
3763 Out << "name: \"" << VI.name() << "\"";
3764 else
3765 Out << "guid: " << VI.getGUID();
3766 if (!VI.getSummaryList().empty()) {
3767 Out << ", summaries: (";
3768 ListSeparator FS;
3769 for (auto &Summary : VI.getSummaryList()) {
3770 Out << FS;
3771 printSummary(*Summary);
3772 }
3773 Out << ")";
3774 }
3775 Out << ")";
3776 if (VI.hasName() && !VI.name().empty())
3777 Out << " ; guid = " << VI.getGUID();
3778 Out << "\n";
3779}
3780
3782 formatted_raw_ostream &Out) {
3783 if (Name.empty()) {
3784 Out << "<empty name> ";
3785 } else {
3786 unsigned char FirstC = static_cast<unsigned char>(Name[0]);
3787 if (isalpha(FirstC) || FirstC == '-' || FirstC == '$' || FirstC == '.' ||
3788 FirstC == '_')
3789 Out << FirstC;
3790 else
3791 Out << '\\' << hexdigit(FirstC >> 4) << hexdigit(FirstC & 0x0F);
3792 for (unsigned i = 1, e = Name.size(); i != e; ++i) {
3793 unsigned char C = Name[i];
3794 if (isalnum(C) || C == '-' || C == '$' || C == '.' || C == '_')
3795 Out << C;
3796 else
3797 Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
3798 }
3799 }
3800}
3801
3802void AssemblyWriter::printNamedMDNode(const NamedMDNode *NMD) {
3803 Out << '!';
3804 printMetadataIdentifier(NMD->getName(), Out);
3805 Out << " = !{";
3806 ListSeparator LS;
3807 for (const MDNode *Op : NMD->operands()) {
3808 Out << LS;
3809 // Write DIExpressions inline.
3810 // FIXME: Ban DIExpressions in NamedMDNodes, they will serve no purpose.
3811 if (auto *Expr = dyn_cast<DIExpression>(Op)) {
3812 writeDIExpression(Out, Expr, AsmWriterContext::getEmpty());
3813 continue;
3814 }
3815
3816 int Slot = Machine.getMetadataSlot(Op);
3817 if (Slot == -1)
3818 Out << "<badref>";
3819 else
3820 Out << '!' << Slot;
3821 }
3822 Out << "}\n";
3823}
3824
3826 formatted_raw_ostream &Out) {
3827 switch (Vis) {
3829 case GlobalValue::HiddenVisibility: Out << "hidden "; break;
3830 case GlobalValue::ProtectedVisibility: Out << "protected "; break;
3831 }
3832}
3833
3834static void printDSOLocation(const GlobalValue &GV,
3835 formatted_raw_ostream &Out) {
3836 if (GV.isDSOLocal() && !GV.isImplicitDSOLocal())
3837 Out << "dso_local ";
3838}
3839
3841 formatted_raw_ostream &Out) {
3842 switch (SCT) {
3844 case GlobalValue::DLLImportStorageClass: Out << "dllimport "; break;
3845 case GlobalValue::DLLExportStorageClass: Out << "dllexport "; break;
3846 }
3847}
3848
3850 formatted_raw_ostream &Out) {
3851 switch (TLM) {
3853 break;
3855 Out << "thread_local ";
3856 break;
3858 Out << "thread_local(localdynamic) ";
3859 break;
3861 Out << "thread_local(initialexec) ";
3862 break;
3864 Out << "thread_local(localexec) ";
3865 break;
3866 }
3867}
3868
3870 switch (UA) {
3872 return "";
3874 return "local_unnamed_addr";
3876 return "unnamed_addr";
3877 }
3878 llvm_unreachable("Unknown UnnamedAddr");
3879}
3880
3882 const GlobalObject &GO) {
3883 const Comdat *C = GO.getComdat();
3884 if (!C)
3885 return;
3886
3887 if (isa<GlobalVariable>(GO))
3888 Out << ',';
3889 Out << " comdat";
3890
3891 if (GO.getName() == C->getName())
3892 return;
3893
3894 Out << '(';
3895 printLLVMName(Out, C->getName(), ComdatPrefix);
3896 Out << ')';
3897}
3898
3899void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
3900 if (GV->isMaterializable())
3901 Out << "; Materializable\n";
3902
3903 AsmWriterContext WriterCtx(&TypePrinter, &Machine, GV->getParent());
3904 writeAsOperandInternal(Out, GV, WriterCtx);
3905 Out << " = ";
3906
3907 if (!GV->hasInitializer() && GV->hasExternalLinkage())
3908 Out << "external ";
3909
3910 Out << getLinkageNameWithSpace(GV->getLinkage());
3911 printDSOLocation(*GV, Out);
3912 printVisibility(GV->getVisibility(), Out);
3915 StringRef UA = getUnnamedAddrEncoding(GV->getUnnamedAddr());
3916 if (!UA.empty())
3917 Out << UA << ' ';
3918
3920 /*Prefix=*/"", /*Suffix=*/" ");
3921 if (GV->isExternallyInitialized()) Out << "externally_initialized ";
3922 Out << (GV->isConstant() ? "constant " : "global ");
3923 TypePrinter.print(GV->getValueType(), Out);
3924
3925 if (GV->hasInitializer()) {
3926 Out << ' ';
3927 writeOperand(GV->getInitializer(), false);
3928 }
3929
3930 if (GV->hasSection()) {
3931 Out << ", section \"";
3932 printEscapedString(GV->getSection(), Out);
3933 Out << '"';
3934 }
3935 if (GV->hasPartition()) {
3936 Out << ", partition \"";
3937 printEscapedString(GV->getPartition(), Out);
3938 Out << '"';
3939 }
3940 if (auto CM = GV->getCodeModel()) {
3941 Out << ", code_model \"";
3942 switch (*CM) {
3943 case CodeModel::Tiny:
3944 Out << "tiny";
3945 break;
3946 case CodeModel::Small:
3947 Out << "small";
3948 break;
3949 case CodeModel::Kernel:
3950 Out << "kernel";
3951 break;
3952 case CodeModel::Medium:
3953 Out << "medium";
3954 break;
3955 case CodeModel::Large:
3956 Out << "large";
3957 break;
3958 }
3959 Out << '"';
3960 }
3961
3962 using SanitizerMetadata = llvm::GlobalValue::SanitizerMetadata;
3963 if (GV->hasSanitizerMetadata()) {
3965 if (MD.NoAddress)
3966 Out << ", no_sanitize_address";
3967 if (MD.NoHWAddress)
3968 Out << ", no_sanitize_hwaddress";
3969 if (MD.Memtag)
3970 Out << ", sanitize_memtag";
3971 if (MD.IsDynInit)
3972 Out << ", sanitize_address_dyninit";
3973 }
3974
3975 maybePrintComdat(Out, *GV);
3976 if (MaybeAlign A = GV->getAlign())
3977 Out << ", align " << A->value();
3978
3980 GV->getAllMetadata(MDs);
3981 printMetadataAttachments(MDs, ", ");
3982
3983 auto Attrs = GV->getAttributes();
3984 if (Attrs.hasAttributes())
3985 Out << " #" << Machine.getAttributeGroupSlot(Attrs);
3986
3987 printInfoComment(*GV, GV->isMaterializable());
3988}
3989
3990void AssemblyWriter::printAlias(const GlobalAlias *GA) {
3991 if (GA->isMaterializable())
3992 Out << "; Materializable\n";
3993
3994 AsmWriterContext WriterCtx(&TypePrinter, &Machine, GA->getParent());
3995 writeAsOperandInternal(Out, GA, WriterCtx);
3996 Out << " = ";
3997
3998 Out << getLinkageNameWithSpace(GA->getLinkage());
3999 printDSOLocation(*GA, Out);
4000 printVisibility(GA->getVisibility(), Out);
4003 StringRef UA = getUnnamedAddrEncoding(GA->getUnnamedAddr());
4004 if (!UA.empty())
4005 Out << UA << ' ';
4006
4007 Out << "alias ";
4008
4009 TypePrinter.print(GA->getValueType(), Out);
4010 Out << ", ";
4011
4012 if (const Constant *Aliasee = GA->getAliasee()) {
4013 writeOperand(Aliasee, !isa<ConstantExpr>(Aliasee));
4014 } else {
4015 TypePrinter.print(GA->getType(), Out);
4016 Out << " <<NULL ALIASEE>>";
4017 }
4018
4019 if (GA->hasPartition()) {
4020 Out << ", partition \"";
4021 printEscapedString(GA->getPartition(), Out);
4022 Out << '"';
4023 }
4024
4025 printInfoComment(*GA, GA->isMaterializable());
4026 Out << '\n';
4027}
4028
4029void AssemblyWriter::printIFunc(const GlobalIFunc *GI) {
4030 if (GI->isMaterializable())
4031 Out << "; Materializable\n";
4032
4033 AsmWriterContext WriterCtx(&TypePrinter, &Machine, GI->getParent());
4034 writeAsOperandInternal(Out, GI, WriterCtx);
4035 Out << " = ";
4036
4037 Out << getLinkageNameWithSpace(GI->getLinkage());
4038 printDSOLocation(*GI, Out);
4039 printVisibility(GI->getVisibility(), Out);
4040
4041 Out << "ifunc ";
4042
4043 TypePrinter.print(GI->getValueType(), Out);
4044 Out << ", ";
4045
4046 if (const Constant *Resolver = GI->getResolver()) {
4047 writeOperand(Resolver, !isa<ConstantExpr>(Resolver));
4048 } else {
4049 TypePrinter.print(GI->getType(), Out);
4050 Out << " <<NULL RESOLVER>>";
4051 }
4052
4053 if (GI->hasPartition()) {
4054 Out << ", partition \"";
4055 printEscapedString(GI->getPartition(), Out);
4056 Out << '"';
4057 }
4059 GI->getAllMetadata(MDs);
4060 if (!MDs.empty()) {
4061 printMetadataAttachments(MDs, ", ");
4062 }
4063
4064 printInfoComment(*GI, GI->isMaterializable());
4065 Out << '\n';
4066}
4067
4068void AssemblyWriter::printComdat(const Comdat *C) {
4069 C->print(Out);
4070}
4071
4072void AssemblyWriter::printTypeIdentities() {
4073 if (TypePrinter.empty())
4074 return;
4075
4076 Out << '\n';
4077
4078 // Emit all numbered types.
4079 auto &NumberedTypes = TypePrinter.getNumberedTypes();
4080 for (unsigned I = 0, E = NumberedTypes.size(); I != E; ++I) {
4081 Out << '%' << I << " = type ";
4082
4083 // Make sure we print out at least one level of the type structure, so
4084 // that we do not get %2 = type %2
4085 TypePrinter.printStructBody(NumberedTypes[I], Out);
4086 Out << '\n';
4087 }
4088
4089 auto &NamedTypes = TypePrinter.getNamedTypes();
4090 for (StructType *NamedType : NamedTypes) {
4091 printLLVMName(Out, NamedType->getName(), LocalPrefix);
4092 Out << " = type ";
4093
4094 // Make sure we print out at least one level of the type structure, so
4095 // that we do not get %FILE = type %FILE
4096 TypePrinter.printStructBody(NamedType, Out);
4097 Out << '\n';
4098 }
4099}
4100
4101/// printFunction - Print all aspects of a function.
4102void AssemblyWriter::printFunction(const Function *F) {
4103 if (F->isMaterializable())
4104 Out << "; Materializable\n";
4105 else if (AnnotationWriter)
4106 AnnotationWriter->emitFunctionAnnot(F, Out);
4107
4108 const AttributeList &Attrs = F->getAttributes();
4109 if (Attrs.hasFnAttrs()) {
4110 AttributeSet AS = Attrs.getFnAttrs();
4111 std::string AttrStr;
4112
4113 for (const Attribute &Attr : AS) {
4114 if (!Attr.isStringAttribute()) {
4115 if (!AttrStr.empty()) AttrStr += ' ';
4116 AttrStr += Attr.getAsString();
4117 }
4118 }
4119
4120 if (!AttrStr.empty())
4121 Out << "; Function Attrs: " << AttrStr << '\n';
4122 }
4123
4124 if (F->isIntrinsic() && F->getIntrinsicID() == Intrinsic::not_intrinsic)
4125 Out << "; Unknown intrinsic\n";
4126
4127 Machine.incorporateFunction(F);
4128
4129 if (F->isDeclaration()) {
4130 Out << "declare";
4132 F->getAllMetadata(MDs);
4133 printMetadataAttachments(MDs, " ");
4134 Out << ' ';
4135 } else
4136 Out << "define ";
4137
4138 Out << getLinkageNameWithSpace(F->getLinkage());
4139 printDSOLocation(*F, Out);
4140 printVisibility(F->getVisibility(), Out);
4141 printDLLStorageClass(F->getDLLStorageClass(), Out);
4142
4143 // Print the calling convention.
4144 if (F->getCallingConv() != CallingConv::C) {
4145 printCallingConv(F->getCallingConv(), Out);
4146 Out << " ";
4147 }
4148
4149 FunctionType *FT = F->getFunctionType();
4150 if (Attrs.hasRetAttrs())
4151 Out << Attrs.getAsString(AttributeList::ReturnIndex) << ' ';
4152 TypePrinter.print(F->getReturnType(), Out);
4153 AsmWriterContext WriterCtx(&TypePrinter, &Machine, F->getParent());
4154 Out << ' ';
4155 writeAsOperandInternal(Out, F, WriterCtx);
4156 Out << '(';
4157
4158 // Loop over the arguments, printing them...
4159 if (F->isDeclaration() && !IsForDebug) {
4160 // We're only interested in the type here - don't print argument names.
4161 ListSeparator LS;
4162 for (unsigned I = 0, E = FT->getNumParams(); I != E; ++I) {
4163 Out << LS;
4164 // Output type.
4165 TypePrinter.print(FT->getParamType(I), Out);
4166
4167 AttributeSet ArgAttrs = Attrs.getParamAttrs(I);
4168 if (ArgAttrs.hasAttributes()) {
4169 Out << ' ';
4170 writeAttributeSet(ArgAttrs);
4171 }
4172 }
4173 } else {
4174 // The arguments are meaningful here, print them in detail.
4175 ListSeparator LS;
4176 for (const Argument &Arg : F->args()) {
4177 Out << LS;
4178 printArgument(&Arg, Attrs.getParamAttrs(Arg.getArgNo()));
4179 }
4180 }
4181
4182 // Finish printing arguments...
4183 if (FT->isVarArg()) {
4184 if (FT->getNumParams()) Out << ", ";
4185 Out << "..."; // Output varargs portion of signature!
4186 }
4187 Out << ')';
4188 StringRef UA = getUnnamedAddrEncoding(F->getUnnamedAddr());
4189 if (!UA.empty())
4190 Out << ' ' << UA;
4191 // We print the function address space if it is non-zero or if we are writing
4192 // a module with a non-zero program address space or if there is no valid
4193 // Module* so that the file can be parsed without the datalayout string.
4194 const Module *Mod = F->getParent();
4195 bool ForcePrintAddressSpace =
4196 !Mod || Mod->getDataLayout().getProgramAddressSpace() != 0;
4197 printAddressSpace(Mod, F->getAddressSpace(), Out, /*Prefix=*/" ",
4198 /*Suffix=*/"", ForcePrintAddressSpace);
4199 if (Attrs.hasFnAttrs())
4200 Out << " #" << Machine.getAttributeGroupSlot(Attrs.getFnAttrs());
4201 if (F->hasSection()) {
4202 Out << " section \"";
4203 printEscapedString(F->getSection(), Out);
4204 Out << '"';
4205 }
4206 if (F->hasPartition()) {
4207 Out << " partition \"";
4208 printEscapedString(F->getPartition(), Out);
4209 Out << '"';
4210 }
4211 maybePrintComdat(Out, *F);
4212 if (MaybeAlign A = F->getAlign())
4213 Out << " align " << A->value();
4214 if (F->hasGC())
4215 Out << " gc \"" << F->getGC() << '"';
4216 if (F->hasPrefixData()) {
4217 Out << " prefix ";
4218 writeOperand(F->getPrefixData(), true);
4219 }
4220 if (F->hasPrologueData()) {
4221 Out << " prologue ";
4222 writeOperand(F->getPrologueData(), true);
4223 }
4224 if (F->hasPersonalityFn()) {
4225 Out << " personality ";
4226 writeOperand(F->getPersonalityFn(), /*PrintType=*/true);
4227 }
4228
4229 if (PrintProfData) {
4230 if (auto *MDProf = F->getMetadata(LLVMContext::MD_prof)) {
4231 Out << " ";
4232 MDProf->print(Out, TheModule, /*IsForDebug=*/true);
4233 }
4234 }
4235
4236 if (F->isDeclaration()) {
4237 Out << '\n';
4238 } else {
4240 F->getAllMetadata(MDs);
4241 printMetadataAttachments(MDs, " ");
4242
4243 Out << " {";
4244 // Output all of the function's basic blocks.
4245 for (const BasicBlock &BB : *F)
4246 printBasicBlock(&BB);
4247
4248 // Output the function's use-lists.
4249 printUseLists(F);
4250
4251 Out << "}\n";
4252 }
4253
4254 Machine.purgeFunction();
4255}
4256
4257/// printArgument - This member is called for every argument that is passed into
4258/// the function. Simply print it out
4259void AssemblyWriter::printArgument(const Argument *Arg, AttributeSet Attrs) {
4260 // Output type...
4261 TypePrinter.print(Arg->getType(), Out);
4262
4263 // Output parameter attributes list
4264 if (Attrs.hasAttributes()) {
4265 Out << ' ';
4266 writeAttributeSet(Attrs);
4267 }
4268
4269 // Output name, if available...
4270 if (Arg->hasName()) {
4271 Out << ' ';
4272 printLLVMName(Out, Arg);
4273 } else {
4274 int Slot = Machine.getLocalSlot(Arg);
4275 assert(Slot != -1 && "expect argument in function here");
4276 Out << " %" << Slot;
4277 }
4278}
4279
4280/// printBasicBlock - This member is called for each basic block in a method.
4281void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
4282 bool IsEntryBlock = BB->getParent() && BB->isEntryBlock();
4283 if (BB->hasName()) { // Print out the label if it exists...
4284 Out << "\n";
4285 printLLVMName(Out, BB->getName(), LabelPrefix);
4286 Out << ':';
4287 } else if (!IsEntryBlock) {
4288 Out << "\n";
4289 int Slot = Machine.getLocalSlot(BB);
4290 if (Slot != -1)
4291 Out << Slot << ":";
4292 else
4293 Out << "<badref>:";
4294 }
4295
4296 if (!IsEntryBlock) {
4297 // Output predecessors for the block.
4298 Out.PadToColumn(50);
4299 Out << ";";
4300 if (pred_empty(BB)) {
4301 Out << " No predecessors!";
4302 } else {
4303 Out << " preds = ";
4304 ListSeparator LS;
4305 for (const BasicBlock *Pred : predecessors(BB)) {
4306 Out << LS;
4307 writeOperand(Pred, false);
4308 }
4309 }
4310 }
4311
4312 Out << "\n";
4313
4314 if (AnnotationWriter) AnnotationWriter->emitBasicBlockStartAnnot(BB, Out);
4315
4316 // Output all of the instructions in the basic block...
4317 for (const Instruction &I : *BB) {
4318 for (const DbgRecord &DR : I.getDbgRecordRange())
4319 printDbgRecordLine(DR);
4320 printInstructionLine(I);
4321 }
4322
4323 if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);
4324}
4325
4326/// printInstructionLine - Print an instruction and a newline character.
4327void AssemblyWriter::printInstructionLine(const Instruction &I) {
4328 printInstruction(I);
4329 Out << '\n';
4330}
4331
4332/// printGCRelocateComment - print comment after call to the gc.relocate
4333/// intrinsic indicating base and derived pointer names.
4334void AssemblyWriter::printGCRelocateComment(const GCRelocateInst &Relocate) {
4335 Out << " ; (";
4336 writeOperand(Relocate.getBasePtr(), false);
4337 Out << ", ";
4338 writeOperand(Relocate.getDerivedPtr(), false);
4339 Out << ")";
4340}
4341
4342/// printInfoComment - Print a little comment after the instruction indicating
4343/// which slot it occupies.
4344void AssemblyWriter::printInfoComment(const Value &V, bool isMaterializable) {
4345 if (const auto *Relocate = dyn_cast<GCRelocateInst>(&V))
4346 printGCRelocateComment(*Relocate);
4347
4348 if (AnnotationWriter && !isMaterializable)
4349 AnnotationWriter->printInfoComment(V, Out);
4350
4351 if (PrintInstDebugLocs) {
4352 if (auto *I = dyn_cast<Instruction>(&V)) {
4353 if (I->getDebugLoc()) {
4354 Out << " ; ";
4355 I->getDebugLoc().print(Out);
4356 }
4357 }
4358 }
4359 if (PrintProfData) {
4360 if (auto *I = dyn_cast<Instruction>(&V)) {
4361 if (auto *MD = I->getMetadata(LLVMContext::MD_prof)) {
4362 Out << " ; ";
4363 MD->print(Out, TheModule, /*IsForDebug=*/true);
4364 }
4365 }
4366 }
4367
4368 if (PrintInstAddrs)
4369 Out << " ; " << &V;
4370}
4371
4372static void maybePrintCallAddrSpace(const Value *Operand, const Instruction *I,
4373 raw_ostream &Out) {
4374 if (Operand == nullptr) {
4375 Out << " <cannot get addrspace!>";
4376 return;
4377 }
4378
4379 // We print the address space of the call if it is non-zero.
4380 // We also print it if it is zero but not equal to the program address space
4381 // or if we can't find a valid Module* to make it possible to parse
4382 // the resulting file even without a datalayout string.
4383 unsigned CallAddrSpace = Operand->getType()->getPointerAddressSpace();
4384 const Module *Mod = getModuleFromVal(I);
4385 bool ForcePrintAddrSpace =
4386 !Mod || Mod->getDataLayout().getProgramAddressSpace() != 0;
4387 printAddressSpace(Mod, CallAddrSpace, Out, /*Prefix=*/" ", /*Suffix=*/"",
4388 ForcePrintAddrSpace);
4389}
4390
4391// This member is called for each Instruction in a function..
4392void AssemblyWriter::printInstruction(const Instruction &I) {
4393 if (AnnotationWriter) AnnotationWriter->emitInstructionAnnot(&I, Out);
4394
4395 // Print out indentation for an instruction.
4396 Out << " ";
4397
4398 // Print out name if it exists...
4399 if (I.hasName()) {
4400 printLLVMName(Out, &I);
4401 Out << " = ";
4402 } else if (!I.getType()->isVoidTy()) {
4403 // Print out the def slot taken.
4404 int SlotNum = Machine.getLocalSlot(&I);
4405 if (SlotNum == -1)
4406 Out << "<badref> = ";
4407 else
4408 Out << '%' << SlotNum << " = ";
4409 }
4410
4411 if (const auto *CI = dyn_cast<CallInst>(&I)) {
4412 if (CI->isMustTailCall())
4413 Out << "musttail ";
4414 else if (CI->isTailCall())
4415 Out << "tail ";
4416 else if (CI->isNoTailCall())
4417 Out << "notail ";
4418 }
4419
4420 // Print out the opcode...
4421 Out << I.getOpcodeName();
4422
4423 // If this is an atomic load or store, print out the atomic marker.
4424 if ((isa<LoadInst>(I) && cast<LoadInst>(I).isAtomic()) ||
4425 (isa<StoreInst>(I) && cast<StoreInst>(I).isAtomic()))
4426 Out << " atomic";
4427
4429 Out << " weak";
4430
4431 // If this is a volatile operation, print out the volatile marker.
4432 if ((isa<LoadInst>(I) && cast<LoadInst>(I).isVolatile()) ||
4433 (isa<StoreInst>(I) && cast<StoreInst>(I).isVolatile()) ||
4434 (isa<AtomicCmpXchgInst>(I) && cast<AtomicCmpXchgInst>(I).isVolatile()) ||
4435 (isa<AtomicRMWInst>(I) && cast<AtomicRMWInst>(I).isVolatile()))
4436 Out << " volatile";
4437
4438 // Print out optimization information.
4439 writeOptimizationInfo(Out, &I);
4440
4441 // Print out the compare instruction predicates
4442 if (const auto *CI = dyn_cast<CmpInst>(&I))
4443 Out << ' ' << CI->getPredicate();
4444
4445 // Print out the atomicrmw operation
4446 if (const auto *RMWI = dyn_cast<AtomicRMWInst>(&I))
4447 Out << ' ' << AtomicRMWInst::getOperationName(RMWI->getOperation());
4448
4449 // Print out the type of the operands...
4450 const Value *Operand = I.getNumOperands() ? I.getOperand(0) : nullptr;
4451
4452 // Special case conditional branches to swizzle the condition out to the front
4453 if (isa<BranchInst>(I) && cast<BranchInst>(I).isConditional()) {
4454 const BranchInst &BI(cast<BranchInst>(I));
4455 Out << ' ';
4456 writeOperand(BI.getCondition(), true);
4457 Out << ", ";
4458 writeOperand(BI.getSuccessor(0), true);
4459 Out << ", ";
4460 writeOperand(BI.getSuccessor(1), true);
4461
4462 } else if (isa<SwitchInst>(I)) {
4463 const SwitchInst& SI(cast<SwitchInst>(I));
4464 // Special case switch instruction to get formatting nice and correct.
4465 Out << ' ';
4466 writeOperand(SI.getCondition(), true);
4467 Out << ", ";
4468 writeOperand(SI.getDefaultDest(), true);
4469 Out << " [";
4470 for (auto Case : SI.cases()) {
4471 Out << "\n ";
4472 writeOperand(Case.getCaseValue(), true);
4473 Out << ", ";
4474 writeOperand(Case.getCaseSuccessor(), true);
4475 }
4476 Out << "\n ]";
4477 } else if (isa<IndirectBrInst>(I)) {
4478 // Special case indirectbr instruction to get formatting nice and correct.
4479 Out << ' ';
4480 writeOperand(Operand, true);
4481 Out << ", [";
4482
4483 ListSeparator LS;
4484 for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) {
4485 Out << LS;
4486 writeOperand(I.getOperand(i), true);
4487 }
4488 Out << ']';
4489 } else if (const auto *PN = dyn_cast<PHINode>(&I)) {
4490 Out << ' ';
4491 TypePrinter.print(I.getType(), Out);
4492 Out << ' ';
4493
4494 ListSeparator LS;
4495 for (const auto &[V, Block] :
4496 zip_equal(PN->incoming_values(), PN->blocks())) {
4497 Out << LS << "[ ";
4498 writeOperand(V, false);
4499 Out << ", ";
4500 writeOperand(Block, false);
4501 Out << " ]";
4502 }
4503 } else if (const auto *EVI = dyn_cast<ExtractValueInst>(&I)) {
4504 Out << ' ';
4505 writeOperand(I.getOperand(0), true);
4506 Out << ", ";
4507 Out << llvm::interleaved(EVI->indices());
4508 } else if (const auto *IVI = dyn_cast<InsertValueInst>(&I)) {
4509 Out << ' ';
4510 writeOperand(I.getOperand(0), true); Out << ", ";
4511 writeOperand(I.getOperand(1), true);
4512 Out << ", ";
4513 Out << llvm::interleaved(IVI->indices());
4514 } else if (const auto *LPI = dyn_cast<LandingPadInst>(&I)) {
4515 Out << ' ';
4516 TypePrinter.print(I.getType(), Out);
4517 if (LPI->isCleanup() || LPI->getNumClauses() != 0)
4518 Out << '\n';
4519
4520 if (LPI->isCleanup())
4521 Out << " cleanup";
4522
4523 for (unsigned i = 0, e = LPI->getNumClauses(); i != e; ++i) {
4524 if (i != 0 || LPI->isCleanup()) Out << "\n";
4525 if (LPI->isCatch(i))
4526 Out << " catch ";
4527 else
4528 Out << " filter ";
4529
4530 writeOperand(LPI->getClause(i), true);
4531 }
4532 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(&I)) {
4533 Out << " within ";
4534 writeOperand(CatchSwitch->getParentPad(), /*PrintType=*/false);
4535 Out << " [";
4536 ListSeparator LS;
4537 for (const BasicBlock *PadBB : CatchSwitch->handlers()) {
4538 Out << LS;
4539 writeOperand(PadBB, /*PrintType=*/true);
4540 }
4541 Out << "] unwind ";
4542 if (const BasicBlock *UnwindDest = CatchSwitch->getUnwindDest())
4543 writeOperand(UnwindDest, /*PrintType=*/true);
4544 else
4545 Out << "to caller";
4546 } else if (const auto *FPI = dyn_cast<FuncletPadInst>(&I)) {
4547 Out << " within ";
4548 writeOperand(FPI->getParentPad(), /*PrintType=*/false);
4549 Out << " [";
4550 ListSeparator LS;
4551 for (const Value *Op : FPI->arg_operands()) {
4552 Out << LS;
4553 writeOperand(Op, /*PrintType=*/true);
4554 }
4555 Out << ']';
4556 } else if (isa<ReturnInst>(I) && !Operand) {
4557 Out << " void";
4558 } else if (const auto *CRI = dyn_cast<CatchReturnInst>(&I)) {
4559 Out << " from ";
4560 writeOperand(CRI->getOperand(0), /*PrintType=*/false);
4561
4562 Out << " to ";
4563 writeOperand(CRI->getOperand(1), /*PrintType=*/true);
4564 } else if (const auto *CRI = dyn_cast<CleanupReturnInst>(&I)) {
4565 Out << " from ";
4566 writeOperand(CRI->getOperand(0), /*PrintType=*/false);
4567
4568 Out << " unwind ";
4569 if (CRI->hasUnwindDest())
4570 writeOperand(CRI->getOperand(1), /*PrintType=*/true);
4571 else
4572 Out << "to caller";
4573 } else if (const auto *CI = dyn_cast<CallInst>(&I)) {
4574 // Print the calling convention being used.
4575 if (CI->getCallingConv() != CallingConv::C) {
4576 Out << " ";
4577 printCallingConv(CI->getCallingConv(), Out);
4578 }
4579
4580 Operand = CI->getCalledOperand();
4581 FunctionType *FTy = CI->getFunctionType();
4582 Type *RetTy = FTy->getReturnType();
4583 const AttributeList &PAL = CI->getAttributes();
4584
4585 if (PAL.hasRetAttrs())
4586 Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);
4587
4588 // Only print addrspace(N) if necessary:
4589 maybePrintCallAddrSpace(Operand, &I, Out);
4590
4591 // If possible, print out the short form of the call instruction. We can
4592 // only do this if the first argument is a pointer to a nonvararg function,
4593 // and if the return type is not a pointer to a function.
4594 Out << ' ';
4595 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4596 Out << ' ';
4597 writeOperand(Operand, false);
4598 Out << '(';
4599 bool HasPrettyPrintedArgs =
4600 isa<IntrinsicInst>(CI) &&
4601 Intrinsic::hasPrettyPrintedArgs(CI->getIntrinsicID());
4602
4603 ListSeparator LS;
4604 Function *CalledFunc = CI->getCalledFunction();
4605 auto PrintArgComment = [&](unsigned ArgNo) {
4606 const auto *ConstArg = dyn_cast<Constant>(CI->getArgOperand(ArgNo));
4607 if (!ConstArg)
4608 return;
4609 std::string ArgComment;
4610 raw_string_ostream ArgCommentStream(ArgComment);
4611 Intrinsic::ID IID = CalledFunc->getIntrinsicID();
4612 Intrinsic::printImmArg(IID, ArgNo, ArgCommentStream, ConstArg);
4613 if (ArgComment.empty())
4614 return;
4615 Out << "/* " << ArgComment << " */ ";
4616 };
4617 if (HasPrettyPrintedArgs) {
4618 for (unsigned ArgNo = 0, NumArgs = CI->arg_size(); ArgNo < NumArgs;
4619 ++ArgNo) {
4620 Out << LS;
4621 PrintArgComment(ArgNo);
4622 writeParamOperand(CI->getArgOperand(ArgNo), PAL.getParamAttrs(ArgNo));
4623 }
4624 } else {
4625 for (unsigned ArgNo = 0, NumArgs = CI->arg_size(); ArgNo < NumArgs;
4626 ++ArgNo) {
4627 Out << LS;
4628 writeParamOperand(CI->getArgOperand(ArgNo), PAL.getParamAttrs(ArgNo));
4629 }
4630 }
4631 // Emit an ellipsis if this is a musttail call in a vararg function. This
4632 // is only to aid readability, musttail calls forward varargs by default.
4633 if (CI->isMustTailCall() && CI->getParent() &&
4634 CI->getParent()->getParent() &&
4635 CI->getParent()->getParent()->isVarArg()) {
4636 if (CI->arg_size() > 0)
4637 Out << ", ";
4638 Out << "...";
4639 }
4640
4641 Out << ')';
4642 if (PAL.hasFnAttrs())
4643 Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4644
4645 writeOperandBundles(CI);
4646 } else if (const auto *II = dyn_cast<InvokeInst>(&I)) {
4647 Operand = II->getCalledOperand();
4648 FunctionType *FTy = II->getFunctionType();
4649 Type *RetTy = FTy->getReturnType();
4650 const AttributeList &PAL = II->getAttributes();
4651
4652 // Print the calling convention being used.
4653 if (II->getCallingConv() != CallingConv::C) {
4654 Out << " ";
4655 printCallingConv(II->getCallingConv(), Out);
4656 }
4657
4658 if (PAL.hasRetAttrs())
4659 Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);
4660
4661 // Only print addrspace(N) if necessary:
4662 maybePrintCallAddrSpace(Operand, &I, Out);
4663
4664 // If possible, print out the short form of the invoke instruction. We can
4665 // only do this if the first argument is a pointer to a nonvararg function,
4666 // and if the return type is not a pointer to a function.
4667 //
4668 Out << ' ';
4669 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4670 Out << ' ';
4671 writeOperand(Operand, false);
4672 Out << '(';
4673 ListSeparator LS;
4674 for (unsigned op = 0, Eop = II->arg_size(); op < Eop; ++op) {
4675 Out << LS;
4676 writeParamOperand(II->getArgOperand(op), PAL.getParamAttrs(op));
4677 }
4678
4679 Out << ')';
4680 if (PAL.hasFnAttrs())
4681 Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4682
4683 writeOperandBundles(II);
4684
4685 Out << "\n to ";
4686 writeOperand(II->getNormalDest(), true);
4687 Out << " unwind ";
4688 writeOperand(II->getUnwindDest(), true);
4689 } else if (const auto *CBI = dyn_cast<CallBrInst>(&I)) {
4690 Operand = CBI->getCalledOperand();
4691 FunctionType *FTy = CBI->getFunctionType();
4692 Type *RetTy = FTy->getReturnType();
4693 const AttributeList &PAL = CBI->getAttributes();
4694
4695 // Print the calling convention being used.
4696 if (CBI->getCallingConv() != CallingConv::C) {
4697 Out << " ";
4698 printCallingConv(CBI->getCallingConv(), Out);
4699 }
4700
4701 if (PAL.hasRetAttrs())
4702 Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);
4703
4704 // If possible, print out the short form of the callbr instruction. We can
4705 // only do this if the first argument is a pointer to a nonvararg function,
4706 // and if the return type is not a pointer to a function.
4707 //
4708 Out << ' ';
4709 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4710 Out << ' ';
4711 writeOperand(Operand, false);
4712 Out << '(';
4713 ListSeparator ArgLS;
4714 for (unsigned op = 0, Eop = CBI->arg_size(); op < Eop; ++op) {
4715 Out << ArgLS;
4716 writeParamOperand(CBI->getArgOperand(op), PAL.getParamAttrs(op));
4717 }
4718
4719 Out << ')';
4720 if (PAL.hasFnAttrs())
4721 Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4722
4723 writeOperandBundles(CBI);
4724
4725 Out << "\n to ";
4726 writeOperand(CBI->getDefaultDest(), true);
4727 Out << " [";
4728 ListSeparator DestLS;
4729 for (const BasicBlock *Dest : CBI->getIndirectDests()) {
4730 Out << DestLS;
4731 writeOperand(Dest, true);
4732 }
4733 Out << ']';
4734 } else if (const auto *AI = dyn_cast<AllocaInst>(&I)) {
4735 Out << ' ';
4736 if (AI->isUsedWithInAlloca())
4737 Out << "inalloca ";
4738 if (AI->isSwiftError())
4739 Out << "swifterror ";
4740 TypePrinter.print(AI->getAllocatedType(), Out);
4741
4742 // Explicitly write the array size if the code is broken, if it's an array
4743 // allocation, or if the type is not canonical for scalar allocations. The
4744 // latter case prevents the type from mutating when round-tripping through
4745 // assembly.
4746 if (!AI->getArraySize() || AI->isArrayAllocation() ||
4747 !AI->getArraySize()->getType()->isIntegerTy(32)) {
4748 Out << ", ";
4749 writeOperand(AI->getArraySize(), true);
4750 }
4751 if (MaybeAlign A = AI->getAlign()) {
4752 Out << ", align " << A->value();
4753 }
4754
4755 printAddressSpace(AI->getModule(), AI->getAddressSpace(), Out,
4756 /*Prefix=*/", ");
4757 } else if (isa<CastInst>(I)) {
4758 if (Operand) {
4759 Out << ' ';
4760 writeOperand(Operand, true); // Work with broken code
4761 }
4762 Out << " to ";
4763 TypePrinter.print(I.getType(), Out);
4764 } else if (isa<VAArgInst>(I)) {
4765 if (Operand) {
4766 Out << ' ';
4767 writeOperand(Operand, true); // Work with broken code
4768 }
4769 Out << ", ";
4770 TypePrinter.print(I.getType(), Out);
4771 } else if (Operand) { // Print the normal way.
4772 if (const auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
4773 Out << ' ';
4774 TypePrinter.print(GEP->getSourceElementType(), Out);
4775 Out << ',';
4776 } else if (const auto *LI = dyn_cast<LoadInst>(&I)) {
4777 Out << ' ';
4778 TypePrinter.print(LI->getType(), Out);
4779 Out << ',';
4780 }
4781
4782 // PrintAllTypes - Instructions who have operands of all the same type
4783 // omit the type from all but the first operand. If the instruction has
4784 // different type operands (for example br), then they are all printed.
4785 bool PrintAllTypes = false;
4786 Type *TheType = Operand->getType();
4787
4788 // Select, Store, ShuffleVector, CmpXchg and AtomicRMW always print all
4789 // types.
4793 PrintAllTypes = true;
4794 } else {
4795 for (unsigned i = 1, E = I.getNumOperands(); i != E; ++i) {
4796 Operand = I.getOperand(i);
4797 // note that Operand shouldn't be null, but the test helps make dump()
4798 // more tolerant of malformed IR
4799 if (Operand && Operand->getType() != TheType) {
4800 PrintAllTypes = true; // We have differing types! Print them all!
4801 break;
4802 }
4803 }
4804 }
4805
4806 if (!PrintAllTypes) {
4807 Out << ' ';
4808 TypePrinter.print(TheType, Out);
4809 }
4810
4811 Out << ' ';
4812 ListSeparator LS;
4813 for (const Value *Op : I.operands()) {
4814 Out << LS;
4815 writeOperand(Op, PrintAllTypes);
4816 }
4817 }
4818
4819 // Print atomic ordering/alignment for memory operations
4820 if (const auto *LI = dyn_cast<LoadInst>(&I)) {
4821 if (LI->isAtomic())
4822 writeAtomic(LI->getContext(), LI->getOrdering(), LI->getSyncScopeID());
4823 if (MaybeAlign A = LI->getAlign())
4824 Out << ", align " << A->value();
4825 } else if (const auto *SI = dyn_cast<StoreInst>(&I)) {
4826 if (SI->isAtomic())
4827 writeAtomic(SI->getContext(), SI->getOrdering(), SI->getSyncScopeID());
4828 if (MaybeAlign A = SI->getAlign())
4829 Out << ", align " << A->value();
4830 } else if (const auto *CXI = dyn_cast<AtomicCmpXchgInst>(&I)) {
4831 writeAtomicCmpXchg(CXI->getContext(), CXI->getSuccessOrdering(),
4832 CXI->getFailureOrdering(), CXI->getSyncScopeID());
4833 Out << ", align " << CXI->getAlign().value();
4834 } else if (const auto *RMWI = dyn_cast<AtomicRMWInst>(&I)) {
4835 writeAtomic(RMWI->getContext(), RMWI->getOrdering(),
4836 RMWI->getSyncScopeID());
4837 Out << ", align " << RMWI->getAlign().value();
4838 } else if (const auto *FI = dyn_cast<FenceInst>(&I)) {
4839 writeAtomic(FI->getContext(), FI->getOrdering(), FI->getSyncScopeID());
4840 } else if (const auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) {
4841 printShuffleMask(Out, SVI->getType(), SVI->getShuffleMask());
4842 }
4843
4844 // Print Metadata info.
4846 I.getAllMetadata(InstMD);
4847 printMetadataAttachments(InstMD, ", ");
4848
4849 // Print a nice comment.
4850 printInfoComment(I);
4851}
4852
4853void AssemblyWriter::printDbgMarker(const DbgMarker &Marker) {
4854 // There's no formal representation of a DbgMarker -- print purely as a
4855 // debugging aid.
4856 for (const DbgRecord &DPR : Marker.StoredDbgRecords) {
4857 printDbgRecord(DPR);
4858 Out << "\n";
4859 }
4860
4861 Out << " DbgMarker -> { ";
4862 printInstruction(*Marker.MarkedInstr);
4863 Out << " }";
4864}
4865
4866void AssemblyWriter::printDbgRecord(const DbgRecord &DR) {
4867 if (auto *DVR = dyn_cast<DbgVariableRecord>(&DR))
4868 printDbgVariableRecord(*DVR);
4869 else if (auto *DLR = dyn_cast<DbgLabelRecord>(&DR))
4870 printDbgLabelRecord(*DLR);
4871 else
4872 llvm_unreachable("Unexpected DbgRecord kind");
4873}
4874
4875void AssemblyWriter::printDbgVariableRecord(const DbgVariableRecord &DVR) {
4876 auto WriterCtx = getContext();
4877 Out << "#dbg_";
4878 switch (DVR.getType()) {
4879 case DbgVariableRecord::LocationType::Value:
4880 Out << "value";
4881 break;
4882 case DbgVariableRecord::LocationType::Declare:
4883 Out << "declare";
4884 break;
4885 case DbgVariableRecord::LocationType::DeclareValue:
4886 Out << "declare_value";
4887 break;
4888 case DbgVariableRecord::LocationType::Assign:
4889 Out << "assign";
4890 break;
4891 default:
4893 "Tried to print a DbgVariableRecord with an invalid LocationType!");
4894 }
4895
4896 auto PrintOrNull = [&](Metadata *M) {
4897 if (!M)
4898 Out << "(null)";
4899 else
4900 writeAsOperandInternal(Out, M, WriterCtx, true);
4901 };
4902
4903 Out << "(";
4904 PrintOrNull(DVR.getRawLocation());
4905 Out << ", ";
4906 PrintOrNull(DVR.getRawVariable());
4907 Out << ", ";
4908 PrintOrNull(DVR.getRawExpression());
4909 Out << ", ";
4910 if (DVR.isDbgAssign()) {
4911 PrintOrNull(DVR.getRawAssignID());
4912 Out << ", ";
4913 PrintOrNull(DVR.getRawAddress());
4914 Out << ", ";
4915 PrintOrNull(DVR.getRawAddressExpression());
4916 Out << ", ";
4917 }
4918 PrintOrNull(DVR.getDebugLoc().getAsMDNode());
4919 Out << ")";
4920}
4921
4922/// printDbgRecordLine - Print a DbgRecord with indentation and a newline
4923/// character.
4924void AssemblyWriter::printDbgRecordLine(const DbgRecord &DR) {
4925 // Print lengthier indentation to bring out-of-line with instructions.
4926 Out << " ";
4927 printDbgRecord(DR);
4928 Out << '\n';
4929}
4930
4931void AssemblyWriter::printDbgLabelRecord(const DbgLabelRecord &Label) {
4932 auto WriterCtx = getContext();
4933 Out << "#dbg_label(";
4934 writeAsOperandInternal(Out, Label.getRawLabel(), WriterCtx, true);
4935 Out << ", ";
4936 writeAsOperandInternal(Out, Label.getDebugLoc(), WriterCtx, true);
4937 Out << ")";
4938}
4939
4940void AssemblyWriter::printMetadataAttachments(
4941 const SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs,
4942 StringRef Separator) {
4943 if (MDs.empty())
4944 return;
4945
4946 if (MDNames.empty())
4947 MDs[0].second->getContext().getMDKindNames(MDNames);
4948
4949 auto WriterCtx = getContext();
4950 for (const auto &I : MDs) {
4951 unsigned Kind = I.first;
4952 Out << Separator;
4953 if (Kind < MDNames.size()) {
4954 Out << "!";
4955 printMetadataIdentifier(MDNames[Kind], Out);
4956 } else
4957 Out << "!<unknown kind #" << Kind << ">";
4958 Out << ' ';
4959 writeAsOperandInternal(Out, I.second, WriterCtx);
4960 }
4961}
4962
4963void AssemblyWriter::writeMDNode(unsigned Slot, const MDNode *Node) {
4964 Out << '!' << Slot << " = ";
4965 printMDNodeBody(Node);
4966 Out << "\n";
4967}
4968
4969void AssemblyWriter::writeAllMDNodes() {
4971 Nodes.resize(Machine.mdn_size());
4972 for (auto &I : llvm::make_range(Machine.mdn_begin(), Machine.mdn_end()))
4973 Nodes[I.second] = cast<MDNode>(I.first);
4974
4975 for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
4976 writeMDNode(i, Nodes[i]);
4977 }
4978}
4979
4980void AssemblyWriter::printMDNodeBody(const MDNode *Node) {
4981 auto WriterCtx = getContext();
4982 writeMDNodeBodyInternal(Out, Node, WriterCtx);
4983}
4984
4985void AssemblyWriter::writeAttribute(const Attribute &Attr, bool InAttrGroup) {
4986 if (!Attr.isTypeAttribute()) {
4987 Out << Attr.getAsString(InAttrGroup);
4988 return;
4989 }
4990
4991 Out << Attribute::getNameFromAttrKind(Attr.getKindAsEnum());
4992 if (Type *Ty = Attr.getValueAsType()) {
4993 Out << '(';
4994 TypePrinter.print(Ty, Out);
4995 Out << ')';
4996 }
4997}
4998
4999void AssemblyWriter::writeAttributeSet(const AttributeSet &AttrSet,
5000 bool InAttrGroup) {
5001 ListSeparator LS(" ");
5002 for (const auto &Attr : AttrSet) {
5003 Out << LS;
5004 writeAttribute(Attr, InAttrGroup);
5005 }
5006}
5007
5008void AssemblyWriter::writeAllAttributeGroups() {
5009 std::vector<std::pair<AttributeSet, unsigned>> asVec;
5010 asVec.resize(Machine.as_size());
5011
5012 for (auto &I : llvm::make_range(Machine.as_begin(), Machine.as_end()))
5013 asVec[I.second] = I;
5014
5015 for (const auto &I : asVec)
5016 Out << "attributes #" << I.second << " = { "
5017 << I.first.getAsString(true) << " }\n";
5018}
5019
5020void AssemblyWriter::printUseListOrder(const Value *V,
5021 ArrayRef<unsigned> Shuffle) {
5022 bool IsInFunction = Machine.getFunction();
5023 if (IsInFunction)
5024 Out << " ";
5025
5026 Out << "uselistorder";
5027 if (const BasicBlock *BB = IsInFunction ? nullptr : dyn_cast<BasicBlock>(V)) {
5028 Out << "_bb ";
5029 writeOperand(BB->getParent(), false);
5030 Out << ", ";
5031 writeOperand(BB, false);
5032 } else {
5033 Out << " ";
5034 writeOperand(V, true);
5035 }
5036
5037 assert(Shuffle.size() >= 2 && "Shuffle too small");
5038 Out << ", { " << llvm::interleaved(Shuffle) << " }\n";
5039}
5040
5041void AssemblyWriter::printUseLists(const Function *F) {
5042 auto It = UseListOrders.find(F);
5043 if (It == UseListOrders.end())
5044 return;
5045
5046 Out << "\n; uselistorder directives\n";
5047 for (const auto &Pair : It->second)
5048 printUseListOrder(Pair.first, Pair.second);
5049}
5050
5051//===----------------------------------------------------------------------===//
5052// External Interface declarations
5053//===----------------------------------------------------------------------===//
5054
5056 bool ShouldPreserveUseListOrder, bool IsForDebug) const {
5057 SlotTracker SlotTable(this->getParent());
5058 formatted_raw_ostream OS(ROS);
5059 AssemblyWriter W(OS, SlotTable, this->getParent(), AAW, IsForDebug,
5060 ShouldPreserveUseListOrder);
5061 W.printFunction(this);
5062}
5063
5065 bool ShouldPreserveUseListOrder,
5066 bool IsForDebug) const {
5067 SlotTracker SlotTable(this->getParent());
5068 formatted_raw_ostream OS(ROS);
5069 AssemblyWriter W(OS, SlotTable, this->getModule(), AAW,
5070 IsForDebug,
5071 ShouldPreserveUseListOrder);
5072 W.printBasicBlock(this);
5073}
5074
5076 bool ShouldPreserveUseListOrder, bool IsForDebug) const {
5077 SlotTracker SlotTable(this);
5078 formatted_raw_ostream OS(ROS);
5079 AssemblyWriter W(OS, SlotTable, this, AAW, IsForDebug,
5080 ShouldPreserveUseListOrder);
5081 W.printModule(this);
5082}
5083
5084void NamedMDNode::print(raw_ostream &ROS, bool IsForDebug) const {
5085 SlotTracker SlotTable(getParent());
5086 formatted_raw_ostream OS(ROS);
5087 AssemblyWriter W(OS, SlotTable, getParent(), nullptr, IsForDebug);
5088 W.printNamedMDNode(this);
5089}
5090
5092 bool IsForDebug) const {
5093 std::optional<SlotTracker> LocalST;
5094 SlotTracker *SlotTable;
5095 if (auto *ST = MST.getMachine())
5096 SlotTable = ST;
5097 else {
5098 LocalST.emplace(getParent());
5099 SlotTable = &*LocalST;
5100 }
5101
5102 formatted_raw_ostream OS(ROS);
5103 AssemblyWriter W(OS, *SlotTable, getParent(), nullptr, IsForDebug);
5104 W.printNamedMDNode(this);
5105}
5106
5107void Comdat::print(raw_ostream &ROS, bool /*IsForDebug*/) const {
5109 ROS << " = comdat ";
5110
5111 switch (getSelectionKind()) {
5112 case Comdat::Any:
5113 ROS << "any";
5114 break;
5115 case Comdat::ExactMatch:
5116 ROS << "exactmatch";
5117 break;
5118 case Comdat::Largest:
5119 ROS << "largest";
5120 break;
5122 ROS << "nodeduplicate";
5123 break;
5124 case Comdat::SameSize:
5125 ROS << "samesize";
5126 break;
5127 }
5128
5129 ROS << '\n';
5130}
5131
5132void Type::print(raw_ostream &OS, bool /*IsForDebug*/, bool NoDetails) const {
5133 TypePrinting TP;
5134 TP.print(const_cast<Type*>(this), OS);
5135
5136 if (NoDetails)
5137 return;
5138
5139 // If the type is a named struct type, print the body as well.
5140 if (auto *STy = dyn_cast<StructType>(const_cast<Type *>(this)))
5141 if (!STy->isLiteral()) {
5142 OS << " = type ";
5143 TP.printStructBody(STy, OS);
5144 }
5145}
5146
5147static bool isReferencingMDNode(const Instruction &I) {
5148 if (const auto *CI = dyn_cast<CallInst>(&I))
5149 if (Function *F = CI->getCalledFunction())
5150 if (F->isIntrinsic())
5151 for (auto &Op : I.operands())
5153 if (isa<MDNode>(V->getMetadata()))
5154 return true;
5155 return false;
5156}
5157
5158void DbgMarker::print(raw_ostream &ROS, bool IsForDebug) const {
5159
5160 ModuleSlotTracker MST(getModuleFromDPI(this), true);
5161 print(ROS, MST, IsForDebug);
5162}
5163
5164void DbgVariableRecord::print(raw_ostream &ROS, bool IsForDebug) const {
5165
5166 ModuleSlotTracker MST(getModuleFromDPI(this), true);
5167 print(ROS, MST, IsForDebug);
5168}
5169
5171 bool IsForDebug) const {
5172 formatted_raw_ostream OS(ROS);
5173 SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));
5174 SlotTracker &SlotTable =
5175 MST.getMachine() ? *MST.getMachine() : EmptySlotTable;
5176 const Function *F = getParent() ? getParent()->getParent() : nullptr;
5177 if (F)
5178 MST.incorporateFunction(*F);
5179 AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);
5180 W.printDbgMarker(*this);
5181}
5182
5183void DbgLabelRecord::print(raw_ostream &ROS, bool IsForDebug) const {
5184
5185 ModuleSlotTracker MST(getModuleFromDPI(this), true);
5186 print(ROS, MST, IsForDebug);
5187}
5188
5190 bool IsForDebug) const {
5191 formatted_raw_ostream OS(ROS);
5192 SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));
5193 SlotTracker &SlotTable =
5194 MST.getMachine() ? *MST.getMachine() : EmptySlotTable;
5195 const Function *F = Marker && Marker->getParent()
5196 ? Marker->getParent()->getParent()
5197 : nullptr;
5198 if (F)
5199 MST.incorporateFunction(*F);
5200 AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);
5201 W.printDbgVariableRecord(*this);
5202}
5203
5205 bool IsForDebug) const {
5206 formatted_raw_ostream OS(ROS);
5207 SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));
5208 SlotTracker &SlotTable =
5209 MST.getMachine() ? *MST.getMachine() : EmptySlotTable;
5210 const Function *F =
5211 Marker->getParent() ? Marker->getParent()->getParent() : nullptr;
5212 if (F)
5213 MST.incorporateFunction(*F);
5214
5215 AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);
5216 W.printDbgLabelRecord(*this);
5217}
5218
5219void Value::print(raw_ostream &ROS, bool IsForDebug) const {
5220 bool ShouldInitializeAllMetadata = false;
5221 if (auto *I = dyn_cast<Instruction>(this))
5222 ShouldInitializeAllMetadata = isReferencingMDNode(*I);
5223 else if (isa<Function>(this) || isa<MetadataAsValue>(this))
5224 ShouldInitializeAllMetadata = true;
5225
5226 ModuleSlotTracker MST(getModuleFromVal(this), ShouldInitializeAllMetadata);
5227 print(ROS, MST, IsForDebug);
5228}
5229
5231 bool IsForDebug) const {
5232 formatted_raw_ostream OS(ROS);
5233 SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));
5234 SlotTracker &SlotTable =
5235 MST.getMachine() ? *MST.getMachine() : EmptySlotTable;
5236 auto IncorporateFunction = [&](const Function *F) {
5237 if (F)
5238 MST.incorporateFunction(*F);
5239 };
5240
5241 if (const auto *I = dyn_cast<Instruction>(this)) {
5242 IncorporateFunction(I->getParent() ? I->getParent()->getParent() : nullptr);
5243 AssemblyWriter W(OS, SlotTable, getModuleFromVal(I), nullptr, IsForDebug);
5244 W.printInstruction(*I);
5245 } else if (const auto *BB = dyn_cast<BasicBlock>(this)) {
5246 IncorporateFunction(BB->getParent());
5247 AssemblyWriter W(OS, SlotTable, getModuleFromVal(BB), nullptr, IsForDebug);
5248 W.printBasicBlock(BB);
5249 } else if (const auto *GV = dyn_cast<GlobalValue>(this)) {
5250 AssemblyWriter W(OS, SlotTable, GV->getParent(), nullptr, IsForDebug);
5251 if (const auto *V = dyn_cast<GlobalVariable>(GV))
5252 W.printGlobal(V);
5253 else if (const auto *F = dyn_cast<Function>(GV))
5254 W.printFunction(F);
5255 else if (const auto *A = dyn_cast<GlobalAlias>(GV))
5256 W.printAlias(A);
5257 else if (const auto *I = dyn_cast<GlobalIFunc>(GV))
5258 W.printIFunc(I);
5259 else
5260 llvm_unreachable("Unknown GlobalValue to print out!");
5261 } else if (const auto *V = dyn_cast<MetadataAsValue>(this)) {
5262 V->getMetadata()->print(ROS, MST, getModuleFromVal(V));
5263 } else if (const auto *C = dyn_cast<Constant>(this)) {
5264 TypePrinting TypePrinter;
5265 TypePrinter.print(C->getType(), OS);
5266 OS << ' ';
5267 AsmWriterContext WriterCtx(&TypePrinter, MST.getMachine());
5268 writeConstantInternal(OS, C, WriterCtx);
5269 } else if (isa<InlineAsm>(this) || isa<Argument>(this)) {
5270 this->printAsOperand(OS, /* PrintType */ true, MST);
5271 } else {
5272 llvm_unreachable("Unknown value to print out!");
5273 }
5274}
5275
5276/// Print without a type, skipping the TypePrinting object.
5277///
5278/// \return \c true iff printing was successful.
5279static bool printWithoutType(const Value &V, raw_ostream &O,
5280 SlotTracker *Machine, const Module *M) {
5281 if (V.hasName() || isa<GlobalValue>(V) ||
5282 (!isa<Constant>(V) && !isa<MetadataAsValue>(V))) {
5283 AsmWriterContext WriterCtx(nullptr, Machine, M);
5284 writeAsOperandInternal(O, &V, WriterCtx);
5285 return true;
5286 }
5287 return false;
5288}
5289
5290static void printAsOperandImpl(const Value &V, raw_ostream &O, bool PrintType,
5291 ModuleSlotTracker &MST) {
5292 TypePrinting TypePrinter(MST.getModule());
5293 AsmWriterContext WriterCtx(&TypePrinter, MST.getMachine(), MST.getModule());
5294 writeAsOperandInternal(O, &V, WriterCtx, PrintType);
5295}
5296
5297void Value::printAsOperand(raw_ostream &O, bool PrintType,
5298 const Module *M) const {
5299 if (!M)
5300 M = getModuleFromVal(this);
5301
5302 if (!PrintType)
5303 if (printWithoutType(*this, O, nullptr, M))
5304 return;
5305
5307 M, /* ShouldInitializeAllMetadata */ isa<MetadataAsValue>(this));
5308 ModuleSlotTracker MST(Machine, M);
5309 printAsOperandImpl(*this, O, PrintType, MST);
5310}
5311
5312void Value::printAsOperand(raw_ostream &O, bool PrintType,
5313 ModuleSlotTracker &MST) const {
5314 if (!PrintType)
5315 if (printWithoutType(*this, O, MST.getMachine(), MST.getModule()))
5316 return;
5317
5318 printAsOperandImpl(*this, O, PrintType, MST);
5319}
5320
5321/// Recursive version of printMetadataImpl.
5322static void printMetadataImplRec(raw_ostream &ROS, const Metadata &MD,
5323 AsmWriterContext &WriterCtx) {
5324 formatted_raw_ostream OS(ROS);
5325 writeAsOperandInternal(OS, &MD, WriterCtx, /* FromValue */ true);
5326
5327 auto *N = dyn_cast<MDNode>(&MD);
5328 if (!N || isa<DIExpression>(MD))
5329 return;
5330
5331 OS << " = ";
5332 writeMDNodeBodyInternal(OS, N, WriterCtx);
5333}
5334
5335namespace {
5336struct MDTreeAsmWriterContext : public AsmWriterContext {
5337 unsigned Level;
5338 // {Level, Printed string}
5339 using EntryTy = std::pair<unsigned, std::string>;
5341
5342 // Used to break the cycle in case there is any.
5343 SmallPtrSet<const Metadata *, 4> Visited;
5344
5345 raw_ostream &MainOS;
5346
5347 MDTreeAsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M,
5348 raw_ostream &OS, const Metadata *InitMD)
5349 : AsmWriterContext(TP, ST, M), Level(0U), Visited({InitMD}), MainOS(OS) {}
5350
5351 void onWriteMetadataAsOperand(const Metadata *MD) override {
5352 if (!Visited.insert(MD).second)
5353 return;
5354
5355 std::string Str;
5356 raw_string_ostream SS(Str);
5357 ++Level;
5358 // A placeholder entry to memorize the correct
5359 // position in buffer.
5360 Buffer.emplace_back(std::make_pair(Level, ""));
5361 unsigned InsertIdx = Buffer.size() - 1;
5362
5363 printMetadataImplRec(SS, *MD, *this);
5364 Buffer[InsertIdx].second = std::move(SS.str());
5365 --Level;
5366 }
5367
5368 ~MDTreeAsmWriterContext() override {
5369 for (const auto &Entry : Buffer) {
5370 MainOS << "\n";
5371 unsigned NumIndent = Entry.first * 2U;
5372 MainOS.indent(NumIndent) << Entry.second;
5373 }
5374 }
5375};
5376} // end anonymous namespace
5377
5378static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD,
5379 ModuleSlotTracker &MST, const Module *M,
5380 bool OnlyAsOperand, bool PrintAsTree = false) {
5381 formatted_raw_ostream OS(ROS);
5382
5383 TypePrinting TypePrinter(M);
5384
5385 std::unique_ptr<AsmWriterContext> WriterCtx;
5386 if (PrintAsTree && !OnlyAsOperand)
5387 WriterCtx = std::make_unique<MDTreeAsmWriterContext>(
5388 &TypePrinter, MST.getMachine(), M, OS, &MD);
5389 else
5390 WriterCtx =
5391 std::make_unique<AsmWriterContext>(&TypePrinter, MST.getMachine(), M);
5392
5393 writeAsOperandInternal(OS, &MD, *WriterCtx, /* FromValue */ true);
5394
5395 auto *N = dyn_cast<MDNode>(&MD);
5396 if (OnlyAsOperand || !N || isa<DIExpression>(MD))
5397 return;
5398
5399 OS << " = ";
5400 writeMDNodeBodyInternal(OS, N, *WriterCtx);
5401}
5402
5404 ModuleSlotTracker MST(M, isa<MDNode>(this));
5405 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);
5406}
5407
5409 const Module *M) const {
5410 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);
5411}
5412
5414 bool /*IsForDebug*/) const {
5415 ModuleSlotTracker MST(M, isa<MDNode>(this));
5416 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false);
5417}
5418
5420 const Module *M, bool /*IsForDebug*/) const {
5421 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false);
5422}
5423
5424void MDNode::printTree(raw_ostream &OS, const Module *M) const {
5425 ModuleSlotTracker MST(M, true);
5426 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false,
5427 /*PrintAsTree=*/true);
5428}
5429
5431 const Module *M) const {
5432 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false,
5433 /*PrintAsTree=*/true);
5434}
5435
5436void ModuleSummaryIndex::print(raw_ostream &ROS, bool IsForDebug) const {
5437 SlotTracker SlotTable(this);
5438 formatted_raw_ostream OS(ROS);
5439 AssemblyWriter W(OS, SlotTable, this, IsForDebug);
5440 W.printModuleSummaryIndex();
5441}
5442
5444 unsigned UB) const {
5445 SlotTracker *ST = MachineStorage.get();
5446 if (!ST)
5447 return;
5448
5449 for (auto &I : llvm::make_range(ST->mdn_begin(), ST->mdn_end()))
5450 if (I.second >= LB && I.second < UB)
5451 L.push_back(std::make_pair(I.second, I.first));
5452}
5453
5454#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
5455// Value::dump - allow easy printing of Values from the debugger.
5457void Value::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5458
5459// Value::dump - allow easy printing of Values from the debugger.
5461void DbgMarker::dump() const {
5462 print(dbgs(), /*IsForDebug=*/true);
5463 dbgs() << '\n';
5464}
5465
5466// Value::dump - allow easy printing of Values from the debugger.
5468void DbgRecord::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5469
5470// Type::dump - allow easy printing of Types from the debugger.
5472void Type::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5473
5474// Module::dump() - Allow printing of Modules from the debugger.
5476void Module::dump() const {
5477 print(dbgs(), nullptr,
5478 /*ShouldPreserveUseListOrder=*/false, /*IsForDebug=*/true);
5479}
5480
5481// Allow printing of Comdats from the debugger.
5483void Comdat::dump() const { print(dbgs(), /*IsForDebug=*/true); }
5484
5485// NamedMDNode::dump() - Allow printing of NamedMDNodes from the debugger.
5487void NamedMDNode::dump() const { print(dbgs(), /*IsForDebug=*/true); }
5488
5490void Metadata::dump() const { dump(nullptr); }
5491
5493void Metadata::dump(const Module *M) const {
5494 print(dbgs(), M, /*IsForDebug=*/true);
5495 dbgs() << '\n';
5496}
5497
5499void MDNode::dumpTree() const { dumpTree(nullptr); }
5500
5502void MDNode::dumpTree(const Module *M) const {
5503 printTree(dbgs(), M);
5504 dbgs() << '\n';
5505}
5506
5507// Allow printing of ModuleSummaryIndex from the debugger.
5509void ModuleSummaryIndex::dump() const { print(dbgs(), /*IsForDebug=*/true); }
5510#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static void writeDIMacro(raw_ostream &Out, const DIMacro *N, AsmWriterContext &WriterCtx)
static void writeMetadataAsOperand(raw_ostream &Out, const Metadata *MD, AsmWriterContext &WriterCtx)
static void writeDIGlobalVariableExpression(raw_ostream &Out, const DIGlobalVariableExpression *N, AsmWriterContext &WriterCtx)
static void writeDICompositeType(raw_ostream &Out, const DICompositeType *N, AsmWriterContext &WriterCtx)
static void writeDIFixedPointType(raw_ostream &Out, const DIFixedPointType *N, AsmWriterContext &WriterCtx)
static void printDSOLocation(const GlobalValue &GV, formatted_raw_ostream &Out)
static const char * getWholeProgDevirtResKindName(WholeProgramDevirtResolution::Kind K)
static void writeDISubrangeType(raw_ostream &Out, const DISubrangeType *N, AsmWriterContext &WriterCtx)
static void writeAPFloatInternal(raw_ostream &Out, const APFloat &APF)
static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD, ModuleSlotTracker &MST, const Module *M, bool OnlyAsOperand, bool PrintAsTree=false)
static void writeDIStringType(raw_ostream &Out, const DIStringType *N, AsmWriterContext &WriterCtx)
static std::string getLinkageNameWithSpace(GlobalValue::LinkageTypes LT)
static cl::opt< bool > PreserveAssemblyUseListOrder("preserve-ll-uselistorder", cl::Hidden, cl::init(false), cl::desc("Preserve use-list order when writing LLVM assembly."))
static std::vector< unsigned > predictValueUseListOrder(const Value *V, unsigned ID, const OrderMap &OM)
static void writeDIGlobalVariable(raw_ostream &Out, const DIGlobalVariable *N, AsmWriterContext &WriterCtx)
static void orderValue(const Value *V, OrderMap &OM)
static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N, AsmWriterContext &WriterCtx)
static StringRef getUnnamedAddrEncoding(GlobalVariable::UnnamedAddr UA)
static const char * getWholeProgDevirtResByArgKindName(WholeProgramDevirtResolution::ByArg::Kind K)
static void writeMDNodeBodyInternal(raw_ostream &Out, const MDNode *Node, AsmWriterContext &Ctx)
static void writeDIModule(raw_ostream &Out, const DIModule *N, AsmWriterContext &WriterCtx)
static void writeDIFile(raw_ostream &Out, const DIFile *N, AsmWriterContext &)
static void writeDISubroutineType(raw_ostream &Out, const DISubroutineType *N, AsmWriterContext &WriterCtx)
static cl::opt< bool > PrintAddrspaceName("print-addrspace-name", cl::Hidden, cl::init(false), cl::desc("Print address space names"))
static void writeOptimizationInfo(raw_ostream &Out, const User *U)
static bool isReferencingMDNode(const Instruction &I)
#define CC_VLS_CASE(ABI_VLEN)
static void writeDILabel(raw_ostream &Out, const DILabel *N, AsmWriterContext &WriterCtx)
static void writeDIDerivedType(raw_ostream &Out, const DIDerivedType *N, AsmWriterContext &WriterCtx)
static void printMetadataIdentifier(StringRef Name, formatted_raw_ostream &Out)
static void printShuffleMask(raw_ostream &Out, Type *Ty, ArrayRef< int > Mask)
static void writeDIImportedEntity(raw_ostream &Out, const DIImportedEntity *N, AsmWriterContext &WriterCtx)
static const Module * getModuleFromDPI(const DbgMarker *Marker)
static void printAsOperandImpl(const Value &V, raw_ostream &O, bool PrintType, ModuleSlotTracker &MST)
static void writeDIObjCProperty(raw_ostream &Out, const DIObjCProperty *N, AsmWriterContext &WriterCtx)
static void writeDISubprogram(raw_ostream &Out, const DISubprogram *N, AsmWriterContext &WriterCtx)
static const char * getSummaryKindName(GlobalValueSummary::SummaryKind SK)
static OrderMap orderModule(const Module *M)
static const char * getVisibilityName(GlobalValue::VisibilityTypes Vis)
static void printCallingConv(unsigned cc, raw_ostream &Out)
static void printAddressSpace(const Module *M, unsigned AS, raw_ostream &OS, StringRef Prefix=" ", StringRef Suffix="", bool ForcePrint=false)
static cl::opt< bool > PrintInstDebugLocs("print-inst-debug-locs", cl::Hidden, cl::desc("Pretty print debug locations of instructions when dumping"))
static void printMetadataImplRec(raw_ostream &ROS, const Metadata &MD, AsmWriterContext &WriterCtx)
Recursive version of printMetadataImpl.
static SlotTracker * createSlotTracker(const Value *V)
static void writeDILocation(raw_ostream &Out, const DILocation *DL, AsmWriterContext &WriterCtx)
static void writeDINamespace(raw_ostream &Out, const DINamespace *N, AsmWriterContext &WriterCtx)
DenseMap< const Function *, MapVector< const Value *, std::vector< unsigned > > > UseListOrderMap
static void writeDICommonBlock(raw_ostream &Out, const DICommonBlock *N, AsmWriterContext &WriterCtx)
static UseListOrderMap predictUseListOrder(const Module *M)
static void printThreadLocalModel(GlobalVariable::ThreadLocalMode TLM, formatted_raw_ostream &Out)
static std::string getLinkageName(GlobalValue::LinkageTypes LT)
static void writeGenericDINode(raw_ostream &Out, const GenericDINode *N, AsmWriterContext &WriterCtx)
static void writeDILocalVariable(raw_ostream &Out, const DILocalVariable *N, AsmWriterContext &WriterCtx)
static const char * getTTResKindName(TypeTestResolution::Kind K)
static void writeDITemplateTypeParameter(raw_ostream &Out, const DITemplateTypeParameter *N, AsmWriterContext &WriterCtx)
static const char * getImportTypeName(GlobalValueSummary::ImportKind IK)
static void writeDICompileUnit(raw_ostream &Out, const DICompileUnit *N, AsmWriterContext &WriterCtx)
static const Module * getModuleFromVal(const Value *V)
static void printLLVMName(raw_ostream &OS, StringRef Name, PrefixType Prefix)
Turn the specified name into an 'LLVM name', which is either prefixed with % (if the string only cont...
static void maybePrintCallAddrSpace(const Value *Operand, const Instruction *I, raw_ostream &Out)
static void writeDIGenericSubrange(raw_ostream &Out, const DIGenericSubrange *N, AsmWriterContext &WriterCtx)
static void writeDISubrange(raw_ostream &Out, const DISubrange *N, AsmWriterContext &WriterCtx)
static void writeDILexicalBlockFile(raw_ostream &Out, const DILexicalBlockFile *N, AsmWriterContext &WriterCtx)
static void writeConstantInternal(raw_ostream &Out, const Constant *CV, AsmWriterContext &WriterCtx)
static void writeDIEnumerator(raw_ostream &Out, const DIEnumerator *N, AsmWriterContext &)
static void writeAsOperandInternal(raw_ostream &Out, const Value *V, AsmWriterContext &WriterCtx, bool PrintType=false)
static void printVisibility(GlobalValue::VisibilityTypes Vis, formatted_raw_ostream &Out)
static cl::opt< bool > PrintProfData("print-prof-data", cl::Hidden, cl::desc("Pretty print perf data (branch weights, etc) when dumping"))
static void writeMDTuple(raw_ostream &Out, const MDTuple *Node, AsmWriterContext &WriterCtx)
static void writeDIExpression(raw_ostream &Out, const DIExpression *N, AsmWriterContext &WriterCtx)
static cl::opt< bool > PrintInstAddrs("print-inst-addrs", cl::Hidden, cl::desc("Print addresses of instructions when dumping"))
static void writeDIAssignID(raw_ostream &Out, const DIAssignID *DL, AsmWriterContext &WriterCtx)
static void writeDILexicalBlock(raw_ostream &Out, const DILexicalBlock *N, AsmWriterContext &WriterCtx)
PrefixType
@ GlobalPrefix
@ LabelPrefix
@ LocalPrefix
@ NoPrefix
@ ComdatPrefix
static void maybePrintComdat(formatted_raw_ostream &Out, const GlobalObject &GO)
static void printDLLStorageClass(GlobalValue::DLLStorageClassTypes SCT, formatted_raw_ostream &Out)
static bool printWithoutType(const Value &V, raw_ostream &O, SlotTracker *Machine, const Module *M)
Print without a type, skipping the TypePrinting object.
#define ST_DEBUG(X)
static void writeDIArgList(raw_ostream &Out, const DIArgList *N, AsmWriterContext &WriterCtx, bool FromValue=false)
static void writeDITemplateValueParameter(raw_ostream &Out, const DITemplateValueParameter *N, AsmWriterContext &WriterCtx)
static const Value * skipMetadataWrapper(const Value *V)
Look for a value that might be wrapped as metadata, e.g.
static void writeDIMacroFile(raw_ostream &Out, const DIMacroFile *N, AsmWriterContext &WriterCtx)
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:661
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil pretty DXIL Metadata Pretty Printer
dxil translate DXIL Translate Metadata
This file defines the DenseMap class.
@ Default
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
GlobalValue::SanitizerMetadata SanitizerMetadata
Definition Globals.cpp:245
#define op(i)
Hexagon Common GEP
#define _
IRTranslator LLVM IR MI
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This file contains an interface for creating legacy passes to print out IR in various granularities.
Module.h This file contains the declarations for the Module class.
This defines the Use class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
Machine Check Debug Module
This file contains the declarations for metadata subclasses.
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
static bool processFunction(Function &F, NVPTXTargetMachine &TM)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
Function const char TargetMachine * Machine
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
if(PassOpts->AAPipeline)
static StringRef getName(Value *V)
This file contains some templates that are useful if you are working with the STL at all.
This file provides utility classes that use RAII to save and restore values.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
static UseListOrderStack predictUseListOrder(const Module &M)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
static const fltSemantics & BFloat()
Definition APFloat.h:295
static const fltSemantics & IEEEquad()
Definition APFloat.h:298
static const fltSemantics & IEEEdouble()
Definition APFloat.h:297
static const fltSemantics & x87DoubleExtended()
Definition APFloat.h:317
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
static const fltSemantics & IEEEhalf()
Definition APFloat.h:294
static const fltSemantics & PPCDoubleDouble()
Definition APFloat.h:299
static APFloat getSNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for SNaN values.
Definition APFloat.h:1191
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5975
bool isNegative() const
Definition APFloat.h:1512
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
Definition APFloat.cpp:6034
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Definition APFloat.h:1541
const fltSemantics & getSemantics() const
Definition APFloat.h:1520
bool isNaN() const
Definition APFloat.h:1510
bool isSignaling() const
Definition APFloat.h:1514
APInt bitcastToAPInt() const
Definition APFloat.h:1416
bool isInfinity() const
Definition APFloat.h:1509
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt getLoBits(unsigned numBits) const
Compute an APInt containing numBits lowbits from this APInt.
Definition APInt.cpp:644
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1555
LLVM_ABI APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
Definition APInt.cpp:639
Abstract interface of slot tracker storage.
const GlobalValueSummary & getAliasee() const
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
virtual void emitBasicBlockStartAnnot(const BasicBlock *, formatted_raw_ostream &)
emitBasicBlockStartAnnot - This may be implemented to emit a string right after the basic block label...
virtual void emitBasicBlockEndAnnot(const BasicBlock *, formatted_raw_ostream &)
emitBasicBlockEndAnnot - This may be implemented to emit a string right after the basic block.
virtual void emitFunctionAnnot(const Function *, formatted_raw_ostream &)
emitFunctionAnnot - This may be implemented to emit a string right before the start of a function.
virtual void emitInstructionAnnot(const Instruction *, formatted_raw_ostream &)
emitInstructionAnnot - This may be implemented to emit a string right before an instruction is emitte...
virtual void printInfoComment(const Value &, formatted_raw_ostream &)
printInfoComment - This may be implemented to emit a comment to the right of an instruction or global...
static LLVM_ABI StringRef getOperationName(BinOp Op)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:402
bool hasAttributes() const
Return true if attributes exists in this set.
Definition Attributes.h:472
LLVM_ABI std::string getAsString(bool InAttrGrp=false) const
The Attribute is converted to a string of equivalent mnemonic.
LLVM_ABI Attribute::AttrKind getKindAsEnum() const
Return the attribute's kind as an enum (Attribute::AttrKind).
LLVM_ABI bool isTypeAttribute() const
Return true if the attribute is a type attribute.
LLVM_ABI Type * getValueAsType() const
Return the attribute's value as a Type.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW=nullptr, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the basic block to an output stream with an optional AssemblyAnnotationWriter.
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
AttributeList getAttributes() const
Return the attributes for this call.
bool hasOperandBundles() const
Return true if this User has any operand bundles.
LLVM_ABI void print(raw_ostream &OS, bool IsForDebug=false) const
LLVM_ABI void dump() const
@ Largest
The linker will choose the largest COMDAT.
Definition Comdat.h:39
@ SameSize
The data referenced by the COMDAT must be the same size.
Definition Comdat.h:41
@ Any
The linker may choose any COMDAT.
Definition Comdat.h:37
@ NoDeduplicate
No deduplication is performed.
Definition Comdat.h:40
@ ExactMatch
The data referenced by the COMDAT must be the same.
Definition Comdat.h:38
SelectionKind getSelectionKind() const
Definition Comdat.h:47
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
Basic type, like 'int' or 'float'.
Debug common block.
static LLVM_ABI const char * nameTableKindString(DebugNameTableKind PK)
static LLVM_ABI const char * emissionKindString(DebugEmissionKind EK)
Enumeration value.
A lightweight wrapper around an expression operand.
DWARF expression.
static LLVM_ABI const char * fixedPointKindString(FixedPointKind)
A pair of DIGlobalVariable and DIExpression.
An imported module (C++ using directive or similar).
Debug lexical block.
Macro Info DWARF-like metadata node.
Represents a module in the programming language, for example, a Clang module, or a Fortran module.
Debug lexical block.
Tagged DWARF-like metadata node.
static LLVM_ABI DIFlags splitFlags(DIFlags Flags, SmallVectorImpl< DIFlags > &SplitFlags)
Split up a flags bitfield.
static LLVM_ABI StringRef getFlagString(DIFlags Flag)
DIFlags
Debug info flags.
Wrapper structure that holds a language name and its version.
uint32_t getVersion() const
Returns language version. Only valid for versioned language names.
uint16_t getName() const
Returns a versioned or unversioned language name.
String type, Fortran CHARACTER(n)
Subprogram description. Uses SubclassData1.
static LLVM_ABI DISPFlags splitFlags(DISPFlags Flags, SmallVectorImpl< DISPFlags > &SplitFlags)
Split up a flags bitfield for easier printing.
static LLVM_ABI StringRef getFlagString(DISPFlags Flag)
DISPFlags
Debug info subprogram flags.
Array subrange.
Type array for a subprogram.
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Per-instruction record of debug-info.
LLVM_ABI void dump() const
Instruction * MarkedInstr
Link back to the Instruction that owns this marker.
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on DbgMarker.
LLVM_ABI const BasicBlock * getParent() const
simple_ilist< DbgRecord > StoredDbgRecords
List of DbgRecords, the non-instruction equivalent of llvm.dbg.
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
LLVM_ABI void dump() const
DbgMarker * Marker
Marker that this DbgRecord is linked into.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Metadata * getRawLocation() const
Returns the metadata operand for the first location description.
MDNode * getAsMDNode() const
Return this as a bar MDNode.
Definition DebugLoc.h:290
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:74
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:244
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW=nullptr, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the function to an output stream with an optional AssemblyAnnotationWriter.
const Function & getFunction() const
Definition Function.h:164
const Argument * const_arg_iterator
Definition Function.h:73
LLVM_ABI Value * getBasePtr() const
LLVM_ABI Value * getDerivedPtr() const
Generic tagged DWARF-like metadata node.
const Constant * getAliasee() const
Definition GlobalAlias.h:87
const Constant * getResolver() const
Definition GlobalIFunc.h:73
StringRef getSection() const
Get the custom section of this global if it has one.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
const Comdat * getComdat() const
bool hasSection() const
Check if this global has a custom object file section.
SummaryKind
Sububclass discriminator (for dyn_cast<> et al.)
bool hasPartition() const
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
Definition Globals.cpp:78
LLVM_ABI const SanitizerMetadata & getSanitizerMetadata() const
Definition Globals.cpp:246
bool hasExternalLinkage() const
bool isDSOLocal() const
VisibilityTypes getVisibility() const
bool isImplicitDSOLocal() const
LinkageTypes getLinkage() const
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
ThreadLocalMode getThreadLocalMode() const
DLLStorageClassTypes
Storage classes of global values for PE targets.
Definition GlobalValue.h:74
@ DLLExportStorageClass
Function to be accessible from DLL.
Definition GlobalValue.h:77
@ DLLImportStorageClass
Function to be imported from DLL.
Definition GlobalValue.h:76
bool hasSanitizerMetadata() const
LLVM_ABI StringRef getPartition() const
Definition Globals.cpp:223
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
Definition GlobalValue.h:67
@ DefaultVisibility
The GV is visible.
Definition GlobalValue.h:68
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
@ ProtectedVisibility
The GV is protected.
Definition GlobalValue.h:70
LLVM_ABI bool isMaterializable() const
If this function's Module is being lazily streamed in functions from disk or some other source,...
Definition Globals.cpp:45
UnnamedAddr getUnnamedAddr() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition GlobalValue.h:52
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition GlobalValue.h:61
@ CommonLinkage
Tentative definitions.
Definition GlobalValue.h:63
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
Definition GlobalValue.h:55
@ WeakODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:58
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition GlobalValue.h:57
@ AppendingLinkage
Special purpose, only applies to global arrays.
Definition GlobalValue.h:59
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition GlobalValue.h:62
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:56
DLLStorageClassTypes getDLLStorageClass() const
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool isExternallyInitialized() const
bool hasInitializer() const
Definitions have initializers, declarations don't.
AttributeSet getAttributes() const
Return the attribute set for this global.
std::optional< CodeModel::Model > getCodeModel() const
Get the custom code model of this global if it has one.
MaybeAlign getAlign() const
Returns the alignment of the given variable.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
A helper class to return the specified delimiter string after the first invocation of operator String...
Metadata node.
Definition Metadata.h:1080
LLVM_ABI void printTree(raw_ostream &OS, const Module *M=nullptr) const
Print in tree shape.
LLVM_ABI void dumpTree() const
User-friendly dump in tree shape.
Tuple of metadata.
Definition Metadata.h:1500
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:36
Root of the metadata hierarchy.
Definition Metadata.h:64
LLVM_ABI void print(raw_ostream &OS, const Module *M=nullptr, bool IsForDebug=false) const
Print.
LLVM_ABI void printAsOperand(raw_ostream &OS, const Module *M=nullptr) const
Print as operand.
LLVM_ABI void dump() const
User-friendly dump.
Manage lifetime of a slot tracker for printing IR.
const Module * getModule() const
ModuleSlotTracker(SlotTracker &Machine, const Module *M, const Function *F=nullptr)
Wrap a preinitialized SlotTracker.
virtual ~ModuleSlotTracker()
Destructor to clean up storage.
std::vector< std::pair< unsigned, const MDNode * > > MachineMDNodeListType
int getLocalSlot(const Value *V)
Return the slot number of the specified local value.
void collectMDNodes(MachineMDNodeListType &L, unsigned LB, unsigned UB) const
SlotTracker * getMachine()
Lazily creates a slot tracker.
void setProcessHook(std::function< void(AbstractSlotTrackerStorage *, const Module *, bool)>)
void incorporateFunction(const Function &F)
Incorporate the given function.
Class to hold module path string table and global value map, and encapsulate methods for operating on...
static constexpr const char * getRegularLTOModuleName()
LLVM_ABI void dump() const
Dump to stderr (for debugging).
LLVM_ABI void print(raw_ostream &OS, bool IsForDebug=false) const
Print to an output stream.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
iterator_range< alias_iterator > aliases()
Definition Module.h:735
iterator_range< global_iterator > globals()
Definition Module.h:684
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the module to an output stream with an optional AssemblyAnnotationWriter.
void dump() const
Dump the module to stderr (for debugging).
LLVM_ABI void dump() const
LLVM_ABI StringRef getName() const
LLVM_ABI void print(raw_ostream &ROS, bool IsForDebug=false) const
iterator_range< op_iterator > operands()
Definition Metadata.h:1856
unsigned getAddressSpace() const
Return the address space of the Pointer type.
This class provides computation of slot numbers for LLVM Assembly writing.
DenseMap< const Value *, unsigned > ValueMap
ValueMap - A mapping of Values to slot numbers.
bool mdn_empty() const
int getMetadataSlot(const MDNode *N) override
getMetadataSlot - Get the slot number of a MDNode.
~SlotTracker() override=default
int getTypeIdCompatibleVtableSlot(StringRef Id)
int getModulePathSlot(StringRef Path)
bool as_empty() const
unsigned mdn_size() const
SlotTracker(const SlotTracker &)=delete
void purgeFunction()
After calling incorporateFunction, use this method to remove the most recently incorporated function ...
mdn_iterator mdn_end()
int getTypeIdSlot(StringRef Id)
void initializeIfNeeded()
These functions do the actual initialization.
int getGlobalSlot(const GlobalValue *V)
getGlobalSlot - Get the slot number of a global value.
as_iterator as_begin()
const Function * getFunction() const
unsigned getNextMetadataSlot() override
DenseMap< GlobalValue::GUID, unsigned >::iterator guid_iterator
GUID map iterators.
void incorporateFunction(const Function *F)
If you'd like to deal with a function instead of just a module, use this method to get its data into ...
int getLocalSlot(const Value *V)
Return the slot number of the specified value in it's type plane.
int getAttributeGroupSlot(AttributeSet AS)
SlotTracker(const Module *M, bool ShouldInitializeAllMetadata=false)
Construct from a module.
void createMetadataSlot(const MDNode *N) override
getMetadataSlot - Get the slot number of a MDNode.
void setProcessHook(std::function< void(AbstractSlotTrackerStorage *, const Module *, bool)>)
DenseMap< const MDNode *, unsigned >::iterator mdn_iterator
MDNode map iterators.
as_iterator as_end()
unsigned as_size() const
SlotTracker & operator=(const SlotTracker &)=delete
int getGUIDSlot(GlobalValue::GUID GUID)
mdn_iterator mdn_begin()
int initializeIndexIfNeeded()
DenseMap< AttributeSet, unsigned >::iterator as_iterator
AttributeSet map iterators.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
reference emplace_back(ArgTypes &&... Args)
void resize(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:133
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
ArrayRef< Type * > elements() const
bool isPacked() const
unsigned getNumElements() const
Random access to the elements.
bool isLiteral() const
Return true if this type is uniqued by structural equivalence, false if it is a struct definition.
bool isOpaque() const
Return true if this is a type with an identity that has no body specified yet.
LLVM_ABI StringRef getName() const
Return the name for this struct type if it has an identity.
Definition Type.cpp:696
ArrayRef< Type * > type_params() const
Return the type parameters for this particular target extension type.
ArrayRef< unsigned > int_params() const
Return the integer parameters for this particular target extension type.
TypeFinder - Walk over a module, identifying all of the types that are used by the module.
Definition TypeFinder.h:31
void run(const Module &M, bool onlyNamed)
iterator begin()
Definition TypeFinder.h:51
bool empty() const
Definition TypeFinder.h:57
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI StringRef getTargetExtName() const
Type(LLVMContext &C, TypeID tid)
Definition Type.h:93
LLVM_ABI void dump() const
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
TypeID getTypeID() const
Return the type id for the type.
Definition Type.h:136
Type * getElementType() const
unsigned getAddressSpace() const
Return the address space of the Pointer type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on Value.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
iterator_range< use_iterator > uses()
Definition Value.h:380
bool hasName() const
Definition Value.h:262
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void dump() const
Support for debugging, callable in GDB: V->dump()
formatted_raw_ostream - A raw_ostream that wraps another one and keeps track of line and column posit...
formatted_raw_ostream & PadToColumn(unsigned NewCol)
PadToColumn - Align the output to some column number.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
CallInst * Call
LLVM_ABI StringRef SourceLanguageNameString(SourceLanguageName Lang)
Definition Dwarf.cpp:586
LLVM_ABI StringRef EnumKindString(unsigned EnumKind)
Definition Dwarf.cpp:393
LLVM_ABI StringRef LanguageString(unsigned Language)
Definition Dwarf.cpp:412
LLVM_ABI StringRef AttributeEncodingString(unsigned Encoding)
Definition Dwarf.cpp:263
LLVM_ABI StringRef ConventionString(unsigned Convention)
Definition Dwarf.cpp:620
LLVM_ABI StringRef MacinfoString(unsigned Encoding)
Definition Dwarf.cpp:684
LLVM_ABI StringRef OperationEncodingString(unsigned Encoding)
Definition Dwarf.cpp:138
LLVM_ABI StringRef TagString(unsigned Tag)
Definition Dwarf.cpp:21
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
@ Entry
Definition COFF.h:862
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AArch64_VectorCall
Used between AArch64 Advanced SIMD functions.
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ RISCV_VectorCall
Calling convention used for RISC-V V-extension.
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
@ AMDGPU_VS
Used for Mesa vertex shaders, or AMDPAL last shader stage before rasterization (vertex shader if tess...
@ AVR_SIGNAL
Used for AVR signal routines.
@ Swift
Calling convention for Swift.
Definition CallingConv.h:69
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ AArch64_SVE_VectorCall
Used between AArch64 SVE functions.
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
@ CHERIoT_CompartmentCall
Calling convention used for CHERIoT when crossing a protection boundary.
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
Definition CallingConv.h:82
@ AVR_INTR
Used for AVR interrupt routines.
@ PreserveMost
Used for runtime calls that preserves most registers.
Definition CallingConv.h:63
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_Gfx
Used for AMD graphics targets.
@ DUMMY_HHVM
Placeholders for HHVM calling conventions (deprecated, removed).
@ AMDGPU_CS_ChainPreserve
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
@ CHERIoT_CompartmentCallee
Calling convention used for the callee of CHERIoT_CompartmentCall.
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2
Preserve X2-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ CHERIoT_LibraryCall
Calling convention used for CHERIoT for cross-library calls to a stateless compartment.
@ CXX_FAST_TLS
Used for access functions.
Definition CallingConv.h:72
@ X86_INTR
x86 hardware interrupt context.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0
Preserve X0-X13, X19-X29, SP, Z0-Z31, P0-P15.
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
Definition CallingConv.h:50
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
Definition CallingConv.h:47
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1
Preserve X1-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ X86_ThisCall
Similar to X86_StdCall.
@ PTX_Device
Call to a PTX device function.
@ SPIR_KERNEL
Used for SPIR kernel functions.
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
Definition CallingConv.h:66
@ X86_StdCall
stdcall is mostly used by the Win32 API.
Definition CallingConv.h:99
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ MSP430_INTR
Used for MSP430 interrupt routines.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ PreserveNone
Used for runtime calls that preserves none general registers.
Definition CallingConv.h:90
@ AMDGPU_ES
Used for AMDPAL shader stage before geometry shader if geometry is in use.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
Definition CallingConv.h:76
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ PTX_Kernel
Call to a PTX kernel. Passes all arguments in parameter space.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
Definition CallingConv.h:87
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
@ AMDGPU_LS
Used for AMDPAL vertex shader if tessellation is in use.
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
@ M68k_RTD
Used for M68k rtd-based CC (similar to X86's stdcall).
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ X86_FastCall
'fast' analog of X86_StdCall.
LLVM_ABI void printImmArg(ID IID, unsigned ArgIdx, raw_ostream &OS, const Constant *ImmArgVal)
Print the argument info for the arguments with ArgInfo.
LLVM_ABI bool hasPrettyPrintedArgs(ID id)
Returns true if the intrinsic has pretty printed immediate arguments.
@ System
Synchronized with respect to all concurrently executing threads.
Definition LLVMContext.h:58
initializer< Ty > init(const Ty &Val)
SourceLanguageName
Definition Dwarf.h:223
@ DW_OP_LLVM_convert
Only used in LLVM metadata.
Definition Dwarf.h:145
bool empty() const
Definition BasicBlock.h:101
Context & getContext() const
Definition BasicBlock.h:99
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1737
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
Definition STLExtras.h:839
InterleavedRange< Range > interleaved(const Range &R, StringRef Separator=", ", StringRef Prefix="", StringRef Suffix="")
Output range R as a sequence of interleaved elements.
const char * getHotnessName(CalleeInfo::HotnessType HT)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI void printEscapedString(StringRef Name, raw_ostream &Out)
Print each character of the specified string, escaping it if it is not printable or if it is an escap...
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2163
const char * toIRString(AtomicOrdering ao)
String used by LLVM IR to represent atomic ordering.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1634
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
char hexdigit(unsigned X, bool LowerCase=false)
hexdigit - Return the hexadecimal character for the given number X (which should be less than 16).
bool isDigit(char C)
Checks if character C is one of the 10 decimal digits.
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
Definition STLExtras.h:1968
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
FormattedNumber format_hex(uint64_t N, unsigned Width, bool Upper=false)
format_hex - Output N as a fixed width hexadecimal.
Definition Format.h:191
FormattedNumber format_hex_no_prefix(uint64_t N, unsigned Width, bool Upper=false)
format_hex_no_prefix - Output N as a fixed width hexadecimal.
Definition Format.h:204
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
constexpr int PoisonMaskElem
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
LLVM_ABI Printable printBasicBlock(const BasicBlock *BB)
Print BasicBlock BB as an operand or print "<nullptr>" if BB is a nullptr.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
bool pred_empty(const BasicBlock *BB)
Definition CFG.h:119
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
@ Default
The result values are uniform if and only if all operands are uniform.
Definition Uniformity.h:20
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI void printLLVMNameWithoutPrefix(raw_ostream &OS, StringRef Name)
Print out a name of an LLVM value without any prefixes.
#define N
#define NC
Definition regutils.h:42
A single checksum, represented by a Kind and a Value (a string).
T Value
The string value of the checksum.
StringRef getKindAsString() const
std::vector< ConstVCall > TypeCheckedLoadConstVCalls
std::vector< VFuncId > TypeCheckedLoadVCalls
std::vector< ConstVCall > TypeTestAssumeConstVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
std::vector< GlobalValue::GUID > TypeTests
List of type identifiers used by this function in llvm.type.test intrinsics referenced by something o...
std::vector< VFuncId > TypeTestAssumeVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
unsigned DSOLocal
Indicates that the linker resolved the symbol to a definition from within the same linkage unit.
unsigned CanAutoHide
In the per-module summary, indicates that the global value is linkonce_odr and global unnamed addr (s...
unsigned ImportType
This field is written by the ThinLTO indexing step to postlink combined summary.
unsigned NotEligibleToImport
Indicate if the global value cannot be imported (e.g.
unsigned Linkage
The linkage type of the associated global value.
unsigned Visibility
Indicates the visibility.
unsigned Live
In per-module summary, indicate that the global value must be considered a live root for index-based ...
StringRef getTagName() const
Return the tag of this operand bundle as a string.
ArrayRef< Use > Inputs
A utility class that uses RAII to save and restore the value of a variable.
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
TypeTestResolution TTRes
Kind
Specifies which kind of type check we should emit for this byte array.
@ Unknown
Unknown (analysis not performed, don't lower)
@ Single
Single element (last example in "Short Inline Bit Vectors")
@ Inline
Inlined bit vector ("Short Inline Bit Vectors")
@ Unsat
Unsatisfiable type (i.e. no global has this type metadata)
@ AllOnes
All-ones bit vector ("Eliminating Bit Vector Checks for All-Ones Bit Vectors")
@ ByteArray
Test a byte array (first example)
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
@ UniformRetVal
Uniform return value optimization.
@ VirtualConstProp
Virtual constant propagation.
@ UniqueRetVal
Unique return value optimization.
@ Indir
Just do a regular virtual call.
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
@ SingleImpl
Single implementation devirtualization.
@ Indir
Just do a regular virtual call.
@ BranchFunnel
When retpoline mitigation is enabled, use a branch funnel that is defined in the merged module.
Function object to check whether the second component of a container supported by std::get (like std:...
Definition STLExtras.h:1446