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::ByteTyID:
673 OS << 'b' << Ty->getByteBitWidth();
674 return;
675 case Type::IntegerTyID:
676 OS << 'i' << cast<IntegerType>(Ty)->getBitWidth();
677 return;
678
679 case Type::FunctionTyID: {
680 FunctionType *FTy = cast<FunctionType>(Ty);
681 print(FTy->getReturnType(), OS);
682 OS << " (";
683 ListSeparator LS;
684 for (Type *Ty : FTy->params()) {
685 OS << LS;
686 print(Ty, OS);
687 }
688 if (FTy->isVarArg())
689 OS << LS << "...";
690 OS << ')';
691 return;
692 }
693 case Type::StructTyID: {
694 StructType *STy = cast<StructType>(Ty);
695
696 if (STy->isLiteral())
697 return printStructBody(STy, OS);
698
699 if (!STy->getName().empty())
700 return printLLVMName(OS, STy->getName(), LocalPrefix);
701
702 incorporateTypes();
703 const auto I = Type2Number.find(STy);
704 if (I != Type2Number.end())
705 OS << '%' << I->second;
706 else // Not enumerated, print the hex address.
707 OS << "%\"type " << STy << '\"';
708 return;
709 }
710 case Type::PointerTyID: {
712 OS << "ptr";
713 printAddressSpace(M, PTy->getAddressSpace(), OS);
714 return;
715 }
716 case Type::ArrayTyID: {
717 ArrayType *ATy = cast<ArrayType>(Ty);
718 OS << '[' << ATy->getNumElements() << " x ";
719 print(ATy->getElementType(), OS);
720 OS << ']';
721 return;
722 }
723 case Type::FixedVectorTyID:
724 case Type::ScalableVectorTyID: {
725 VectorType *PTy = cast<VectorType>(Ty);
726 ElementCount EC = PTy->getElementCount();
727 OS << "<";
728 if (EC.isScalable())
729 OS << "vscale x ";
730 OS << EC.getKnownMinValue() << " x ";
731 print(PTy->getElementType(), OS);
732 OS << '>';
733 return;
734 }
735 case Type::TypedPointerTyID: {
736 TypedPointerType *TPTy = cast<TypedPointerType>(Ty);
737 OS << "typedptr(" << *TPTy->getElementType() << ", "
738 << TPTy->getAddressSpace() << ")";
739 return;
740 }
741 case Type::TargetExtTyID:
742 TargetExtType *TETy = cast<TargetExtType>(Ty);
743 OS << "target(\"";
745 OS << "\"";
746 for (Type *Inner : TETy->type_params()) {
747 OS << ", ";
748 Inner->print(OS, /*IsForDebug=*/false, /*NoDetails=*/true);
749 }
750 for (unsigned IntParam : TETy->int_params())
751 OS << ", " << IntParam;
752 OS << ")";
753 return;
754 }
755 llvm_unreachable("Invalid TypeID");
756}
757
758void TypePrinting::printStructBody(StructType *STy, raw_ostream &OS) {
759 if (STy->isOpaque()) {
760 OS << "opaque";
761 return;
762 }
763
764 if (STy->isPacked())
765 OS << '<';
766
767 if (STy->getNumElements() == 0) {
768 OS << "{}";
769 } else {
770 OS << "{ ";
771 ListSeparator LS;
772 for (Type *Ty : STy->elements()) {
773 OS << LS;
774 print(Ty, OS);
775 }
776
777 OS << " }";
778 }
779 if (STy->isPacked())
780 OS << '>';
781}
782
784
785//===----------------------------------------------------------------------===//
786// SlotTracker Class: Enumerate slot numbers for unnamed values
787//===----------------------------------------------------------------------===//
788/// This class provides computation of slot numbers for LLVM Assembly writing.
789///
791public:
792 /// ValueMap - A mapping of Values to slot numbers.
794
795private:
796 /// TheModule - The module for which we are holding slot numbers.
797 const Module* TheModule;
798
799 /// TheFunction - The function for which we are holding slot numbers.
800 const Function* TheFunction = nullptr;
801 bool FunctionProcessed = false;
802 bool ShouldInitializeAllMetadata;
803
804 std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
805 ProcessModuleHookFn;
806 std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
807 ProcessFunctionHookFn;
808
809 /// The summary index for which we are holding slot numbers.
810 const ModuleSummaryIndex *TheIndex = nullptr;
811
812 /// mMap - The slot map for the module level data.
813 ValueMap mMap;
814 unsigned mNext = 0;
815
816 /// fMap - The slot map for the function level data.
817 ValueMap fMap;
818 unsigned fNext = 0;
819
820 /// mdnMap - Map for MDNodes.
822 unsigned mdnNext = 0;
823
824 /// asMap - The slot map for attribute sets.
826 unsigned asNext = 0;
827
828 /// ModulePathMap - The slot map for Module paths used in the summary index.
829 StringMap<unsigned> ModulePathMap;
830 unsigned ModulePathNext = 0;
831
832 /// GUIDMap - The slot map for GUIDs used in the summary index.
834 unsigned GUIDNext = 0;
835
836 /// TypeIdMap - The slot map for type ids used in the summary index.
837 StringMap<unsigned> TypeIdMap;
838 unsigned TypeIdNext = 0;
839
840 /// TypeIdCompatibleVtableMap - The slot map for type compatible vtable ids
841 /// used in the summary index.
842 StringMap<unsigned> TypeIdCompatibleVtableMap;
843 unsigned TypeIdCompatibleVtableNext = 0;
844
845public:
846 /// Construct from a module.
847 ///
848 /// If \c ShouldInitializeAllMetadata, initializes all metadata in all
849 /// functions, giving correct numbering for metadata referenced only from
850 /// within a function (even if no functions have been initialized).
851 explicit SlotTracker(const Module *M,
852 bool ShouldInitializeAllMetadata = false);
853
854 /// Construct from a function, starting out in incorp state.
855 ///
856 /// If \c ShouldInitializeAllMetadata, initializes all metadata in all
857 /// functions, giving correct numbering for metadata referenced only from
858 /// within a function (even if no functions have been initialized).
859 explicit SlotTracker(const Function *F,
860 bool ShouldInitializeAllMetadata = false);
861
862 /// Construct from a module summary index.
863 explicit SlotTracker(const ModuleSummaryIndex *Index);
864
865 SlotTracker(const SlotTracker &) = delete;
867
868 ~SlotTracker() override = default;
869
870 void setProcessHook(
871 std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>);
872 void setProcessHook(std::function<void(AbstractSlotTrackerStorage *,
873 const Function *, bool)>);
874
875 unsigned getNextMetadataSlot() override { return mdnNext; }
876
877 void createMetadataSlot(const MDNode *N) override;
878
879 /// Return the slot number of the specified value in it's type
880 /// plane. If something is not in the SlotTracker, return -1.
881 int getLocalSlot(const Value *V);
882 int getGlobalSlot(const GlobalValue *V);
883 int getMetadataSlot(const MDNode *N) override;
884 int getAttributeGroupSlot(AttributeSet AS);
885 int getModulePathSlot(StringRef Path);
886 int getGUIDSlot(GlobalValue::GUID GUID);
887 int getTypeIdSlot(StringRef Id);
888 int getTypeIdCompatibleVtableSlot(StringRef Id);
889
890 /// If you'd like to deal with a function instead of just a module, use
891 /// this method to get its data into the SlotTracker.
893 TheFunction = F;
894 FunctionProcessed = false;
895 }
896
897 const Function *getFunction() const { return TheFunction; }
898
899 /// After calling incorporateFunction, use this method to remove the
900 /// most recently incorporated function from the SlotTracker. This
901 /// will reset the state of the machine back to just the module contents.
902 void purgeFunction();
903
904 /// MDNode map iterators.
906
907 mdn_iterator mdn_begin() { return mdnMap.begin(); }
908 mdn_iterator mdn_end() { return mdnMap.end(); }
909 unsigned mdn_size() const { return mdnMap.size(); }
910 bool mdn_empty() const { return mdnMap.empty(); }
911
912 /// AttributeSet map iterators.
914
915 as_iterator as_begin() { return asMap.begin(); }
916 as_iterator as_end() { return asMap.end(); }
917 unsigned as_size() const { return asMap.size(); }
918 bool as_empty() const { return asMap.empty(); }
919
920 /// GUID map iterators.
922
923 /// These functions do the actual initialization.
924 inline void initializeIfNeeded();
926
927 // Implementation Details
928private:
929 /// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.
930 void CreateModuleSlot(const GlobalValue *V);
931
932 /// CreateMetadataSlot - Insert the specified MDNode* into the slot table.
933 void CreateMetadataSlot(const MDNode *N);
934
935 /// CreateFunctionSlot - Insert the specified Value* into the slot table.
936 void CreateFunctionSlot(const Value *V);
937
938 /// Insert the specified AttributeSet into the slot table.
939 void CreateAttributeSetSlot(AttributeSet AS);
940
941 inline void CreateModulePathSlot(StringRef Path);
942 void CreateGUIDSlot(GlobalValue::GUID GUID);
943 void CreateTypeIdSlot(StringRef Id);
944 void CreateTypeIdCompatibleVtableSlot(StringRef Id);
945
946 /// Add all of the module level global variables (and their initializers)
947 /// and function declarations, but not the contents of those functions.
948 void processModule();
949 // Returns number of allocated slots
950 int processIndex();
951
952 /// Add all of the functions arguments, basic blocks, and instructions.
953 void processFunction();
954
955 /// Add the metadata directly attached to a GlobalObject.
956 void processGlobalObjectMetadata(const GlobalObject &GO);
957
958 /// Add all of the metadata from a function.
959 void processFunctionMetadata(const Function &F);
960
961 /// Add all of the metadata from an instruction.
962 void processInstructionMetadata(const Instruction &I);
963
964 /// Add all of the metadata from a DbgRecord.
965 void processDbgRecordMetadata(const DbgRecord &DVR);
966};
967
969 const Function *F)
970 : M(M), F(F), Machine(&Machine) {}
971
973 bool ShouldInitializeAllMetadata)
974 : ShouldCreateStorage(M),
975 ShouldInitializeAllMetadata(ShouldInitializeAllMetadata), M(M) {}
976
978
980 if (!ShouldCreateStorage)
981 return Machine;
982
983 ShouldCreateStorage = false;
984 MachineStorage =
985 std::make_unique<SlotTracker>(M, ShouldInitializeAllMetadata);
986 Machine = MachineStorage.get();
987 if (ProcessModuleHookFn)
988 Machine->setProcessHook(ProcessModuleHookFn);
989 if (ProcessFunctionHookFn)
990 Machine->setProcessHook(ProcessFunctionHookFn);
991 return Machine;
992}
993
995 // Using getMachine() may lazily create the slot tracker.
996 if (!getMachine())
997 return;
998
999 // Nothing to do if this is the right function already.
1000 if (this->F == &F)
1001 return;
1002 if (this->F)
1003 Machine->purgeFunction();
1004 Machine->incorporateFunction(&F);
1005 this->F = &F;
1006}
1007
1009 assert(F && "No function incorporated");
1010 return Machine->getLocalSlot(V);
1011}
1012
1014 std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
1015 Fn) {
1016 ProcessModuleHookFn = std::move(Fn);
1017}
1018
1020 std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
1021 Fn) {
1022 ProcessFunctionHookFn = std::move(Fn);
1023}
1024
1026 if (const auto *FA = dyn_cast<Argument>(V))
1027 return new SlotTracker(FA->getParent());
1028
1029 if (const auto *I = dyn_cast<Instruction>(V))
1030 if (I->getParent())
1031 return new SlotTracker(I->getParent()->getParent());
1032
1033 if (const auto *BB = dyn_cast<BasicBlock>(V))
1034 return new SlotTracker(BB->getParent());
1035
1036 if (const auto *GV = dyn_cast<GlobalVariable>(V))
1037 return new SlotTracker(GV->getParent());
1038
1039 if (const auto *GA = dyn_cast<GlobalAlias>(V))
1040 return new SlotTracker(GA->getParent());
1041
1042 if (const auto *GIF = dyn_cast<GlobalIFunc>(V))
1043 return new SlotTracker(GIF->getParent());
1044
1045 if (const auto *Func = dyn_cast<Function>(V))
1046 return new SlotTracker(Func);
1047
1048 return nullptr;
1049}
1050
1051#if 0
1052#define ST_DEBUG(X) dbgs() << X
1053#else
1054#define ST_DEBUG(X)
1055#endif
1056
1057// Module level constructor. Causes the contents of the Module (sans functions)
1058// to be added to the slot table.
1059SlotTracker::SlotTracker(const Module *M, bool ShouldInitializeAllMetadata)
1060 : TheModule(M), ShouldInitializeAllMetadata(ShouldInitializeAllMetadata) {}
1061
1062// Function level constructor. Causes the contents of the Module and the one
1063// function provided to be added to the slot table.
1064SlotTracker::SlotTracker(const Function *F, bool ShouldInitializeAllMetadata)
1065 : TheModule(F ? F->getParent() : nullptr), TheFunction(F),
1066 ShouldInitializeAllMetadata(ShouldInitializeAllMetadata) {}
1067
1069 : TheModule(nullptr), ShouldInitializeAllMetadata(false), TheIndex(Index) {}
1070
1072 if (TheModule) {
1073 processModule();
1074 TheModule = nullptr; ///< Prevent re-processing next time we're called.
1075 }
1076
1077 if (TheFunction && !FunctionProcessed)
1078 processFunction();
1079}
1080
1082 if (!TheIndex)
1083 return 0;
1084 int NumSlots = processIndex();
1085 TheIndex = nullptr; ///< Prevent re-processing next time we're called.
1086 return NumSlots;
1087}
1088
1089// Iterate through all the global variables, functions, and global
1090// variable initializers and create slots for them.
1091void SlotTracker::processModule() {
1092 ST_DEBUG("begin processModule!\n");
1093
1094 // Add all of the unnamed global variables to the value table.
1095 for (const GlobalVariable &Var : TheModule->globals()) {
1096 if (!Var.hasName())
1097 CreateModuleSlot(&Var);
1098 processGlobalObjectMetadata(Var);
1099 auto Attrs = Var.getAttributes();
1100 if (Attrs.hasAttributes())
1101 CreateAttributeSetSlot(Attrs);
1102 }
1103
1104 for (const GlobalAlias &A : TheModule->aliases()) {
1105 if (!A.hasName())
1106 CreateModuleSlot(&A);
1107 }
1108
1109 for (const GlobalIFunc &I : TheModule->ifuncs()) {
1110 if (!I.hasName())
1111 CreateModuleSlot(&I);
1112 processGlobalObjectMetadata(I);
1113 }
1114
1115 // Add metadata used by named metadata.
1116 for (const NamedMDNode &NMD : TheModule->named_metadata()) {
1117 for (const MDNode *N : NMD.operands())
1118 CreateMetadataSlot(N);
1119 }
1120
1121 for (const Function &F : *TheModule) {
1122 if (!F.hasName())
1123 // Add all the unnamed functions to the table.
1124 CreateModuleSlot(&F);
1125
1126 if (ShouldInitializeAllMetadata)
1127 processFunctionMetadata(F);
1128
1129 // Add all the function attributes to the table.
1130 // FIXME: Add attributes of other objects?
1131 AttributeSet FnAttrs = F.getAttributes().getFnAttrs();
1132 if (FnAttrs.hasAttributes())
1133 CreateAttributeSetSlot(FnAttrs);
1134 }
1135
1136 if (ProcessModuleHookFn)
1137 ProcessModuleHookFn(this, TheModule, ShouldInitializeAllMetadata);
1138
1139 ST_DEBUG("end processModule!\n");
1140}
1141
1142// Process the arguments, basic blocks, and instructions of a function.
1143void SlotTracker::processFunction() {
1144 ST_DEBUG("begin processFunction!\n");
1145 fNext = 0;
1146
1147 // Process function metadata if it wasn't hit at the module-level.
1148 if (!ShouldInitializeAllMetadata)
1149 processFunctionMetadata(*TheFunction);
1150
1151 // Add all the function arguments with no names.
1152 for(Function::const_arg_iterator AI = TheFunction->arg_begin(),
1153 AE = TheFunction->arg_end(); AI != AE; ++AI)
1154 if (!AI->hasName())
1155 CreateFunctionSlot(&*AI);
1156
1157 ST_DEBUG("Inserting Instructions:\n");
1158
1159 // Add all of the basic blocks and instructions with no names.
1160 for (auto &BB : *TheFunction) {
1161 if (!BB.hasName())
1162 CreateFunctionSlot(&BB);
1163
1164 for (auto &I : BB) {
1165 if (!I.getType()->isVoidTy() && !I.hasName())
1166 CreateFunctionSlot(&I);
1167
1168 // We allow direct calls to any llvm.foo function here, because the
1169 // target may not be linked into the optimizer.
1170 if (const auto *Call = dyn_cast<CallBase>(&I)) {
1171 // Add all the call attributes to the table.
1172 AttributeSet Attrs = Call->getAttributes().getFnAttrs();
1173 if (Attrs.hasAttributes())
1174 CreateAttributeSetSlot(Attrs);
1175 }
1176 }
1177 }
1178
1179 if (ProcessFunctionHookFn)
1180 ProcessFunctionHookFn(this, TheFunction, ShouldInitializeAllMetadata);
1181
1182 FunctionProcessed = true;
1183
1184 ST_DEBUG("end processFunction!\n");
1185}
1186
1187// Iterate through all the GUID in the index and create slots for them.
1188int SlotTracker::processIndex() {
1189 ST_DEBUG("begin processIndex!\n");
1190 assert(TheIndex);
1191
1192 // The first block of slots are just the module ids, which start at 0 and are
1193 // assigned consecutively. Since the StringMap iteration order isn't
1194 // guaranteed, order by path string before assigning slots.
1195 std::vector<StringRef> ModulePaths;
1196 for (auto &[ModPath, _] : TheIndex->modulePaths())
1197 ModulePaths.push_back(ModPath);
1198 llvm::sort(ModulePaths);
1199 for (auto &ModPath : ModulePaths)
1200 CreateModulePathSlot(ModPath);
1201
1202 // Start numbering the GUIDs after the module ids.
1203 GUIDNext = ModulePathNext;
1204
1205 for (auto &GlobalList : *TheIndex)
1206 CreateGUIDSlot(GlobalList.first);
1207
1208 // Start numbering the TypeIdCompatibleVtables after the GUIDs.
1209 TypeIdCompatibleVtableNext = GUIDNext;
1210 for (auto &TId : TheIndex->typeIdCompatibleVtableMap())
1211 CreateTypeIdCompatibleVtableSlot(TId.first);
1212
1213 // Start numbering the TypeIds after the TypeIdCompatibleVtables.
1214 TypeIdNext = TypeIdCompatibleVtableNext;
1215 for (const auto &TID : TheIndex->typeIds())
1216 CreateTypeIdSlot(TID.second.first);
1217
1218 ST_DEBUG("end processIndex!\n");
1219 return TypeIdNext;
1220}
1221
1222void SlotTracker::processGlobalObjectMetadata(const GlobalObject &GO) {
1224 GO.getAllMetadata(MDs);
1225 for (auto &MD : MDs)
1226 CreateMetadataSlot(MD.second);
1227}
1228
1229void SlotTracker::processFunctionMetadata(const Function &F) {
1230 processGlobalObjectMetadata(F);
1231 for (auto &BB : F) {
1232 for (auto &I : BB) {
1233 for (const DbgRecord &DR : I.getDbgRecordRange())
1234 processDbgRecordMetadata(DR);
1235 processInstructionMetadata(I);
1236 }
1237 }
1238}
1239
1240void SlotTracker::processDbgRecordMetadata(const DbgRecord &DR) {
1241 // Tolerate null metadata pointers: it's a completely illegal debug record,
1242 // but we can have faulty metadata from debug-intrinsic days being
1243 // autoupgraded into debug records. This gets caught by the verifier, which
1244 // then will print the faulty IR, hitting this code path.
1245 if (const auto *DVR = dyn_cast<const DbgVariableRecord>(&DR)) {
1246 // Process metadata used by DbgRecords; we only specifically care about the
1247 // DILocalVariable, DILocation, and DIAssignID fields, as the Value and
1248 // Expression fields should only be printed inline and so do not use a slot.
1249 // Note: The above doesn't apply for empty-metadata operands.
1250 if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawLocation()))
1251 CreateMetadataSlot(Empty);
1252 if (DVR->getRawVariable())
1253 CreateMetadataSlot(DVR->getRawVariable());
1254 if (DVR->isDbgAssign()) {
1255 if (auto *AssignID = DVR->getRawAssignID())
1256 CreateMetadataSlot(cast<MDNode>(AssignID));
1257 if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawAddress()))
1258 CreateMetadataSlot(Empty);
1259 }
1260 } else if (const auto *DLR = dyn_cast<const DbgLabelRecord>(&DR)) {
1261 CreateMetadataSlot(DLR->getRawLabel());
1262 } else {
1263 llvm_unreachable("unsupported DbgRecord kind");
1264 }
1265 if (DR.getDebugLoc())
1266 CreateMetadataSlot(DR.getDebugLoc().getAsMDNode());
1267}
1268
1269void SlotTracker::processInstructionMetadata(const Instruction &I) {
1270 // Process metadata used directly by intrinsics.
1271 if (const auto *CI = dyn_cast<CallInst>(&I))
1272 if (Function *F = CI->getCalledFunction())
1273 if (F->isIntrinsic())
1274 for (auto &Op : I.operands())
1276 if (auto *N = dyn_cast<MDNode>(V->getMetadata()))
1277 CreateMetadataSlot(N);
1278
1279 // Process metadata attached to this instruction.
1281 I.getAllMetadata(MDs);
1282 for (auto &MD : MDs)
1283 CreateMetadataSlot(MD.second);
1284}
1285
1286/// Clean up after incorporating a function. This is the only way to get out of
1287/// the function incorporation state that affects get*Slot/Create*Slot. Function
1288/// incorporation state is indicated by TheFunction != 0.
1290 ST_DEBUG("begin purgeFunction!\n");
1291 fMap.clear(); // Simply discard the function level map
1292 TheFunction = nullptr;
1293 FunctionProcessed = false;
1294 ST_DEBUG("end purgeFunction!\n");
1295}
1296
1297/// getGlobalSlot - Get the slot number of a global value.
1299 // Check for uninitialized state and do lazy initialization.
1301
1302 // Find the value in the module map
1303 ValueMap::iterator MI = mMap.find(V);
1304 return MI == mMap.end() ? -1 : (int)MI->second;
1305}
1306
1308 std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
1309 Fn) {
1310 ProcessModuleHookFn = std::move(Fn);
1311}
1312
1314 std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
1315 Fn) {
1316 ProcessFunctionHookFn = std::move(Fn);
1317}
1318
1319/// getMetadataSlot - Get the slot number of a MDNode.
1320void SlotTracker::createMetadataSlot(const MDNode *N) { CreateMetadataSlot(N); }
1321
1322/// getMetadataSlot - Get the slot number of a MDNode.
1324 // Check for uninitialized state and do lazy initialization.
1326
1327 // Find the MDNode in the module map
1328 mdn_iterator MI = mdnMap.find(N);
1329 return MI == mdnMap.end() ? -1 : (int)MI->second;
1330}
1331
1332/// getLocalSlot - Get the slot number for a value that is local to a function.
1334 assert(!isa<Constant>(V) && "Can't get a constant or global slot with this!");
1335
1336 // Check for uninitialized state and do lazy initialization.
1338
1339 ValueMap::iterator FI = fMap.find(V);
1340 return FI == fMap.end() ? -1 : (int)FI->second;
1341}
1342
1344 // Check for uninitialized state and do lazy initialization.
1346
1347 // Find the AttributeSet in the module map.
1348 as_iterator AI = asMap.find(AS);
1349 return AI == asMap.end() ? -1 : (int)AI->second;
1350}
1351
1353 // Check for uninitialized state and do lazy initialization.
1355
1356 // Find the Module path in the map
1357 auto I = ModulePathMap.find(Path);
1358 return I == ModulePathMap.end() ? -1 : (int)I->second;
1359}
1360
1362 // Check for uninitialized state and do lazy initialization.
1364
1365 // Find the GUID in the map
1366 guid_iterator I = GUIDMap.find(GUID);
1367 return I == GUIDMap.end() ? -1 : (int)I->second;
1368}
1369
1371 // Check for uninitialized state and do lazy initialization.
1373
1374 // Find the TypeId string in the map
1375 auto I = TypeIdMap.find(Id);
1376 return I == TypeIdMap.end() ? -1 : (int)I->second;
1377}
1378
1380 // Check for uninitialized state and do lazy initialization.
1382
1383 // Find the TypeIdCompatibleVtable string in the map
1384 auto I = TypeIdCompatibleVtableMap.find(Id);
1385 return I == TypeIdCompatibleVtableMap.end() ? -1 : (int)I->second;
1386}
1387
1388/// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.
1389void SlotTracker::CreateModuleSlot(const GlobalValue *V) {
1390 assert(V && "Can't insert a null Value into SlotTracker!");
1391 assert(!V->getType()->isVoidTy() && "Doesn't need a slot!");
1392 assert(!V->hasName() && "Doesn't need a slot!");
1393
1394 unsigned DestSlot = mNext++;
1395 mMap[V] = DestSlot;
1396
1397 ST_DEBUG(" Inserting value [" << V->getType() << "] = " << V << " slot=" <<
1398 DestSlot << " [");
1399 // G = Global, F = Function, A = Alias, I = IFunc, o = other
1400 ST_DEBUG((isa<GlobalVariable>(V) ? 'G' :
1401 (isa<Function>(V) ? 'F' :
1402 (isa<GlobalAlias>(V) ? 'A' :
1403 (isa<GlobalIFunc>(V) ? 'I' : 'o')))) << "]\n");
1404}
1405
1406/// CreateSlot - Create a new slot for the specified value if it has no name.
1407void SlotTracker::CreateFunctionSlot(const Value *V) {
1408 assert(!V->getType()->isVoidTy() && !V->hasName() && "Doesn't need a slot!");
1409
1410 unsigned DestSlot = fNext++;
1411 fMap[V] = DestSlot;
1412
1413 // G = Global, F = Function, o = other
1414 ST_DEBUG(" Inserting value [" << V->getType() << "] = " << V << " slot=" <<
1415 DestSlot << " [o]\n");
1416}
1417
1418/// CreateModuleSlot - Insert the specified MDNode* into the slot table.
1419void SlotTracker::CreateMetadataSlot(const MDNode *N) {
1420 assert(N && "Can't insert a null Value into SlotTracker!");
1421
1422 // Don't make slots for DIExpressions. We just print them inline everywhere.
1423 if (isa<DIExpression>(N))
1424 return;
1425
1426 unsigned DestSlot = mdnNext;
1427 if (!mdnMap.insert(std::make_pair(N, DestSlot)).second)
1428 return;
1429 ++mdnNext;
1430
1431 // Recursively add any MDNodes referenced by operands.
1432 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
1433 if (const auto *Op = dyn_cast_or_null<MDNode>(N->getOperand(i)))
1434 CreateMetadataSlot(Op);
1435}
1436
1437void SlotTracker::CreateAttributeSetSlot(AttributeSet AS) {
1438 assert(AS.hasAttributes() && "Doesn't need a slot!");
1439
1440 if (asMap.try_emplace(AS, asNext).second)
1441 ++asNext;
1442}
1443
1444/// Create a new slot for the specified Module
1445void SlotTracker::CreateModulePathSlot(StringRef Path) {
1446 ModulePathMap[Path] = ModulePathNext++;
1447}
1448
1449/// Create a new slot for the specified GUID
1450void SlotTracker::CreateGUIDSlot(GlobalValue::GUID GUID) {
1451 GUIDMap[GUID] = GUIDNext++;
1452}
1453
1454/// Create a new slot for the specified Id
1455void SlotTracker::CreateTypeIdSlot(StringRef Id) {
1456 TypeIdMap[Id] = TypeIdNext++;
1457}
1458
1459/// Create a new slot for the specified Id
1460void SlotTracker::CreateTypeIdCompatibleVtableSlot(StringRef Id) {
1461 TypeIdCompatibleVtableMap[Id] = TypeIdCompatibleVtableNext++;
1462}
1463
1464namespace {
1465/// Common instances used by most of the printer functions.
1466struct AsmWriterContext {
1467 TypePrinting *TypePrinter = nullptr;
1468 SlotTracker *Machine = nullptr;
1469 const Module *Context = nullptr;
1470
1471 AsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M = nullptr)
1472 : TypePrinter(TP), Machine(ST), Context(M) {}
1473
1474 static AsmWriterContext &getEmpty() {
1475 static AsmWriterContext EmptyCtx(nullptr, nullptr);
1476 return EmptyCtx;
1477 }
1478
1479 /// A callback that will be triggered when the underlying printer
1480 /// prints a Metadata as operand.
1481 virtual void onWriteMetadataAsOperand(const Metadata *) {}
1482
1483 virtual ~AsmWriterContext() = default;
1484};
1485} // end anonymous namespace
1486
1487//===----------------------------------------------------------------------===//
1488// AsmWriter Implementation
1489//===----------------------------------------------------------------------===//
1490
1491static void writeAsOperandInternal(raw_ostream &Out, const Value *V,
1492 AsmWriterContext &WriterCtx,
1493 bool PrintType = false);
1494
1495static void writeAsOperandInternal(raw_ostream &Out, const Metadata *MD,
1496 AsmWriterContext &WriterCtx,
1497 bool FromValue = false);
1498
1499static void writeOptimizationInfo(raw_ostream &Out, const User *U) {
1500 if (const auto *FPO = dyn_cast<const FPMathOperator>(U))
1501 Out << FPO->getFastMathFlags();
1502
1503 if (const auto *OBO = dyn_cast<OverflowingBinaryOperator>(U)) {
1504 if (OBO->hasNoUnsignedWrap())
1505 Out << " nuw";
1506 if (OBO->hasNoSignedWrap())
1507 Out << " nsw";
1508 } else if (const auto *Div = dyn_cast<PossiblyExactOperator>(U)) {
1509 if (Div->isExact())
1510 Out << " exact";
1511 } else if (const auto *PDI = dyn_cast<PossiblyDisjointInst>(U)) {
1512 if (PDI->isDisjoint())
1513 Out << " disjoint";
1514 } else if (const auto *GEP = dyn_cast<GEPOperator>(U)) {
1515 if (GEP->isInBounds())
1516 Out << " inbounds";
1517 else if (GEP->hasNoUnsignedSignedWrap())
1518 Out << " nusw";
1519 if (GEP->hasNoUnsignedWrap())
1520 Out << " nuw";
1521 if (auto InRange = GEP->getInRange()) {
1522 Out << " inrange(" << InRange->getLower() << ", " << InRange->getUpper()
1523 << ")";
1524 }
1525 } else if (const auto *NNI = dyn_cast<PossiblyNonNegInst>(U)) {
1526 if (NNI->hasNonNeg())
1527 Out << " nneg";
1528 } else if (const auto *TI = dyn_cast<TruncInst>(U)) {
1529 if (TI->hasNoUnsignedWrap())
1530 Out << " nuw";
1531 if (TI->hasNoSignedWrap())
1532 Out << " nsw";
1533 } else if (const auto *ICmp = dyn_cast<ICmpInst>(U)) {
1534 if (ICmp->hasSameSign())
1535 Out << " samesign";
1536 }
1537}
1538
1539static void WriteFullHexAPInt(raw_ostream &Out, const APInt &Val) {
1541 Val.toStringUnsigned(Bits, 16);
1542 unsigned NumDigits = std::max((Val.getBitWidth() + 3) / 4, 1U);
1543 Out << "0x";
1544 for (unsigned i = 0; i < NumDigits - Bits.size(); i++)
1545 Out << '0';
1546 Out << Bits;
1547}
1548
1549static void writeAPFloatInternal(raw_ostream &Out, const APFloat &APF) {
1550 bool ForceBitwiseOutput = false;
1551 if (&APF.getSemantics() == &APFloat::PPCDoubleDouble()) {
1552 // ppc_fp128 types are double-double. The special cases set the second
1553 // (high) double to +0.0, so if the high word is nonzero, force the use of
1554 // bitwise output.
1555 APInt HiWord = APF.bitcastToAPInt().lshr(64);
1556 ForceBitwiseOutput = !HiWord.isZero();
1557 }
1558
1559 if (!ForceBitwiseOutput) {
1560 // Check for special values in APFloat.
1561 if (APF.isInfinity()) {
1562 Out << (APF.isNegative() ? '-' : '+') << "inf";
1563 return;
1564 }
1565
1566 if (APF.isNaN()) {
1567 Out << (APF.isNegative() ? '-' : '+');
1568 APInt Payload = APF.getNaNPayload();
1569 // The quiet bit of a NaN is the highest bit of the payload, so the
1570 // preferred QNaN value happens to be the sign mask value.
1571 if (Payload.isSignMask()) {
1572 Out << "qnan";
1573 } else {
1574 if (APF.isSignaling())
1575 Out << 's';
1576 Out << "nan(";
1577 // Clear out the signaling/quiet bit of the payload for output.
1578 Payload.clearBit(Payload.getBitWidth() - 1);
1579 // Trim the string to exclude leading 0's.
1580 WriteFullHexAPInt(Out, Payload.trunc(Payload.getActiveBits()));
1581 Out << ')';
1582 }
1583 return;
1584 }
1585 }
1586
1587 // Try for a decimal string output. If the value is convertible back to the
1588 // same APFloat value, then we know that it is safe to use it. Otherwise, fall
1589 // back onto the hexadecimal format.
1590 SmallString<128> StrVal;
1591 APF.toString(StrVal, 6, 0, false);
1592 if (APFloat(APF.getSemantics(), StrVal) == APF) {
1593 Out << StrVal;
1594 return;
1595 }
1596
1597 // Fallback to the hexadecimal format representing the bit string exactly.
1598 Out << 'f';
1599 APInt API = APF.bitcastToAPInt();
1600 WriteFullHexAPInt(Out, API);
1601}
1602
1603static void writeConstantInternal(raw_ostream &Out, const Constant *CV,
1604 AsmWriterContext &WriterCtx) {
1605 if (const auto *CI = dyn_cast<ConstantInt>(CV)) {
1606 Type *Ty = CI->getType();
1607
1608 if (Ty->isVectorTy()) {
1609 Out << "splat (";
1610 WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);
1611 Out << " ";
1612 }
1613
1614 if (Ty->getScalarType()->isIntegerTy(1))
1615 Out << (CI->getZExtValue() ? "true" : "false");
1616 else
1617 Out << CI->getValue();
1618
1619 if (Ty->isVectorTy())
1620 Out << ")";
1621
1622 return;
1623 }
1624
1625 if (const auto *CB = dyn_cast<ConstantByte>(CV)) {
1626 Type *Ty = CB->getType();
1627
1628 if (Ty->isVectorTy()) {
1629 Out << "splat (";
1630 WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);
1631 Out << " ";
1632 }
1633
1634 Out << CB->getValue();
1635
1636 if (Ty->isVectorTy())
1637 Out << ")";
1638
1639 return;
1640 }
1641
1642 if (const auto *CFP = dyn_cast<ConstantFP>(CV)) {
1643 Type *Ty = CFP->getType();
1644
1645 if (Ty->isVectorTy()) {
1646 if (CFP->isPosZero()) {
1647 Out << "zeroinitializer";
1648 return;
1649 }
1650
1651 Out << "splat (";
1652 WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);
1653 Out << " ";
1654 }
1655
1656 writeAPFloatInternal(Out, CFP->getValueAPF());
1657
1658 if (Ty->isVectorTy())
1659 Out << ")";
1660
1661 return;
1662 }
1663
1665 Out << "zeroinitializer";
1666 return;
1667 }
1668
1669 if (const auto *BA = dyn_cast<BlockAddress>(CV)) {
1670 Out << "blockaddress(";
1671 writeAsOperandInternal(Out, BA->getFunction(), WriterCtx);
1672 Out << ", ";
1673 writeAsOperandInternal(Out, BA->getBasicBlock(), WriterCtx);
1674 Out << ")";
1675 return;
1676 }
1677
1678 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(CV)) {
1679 Out << "dso_local_equivalent ";
1680 writeAsOperandInternal(Out, Equiv->getGlobalValue(), WriterCtx);
1681 return;
1682 }
1683
1684 if (const auto *NC = dyn_cast<NoCFIValue>(CV)) {
1685 Out << "no_cfi ";
1686 writeAsOperandInternal(Out, NC->getGlobalValue(), WriterCtx);
1687 return;
1688 }
1689
1690 if (const auto *CPA = dyn_cast<ConstantPtrAuth>(CV)) {
1691 Out << "ptrauth (";
1692
1693 // ptrauth (ptr CST, i32 KEY[, i64 DISC[, ptr ADDRDISC[, ptr DS]?]?]?)
1694 unsigned NumOpsToWrite = 2;
1695 if (!CPA->getOperand(2)->isNullValue())
1696 NumOpsToWrite = 3;
1697 if (!isa<ConstantPointerNull>(CPA->getOperand(3)))
1698 NumOpsToWrite = 4;
1699 if (!isa<ConstantPointerNull>(CPA->getOperand(4)))
1700 NumOpsToWrite = 5;
1701
1702 ListSeparator LS;
1703 for (unsigned i = 0, e = NumOpsToWrite; i != e; ++i) {
1704 Out << LS;
1705 writeAsOperandInternal(Out, CPA->getOperand(i), WriterCtx,
1706 /*PrintType=*/true);
1707 }
1708 Out << ')';
1709 return;
1710 }
1711
1712 if (const auto *CA = dyn_cast<ConstantArray>(CV)) {
1713 Out << '[';
1714 ListSeparator LS;
1715 for (const Value *Op : CA->operands()) {
1716 Out << LS;
1717 writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
1718 }
1719 Out << ']';
1720 return;
1721 }
1722
1723 if (const auto *CA = dyn_cast<ConstantDataArray>(CV)) {
1724 // As a special case, print the array as a string if it is an array of
1725 // i8 with ConstantInt values.
1726 if (CA->isString()) {
1727 Out << "c\"";
1728 printEscapedString(CA->getAsString(), Out);
1729 Out << '"';
1730 return;
1731 }
1732
1733 Out << '[';
1734 ListSeparator LS;
1735 for (uint64_t i = 0, e = CA->getNumElements(); i != e; ++i) {
1736 Out << LS;
1737 writeAsOperandInternal(Out, CA->getElementAsConstant(i), WriterCtx,
1738 /*PrintType=*/true);
1739 }
1740 Out << ']';
1741 return;
1742 }
1743
1744 if (const auto *CS = dyn_cast<ConstantStruct>(CV)) {
1745 if (CS->getType()->isPacked())
1746 Out << '<';
1747 Out << '{';
1748 if (CS->getNumOperands() != 0) {
1749 Out << ' ';
1750 ListSeparator LS;
1751 for (const Value *Op : CS->operands()) {
1752 Out << LS;
1753 writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
1754 }
1755 Out << ' ';
1756 }
1757 Out << '}';
1758 if (CS->getType()->isPacked())
1759 Out << '>';
1760 return;
1761 }
1762
1764 auto *CVVTy = cast<FixedVectorType>(CV->getType());
1765
1766 // Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is
1767 // permitted on IR input to reduce the output changes when enabling
1768 // UseConstant{Int,FP}ForFixedLengthSplat.
1769 // TODO: Remove this block when the UseConstant{Int,FP}ForFixedLengthSplat
1770 // options are removed.
1771 if (auto *SplatVal = CV->getSplatValue()) {
1772 if (isa<ConstantInt>(SplatVal) || isa<ConstantFP>(SplatVal) ||
1773 isa<ConstantByte>(SplatVal)) {
1774 Out << "splat (";
1775 writeAsOperandInternal(Out, SplatVal, WriterCtx, /*PrintType=*/true);
1776 Out << ')';
1777 return;
1778 }
1779 }
1780
1781 Out << '<';
1782 ListSeparator LS;
1783 for (unsigned i = 0, e = CVVTy->getNumElements(); i != e; ++i) {
1784 Out << LS;
1785 writeAsOperandInternal(Out, CV->getAggregateElement(i), WriterCtx,
1786 /*PrintType=*/true);
1787 }
1788 Out << '>';
1789 return;
1790 }
1791
1792 if (const auto *CPN = dyn_cast<ConstantPointerNull>(CV)) {
1793 if (auto *VT = dyn_cast<VectorType>(CPN->getType())) {
1794 Out << "splat (";
1796 ConstantPointerNull::get(VT->getElementType()),
1797 WriterCtx, /*PrintType=*/true);
1798 Out << ')';
1799 return;
1800 }
1801
1802 Out << "null";
1803 return;
1804 }
1805
1806 if (isa<ConstantTokenNone>(CV)) {
1807 Out << "none";
1808 return;
1809 }
1810
1811 if (isa<PoisonValue>(CV)) {
1812 Out << "poison";
1813 return;
1814 }
1815
1816 if (isa<UndefValue>(CV)) {
1817 Out << "undef";
1818 return;
1819 }
1820
1821 if (const auto *CE = dyn_cast<ConstantExpr>(CV)) {
1822 // Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is
1823 // permitted on IR input to reduce the output changes when enabling
1824 // UseConstant{Int,FP}ForScalableSplat.
1825 // TODO: Remove this block when the UseConstant{Int,FP}ForScalableSplat
1826 // options are removed.
1827 if (CE->getOpcode() == Instruction::ShuffleVector) {
1828 if (auto *SplatVal = CE->getSplatValue()) {
1829 if (isa<ConstantInt>(SplatVal) || isa<ConstantFP>(SplatVal) ||
1830 isa<ConstantByte>(SplatVal)) {
1831 Out << "splat (";
1832 writeAsOperandInternal(Out, SplatVal, WriterCtx, /*PrintType=*/true);
1833 Out << ')';
1834 return;
1835 }
1836 }
1837 }
1838
1839 Out << CE->getOpcodeName();
1840 writeOptimizationInfo(Out, CE);
1841 Out << " (";
1842
1843 if (const auto *GEP = dyn_cast<GEPOperator>(CE)) {
1844 WriterCtx.TypePrinter->print(GEP->getSourceElementType(), Out);
1845 Out << ", ";
1846 }
1847
1848 ListSeparator LS;
1849 for (const Value *Op : CE->operands()) {
1850 Out << LS;
1851 writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
1852 }
1853
1854 if (CE->isCast()) {
1855 Out << " to ";
1856 WriterCtx.TypePrinter->print(CE->getType(), Out);
1857 }
1858
1859 if (CE->getOpcode() == Instruction::ShuffleVector)
1860 printShuffleMask(Out, CE->getType(), CE->getShuffleMask());
1861
1862 Out << ')';
1863 return;
1864 }
1865
1866 Out << "<placeholder or erroneous Constant>";
1867}
1868
1869static void writeMDTuple(raw_ostream &Out, const MDTuple *Node,
1870 AsmWriterContext &WriterCtx) {
1871 Out << "!{";
1872 ListSeparator LS;
1873 for (const Metadata *MD : Node->operands()) {
1874 Out << LS;
1875 if (!MD) {
1876 Out << "null";
1877 } else if (auto *MDV = dyn_cast<ValueAsMetadata>(MD)) {
1878 Value *V = MDV->getValue();
1879 writeAsOperandInternal(Out, V, WriterCtx, /*PrintType=*/true);
1880 } else {
1881 writeAsOperandInternal(Out, MD, WriterCtx);
1882 WriterCtx.onWriteMetadataAsOperand(MD);
1883 }
1884 }
1885
1886 Out << "}";
1887}
1888
1889namespace {
1890
1891struct MDFieldPrinter {
1892 raw_ostream &Out;
1893 ListSeparator FS;
1894 AsmWriterContext &WriterCtx;
1895
1896 explicit MDFieldPrinter(raw_ostream &Out)
1897 : Out(Out), WriterCtx(AsmWriterContext::getEmpty()) {}
1898 MDFieldPrinter(raw_ostream &Out, AsmWriterContext &Ctx)
1899 : Out(Out), WriterCtx(Ctx) {}
1900
1901 void printTag(const DINode *N);
1902 void printMacinfoType(const DIMacroNode *N);
1903 void printChecksum(const DIFile::ChecksumInfo<StringRef> &N);
1904 void printString(StringRef Name, StringRef Value,
1905 bool ShouldSkipEmpty = true);
1906 void printMetadata(StringRef Name, const Metadata *MD,
1907 bool ShouldSkipNull = true);
1908 void printMetadataOrInt(StringRef Name, const Metadata *MD, bool IsUnsigned,
1909 bool ShouldSkipZero = true);
1910 template <class IntTy>
1911 void printInt(StringRef Name, IntTy Int, bool ShouldSkipZero = true);
1912 void printAPInt(StringRef Name, const APInt &Int, bool IsUnsigned,
1913 bool ShouldSkipZero);
1914 void printBool(StringRef Name, bool Value,
1915 std::optional<bool> Default = std::nullopt);
1916 void printDIFlags(StringRef Name, DINode::DIFlags Flags);
1917 void printDISPFlags(StringRef Name, DISubprogram::DISPFlags Flags);
1918 template <class IntTy, class Stringifier>
1919 void printDwarfEnum(StringRef Name, IntTy Value, Stringifier toString,
1920 bool ShouldSkipZero = true);
1921 void printEmissionKind(StringRef Name, DICompileUnit::DebugEmissionKind EK);
1922 void printNameTableKind(StringRef Name,
1924 void printFixedPointKind(StringRef Name, DIFixedPointType::FixedPointKind V);
1925};
1926
1927} // end anonymous namespace
1928
1929void MDFieldPrinter::printTag(const DINode *N) {
1930 Out << FS << "tag: ";
1931 auto Tag = dwarf::TagString(N->getTag());
1932 if (!Tag.empty())
1933 Out << Tag;
1934 else
1935 Out << N->getTag();
1936}
1937
1938void MDFieldPrinter::printMacinfoType(const DIMacroNode *N) {
1939 Out << FS << "type: ";
1940 auto Type = dwarf::MacinfoString(N->getMacinfoType());
1941 if (!Type.empty())
1942 Out << Type;
1943 else
1944 Out << N->getMacinfoType();
1945}
1946
1947void MDFieldPrinter::printChecksum(
1948 const DIFile::ChecksumInfo<StringRef> &Checksum) {
1949 Out << FS << "checksumkind: " << Checksum.getKindAsString();
1950 printString("checksum", Checksum.Value, /* ShouldSkipEmpty */ false);
1951}
1952
1953void MDFieldPrinter::printString(StringRef Name, StringRef Value,
1954 bool ShouldSkipEmpty) {
1955 if (ShouldSkipEmpty && Value.empty())
1956 return;
1957
1958 Out << FS << Name << ": \"";
1960 Out << "\"";
1961}
1962
1963static void writeMetadataAsOperand(raw_ostream &Out, const Metadata *MD,
1964 AsmWriterContext &WriterCtx) {
1965 if (!MD) {
1966 Out << "null";
1967 return;
1968 }
1969 writeAsOperandInternal(Out, MD, WriterCtx);
1970 WriterCtx.onWriteMetadataAsOperand(MD);
1971}
1972
1973void MDFieldPrinter::printMetadata(StringRef Name, const Metadata *MD,
1974 bool ShouldSkipNull) {
1975 if (ShouldSkipNull && !MD)
1976 return;
1977
1978 Out << FS << Name << ": ";
1979 writeMetadataAsOperand(Out, MD, WriterCtx);
1980}
1981
1982void MDFieldPrinter::printMetadataOrInt(StringRef Name, const Metadata *MD,
1983 bool IsUnsigned, bool ShouldSkipZero) {
1984 if (!MD)
1985 return;
1986
1987 if (auto *CI = dyn_cast<ConstantAsMetadata>(MD)) {
1988 auto *CV = cast<ConstantInt>(CI->getValue());
1989 if (IsUnsigned)
1990 printInt(Name, CV->getZExtValue(), ShouldSkipZero);
1991 else
1992 printInt(Name, CV->getSExtValue(), ShouldSkipZero);
1993 } else
1994 printMetadata(Name, MD);
1995}
1996
1997template <class IntTy>
1998void MDFieldPrinter::printInt(StringRef Name, IntTy Int, bool ShouldSkipZero) {
1999 if (ShouldSkipZero && !Int)
2000 return;
2001
2002 Out << FS << Name << ": " << Int;
2003}
2004
2005void MDFieldPrinter::printAPInt(StringRef Name, const APInt &Int,
2006 bool IsUnsigned, bool ShouldSkipZero) {
2007 if (ShouldSkipZero && Int.isZero())
2008 return;
2009
2010 Out << FS << Name << ": ";
2011 Int.print(Out, !IsUnsigned);
2012}
2013
2014void MDFieldPrinter::printBool(StringRef Name, bool Value,
2015 std::optional<bool> Default) {
2016 if (Default && Value == *Default)
2017 return;
2018 Out << FS << Name << ": " << (Value ? "true" : "false");
2019}
2020
2021void MDFieldPrinter::printDIFlags(StringRef Name, DINode::DIFlags Flags) {
2022 if (!Flags)
2023 return;
2024
2025 Out << FS << Name << ": ";
2026
2028 auto Extra = DINode::splitFlags(Flags, SplitFlags);
2029
2030 ListSeparator FlagsFS(" | ");
2031 for (auto F : SplitFlags) {
2032 auto StringF = DINode::getFlagString(F);
2033 assert(!StringF.empty() && "Expected valid flag");
2034 Out << FlagsFS << StringF;
2035 }
2036 if (Extra || SplitFlags.empty())
2037 Out << FlagsFS << Extra;
2038}
2039
2040void MDFieldPrinter::printDISPFlags(StringRef Name,
2042 // Always print this field, because no flags in the IR at all will be
2043 // interpreted as old-style isDefinition: true.
2044 Out << FS << Name << ": ";
2045
2046 if (!Flags) {
2047 Out << 0;
2048 return;
2049 }
2050
2052 auto Extra = DISubprogram::splitFlags(Flags, SplitFlags);
2053
2054 ListSeparator FlagsFS(" | ");
2055 for (auto F : SplitFlags) {
2056 auto StringF = DISubprogram::getFlagString(F);
2057 assert(!StringF.empty() && "Expected valid flag");
2058 Out << FlagsFS << StringF;
2059 }
2060 if (Extra || SplitFlags.empty())
2061 Out << FlagsFS << Extra;
2062}
2063
2064void MDFieldPrinter::printEmissionKind(StringRef Name,
2066 Out << FS << Name << ": " << DICompileUnit::emissionKindString(EK);
2067}
2068
2069void MDFieldPrinter::printNameTableKind(StringRef Name,
2072 return;
2073 Out << FS << Name << ": " << DICompileUnit::nameTableKindString(NTK);
2074}
2075
2076void MDFieldPrinter::printFixedPointKind(StringRef Name,
2078 Out << FS << Name << ": " << DIFixedPointType::fixedPointKindString(V);
2079}
2080
2081template <class IntTy, class Stringifier>
2082void MDFieldPrinter::printDwarfEnum(StringRef Name, IntTy Value,
2083 Stringifier toString, bool ShouldSkipZero) {
2084 if (ShouldSkipZero && !Value)
2085 return;
2086
2087 Out << FS << Name << ": ";
2088 auto S = toString(Value);
2089 if (!S.empty())
2090 Out << S;
2091 else
2092 Out << Value;
2093}
2094
2096 AsmWriterContext &WriterCtx) {
2097 Out << "!GenericDINode(";
2098 MDFieldPrinter Printer(Out, WriterCtx);
2099 Printer.printTag(N);
2100 Printer.printString("header", N->getHeader());
2101 if (N->getNumDwarfOperands()) {
2102 Out << Printer.FS << "operands: {";
2103 ListSeparator IFS;
2104 for (auto &I : N->dwarf_operands()) {
2105 Out << IFS;
2106 writeMetadataAsOperand(Out, I, WriterCtx);
2107 }
2108 Out << "}";
2109 }
2110 Out << ")";
2111}
2112
2113static void writeDILocation(raw_ostream &Out, const DILocation *DL,
2114 AsmWriterContext &WriterCtx) {
2115 Out << "!DILocation(";
2116 MDFieldPrinter Printer(Out, WriterCtx);
2117 // Always output the line, since 0 is a relevant and important value for it.
2118 Printer.printInt("line", DL->getLine(), /* ShouldSkipZero */ false);
2119 Printer.printInt("column", DL->getColumn());
2120 Printer.printMetadata("scope", DL->getRawScope(), /* ShouldSkipNull */ false);
2121 Printer.printMetadata("inlinedAt", DL->getRawInlinedAt());
2122 Printer.printBool("isImplicitCode", DL->isImplicitCode(),
2123 /* Default */ false);
2124 Printer.printInt("atomGroup", DL->getAtomGroup());
2125 Printer.printInt<unsigned>("atomRank", DL->getAtomRank());
2126 Out << ")";
2127}
2128
2129static void writeDIAssignID(raw_ostream &Out, const DIAssignID *DL,
2130 AsmWriterContext &WriterCtx) {
2131 Out << "!DIAssignID()";
2132 MDFieldPrinter Printer(Out, WriterCtx);
2133}
2134
2135static void writeDISubrange(raw_ostream &Out, const DISubrange *N,
2136 AsmWriterContext &WriterCtx) {
2137 Out << "!DISubrange(";
2138 MDFieldPrinter Printer(Out, WriterCtx);
2139
2140 Printer.printMetadataOrInt("count", N->getRawCountNode(),
2141 /* IsUnsigned */ false,
2142 /* ShouldSkipZero */ false);
2143
2144 // A lowerBound of constant 0 should not be skipped, since it is different
2145 // from an unspecified lower bound (= nullptr).
2146 Printer.printMetadataOrInt("lowerBound", N->getRawLowerBound(),
2147 /* IsUnsigned */ false,
2148 /* ShouldSkipZero */ false);
2149 Printer.printMetadataOrInt("upperBound", N->getRawUpperBound(),
2150 /* IsUnsigned */ false,
2151 /* ShouldSkipZero */ false);
2152 Printer.printMetadataOrInt("stride", N->getRawStride(),
2153 /* IsUnsigned */ false,
2154 /* ShouldSkipZero */ false);
2155
2156 Out << ")";
2157}
2158
2160 AsmWriterContext &WriterCtx) {
2161 Out << "!DIGenericSubrange(";
2162 MDFieldPrinter Printer(Out, WriterCtx);
2163
2164 auto GetConstant = [&](Metadata *Bound) -> std::optional<int64_t> {
2165 auto *BE = dyn_cast_or_null<DIExpression>(Bound);
2166 if (!BE)
2167 return std::nullopt;
2168 if (BE->isConstant() &&
2170 *BE->isConstant()) {
2171 return static_cast<int64_t>(BE->getElement(1));
2172 }
2173 return std::nullopt;
2174 };
2175
2176 auto *Count = N->getRawCountNode();
2177 if (auto ConstantCount = GetConstant(Count))
2178 Printer.printInt("count", *ConstantCount,
2179 /* ShouldSkipZero */ false);
2180 else
2181 Printer.printMetadata("count", Count, /*ShouldSkipNull */ true);
2182
2183 auto *LBound = N->getRawLowerBound();
2184 if (auto ConstantLBound = GetConstant(LBound))
2185 Printer.printInt("lowerBound", *ConstantLBound,
2186 /* ShouldSkipZero */ false);
2187 else
2188 Printer.printMetadata("lowerBound", LBound, /*ShouldSkipNull */ true);
2189
2190 auto *UBound = N->getRawUpperBound();
2191 if (auto ConstantUBound = GetConstant(UBound))
2192 Printer.printInt("upperBound", *ConstantUBound,
2193 /* ShouldSkipZero */ false);
2194 else
2195 Printer.printMetadata("upperBound", UBound, /*ShouldSkipNull */ true);
2196
2197 auto *Stride = N->getRawStride();
2198 if (auto ConstantStride = GetConstant(Stride))
2199 Printer.printInt("stride", *ConstantStride,
2200 /* ShouldSkipZero */ false);
2201 else
2202 Printer.printMetadata("stride", Stride, /*ShouldSkipNull */ true);
2203
2204 Out << ")";
2205}
2206
2208 AsmWriterContext &) {
2209 Out << "!DIEnumerator(";
2210 MDFieldPrinter Printer(Out);
2211 Printer.printString("name", N->getName(), /* ShouldSkipEmpty */ false);
2212 Printer.printAPInt("value", N->getValue(), N->isUnsigned(),
2213 /*ShouldSkipZero=*/false);
2214 if (N->isUnsigned())
2215 Printer.printBool("isUnsigned", true);
2216 Out << ")";
2217}
2218
2220 AsmWriterContext &WriterCtx) {
2221 Out << "!DIBasicType(";
2222 MDFieldPrinter Printer(Out, WriterCtx);
2223 if (N->getTag() != dwarf::DW_TAG_base_type)
2224 Printer.printTag(N);
2225 Printer.printString("name", N->getName());
2226 Printer.printMetadata("scope", N->getRawScope());
2227 Printer.printMetadata("file", N->getRawFile());
2228 Printer.printInt("line", N->getLine());
2229 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2230 Printer.printInt("align", N->getAlignInBits());
2231 Printer.printInt("dataSize", N->getDataSizeInBits());
2232 Printer.printDwarfEnum("encoding", N->getEncoding(),
2234 Printer.printInt("num_extra_inhabitants", N->getNumExtraInhabitants());
2235 Printer.printDIFlags("flags", N->getFlags());
2236 Out << ")";
2237}
2238
2240 AsmWriterContext &WriterCtx) {
2241 Out << "!DIFixedPointType(";
2242 MDFieldPrinter Printer(Out, WriterCtx);
2243 if (N->getTag() != dwarf::DW_TAG_base_type)
2244 Printer.printTag(N);
2245 Printer.printString("name", N->getName());
2246 Printer.printMetadata("scope", N->getRawScope());
2247 Printer.printMetadata("file", N->getRawFile());
2248 Printer.printInt("line", N->getLine());
2249 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2250 Printer.printInt("align", N->getAlignInBits());
2251 Printer.printDwarfEnum("encoding", N->getEncoding(),
2253 Printer.printDIFlags("flags", N->getFlags());
2254 Printer.printFixedPointKind("kind", N->getKind());
2255 if (N->isRational()) {
2256 bool IsUnsigned = !N->isSigned();
2257 Printer.printAPInt("numerator", N->getNumerator(), IsUnsigned, false);
2258 Printer.printAPInt("denominator", N->getDenominator(), IsUnsigned, false);
2259 } else {
2260 Printer.printInt("factor", N->getFactor());
2261 }
2262 Out << ")";
2263}
2264
2266 AsmWriterContext &WriterCtx) {
2267 Out << "!DIStringType(";
2268 MDFieldPrinter Printer(Out, WriterCtx);
2269 if (N->getTag() != dwarf::DW_TAG_string_type)
2270 Printer.printTag(N);
2271 Printer.printString("name", N->getName());
2272 Printer.printMetadata("stringLength", N->getRawStringLength());
2273 Printer.printMetadata("stringLengthExpression", N->getRawStringLengthExp());
2274 Printer.printMetadata("stringLocationExpression",
2275 N->getRawStringLocationExp());
2276 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2277 Printer.printInt("align", N->getAlignInBits());
2278 Printer.printDwarfEnum("encoding", N->getEncoding(),
2280 Out << ")";
2281}
2282
2284 AsmWriterContext &WriterCtx) {
2285 Out << "!DIDerivedType(";
2286 MDFieldPrinter Printer(Out, WriterCtx);
2287 Printer.printTag(N);
2288 Printer.printString("name", N->getName());
2289 Printer.printMetadata("scope", N->getRawScope());
2290 Printer.printMetadata("file", N->getRawFile());
2291 Printer.printInt("line", N->getLine());
2292 Printer.printMetadata("baseType", N->getRawBaseType(),
2293 /* ShouldSkipNull */ false);
2294 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2295 Printer.printInt("align", N->getAlignInBits());
2296 Printer.printMetadataOrInt("offset", N->getRawOffsetInBits(), true);
2297 Printer.printDIFlags("flags", N->getFlags());
2298 Printer.printMetadata("extraData", N->getRawExtraData());
2299 if (const auto &DWARFAddressSpace = N->getDWARFAddressSpace())
2300 Printer.printInt("dwarfAddressSpace", *DWARFAddressSpace,
2301 /* ShouldSkipZero */ false);
2302 Printer.printMetadata("annotations", N->getRawAnnotations());
2303 if (auto PtrAuthData = N->getPtrAuthData()) {
2304 Printer.printInt("ptrAuthKey", PtrAuthData->key());
2305 Printer.printBool("ptrAuthIsAddressDiscriminated",
2306 PtrAuthData->isAddressDiscriminated());
2307 Printer.printInt("ptrAuthExtraDiscriminator",
2308 PtrAuthData->extraDiscriminator());
2309 Printer.printBool("ptrAuthIsaPointer", PtrAuthData->isaPointer());
2310 Printer.printBool("ptrAuthAuthenticatesNullValues",
2311 PtrAuthData->authenticatesNullValues());
2312 }
2313 Out << ")";
2314}
2315
2317 AsmWriterContext &WriterCtx) {
2318 Out << "!DISubrangeType(";
2319 MDFieldPrinter Printer(Out, WriterCtx);
2320 Printer.printString("name", N->getName());
2321 Printer.printMetadata("scope", N->getRawScope());
2322 Printer.printMetadata("file", N->getRawFile());
2323 Printer.printInt("line", N->getLine());
2324 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2325 Printer.printInt("align", N->getAlignInBits());
2326 Printer.printDIFlags("flags", N->getFlags());
2327 Printer.printMetadata("baseType", N->getRawBaseType(),
2328 /* ShouldSkipNull */ false);
2329 Printer.printMetadata("lowerBound", N->getRawLowerBound());
2330 Printer.printMetadata("upperBound", N->getRawUpperBound());
2331 Printer.printMetadata("stride", N->getRawStride());
2332 Printer.printMetadata("bias", N->getRawBias());
2333 Out << ")";
2334}
2335
2337 AsmWriterContext &WriterCtx) {
2338 Out << "!DICompositeType(";
2339 MDFieldPrinter Printer(Out, WriterCtx);
2340 Printer.printTag(N);
2341 Printer.printString("name", N->getName());
2342 Printer.printMetadata("scope", N->getRawScope());
2343 Printer.printMetadata("file", N->getRawFile());
2344 Printer.printInt("line", N->getLine());
2345 Printer.printMetadata("baseType", N->getRawBaseType());
2346 Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
2347 Printer.printInt("align", N->getAlignInBits());
2348 Printer.printMetadataOrInt("offset", N->getRawOffsetInBits(), true);
2349 Printer.printInt("num_extra_inhabitants", N->getNumExtraInhabitants());
2350 Printer.printDIFlags("flags", N->getFlags());
2351 Printer.printMetadata("elements", N->getRawElements());
2352 Printer.printDwarfEnum("runtimeLang", N->getRuntimeLang(),
2354 Printer.printMetadata("vtableHolder", N->getRawVTableHolder());
2355 Printer.printMetadata("templateParams", N->getRawTemplateParams());
2356 Printer.printString("identifier", N->getIdentifier());
2357 Printer.printMetadata("discriminator", N->getRawDiscriminator());
2358 Printer.printMetadata("dataLocation", N->getRawDataLocation());
2359 Printer.printMetadata("associated", N->getRawAssociated());
2360 Printer.printMetadata("allocated", N->getRawAllocated());
2361 if (auto *RankConst = N->getRankConst())
2362 Printer.printInt("rank", RankConst->getSExtValue(),
2363 /* ShouldSkipZero */ false);
2364 else
2365 Printer.printMetadata("rank", N->getRawRank(), /*ShouldSkipNull */ true);
2366 Printer.printMetadata("annotations", N->getRawAnnotations());
2367 if (auto *Specification = N->getRawSpecification())
2368 Printer.printMetadata("specification", Specification);
2369
2370 if (auto EnumKind = N->getEnumKind())
2371 Printer.printDwarfEnum("enumKind", *EnumKind, dwarf::EnumKindString,
2372 /*ShouldSkipZero=*/false);
2373
2374 Printer.printMetadata("bitStride", N->getRawBitStride());
2375 Out << ")";
2376}
2377
2379 AsmWriterContext &WriterCtx) {
2380 Out << "!DISubroutineType(";
2381 MDFieldPrinter Printer(Out, WriterCtx);
2382 Printer.printDIFlags("flags", N->getFlags());
2383 Printer.printDwarfEnum("cc", N->getCC(), dwarf::ConventionString);
2384 Printer.printMetadata("types", N->getRawTypeArray(),
2385 /* ShouldSkipNull */ false);
2386 Out << ")";
2387}
2388
2389static void writeDIFile(raw_ostream &Out, const DIFile *N, AsmWriterContext &) {
2390 Out << "!DIFile(";
2391 MDFieldPrinter Printer(Out);
2392 Printer.printString("filename", N->getFilename(),
2393 /* ShouldSkipEmpty */ false);
2394 Printer.printString("directory", N->getDirectory(),
2395 /* ShouldSkipEmpty */ false);
2396 // Print all values for checksum together, or not at all.
2397 if (N->getChecksum())
2398 Printer.printChecksum(*N->getChecksum());
2399 if (N->getSource())
2400 Printer.printString("source", *N->getSource(),
2401 /* ShouldSkipEmpty */ false);
2402 Out << ")";
2403}
2404
2406 AsmWriterContext &WriterCtx) {
2407 Out << "!DICompileUnit(";
2408 MDFieldPrinter Printer(Out, WriterCtx);
2409
2410 DISourceLanguageName Lang = N->getSourceLanguage();
2411
2412 if (Lang.hasVersionedName()) {
2413 Printer.printDwarfEnum(
2414 "sourceLanguageName",
2415 static_cast<llvm::dwarf::SourceLanguageName>(Lang.getName()),
2417 /* ShouldSkipZero */ false);
2418
2419 Printer.printInt("sourceLanguageVersion", Lang.getVersion(),
2420 /*ShouldSkipZero=*/true);
2421 } else {
2422 Printer.printDwarfEnum("language", Lang.getName(), dwarf::LanguageString,
2423 /* ShouldSkipZero */ false);
2424 }
2425
2426 Printer.printMetadata("file", N->getRawFile(), /* ShouldSkipNull */ false);
2427 Printer.printString("producer", N->getProducer());
2428 Printer.printBool("isOptimized", N->isOptimized());
2429 Printer.printString("flags", N->getFlags());
2430 Printer.printInt("runtimeVersion", N->getRuntimeVersion(),
2431 /* ShouldSkipZero */ false);
2432 Printer.printString("splitDebugFilename", N->getSplitDebugFilename());
2433 Printer.printEmissionKind("emissionKind", N->getEmissionKind());
2434 Printer.printMetadata("enums", N->getRawEnumTypes());
2435 Printer.printMetadata("retainedTypes", N->getRawRetainedTypes());
2436 Printer.printMetadata("globals", N->getRawGlobalVariables());
2437 Printer.printMetadata("imports", N->getRawImportedEntities());
2438 Printer.printMetadata("macros", N->getRawMacros());
2439 Printer.printInt("dwoId", N->getDWOId());
2440 Printer.printBool("splitDebugInlining", N->getSplitDebugInlining(), true);
2441 Printer.printBool("debugInfoForProfiling", N->getDebugInfoForProfiling(),
2442 false);
2443 Printer.printNameTableKind("nameTableKind", N->getNameTableKind());
2444 Printer.printBool("rangesBaseAddress", N->getRangesBaseAddress(), false);
2445 Printer.printString("sysroot", N->getSysRoot());
2446 Printer.printString("sdk", N->getSDK());
2447 Out << ")";
2448}
2449
2451 AsmWriterContext &WriterCtx) {
2452 Out << "!DISubprogram(";
2453 MDFieldPrinter Printer(Out, WriterCtx);
2454 Printer.printString("name", N->getName());
2455 Printer.printString("linkageName", N->getLinkageName());
2456 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2457 Printer.printMetadata("file", N->getRawFile());
2458 Printer.printInt("line", N->getLine());
2459 Printer.printMetadata("type", N->getRawType());
2460 Printer.printInt("scopeLine", N->getScopeLine());
2461 Printer.printMetadata("containingType", N->getRawContainingType());
2462 if (N->getVirtuality() != dwarf::DW_VIRTUALITY_none ||
2463 N->getVirtualIndex() != 0)
2464 Printer.printInt("virtualIndex", N->getVirtualIndex(), false);
2465 Printer.printInt("thisAdjustment", N->getThisAdjustment());
2466 Printer.printDIFlags("flags", N->getFlags());
2467 Printer.printDISPFlags("spFlags", N->getSPFlags());
2468 Printer.printMetadata("unit", N->getRawUnit());
2469 Printer.printMetadata("templateParams", N->getRawTemplateParams());
2470 Printer.printMetadata("declaration", N->getRawDeclaration());
2471 Printer.printMetadata("retainedNodes", N->getRawRetainedNodes());
2472 Printer.printMetadata("thrownTypes", N->getRawThrownTypes());
2473 Printer.printMetadata("annotations", N->getRawAnnotations());
2474 Printer.printString("targetFuncName", N->getTargetFuncName());
2475 Printer.printBool("keyInstructions", N->getKeyInstructionsEnabled(), false);
2476 Out << ")";
2477}
2478
2480 AsmWriterContext &WriterCtx) {
2481 Out << "!DILexicalBlock(";
2482 MDFieldPrinter Printer(Out, WriterCtx);
2483 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2484 Printer.printMetadata("file", N->getRawFile());
2485 Printer.printInt("line", N->getLine());
2486 Printer.printInt("column", N->getColumn());
2487 Out << ")";
2488}
2489
2491 const DILexicalBlockFile *N,
2492 AsmWriterContext &WriterCtx) {
2493 Out << "!DILexicalBlockFile(";
2494 MDFieldPrinter Printer(Out, WriterCtx);
2495 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2496 Printer.printMetadata("file", N->getRawFile());
2497 Printer.printInt("discriminator", N->getDiscriminator(),
2498 /* ShouldSkipZero */ false);
2499 Out << ")";
2500}
2501
2503 AsmWriterContext &WriterCtx) {
2504 Out << "!DINamespace(";
2505 MDFieldPrinter Printer(Out, WriterCtx);
2506 Printer.printString("name", N->getName());
2507 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2508 Printer.printBool("exportSymbols", N->getExportSymbols(), false);
2509 Out << ")";
2510}
2511
2513 AsmWriterContext &WriterCtx) {
2514 Out << "!DICommonBlock(";
2515 MDFieldPrinter Printer(Out, WriterCtx);
2516 Printer.printMetadata("scope", N->getRawScope(), false);
2517 Printer.printMetadata("declaration", N->getRawDecl(), false);
2518 Printer.printString("name", N->getName());
2519 Printer.printMetadata("file", N->getRawFile());
2520 Printer.printInt("line", N->getLineNo());
2521 Out << ")";
2522}
2523
2524static void writeDIMacro(raw_ostream &Out, const DIMacro *N,
2525 AsmWriterContext &WriterCtx) {
2526 Out << "!DIMacro(";
2527 MDFieldPrinter Printer(Out, WriterCtx);
2528 Printer.printMacinfoType(N);
2529 Printer.printInt("line", N->getLine());
2530 Printer.printString("name", N->getName());
2531 Printer.printString("value", N->getValue());
2532 Out << ")";
2533}
2534
2536 AsmWriterContext &WriterCtx) {
2537 Out << "!DIMacroFile(";
2538 MDFieldPrinter Printer(Out, WriterCtx);
2539 Printer.printInt("line", N->getLine());
2540 Printer.printMetadata("file", N->getRawFile(), /* ShouldSkipNull */ false);
2541 Printer.printMetadata("nodes", N->getRawElements());
2542 Out << ")";
2543}
2544
2545static void writeDIModule(raw_ostream &Out, const DIModule *N,
2546 AsmWriterContext &WriterCtx) {
2547 Out << "!DIModule(";
2548 MDFieldPrinter Printer(Out, WriterCtx);
2549 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2550 Printer.printString("name", N->getName());
2551 Printer.printString("configMacros", N->getConfigurationMacros());
2552 Printer.printString("includePath", N->getIncludePath());
2553 Printer.printString("apinotes", N->getAPINotesFile());
2554 Printer.printMetadata("file", N->getRawFile());
2555 Printer.printInt("line", N->getLineNo());
2556 Printer.printBool("isDecl", N->getIsDecl(), /* Default */ false);
2557 Out << ")";
2558}
2559
2562 AsmWriterContext &WriterCtx) {
2563 Out << "!DITemplateTypeParameter(";
2564 MDFieldPrinter Printer(Out, WriterCtx);
2565 Printer.printString("name", N->getName());
2566 Printer.printMetadata("type", N->getRawType(), /* ShouldSkipNull */ false);
2567 Printer.printBool("defaulted", N->isDefault(), /* Default= */ false);
2568 Out << ")";
2569}
2570
2573 AsmWriterContext &WriterCtx) {
2574 Out << "!DITemplateValueParameter(";
2575 MDFieldPrinter Printer(Out, WriterCtx);
2576 if (N->getTag() != dwarf::DW_TAG_template_value_parameter)
2577 Printer.printTag(N);
2578 Printer.printString("name", N->getName());
2579 Printer.printMetadata("type", N->getRawType());
2580 Printer.printBool("defaulted", N->isDefault(), /* Default= */ false);
2581 Printer.printMetadata("value", N->getValue(), /* ShouldSkipNull */ false);
2582 Out << ")";
2583}
2584
2586 AsmWriterContext &WriterCtx) {
2587 Out << "!DIGlobalVariable(";
2588 MDFieldPrinter Printer(Out, WriterCtx);
2589 Printer.printString("name", N->getName());
2590 Printer.printString("linkageName", N->getLinkageName());
2591 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2592 Printer.printMetadata("file", N->getRawFile());
2593 Printer.printInt("line", N->getLine());
2594 Printer.printMetadata("type", N->getRawType());
2595 Printer.printBool("isLocal", N->isLocalToUnit());
2596 Printer.printBool("isDefinition", N->isDefinition());
2597 Printer.printMetadata("declaration", N->getRawStaticDataMemberDeclaration());
2598 Printer.printMetadata("templateParams", N->getRawTemplateParams());
2599 Printer.printInt("align", N->getAlignInBits());
2600 Printer.printMetadata("annotations", N->getRawAnnotations());
2601 Out << ")";
2602}
2603
2605 AsmWriterContext &WriterCtx) {
2606 Out << "!DILocalVariable(";
2607 MDFieldPrinter Printer(Out, WriterCtx);
2608 Printer.printString("name", N->getName());
2609 Printer.printInt("arg", N->getArg());
2610 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2611 Printer.printMetadata("file", N->getRawFile());
2612 Printer.printInt("line", N->getLine());
2613 Printer.printMetadata("type", N->getRawType());
2614 Printer.printDIFlags("flags", N->getFlags());
2615 Printer.printInt("align", N->getAlignInBits());
2616 Printer.printMetadata("annotations", N->getRawAnnotations());
2617 Out << ")";
2618}
2619
2620static void writeDILabel(raw_ostream &Out, const DILabel *N,
2621 AsmWriterContext &WriterCtx) {
2622 Out << "!DILabel(";
2623 MDFieldPrinter Printer(Out, WriterCtx);
2624 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2625 Printer.printString("name", N->getName());
2626 Printer.printMetadata("file", N->getRawFile());
2627 Printer.printInt("line", N->getLine());
2628 Printer.printInt("column", N->getColumn());
2629 Printer.printBool("isArtificial", N->isArtificial(), false);
2630 if (N->getCoroSuspendIdx())
2631 Printer.printInt("coroSuspendIdx", *N->getCoroSuspendIdx(),
2632 /* ShouldSkipZero */ false);
2633 Out << ")";
2634}
2635
2637 AsmWriterContext &WriterCtx) {
2638 Out << "!DIExpression(";
2639 ListSeparator FS;
2640 if (N->isValid()) {
2641 for (const DIExpression::ExprOperand &Op : N->expr_ops()) {
2642 auto OpStr = dwarf::OperationEncodingString(Op.getOp());
2643 assert(!OpStr.empty() && "Expected valid opcode");
2644
2645 Out << FS << OpStr;
2646 if (Op.getOp() == dwarf::DW_OP_LLVM_convert) {
2647 Out << FS << Op.getArg(0);
2648 Out << FS << dwarf::AttributeEncodingString(Op.getArg(1));
2649 } else {
2650 for (unsigned A = 0, AE = Op.getNumArgs(); A != AE; ++A)
2651 Out << FS << Op.getArg(A);
2652 }
2653 }
2654 } else {
2655 for (const auto &I : N->getElements())
2656 Out << FS << I;
2657 }
2658 Out << ")";
2659}
2660
2661static void writeDIArgList(raw_ostream &Out, const DIArgList *N,
2662 AsmWriterContext &WriterCtx,
2663 bool FromValue = false) {
2664 assert(FromValue &&
2665 "Unexpected DIArgList metadata outside of value argument");
2666 Out << "!DIArgList(";
2667 ListSeparator FS;
2668 MDFieldPrinter Printer(Out, WriterCtx);
2669 for (const Metadata *Arg : N->getArgs()) {
2670 Out << FS;
2671 writeAsOperandInternal(Out, Arg, WriterCtx, true);
2672 }
2673 Out << ")";
2674}
2675
2678 AsmWriterContext &WriterCtx) {
2679 Out << "!DIGlobalVariableExpression(";
2680 MDFieldPrinter Printer(Out, WriterCtx);
2681 Printer.printMetadata("var", N->getVariable());
2682 Printer.printMetadata("expr", N->getExpression());
2683 Out << ")";
2684}
2685
2687 AsmWriterContext &WriterCtx) {
2688 Out << "!DIObjCProperty(";
2689 MDFieldPrinter Printer(Out, WriterCtx);
2690 Printer.printString("name", N->getName());
2691 Printer.printMetadata("file", N->getRawFile());
2692 Printer.printInt("line", N->getLine());
2693 Printer.printString("setter", N->getSetterName());
2694 Printer.printString("getter", N->getGetterName());
2695 Printer.printInt("attributes", N->getAttributes());
2696 Printer.printMetadata("type", N->getRawType());
2697 Out << ")";
2698}
2699
2701 AsmWriterContext &WriterCtx) {
2702 Out << "!DIImportedEntity(";
2703 MDFieldPrinter Printer(Out, WriterCtx);
2704 Printer.printTag(N);
2705 Printer.printString("name", N->getName());
2706 Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
2707 Printer.printMetadata("entity", N->getRawEntity());
2708 Printer.printMetadata("file", N->getRawFile());
2709 Printer.printInt("line", N->getLine());
2710 Printer.printMetadata("elements", N->getRawElements());
2711 Out << ")";
2712}
2713
2715 AsmWriterContext &Ctx) {
2716 if (Node->isDistinct())
2717 Out << "distinct ";
2718 else if (Node->isTemporary())
2719 Out << "<temporary!> "; // Handle broken code.
2720
2721 switch (Node->getMetadataID()) {
2722 default:
2723 llvm_unreachable("Expected uniquable MDNode");
2724#define HANDLE_MDNODE_LEAF(CLASS) \
2725 case Metadata::CLASS##Kind: \
2726 write##CLASS(Out, cast<CLASS>(Node), Ctx); \
2727 break;
2728#include "llvm/IR/Metadata.def"
2729 }
2730}
2731
2732// Full implementation of printing a Value as an operand with support for
2733// TypePrinting, etc.
2734static void writeAsOperandInternal(raw_ostream &Out, const Value *V,
2735 AsmWriterContext &WriterCtx,
2736 bool PrintType) {
2737 if (PrintType) {
2738 WriterCtx.TypePrinter->print(V->getType(), Out);
2739 Out << ' ';
2740 }
2741
2742 if (V->hasName()) {
2743 printLLVMName(Out, V);
2744 return;
2745 }
2746
2747 const auto *CV = dyn_cast<Constant>(V);
2748 if (CV && !isa<GlobalValue>(CV)) {
2749 assert(WriterCtx.TypePrinter && "Constants require TypePrinting!");
2750 writeConstantInternal(Out, CV, WriterCtx);
2751 return;
2752 }
2753
2754 if (const auto *IA = dyn_cast<InlineAsm>(V)) {
2755 Out << "asm ";
2756 if (IA->hasSideEffects())
2757 Out << "sideeffect ";
2758 if (IA->isAlignStack())
2759 Out << "alignstack ";
2760 // We don't emit the AD_ATT dialect as it's the assumed default.
2761 if (IA->getDialect() == InlineAsm::AD_Intel)
2762 Out << "inteldialect ";
2763 if (IA->canThrow())
2764 Out << "unwind ";
2765 Out << '"';
2766 printEscapedString(IA->getAsmString(), Out);
2767 Out << "\", \"";
2768 printEscapedString(IA->getConstraintString(), Out);
2769 Out << '"';
2770 return;
2771 }
2772
2773 if (auto *MD = dyn_cast<MetadataAsValue>(V)) {
2774 writeAsOperandInternal(Out, MD->getMetadata(), WriterCtx,
2775 /* FromValue */ true);
2776 return;
2777 }
2778
2779 char Prefix = '%';
2780 int Slot;
2781 auto *Machine = WriterCtx.Machine;
2782 // If we have a SlotTracker, use it.
2783 if (Machine) {
2784 if (const auto *GV = dyn_cast<GlobalValue>(V)) {
2785 Slot = Machine->getGlobalSlot(GV);
2786 Prefix = '@';
2787 } else {
2788 Slot = Machine->getLocalSlot(V);
2789
2790 // If the local value didn't succeed, then we may be referring to a value
2791 // from a different function. Translate it, as this can happen when using
2792 // address of blocks.
2793 if (Slot == -1)
2794 if ((Machine = createSlotTracker(V))) {
2795 Slot = Machine->getLocalSlot(V);
2796 delete Machine;
2797 }
2798 }
2799 } else if ((Machine = createSlotTracker(V))) {
2800 // Otherwise, create one to get the # and then destroy it.
2801 if (const auto *GV = dyn_cast<GlobalValue>(V)) {
2802 Slot = Machine->getGlobalSlot(GV);
2803 Prefix = '@';
2804 } else {
2805 Slot = Machine->getLocalSlot(V);
2806 }
2807 delete Machine;
2808 Machine = nullptr;
2809 } else {
2810 Slot = -1;
2811 }
2812
2813 if (Slot != -1)
2814 Out << Prefix << Slot;
2815 else
2816 Out << "<badref>";
2817}
2818
2819static void writeAsOperandInternal(raw_ostream &Out, const Metadata *MD,
2820 AsmWriterContext &WriterCtx,
2821 bool FromValue) {
2822 // Write DIExpressions and DIArgLists inline when used as a value. Improves
2823 // readability of debug info intrinsics.
2824 if (const auto *Expr = dyn_cast<DIExpression>(MD)) {
2825 writeDIExpression(Out, Expr, WriterCtx);
2826 return;
2827 }
2828 if (const auto *ArgList = dyn_cast<DIArgList>(MD)) {
2829 writeDIArgList(Out, ArgList, WriterCtx, FromValue);
2830 return;
2831 }
2832
2833 if (const auto *N = dyn_cast<MDNode>(MD)) {
2834 std::unique_ptr<SlotTracker> MachineStorage;
2835 SaveAndRestore SARMachine(WriterCtx.Machine);
2836 if (!WriterCtx.Machine) {
2837 MachineStorage = std::make_unique<SlotTracker>(WriterCtx.Context);
2838 WriterCtx.Machine = MachineStorage.get();
2839 }
2840 int Slot = WriterCtx.Machine->getMetadataSlot(N);
2841 if (Slot == -1) {
2842 if (const auto *Loc = dyn_cast<DILocation>(N)) {
2843 writeDILocation(Out, Loc, WriterCtx);
2844 return;
2845 }
2846 // Give the pointer value instead of "badref", since this comes up all
2847 // the time when debugging.
2848 Out << "<" << N << ">";
2849 } else
2850 Out << '!' << Slot;
2851 return;
2852 }
2853
2854 if (const auto *MDS = dyn_cast<MDString>(MD)) {
2855 Out << "!\"";
2856 printEscapedString(MDS->getString(), Out);
2857 Out << '"';
2858 return;
2859 }
2860
2861 auto *V = cast<ValueAsMetadata>(MD);
2862 assert(WriterCtx.TypePrinter && "TypePrinter required for metadata values");
2863 assert((FromValue || !isa<LocalAsMetadata>(V)) &&
2864 "Unexpected function-local metadata outside of value argument");
2865
2866 writeAsOperandInternal(Out, V->getValue(), WriterCtx, /*PrintType=*/true);
2867}
2868
2869namespace {
2870
2871class AssemblyWriter {
2872 formatted_raw_ostream &Out;
2873 const Module *TheModule = nullptr;
2874 const ModuleSummaryIndex *TheIndex = nullptr;
2875 std::unique_ptr<SlotTracker> SlotTrackerStorage;
2876 SlotTracker &Machine;
2877 TypePrinting TypePrinter;
2878 AssemblyAnnotationWriter *AnnotationWriter = nullptr;
2879 SetVector<const Comdat *> Comdats;
2880 bool IsForDebug;
2881 bool ShouldPreserveUseListOrder;
2882 UseListOrderMap UseListOrders;
2884 /// Synchronization scope names registered with LLVMContext.
2886 DenseMap<const GlobalValueSummary *, GlobalValue::GUID> SummaryToGUIDMap;
2887
2888public:
2889 /// Construct an AssemblyWriter with an external SlotTracker
2890 AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac, const Module *M,
2891 AssemblyAnnotationWriter *AAW, bool IsForDebug,
2892 bool ShouldPreserveUseListOrder = false);
2893
2894 AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
2895 const ModuleSummaryIndex *Index, bool IsForDebug);
2896
2897 AsmWriterContext getContext() {
2898 return AsmWriterContext(&TypePrinter, &Machine, TheModule);
2899 }
2900
2901 void printMDNodeBody(const MDNode *MD);
2902 void printNamedMDNode(const NamedMDNode *NMD);
2903
2904 void printModule(const Module *M);
2905
2906 void writeOperand(const Value *Op, bool PrintType);
2907 void writeParamOperand(const Value *Operand, AttributeSet Attrs);
2908 void writeOperandBundles(const CallBase *Call);
2909 void writeSyncScope(const LLVMContext &Context,
2910 SyncScope::ID SSID);
2911 void writeAtomic(const LLVMContext &Context,
2912 AtomicOrdering Ordering,
2913 SyncScope::ID SSID);
2914 void writeAtomicCmpXchg(const LLVMContext &Context,
2915 AtomicOrdering SuccessOrdering,
2916 AtomicOrdering FailureOrdering,
2917 SyncScope::ID SSID);
2918
2919 void writeAllMDNodes();
2920 void writeMDNode(unsigned Slot, const MDNode *Node);
2921 void writeAttribute(const Attribute &Attr, bool InAttrGroup = false);
2922 void writeAttributeSet(const AttributeSet &AttrSet, bool InAttrGroup = false);
2923 void writeAllAttributeGroups();
2924
2925 void printTypeIdentities();
2926 void printGlobal(const GlobalVariable *GV);
2927 void printAlias(const GlobalAlias *GA);
2928 void printIFunc(const GlobalIFunc *GI);
2929 void printComdat(const Comdat *C);
2930 void printFunction(const Function *F);
2931 void printArgument(const Argument *FA, AttributeSet Attrs);
2932 void printBasicBlock(const BasicBlock *BB);
2933 void printInstructionLine(const Instruction &I);
2934 void printInstruction(const Instruction &I);
2935 void printDbgMarker(const DbgMarker &DPI);
2936 void printDbgVariableRecord(const DbgVariableRecord &DVR);
2937 void printDbgLabelRecord(const DbgLabelRecord &DLR);
2938 void printDbgRecord(const DbgRecord &DR);
2939 void printDbgRecordLine(const DbgRecord &DR);
2940
2941 void printUseListOrder(const Value *V, ArrayRef<unsigned> Shuffle);
2942 void printUseLists(const Function *F);
2943
2944 void printModuleSummaryIndex();
2945 void printSummaryInfo(unsigned Slot, const ValueInfo &VI);
2946 void printSummary(const GlobalValueSummary &Summary);
2947 void printAliasSummary(const AliasSummary *AS);
2948 void printGlobalVarSummary(const GlobalVarSummary *GS);
2949 void printFunctionSummary(const FunctionSummary *FS);
2950 void printTypeIdSummary(const TypeIdSummary &TIS);
2951 void printTypeIdCompatibleVtableSummary(const TypeIdCompatibleVtableInfo &TI);
2952 void printTypeTestResolution(const TypeTestResolution &TTRes);
2953 void printArgs(ArrayRef<uint64_t> Args);
2954 void printWPDRes(const WholeProgramDevirtResolution &WPDRes);
2955 void printTypeIdInfo(const FunctionSummary::TypeIdInfo &TIDInfo);
2956 void printVFuncId(const FunctionSummary::VFuncId VFId);
2957 void printNonConstVCalls(ArrayRef<FunctionSummary::VFuncId> VCallList,
2958 const char *Tag);
2959 void printConstVCalls(ArrayRef<FunctionSummary::ConstVCall> VCallList,
2960 const char *Tag);
2961
2962private:
2963 /// Print out metadata attachments.
2964 void printMetadataAttachments(
2965 const SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs,
2966 StringRef Separator);
2967
2968 // printInfoComment - Print a little comment after the instruction indicating
2969 // which slot it occupies.
2970 void printInfoComment(const Value &V, bool isMaterializable = false);
2971
2972 // printGCRelocateComment - print comment after call to the gc.relocate
2973 // intrinsic indicating base and derived pointer names.
2974 void printGCRelocateComment(const GCRelocateInst &Relocate);
2975};
2976
2977} // end anonymous namespace
2978
2979AssemblyWriter::AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
2980 const Module *M, AssemblyAnnotationWriter *AAW,
2981 bool IsForDebug, bool ShouldPreserveUseListOrder)
2982 : Out(o), TheModule(M), Machine(Mac), TypePrinter(M), AnnotationWriter(AAW),
2983 IsForDebug(IsForDebug),
2984 ShouldPreserveUseListOrder(
2985 PreserveAssemblyUseListOrder.getNumOccurrences()
2987 : ShouldPreserveUseListOrder) {
2988 if (!TheModule)
2989 return;
2990 for (const GlobalObject &GO : TheModule->global_objects())
2991 if (const Comdat *C = GO.getComdat())
2992 Comdats.insert(C);
2993}
2994
2995AssemblyWriter::AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
2996 const ModuleSummaryIndex *Index, bool IsForDebug)
2997 : Out(o), TheIndex(Index), Machine(Mac), TypePrinter(/*Module=*/nullptr),
2998 IsForDebug(IsForDebug),
2999 ShouldPreserveUseListOrder(PreserveAssemblyUseListOrder) {}
3000
3001void AssemblyWriter::writeOperand(const Value *Operand, bool PrintType) {
3002 if (!Operand) {
3003 Out << "<null operand!>";
3004 return;
3005 }
3006 auto WriteCtx = getContext();
3007 writeAsOperandInternal(Out, Operand, WriteCtx, PrintType);
3008}
3009
3010void AssemblyWriter::writeSyncScope(const LLVMContext &Context,
3011 SyncScope::ID SSID) {
3012 switch (SSID) {
3013 case SyncScope::System: {
3014 break;
3015 }
3016 default: {
3017 if (SSNs.empty())
3018 Context.getSyncScopeNames(SSNs);
3019
3020 Out << " syncscope(\"";
3021 printEscapedString(SSNs[SSID], Out);
3022 Out << "\")";
3023 break;
3024 }
3025 }
3026}
3027
3028void AssemblyWriter::writeAtomic(const LLVMContext &Context,
3029 AtomicOrdering Ordering,
3030 SyncScope::ID SSID) {
3031 if (Ordering == AtomicOrdering::NotAtomic)
3032 return;
3033
3034 writeSyncScope(Context, SSID);
3035 Out << " " << toIRString(Ordering);
3036}
3037
3038void AssemblyWriter::writeAtomicCmpXchg(const LLVMContext &Context,
3039 AtomicOrdering SuccessOrdering,
3040 AtomicOrdering FailureOrdering,
3041 SyncScope::ID SSID) {
3042 assert(SuccessOrdering != AtomicOrdering::NotAtomic &&
3043 FailureOrdering != AtomicOrdering::NotAtomic);
3044
3045 writeSyncScope(Context, SSID);
3046 Out << " " << toIRString(SuccessOrdering);
3047 Out << " " << toIRString(FailureOrdering);
3048}
3049
3050void AssemblyWriter::writeParamOperand(const Value *Operand,
3051 AttributeSet Attrs) {
3052 if (!Operand) {
3053 Out << "<null operand!>";
3054 return;
3055 }
3056
3057 // Print the type
3058 TypePrinter.print(Operand->getType(), Out);
3059 // Print parameter attributes list
3060 if (Attrs.hasAttributes()) {
3061 Out << ' ';
3062 writeAttributeSet(Attrs);
3063 }
3064 Out << ' ';
3065 // Print the operand
3066 auto WriterCtx = getContext();
3067 writeAsOperandInternal(Out, Operand, WriterCtx);
3068}
3069
3070void AssemblyWriter::writeOperandBundles(const CallBase *Call) {
3071 if (!Call->hasOperandBundles())
3072 return;
3073
3074 Out << " [ ";
3075
3076 ListSeparator LS;
3077 for (unsigned i = 0, e = Call->getNumOperandBundles(); i != e; ++i) {
3078 OperandBundleUse BU = Call->getOperandBundleAt(i);
3079
3080 Out << LS << '"';
3081 printEscapedString(BU.getTagName(), Out);
3082 Out << '"';
3083
3084 Out << '(';
3085
3086 ListSeparator InnerLS;
3087 auto WriterCtx = getContext();
3088 for (const auto &Input : BU.Inputs) {
3089 Out << InnerLS;
3090 if (Input == nullptr)
3091 Out << "<null operand bundle!>";
3092 else
3093 writeAsOperandInternal(Out, Input, WriterCtx, /*PrintType=*/true);
3094 }
3095
3096 Out << ')';
3097 }
3098
3099 Out << " ]";
3100}
3101
3102void AssemblyWriter::printModule(const Module *M) {
3103 Machine.initializeIfNeeded();
3104
3105 if (ShouldPreserveUseListOrder)
3106 UseListOrders = predictUseListOrder(M);
3107
3108 if (!M->getModuleIdentifier().empty() &&
3109 // Don't print the ID if it will start a new line (which would
3110 // require a comment char before it).
3111 M->getModuleIdentifier().find('\n') == std::string::npos)
3112 Out << "; ModuleID = '" << M->getModuleIdentifier() << "'\n";
3113
3114 if (!M->getSourceFileName().empty()) {
3115 Out << "source_filename = \"";
3116 printEscapedString(M->getSourceFileName(), Out);
3117 Out << "\"\n";
3118 }
3119
3120 const std::string &DL = M->getDataLayoutStr();
3121 if (!DL.empty())
3122 Out << "target datalayout = \"" << DL << "\"\n";
3123 if (!M->getTargetTriple().empty())
3124 Out << "target triple = \"" << M->getTargetTriple().str() << "\"\n";
3125
3126 if (!M->getModuleInlineAsm().empty()) {
3127 Out << '\n';
3128
3129 // Split the string into lines, to make it easier to read the .ll file.
3130 StringRef Asm = M->getModuleInlineAsm();
3131 do {
3132 StringRef Front;
3133 std::tie(Front, Asm) = Asm.split('\n');
3134
3135 // We found a newline, print the portion of the asm string from the
3136 // last newline up to this newline.
3137 Out << "module asm \"";
3138 printEscapedString(Front, Out);
3139 Out << "\"\n";
3140 } while (!Asm.empty());
3141 }
3142
3143 printTypeIdentities();
3144
3145 // Output all comdats.
3146 if (!Comdats.empty())
3147 Out << '\n';
3148 for (const Comdat *C : Comdats) {
3149 printComdat(C);
3150 if (C != Comdats.back())
3151 Out << '\n';
3152 }
3153
3154 // Output all globals.
3155 if (!M->global_empty()) Out << '\n';
3156 for (const GlobalVariable &GV : M->globals()) {
3157 printGlobal(&GV); Out << '\n';
3158 }
3159
3160 // Output all aliases.
3161 if (!M->alias_empty()) Out << "\n";
3162 for (const GlobalAlias &GA : M->aliases())
3163 printAlias(&GA);
3164
3165 // Output all ifuncs.
3166 if (!M->ifunc_empty()) Out << "\n";
3167 for (const GlobalIFunc &GI : M->ifuncs())
3168 printIFunc(&GI);
3169
3170 // Output all of the functions.
3171 for (const Function &F : *M) {
3172 Out << '\n';
3173 printFunction(&F);
3174 }
3175
3176 // Output global use-lists.
3177 printUseLists(nullptr);
3178
3179 // Output all attribute groups.
3180 if (!Machine.as_empty()) {
3181 Out << '\n';
3182 writeAllAttributeGroups();
3183 }
3184
3185 // Output named metadata.
3186 if (!M->named_metadata_empty()) Out << '\n';
3187
3188 for (const NamedMDNode &Node : M->named_metadata())
3189 printNamedMDNode(&Node);
3190
3191 // Output metadata.
3192 if (!Machine.mdn_empty()) {
3193 Out << '\n';
3194 writeAllMDNodes();
3195 }
3196}
3197
3198void AssemblyWriter::printModuleSummaryIndex() {
3199 assert(TheIndex);
3200 int NumSlots = Machine.initializeIndexIfNeeded();
3201
3202 Out << "\n";
3203
3204 // Print module path entries. To print in order, add paths to a vector
3205 // indexed by module slot.
3206 std::vector<std::pair<std::string, ModuleHash>> moduleVec;
3207 std::string RegularLTOModuleName =
3209 moduleVec.resize(TheIndex->modulePaths().size());
3210 for (auto &[ModPath, ModHash] : TheIndex->modulePaths())
3211 moduleVec[Machine.getModulePathSlot(ModPath)] = std::make_pair(
3212 // An empty module path is a special entry for a regular LTO module
3213 // created during the thin link.
3214 ModPath.empty() ? RegularLTOModuleName : std::string(ModPath), ModHash);
3215
3216 unsigned i = 0;
3217 for (auto &ModPair : moduleVec) {
3218 Out << "^" << i++ << " = module: (";
3219 Out << "path: \"";
3220 printEscapedString(ModPair.first, Out);
3221 Out << "\", hash: (";
3222 ListSeparator FS;
3223 for (auto Hash : ModPair.second)
3224 Out << FS << Hash;
3225 Out << "))\n";
3226 }
3227
3228 // FIXME: Change AliasSummary to hold a ValueInfo instead of summary pointer
3229 // for aliasee (then update BitcodeWriter.cpp and remove get/setAliaseeGUID).
3230 for (auto &GlobalList : *TheIndex) {
3231 auto GUID = GlobalList.first;
3232 for (auto &Summary : GlobalList.second.getSummaryList())
3233 SummaryToGUIDMap[Summary.get()] = GUID;
3234 }
3235
3236 // Print the global value summary entries.
3237 for (auto &GlobalList : *TheIndex) {
3238 auto GUID = GlobalList.first;
3239 auto VI = TheIndex->getValueInfo(GlobalList);
3240 printSummaryInfo(Machine.getGUIDSlot(GUID), VI);
3241 }
3242
3243 // Print the TypeIdMap entries.
3244 for (const auto &TID : TheIndex->typeIds()) {
3245 Out << "^" << Machine.getTypeIdSlot(TID.second.first)
3246 << " = typeid: (name: \"" << TID.second.first << "\"";
3247 printTypeIdSummary(TID.second.second);
3248 Out << ") ; guid = " << TID.first << "\n";
3249 }
3250
3251 // Print the TypeIdCompatibleVtableMap entries.
3252 for (auto &TId : TheIndex->typeIdCompatibleVtableMap()) {
3254 Out << "^" << Machine.getTypeIdCompatibleVtableSlot(TId.first)
3255 << " = typeidCompatibleVTable: (name: \"" << TId.first << "\"";
3256 printTypeIdCompatibleVtableSummary(TId.second);
3257 Out << ") ; guid = " << GUID << "\n";
3258 }
3259
3260 // Don't emit flags when it's not really needed (value is zero by default).
3261 if (TheIndex->getFlags()) {
3262 Out << "^" << NumSlots << " = flags: " << TheIndex->getFlags() << "\n";
3263 ++NumSlots;
3264 }
3265
3266 Out << "^" << NumSlots << " = blockcount: " << TheIndex->getBlockCount()
3267 << "\n";
3268}
3269
3270static const char *
3272 switch (K) {
3274 return "indir";
3276 return "singleImpl";
3278 return "branchFunnel";
3279 }
3280 llvm_unreachable("invalid WholeProgramDevirtResolution kind");
3281}
3282
3285 switch (K) {
3287 return "indir";
3289 return "uniformRetVal";
3291 return "uniqueRetVal";
3293 return "virtualConstProp";
3294 }
3295 llvm_unreachable("invalid WholeProgramDevirtResolution::ByArg kind");
3296}
3297
3299 switch (K) {
3301 return "unknown";
3303 return "unsat";
3305 return "byteArray";
3307 return "inline";
3309 return "single";
3311 return "allOnes";
3312 }
3313 llvm_unreachable("invalid TypeTestResolution kind");
3314}
3315
3316void AssemblyWriter::printTypeTestResolution(const TypeTestResolution &TTRes) {
3317 Out << "typeTestRes: (kind: " << getTTResKindName(TTRes.TheKind)
3318 << ", sizeM1BitWidth: " << TTRes.SizeM1BitWidth;
3319
3320 // The following fields are only used if the target does not support the use
3321 // of absolute symbols to store constants. Print only if non-zero.
3322 if (TTRes.AlignLog2)
3323 Out << ", alignLog2: " << TTRes.AlignLog2;
3324 if (TTRes.SizeM1)
3325 Out << ", sizeM1: " << TTRes.SizeM1;
3326 if (TTRes.BitMask)
3327 // BitMask is uint8_t which causes it to print the corresponding char.
3328 Out << ", bitMask: " << (unsigned)TTRes.BitMask;
3329 if (TTRes.InlineBits)
3330 Out << ", inlineBits: " << TTRes.InlineBits;
3331
3332 Out << ")";
3333}
3334
3335void AssemblyWriter::printTypeIdSummary(const TypeIdSummary &TIS) {
3336 Out << ", summary: (";
3337 printTypeTestResolution(TIS.TTRes);
3338 if (!TIS.WPDRes.empty()) {
3339 Out << ", wpdResolutions: (";
3340 ListSeparator FS;
3341 for (auto &WPDRes : TIS.WPDRes) {
3342 Out << FS;
3343 Out << "(offset: " << WPDRes.first << ", ";
3344 printWPDRes(WPDRes.second);
3345 Out << ")";
3346 }
3347 Out << ")";
3348 }
3349 Out << ")";
3350}
3351
3352void AssemblyWriter::printTypeIdCompatibleVtableSummary(
3353 const TypeIdCompatibleVtableInfo &TI) {
3354 Out << ", summary: (";
3355 ListSeparator FS;
3356 for (auto &P : TI) {
3357 Out << FS;
3358 Out << "(offset: " << P.AddressPointOffset << ", ";
3359 Out << "^" << Machine.getGUIDSlot(P.VTableVI.getGUID());
3360 Out << ")";
3361 }
3362 Out << ")";
3363}
3364
3365void AssemblyWriter::printArgs(ArrayRef<uint64_t> Args) {
3366 Out << "args: (" << llvm::interleaved(Args) << ')';
3367}
3368
3369void AssemblyWriter::printWPDRes(const WholeProgramDevirtResolution &WPDRes) {
3370 Out << "wpdRes: (kind: ";
3372
3374 Out << ", singleImplName: \"" << WPDRes.SingleImplName << "\"";
3375
3376 if (!WPDRes.ResByArg.empty()) {
3377 Out << ", resByArg: (";
3378 ListSeparator FS;
3379 for (auto &ResByArg : WPDRes.ResByArg) {
3380 Out << FS;
3381 printArgs(ResByArg.first);
3382 Out << ", byArg: (kind: ";
3383 Out << getWholeProgDevirtResByArgKindName(ResByArg.second.TheKind);
3384 if (ResByArg.second.TheKind ==
3386 ResByArg.second.TheKind ==
3388 Out << ", info: " << ResByArg.second.Info;
3389
3390 // The following fields are only used if the target does not support the
3391 // use of absolute symbols to store constants. Print only if non-zero.
3392 if (ResByArg.second.Byte || ResByArg.second.Bit)
3393 Out << ", byte: " << ResByArg.second.Byte
3394 << ", bit: " << ResByArg.second.Bit;
3395
3396 Out << ")";
3397 }
3398 Out << ")";
3399 }
3400 Out << ")";
3401}
3402
3404 switch (SK) {
3406 return "alias";
3408 return "function";
3410 return "variable";
3411 }
3412 llvm_unreachable("invalid summary kind");
3413}
3414
3415void AssemblyWriter::printAliasSummary(const AliasSummary *AS) {
3416 Out << ", aliasee: ";
3417 // The indexes emitted for distributed backends may not include the
3418 // aliasee summary (only if it is being imported directly). Handle
3419 // that case by just emitting "null" as the aliasee.
3420 if (AS->hasAliasee())
3421 Out << "^" << Machine.getGUIDSlot(SummaryToGUIDMap[&AS->getAliasee()]);
3422 else
3423 Out << "null";
3424}
3425
3426void AssemblyWriter::printGlobalVarSummary(const GlobalVarSummary *GS) {
3427 auto VTableFuncs = GS->vTableFuncs();
3428 Out << ", varFlags: (readonly: " << GS->VarFlags.MaybeReadOnly << ", "
3429 << "writeonly: " << GS->VarFlags.MaybeWriteOnly << ", "
3430 << "constant: " << GS->VarFlags.Constant;
3431 if (!VTableFuncs.empty())
3432 Out << ", "
3433 << "vcall_visibility: " << GS->VarFlags.VCallVisibility;
3434 Out << ")";
3435
3436 if (!VTableFuncs.empty()) {
3437 Out << ", vTableFuncs: (";
3438 ListSeparator FS;
3439 for (auto &P : VTableFuncs) {
3440 Out << FS;
3441 Out << "(virtFunc: ^" << Machine.getGUIDSlot(P.FuncVI.getGUID())
3442 << ", offset: " << P.VTableOffset;
3443 Out << ")";
3444 }
3445 Out << ")";
3446 }
3447}
3448
3450 switch (LT) {
3452 return "external";
3454 return "private";
3456 return "internal";
3458 return "linkonce";
3460 return "linkonce_odr";
3462 return "weak";
3464 return "weak_odr";
3466 return "common";
3468 return "appending";
3470 return "extern_weak";
3472 return "available_externally";
3473 }
3474 llvm_unreachable("invalid linkage");
3475}
3476
3477// When printing the linkage types in IR where the ExternalLinkage is
3478// not printed, and other linkage types are expected to be printed with
3479// a space after the name.
3482 return "";
3483 return getLinkageName(LT) + " ";
3484}
3485
3487 switch (Vis) {
3489 return "default";
3491 return "hidden";
3493 return "protected";
3494 }
3495 llvm_unreachable("invalid visibility");
3496}
3497
3499 switch (IK) {
3501 return "definition";
3503 return "declaration";
3504 }
3505 llvm_unreachable("invalid import kind");
3506}
3507
3508void AssemblyWriter::printFunctionSummary(const FunctionSummary *FS) {
3509 Out << ", insts: " << FS->instCount();
3510 if (FS->fflags().anyFlagSet())
3511 Out << ", " << FS->fflags();
3512
3513 if (!FS->calls().empty()) {
3514 Out << ", calls: (";
3515 ListSeparator IFS;
3516 for (auto &Call : FS->calls()) {
3517 Out << IFS;
3518 Out << "(callee: ^" << Machine.getGUIDSlot(Call.first.getGUID());
3519 if (Call.second.getHotness() != CalleeInfo::HotnessType::Unknown)
3520 Out << ", hotness: " << getHotnessName(Call.second.getHotness());
3521 // Follow the convention of emitting flags as a boolean value, but only
3522 // emit if true to avoid unnecessary verbosity and test churn.
3523 if (Call.second.HasTailCall)
3524 Out << ", tail: 1";
3525 Out << ")";
3526 }
3527 Out << ")";
3528 }
3529
3530 if (const auto *TIdInfo = FS->getTypeIdInfo())
3531 printTypeIdInfo(*TIdInfo);
3532
3533 // The AllocationType identifiers capture the profiled context behavior
3534 // reaching a specific static allocation site (possibly cloned).
3535 auto AllocTypeName = [](uint8_t Type) -> const char * {
3536 switch (Type) {
3537 case (uint8_t)AllocationType::None:
3538 return "none";
3539 case (uint8_t)AllocationType::NotCold:
3540 return "notcold";
3541 case (uint8_t)AllocationType::Cold:
3542 return "cold";
3543 case (uint8_t)AllocationType::Hot:
3544 return "hot";
3545 }
3546 llvm_unreachable("Unexpected alloc type");
3547 };
3548
3549 if (!FS->allocs().empty()) {
3550 Out << ", allocs: (";
3551 ListSeparator AFS;
3552 for (auto &AI : FS->allocs()) {
3553 Out << AFS;
3554 Out << "(versions: (";
3555 ListSeparator VFS;
3556 for (auto V : AI.Versions) {
3557 Out << VFS;
3558 Out << AllocTypeName(V);
3559 }
3560 Out << "), memProf: (";
3561 ListSeparator MIBFS;
3562 for (auto &MIB : AI.MIBs) {
3563 Out << MIBFS;
3564 Out << "(type: " << AllocTypeName((uint8_t)MIB.AllocType);
3565 Out << ", stackIds: (";
3566 ListSeparator SIDFS;
3567 for (auto Id : MIB.StackIdIndices) {
3568 Out << SIDFS;
3569 Out << TheIndex->getStackIdAtIndex(Id);
3570 }
3571 Out << "))";
3572 }
3573 Out << "))";
3574 }
3575 Out << ")";
3576 }
3577
3578 if (!FS->callsites().empty()) {
3579 Out << ", callsites: (";
3580 ListSeparator SNFS;
3581 for (auto &CI : FS->callsites()) {
3582 Out << SNFS;
3583 if (CI.Callee)
3584 Out << "(callee: ^" << Machine.getGUIDSlot(CI.Callee.getGUID());
3585 else
3586 Out << "(callee: null";
3587 Out << ", clones: (";
3588 ListSeparator VFS;
3589 for (auto V : CI.Clones) {
3590 Out << VFS;
3591 Out << V;
3592 }
3593 Out << "), stackIds: (";
3594 ListSeparator SIDFS;
3595 for (auto Id : CI.StackIdIndices) {
3596 Out << SIDFS;
3597 Out << TheIndex->getStackIdAtIndex(Id);
3598 }
3599 Out << "))";
3600 }
3601 Out << ")";
3602 }
3603
3604 auto PrintRange = [&](const ConstantRange &Range) {
3605 Out << "[" << Range.getSignedMin() << ", " << Range.getSignedMax() << "]";
3606 };
3607
3608 if (!FS->paramAccesses().empty()) {
3609 Out << ", params: (";
3610 ListSeparator IFS;
3611 for (auto &PS : FS->paramAccesses()) {
3612 Out << IFS;
3613 Out << "(param: " << PS.ParamNo;
3614 Out << ", offset: ";
3615 PrintRange(PS.Use);
3616 if (!PS.Calls.empty()) {
3617 Out << ", calls: (";
3618 ListSeparator IFS;
3619 for (auto &Call : PS.Calls) {
3620 Out << IFS;
3621 Out << "(callee: ^" << Machine.getGUIDSlot(Call.Callee.getGUID());
3622 Out << ", param: " << Call.ParamNo;
3623 Out << ", offset: ";
3624 PrintRange(Call.Offsets);
3625 Out << ")";
3626 }
3627 Out << ")";
3628 }
3629 Out << ")";
3630 }
3631 Out << ")";
3632 }
3633}
3634
3635void AssemblyWriter::printTypeIdInfo(
3636 const FunctionSummary::TypeIdInfo &TIDInfo) {
3637 Out << ", typeIdInfo: (";
3638 ListSeparator TIDFS;
3639 if (!TIDInfo.TypeTests.empty()) {
3640 Out << TIDFS;
3641 Out << "typeTests: (";
3642 ListSeparator FS;
3643 for (auto &GUID : TIDInfo.TypeTests) {
3644 auto TidIter = TheIndex->typeIds().equal_range(GUID);
3645 if (TidIter.first == TidIter.second) {
3646 Out << FS;
3647 Out << GUID;
3648 continue;
3649 }
3650 // Print all type id that correspond to this GUID.
3651 for (const auto &[GUID, TypeIdPair] : make_range(TidIter)) {
3652 Out << FS;
3653 auto Slot = Machine.getTypeIdSlot(TypeIdPair.first);
3654 assert(Slot != -1);
3655 Out << "^" << Slot;
3656 }
3657 }
3658 Out << ")";
3659 }
3660 if (!TIDInfo.TypeTestAssumeVCalls.empty()) {
3661 Out << TIDFS;
3662 printNonConstVCalls(TIDInfo.TypeTestAssumeVCalls, "typeTestAssumeVCalls");
3663 }
3664 if (!TIDInfo.TypeCheckedLoadVCalls.empty()) {
3665 Out << TIDFS;
3666 printNonConstVCalls(TIDInfo.TypeCheckedLoadVCalls, "typeCheckedLoadVCalls");
3667 }
3668 if (!TIDInfo.TypeTestAssumeConstVCalls.empty()) {
3669 Out << TIDFS;
3670 printConstVCalls(TIDInfo.TypeTestAssumeConstVCalls,
3671 "typeTestAssumeConstVCalls");
3672 }
3673 if (!TIDInfo.TypeCheckedLoadConstVCalls.empty()) {
3674 Out << TIDFS;
3675 printConstVCalls(TIDInfo.TypeCheckedLoadConstVCalls,
3676 "typeCheckedLoadConstVCalls");
3677 }
3678 Out << ")";
3679}
3680
3681void AssemblyWriter::printVFuncId(const FunctionSummary::VFuncId VFId) {
3682 auto TidIter = TheIndex->typeIds().equal_range(VFId.GUID);
3683 if (TidIter.first == TidIter.second) {
3684 Out << "vFuncId: (";
3685 Out << "guid: " << VFId.GUID;
3686 Out << ", offset: " << VFId.Offset;
3687 Out << ")";
3688 return;
3689 }
3690 // Print all type id that correspond to this GUID.
3691 ListSeparator FS;
3692 for (const auto &[GUID, TypeIdPair] : make_range(TidIter)) {
3693 Out << FS;
3694 Out << "vFuncId: (";
3695 auto Slot = Machine.getTypeIdSlot(TypeIdPair.first);
3696 assert(Slot != -1);
3697 Out << "^" << Slot;
3698 Out << ", offset: " << VFId.Offset;
3699 Out << ")";
3700 }
3701}
3702
3703void AssemblyWriter::printNonConstVCalls(
3704 ArrayRef<FunctionSummary::VFuncId> VCallList, const char *Tag) {
3705 Out << Tag << ": (";
3706 ListSeparator FS;
3707 for (auto &VFuncId : VCallList) {
3708 Out << FS;
3709 printVFuncId(VFuncId);
3710 }
3711 Out << ")";
3712}
3713
3714void AssemblyWriter::printConstVCalls(
3715 ArrayRef<FunctionSummary::ConstVCall> VCallList, const char *Tag) {
3716 Out << Tag << ": (";
3717 ListSeparator FS;
3718 for (auto &ConstVCall : VCallList) {
3719 Out << FS;
3720 Out << "(";
3721 printVFuncId(ConstVCall.VFunc);
3722 if (!ConstVCall.Args.empty()) {
3723 Out << ", ";
3724 printArgs(ConstVCall.Args);
3725 }
3726 Out << ")";
3727 }
3728 Out << ")";
3729}
3730
3731void AssemblyWriter::printSummary(const GlobalValueSummary &Summary) {
3732 GlobalValueSummary::GVFlags GVFlags = Summary.flags();
3734 Out << getSummaryKindName(Summary.getSummaryKind()) << ": ";
3735 Out << "(module: ^" << Machine.getModulePathSlot(Summary.modulePath())
3736 << ", flags: (";
3737 Out << "linkage: " << getLinkageName(LT);
3738 Out << ", visibility: "
3740 Out << ", notEligibleToImport: " << GVFlags.NotEligibleToImport;
3741 Out << ", live: " << GVFlags.Live;
3742 Out << ", dsoLocal: " << GVFlags.DSOLocal;
3743 Out << ", canAutoHide: " << GVFlags.CanAutoHide;
3744 Out << ", importType: "
3746 Out << ", noRenameOnPromotion: " << GVFlags.NoRenameOnPromotion;
3747 Out << ")";
3748
3749 if (Summary.getSummaryKind() == GlobalValueSummary::AliasKind)
3750 printAliasSummary(cast<AliasSummary>(&Summary));
3751 else if (Summary.getSummaryKind() == GlobalValueSummary::FunctionKind)
3752 printFunctionSummary(cast<FunctionSummary>(&Summary));
3753 else
3754 printGlobalVarSummary(cast<GlobalVarSummary>(&Summary));
3755
3756 auto RefList = Summary.refs();
3757 if (!RefList.empty()) {
3758 Out << ", refs: (";
3759 ListSeparator FS;
3760 for (auto &Ref : RefList) {
3761 Out << FS;
3762 if (Ref.isReadOnly())
3763 Out << "readonly ";
3764 else if (Ref.isWriteOnly())
3765 Out << "writeonly ";
3766 Out << "^" << Machine.getGUIDSlot(Ref.getGUID());
3767 }
3768 Out << ")";
3769 }
3770
3771 Out << ")";
3772}
3773
3774void AssemblyWriter::printSummaryInfo(unsigned Slot, const ValueInfo &VI) {
3775 Out << "^" << Slot << " = gv: (";
3776 if (VI.hasName() && !VI.name().empty())
3777 Out << "name: \"" << VI.name() << "\"";
3778 else
3779 Out << "guid: " << VI.getGUID();
3780 if (!VI.getSummaryList().empty()) {
3781 Out << ", summaries: (";
3782 ListSeparator FS;
3783 for (auto &Summary : VI.getSummaryList()) {
3784 Out << FS;
3785 printSummary(*Summary);
3786 }
3787 Out << ")";
3788 }
3789 Out << ")";
3790 if (VI.hasName() && !VI.name().empty())
3791 Out << " ; guid = " << VI.getGUID();
3792 Out << "\n";
3793}
3794
3796 formatted_raw_ostream &Out) {
3797 if (Name.empty()) {
3798 Out << "<empty name> ";
3799 } else {
3800 unsigned char FirstC = static_cast<unsigned char>(Name[0]);
3801 if (isalpha(FirstC) || FirstC == '-' || FirstC == '$' || FirstC == '.' ||
3802 FirstC == '_')
3803 Out << FirstC;
3804 else
3805 Out << '\\' << hexdigit(FirstC >> 4) << hexdigit(FirstC & 0x0F);
3806 for (unsigned i = 1, e = Name.size(); i != e; ++i) {
3807 unsigned char C = Name[i];
3808 if (isalnum(C) || C == '-' || C == '$' || C == '.' || C == '_')
3809 Out << C;
3810 else
3811 Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
3812 }
3813 }
3814}
3815
3816void AssemblyWriter::printNamedMDNode(const NamedMDNode *NMD) {
3817 Out << '!';
3818 printMetadataIdentifier(NMD->getName(), Out);
3819 Out << " = !{";
3820 ListSeparator LS;
3821 for (const MDNode *Op : NMD->operands()) {
3822 Out << LS;
3823 // Write DIExpressions inline.
3824 // FIXME: Ban DIExpressions in NamedMDNodes, they will serve no purpose.
3825 if (auto *Expr = dyn_cast<DIExpression>(Op)) {
3826 writeDIExpression(Out, Expr, AsmWriterContext::getEmpty());
3827 continue;
3828 }
3829
3830 int Slot = Machine.getMetadataSlot(Op);
3831 if (Slot == -1)
3832 Out << "<badref>";
3833 else
3834 Out << '!' << Slot;
3835 }
3836 Out << "}\n";
3837}
3838
3840 formatted_raw_ostream &Out) {
3841 switch (Vis) {
3843 case GlobalValue::HiddenVisibility: Out << "hidden "; break;
3844 case GlobalValue::ProtectedVisibility: Out << "protected "; break;
3845 }
3846}
3847
3848static void printDSOLocation(const GlobalValue &GV,
3849 formatted_raw_ostream &Out) {
3850 if (GV.isDSOLocal() && !GV.isImplicitDSOLocal())
3851 Out << "dso_local ";
3852}
3853
3855 formatted_raw_ostream &Out) {
3856 switch (SCT) {
3858 case GlobalValue::DLLImportStorageClass: Out << "dllimport "; break;
3859 case GlobalValue::DLLExportStorageClass: Out << "dllexport "; break;
3860 }
3861}
3862
3864 formatted_raw_ostream &Out) {
3865 switch (TLM) {
3867 break;
3869 Out << "thread_local ";
3870 break;
3872 Out << "thread_local(localdynamic) ";
3873 break;
3875 Out << "thread_local(initialexec) ";
3876 break;
3878 Out << "thread_local(localexec) ";
3879 break;
3880 }
3881}
3882
3884 switch (UA) {
3886 return "";
3888 return "local_unnamed_addr";
3890 return "unnamed_addr";
3891 }
3892 llvm_unreachable("Unknown UnnamedAddr");
3893}
3894
3896 const GlobalObject &GO) {
3897 const Comdat *C = GO.getComdat();
3898 if (!C)
3899 return;
3900
3901 if (isa<GlobalVariable>(GO))
3902 Out << ',';
3903 Out << " comdat";
3904
3905 if (GO.getName() == C->getName())
3906 return;
3907
3908 Out << '(';
3909 printLLVMName(Out, C->getName(), ComdatPrefix);
3910 Out << ')';
3911}
3912
3913void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
3914 if (GV->isMaterializable())
3915 Out << "; Materializable\n";
3916
3917 AsmWriterContext WriterCtx(&TypePrinter, &Machine, GV->getParent());
3918 writeAsOperandInternal(Out, GV, WriterCtx);
3919 Out << " = ";
3920
3921 if (!GV->hasInitializer() && GV->hasExternalLinkage())
3922 Out << "external ";
3923
3924 Out << getLinkageNameWithSpace(GV->getLinkage());
3925 printDSOLocation(*GV, Out);
3926 printVisibility(GV->getVisibility(), Out);
3929 StringRef UA = getUnnamedAddrEncoding(GV->getUnnamedAddr());
3930 if (!UA.empty())
3931 Out << UA << ' ';
3932
3934 /*Prefix=*/"", /*Suffix=*/" ");
3935 if (GV->isExternallyInitialized()) Out << "externally_initialized ";
3936 Out << (GV->isConstant() ? "constant " : "global ");
3937 TypePrinter.print(GV->getValueType(), Out);
3938
3939 if (GV->hasInitializer()) {
3940 Out << ' ';
3941 writeOperand(GV->getInitializer(), false);
3942 }
3943
3944 if (GV->hasSection()) {
3945 Out << ", section \"";
3946 printEscapedString(GV->getSection(), Out);
3947 Out << '"';
3948 }
3949 if (GV->hasPartition()) {
3950 Out << ", partition \"";
3951 printEscapedString(GV->getPartition(), Out);
3952 Out << '"';
3953 }
3954 if (auto CM = GV->getCodeModel()) {
3955 Out << ", code_model \"";
3956 switch (*CM) {
3957 case CodeModel::Tiny:
3958 Out << "tiny";
3959 break;
3960 case CodeModel::Small:
3961 Out << "small";
3962 break;
3963 case CodeModel::Kernel:
3964 Out << "kernel";
3965 break;
3966 case CodeModel::Medium:
3967 Out << "medium";
3968 break;
3969 case CodeModel::Large:
3970 Out << "large";
3971 break;
3972 }
3973 Out << '"';
3974 }
3975
3976 using SanitizerMetadata = llvm::GlobalValue::SanitizerMetadata;
3977 if (GV->hasSanitizerMetadata()) {
3979 if (MD.NoAddress)
3980 Out << ", no_sanitize_address";
3981 if (MD.NoHWAddress)
3982 Out << ", no_sanitize_hwaddress";
3983 if (MD.Memtag)
3984 Out << ", sanitize_memtag";
3985 if (MD.IsDynInit)
3986 Out << ", sanitize_address_dyninit";
3987 }
3988
3989 maybePrintComdat(Out, *GV);
3990 if (MaybeAlign A = GV->getAlign())
3991 Out << ", align " << A->value();
3992
3994 GV->getAllMetadata(MDs);
3995 printMetadataAttachments(MDs, ", ");
3996
3997 auto Attrs = GV->getAttributes();
3998 if (Attrs.hasAttributes())
3999 Out << " #" << Machine.getAttributeGroupSlot(Attrs);
4000
4001 printInfoComment(*GV, GV->isMaterializable());
4002}
4003
4004void AssemblyWriter::printAlias(const GlobalAlias *GA) {
4005 if (GA->isMaterializable())
4006 Out << "; Materializable\n";
4007
4008 AsmWriterContext WriterCtx(&TypePrinter, &Machine, GA->getParent());
4009 writeAsOperandInternal(Out, GA, WriterCtx);
4010 Out << " = ";
4011
4012 Out << getLinkageNameWithSpace(GA->getLinkage());
4013 printDSOLocation(*GA, Out);
4014 printVisibility(GA->getVisibility(), Out);
4017 StringRef UA = getUnnamedAddrEncoding(GA->getUnnamedAddr());
4018 if (!UA.empty())
4019 Out << UA << ' ';
4020
4021 Out << "alias ";
4022
4023 TypePrinter.print(GA->getValueType(), Out);
4024 Out << ", ";
4025
4026 if (const Constant *Aliasee = GA->getAliasee()) {
4027 writeOperand(Aliasee, !isa<ConstantExpr>(Aliasee));
4028 } else {
4029 TypePrinter.print(GA->getType(), Out);
4030 Out << " <<NULL ALIASEE>>";
4031 }
4032
4033 if (GA->hasPartition()) {
4034 Out << ", partition \"";
4035 printEscapedString(GA->getPartition(), Out);
4036 Out << '"';
4037 }
4038
4039 printInfoComment(*GA, GA->isMaterializable());
4040 Out << '\n';
4041}
4042
4043void AssemblyWriter::printIFunc(const GlobalIFunc *GI) {
4044 if (GI->isMaterializable())
4045 Out << "; Materializable\n";
4046
4047 AsmWriterContext WriterCtx(&TypePrinter, &Machine, GI->getParent());
4048 writeAsOperandInternal(Out, GI, WriterCtx);
4049 Out << " = ";
4050
4051 Out << getLinkageNameWithSpace(GI->getLinkage());
4052 printDSOLocation(*GI, Out);
4053 printVisibility(GI->getVisibility(), Out);
4054
4055 Out << "ifunc ";
4056
4057 TypePrinter.print(GI->getValueType(), Out);
4058 Out << ", ";
4059
4060 if (const Constant *Resolver = GI->getResolver()) {
4061 writeOperand(Resolver, !isa<ConstantExpr>(Resolver));
4062 } else {
4063 TypePrinter.print(GI->getType(), Out);
4064 Out << " <<NULL RESOLVER>>";
4065 }
4066
4067 if (GI->hasPartition()) {
4068 Out << ", partition \"";
4069 printEscapedString(GI->getPartition(), Out);
4070 Out << '"';
4071 }
4073 GI->getAllMetadata(MDs);
4074 if (!MDs.empty()) {
4075 printMetadataAttachments(MDs, ", ");
4076 }
4077
4078 printInfoComment(*GI, GI->isMaterializable());
4079 Out << '\n';
4080}
4081
4082void AssemblyWriter::printComdat(const Comdat *C) {
4083 C->print(Out);
4084}
4085
4086void AssemblyWriter::printTypeIdentities() {
4087 if (TypePrinter.empty())
4088 return;
4089
4090 Out << '\n';
4091
4092 // Emit all numbered types.
4093 auto &NumberedTypes = TypePrinter.getNumberedTypes();
4094 for (unsigned I = 0, E = NumberedTypes.size(); I != E; ++I) {
4095 Out << '%' << I << " = type ";
4096
4097 // Make sure we print out at least one level of the type structure, so
4098 // that we do not get %2 = type %2
4099 TypePrinter.printStructBody(NumberedTypes[I], Out);
4100 Out << '\n';
4101 }
4102
4103 auto &NamedTypes = TypePrinter.getNamedTypes();
4104 for (StructType *NamedType : NamedTypes) {
4105 printLLVMName(Out, NamedType->getName(), LocalPrefix);
4106 Out << " = type ";
4107
4108 // Make sure we print out at least one level of the type structure, so
4109 // that we do not get %FILE = type %FILE
4110 TypePrinter.printStructBody(NamedType, Out);
4111 Out << '\n';
4112 }
4113}
4114
4115/// printFunction - Print all aspects of a function.
4116void AssemblyWriter::printFunction(const Function *F) {
4117 if (F->isMaterializable())
4118 Out << "; Materializable\n";
4119 else if (AnnotationWriter)
4120 AnnotationWriter->emitFunctionAnnot(F, Out);
4121
4122 const AttributeList &Attrs = F->getAttributes();
4123 if (Attrs.hasFnAttrs()) {
4124 AttributeSet AS = Attrs.getFnAttrs();
4125 std::string AttrStr;
4126
4127 for (const Attribute &Attr : AS) {
4128 if (!Attr.isStringAttribute()) {
4129 if (!AttrStr.empty()) AttrStr += ' ';
4130 AttrStr += Attr.getAsString();
4131 }
4132 }
4133
4134 if (!AttrStr.empty())
4135 Out << "; Function Attrs: " << AttrStr << '\n';
4136 }
4137
4138 if (F->isIntrinsic() && F->getIntrinsicID() == Intrinsic::not_intrinsic)
4139 Out << "; Unknown intrinsic\n";
4140
4141 Machine.incorporateFunction(F);
4142
4143 if (F->isDeclaration()) {
4144 Out << "declare";
4146 F->getAllMetadata(MDs);
4147 printMetadataAttachments(MDs, " ");
4148 Out << ' ';
4149 } else
4150 Out << "define ";
4151
4152 Out << getLinkageNameWithSpace(F->getLinkage());
4153 printDSOLocation(*F, Out);
4154 printVisibility(F->getVisibility(), Out);
4155 printDLLStorageClass(F->getDLLStorageClass(), Out);
4156
4157 // Print the calling convention.
4158 if (F->getCallingConv() != CallingConv::C) {
4159 printCallingConv(F->getCallingConv(), Out);
4160 Out << " ";
4161 }
4162
4163 FunctionType *FT = F->getFunctionType();
4164 if (Attrs.hasRetAttrs())
4165 Out << Attrs.getAsString(AttributeList::ReturnIndex) << ' ';
4166 TypePrinter.print(F->getReturnType(), Out);
4167 AsmWriterContext WriterCtx(&TypePrinter, &Machine, F->getParent());
4168 Out << ' ';
4169 writeAsOperandInternal(Out, F, WriterCtx);
4170 Out << '(';
4171
4172 // Loop over the arguments, printing them...
4173 if (F->isDeclaration() && !IsForDebug) {
4174 // We're only interested in the type here - don't print argument names.
4175 ListSeparator LS;
4176 for (unsigned I = 0, E = FT->getNumParams(); I != E; ++I) {
4177 Out << LS;
4178 // Output type.
4179 TypePrinter.print(FT->getParamType(I), Out);
4180
4181 AttributeSet ArgAttrs = Attrs.getParamAttrs(I);
4182 if (ArgAttrs.hasAttributes()) {
4183 Out << ' ';
4184 writeAttributeSet(ArgAttrs);
4185 }
4186 }
4187 } else {
4188 // The arguments are meaningful here, print them in detail.
4189 ListSeparator LS;
4190 for (const Argument &Arg : F->args()) {
4191 Out << LS;
4192 printArgument(&Arg, Attrs.getParamAttrs(Arg.getArgNo()));
4193 }
4194 }
4195
4196 // Finish printing arguments...
4197 if (FT->isVarArg()) {
4198 if (FT->getNumParams()) Out << ", ";
4199 Out << "..."; // Output varargs portion of signature!
4200 }
4201 Out << ')';
4202 StringRef UA = getUnnamedAddrEncoding(F->getUnnamedAddr());
4203 if (!UA.empty())
4204 Out << ' ' << UA;
4205 // We print the function address space if it is non-zero or if we are writing
4206 // a module with a non-zero program address space or if there is no valid
4207 // Module* so that the file can be parsed without the datalayout string.
4208 const Module *Mod = F->getParent();
4209 bool ForcePrintAddressSpace =
4210 !Mod || Mod->getDataLayout().getProgramAddressSpace() != 0;
4211 printAddressSpace(Mod, F->getAddressSpace(), Out, /*Prefix=*/" ",
4212 /*Suffix=*/"", ForcePrintAddressSpace);
4213 if (Attrs.hasFnAttrs())
4214 Out << " #" << Machine.getAttributeGroupSlot(Attrs.getFnAttrs());
4215 if (F->hasSection()) {
4216 Out << " section \"";
4217 printEscapedString(F->getSection(), Out);
4218 Out << '"';
4219 }
4220 if (F->hasPartition()) {
4221 Out << " partition \"";
4222 printEscapedString(F->getPartition(), Out);
4223 Out << '"';
4224 }
4225 maybePrintComdat(Out, *F);
4226 if (MaybeAlign A = F->getAlign())
4227 Out << " align " << A->value();
4228 if (MaybeAlign A = F->getPreferredAlignment())
4229 Out << " prefalign(" << A->value() << ')';
4230 if (F->hasGC())
4231 Out << " gc \"" << F->getGC() << '"';
4232 if (F->hasPrefixData()) {
4233 Out << " prefix ";
4234 writeOperand(F->getPrefixData(), true);
4235 }
4236 if (F->hasPrologueData()) {
4237 Out << " prologue ";
4238 writeOperand(F->getPrologueData(), true);
4239 }
4240 if (F->hasPersonalityFn()) {
4241 Out << " personality ";
4242 writeOperand(F->getPersonalityFn(), /*PrintType=*/true);
4243 }
4244
4245 if (PrintProfData) {
4246 if (auto *MDProf = F->getMetadata(LLVMContext::MD_prof)) {
4247 Out << " ";
4248 MDProf->print(Out, TheModule, /*IsForDebug=*/true);
4249 }
4250 }
4251
4252 if (F->isDeclaration()) {
4253 Out << '\n';
4254 } else {
4256 F->getAllMetadata(MDs);
4257 printMetadataAttachments(MDs, " ");
4258
4259 Out << " {";
4260 // Output all of the function's basic blocks.
4261 for (const BasicBlock &BB : *F)
4262 printBasicBlock(&BB);
4263
4264 // Output the function's use-lists.
4265 printUseLists(F);
4266
4267 Out << "}\n";
4268 }
4269
4270 Machine.purgeFunction();
4271}
4272
4273/// printArgument - This member is called for every argument that is passed into
4274/// the function. Simply print it out
4275void AssemblyWriter::printArgument(const Argument *Arg, AttributeSet Attrs) {
4276 // Output type...
4277 TypePrinter.print(Arg->getType(), Out);
4278
4279 // Output parameter attributes list
4280 if (Attrs.hasAttributes()) {
4281 Out << ' ';
4282 writeAttributeSet(Attrs);
4283 }
4284
4285 // Output name, if available...
4286 if (Arg->hasName()) {
4287 Out << ' ';
4288 printLLVMName(Out, Arg);
4289 } else {
4290 int Slot = Machine.getLocalSlot(Arg);
4291 assert(Slot != -1 && "expect argument in function here");
4292 Out << " %" << Slot;
4293 }
4294}
4295
4296/// printBasicBlock - This member is called for each basic block in a method.
4297void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
4298 bool IsEntryBlock = BB->getParent() && BB->isEntryBlock();
4299 if (BB->hasName()) { // Print out the label if it exists...
4300 Out << "\n";
4301 printLLVMName(Out, BB->getName(), LabelPrefix);
4302 Out << ':';
4303 } else if (!IsEntryBlock) {
4304 Out << "\n";
4305 int Slot = Machine.getLocalSlot(BB);
4306 if (Slot != -1)
4307 Out << Slot << ":";
4308 else
4309 Out << "<badref>:";
4310 }
4311
4312 if (!IsEntryBlock) {
4313 // Output predecessors for the block.
4314 Out.PadToColumn(50);
4315 Out << ";";
4316 if (pred_empty(BB)) {
4317 Out << " No predecessors!";
4318 } else {
4319 Out << " preds = ";
4320 ListSeparator LS;
4321 for (const BasicBlock *Pred : predecessors(BB)) {
4322 Out << LS;
4323 writeOperand(Pred, false);
4324 }
4325 }
4326 }
4327
4328 Out << "\n";
4329
4330 if (AnnotationWriter) AnnotationWriter->emitBasicBlockStartAnnot(BB, Out);
4331
4332 // Output all of the instructions in the basic block...
4333 for (const Instruction &I : *BB) {
4334 for (const DbgRecord &DR : I.getDbgRecordRange())
4335 printDbgRecordLine(DR);
4336 printInstructionLine(I);
4337 }
4338
4339 if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);
4340}
4341
4342/// printInstructionLine - Print an instruction and a newline character.
4343void AssemblyWriter::printInstructionLine(const Instruction &I) {
4344 printInstruction(I);
4345 Out << '\n';
4346}
4347
4348/// printGCRelocateComment - print comment after call to the gc.relocate
4349/// intrinsic indicating base and derived pointer names.
4350void AssemblyWriter::printGCRelocateComment(const GCRelocateInst &Relocate) {
4351 Out << " ; (";
4352 writeOperand(Relocate.getBasePtr(), false);
4353 Out << ", ";
4354 writeOperand(Relocate.getDerivedPtr(), false);
4355 Out << ")";
4356}
4357
4358/// printInfoComment - Print a little comment after the instruction indicating
4359/// which slot it occupies.
4360void AssemblyWriter::printInfoComment(const Value &V, bool isMaterializable) {
4361 if (const auto *Relocate = dyn_cast<GCRelocateInst>(&V))
4362 printGCRelocateComment(*Relocate);
4363
4364 if (AnnotationWriter && !isMaterializable)
4365 AnnotationWriter->printInfoComment(V, Out);
4366
4367 if (PrintInstDebugLocs) {
4368 if (auto *I = dyn_cast<Instruction>(&V)) {
4369 if (I->getDebugLoc()) {
4370 Out << " ; ";
4371 I->getDebugLoc().print(Out);
4372 }
4373 }
4374 }
4375 if (PrintProfData) {
4376 if (auto *I = dyn_cast<Instruction>(&V)) {
4377 if (auto *MD = I->getMetadata(LLVMContext::MD_prof)) {
4378 Out << " ; ";
4379 MD->print(Out, TheModule, /*IsForDebug=*/true);
4380 }
4381 }
4382 }
4383
4384 if (PrintInstAddrs)
4385 Out << " ; " << &V;
4386}
4387
4388static void maybePrintCallAddrSpace(const Value *Operand, const Instruction *I,
4389 raw_ostream &Out) {
4390 if (Operand == nullptr) {
4391 Out << " <cannot get addrspace!>";
4392 return;
4393 }
4394
4395 // We print the address space of the call if it is non-zero.
4396 // We also print it if it is zero but not equal to the program address space
4397 // or if we can't find a valid Module* to make it possible to parse
4398 // the resulting file even without a datalayout string.
4399 unsigned CallAddrSpace = Operand->getType()->getPointerAddressSpace();
4400 const Module *Mod = getModuleFromVal(I);
4401 bool ForcePrintAddrSpace =
4402 !Mod || Mod->getDataLayout().getProgramAddressSpace() != 0;
4403 printAddressSpace(Mod, CallAddrSpace, Out, /*Prefix=*/" ", /*Suffix=*/"",
4404 ForcePrintAddrSpace);
4405}
4406
4407// This member is called for each Instruction in a function..
4408void AssemblyWriter::printInstruction(const Instruction &I) {
4409 if (AnnotationWriter) AnnotationWriter->emitInstructionAnnot(&I, Out);
4410
4411 // Print out indentation for an instruction.
4412 Out << " ";
4413
4414 // Print out name if it exists...
4415 if (I.hasName()) {
4416 printLLVMName(Out, &I);
4417 Out << " = ";
4418 } else if (!I.getType()->isVoidTy()) {
4419 // Print out the def slot taken.
4420 int SlotNum = Machine.getLocalSlot(&I);
4421 if (SlotNum == -1)
4422 Out << "<badref> = ";
4423 else
4424 Out << '%' << SlotNum << " = ";
4425 }
4426
4427 if (const auto *CI = dyn_cast<CallInst>(&I)) {
4428 if (CI->isMustTailCall())
4429 Out << "musttail ";
4430 else if (CI->isTailCall())
4431 Out << "tail ";
4432 else if (CI->isNoTailCall())
4433 Out << "notail ";
4434 }
4435
4436 // Print out the opcode...
4437 Out << I.getOpcodeName();
4438
4439 // If this is an atomic load or store, print out the atomic marker.
4440 if ((isa<LoadInst>(I) && cast<LoadInst>(I).isAtomic()) ||
4441 (isa<StoreInst>(I) && cast<StoreInst>(I).isAtomic()))
4442 Out << " atomic";
4443
4445 Out << " weak";
4446
4447 // If this is a volatile operation, print out the volatile marker.
4448 if ((isa<LoadInst>(I) && cast<LoadInst>(I).isVolatile()) ||
4449 (isa<StoreInst>(I) && cast<StoreInst>(I).isVolatile()) ||
4450 (isa<AtomicCmpXchgInst>(I) && cast<AtomicCmpXchgInst>(I).isVolatile()) ||
4451 (isa<AtomicRMWInst>(I) && cast<AtomicRMWInst>(I).isVolatile()))
4452 Out << " volatile";
4453
4454 // Print out optimization information.
4455 writeOptimizationInfo(Out, &I);
4456
4457 // Print out the compare instruction predicates
4458 if (const auto *CI = dyn_cast<CmpInst>(&I))
4459 Out << ' ' << CI->getPredicate();
4460
4461 // Print out the atomicrmw operation
4462 if (const auto *RMWI = dyn_cast<AtomicRMWInst>(&I)) {
4463 if (RMWI->isElementwise())
4464 Out << " elementwise";
4465 Out << ' ' << AtomicRMWInst::getOperationName(RMWI->getOperation());
4466 }
4467
4468 // Print out the type of the operands...
4469 const Value *Operand = I.getNumOperands() ? I.getOperand(0) : nullptr;
4470
4471 // Special case conditional branches to swizzle the condition out to the front
4472 if (const auto *BI = dyn_cast<CondBrInst>(&I)) {
4473 Out << ' ';
4474 writeOperand(BI->getCondition(), true);
4475 Out << ", ";
4476 writeOperand(BI->getSuccessor(0), true);
4477 Out << ", ";
4478 writeOperand(BI->getSuccessor(1), true);
4479 } else if (isa<SwitchInst>(I)) {
4480 const SwitchInst& SI(cast<SwitchInst>(I));
4481 // Special case switch instruction to get formatting nice and correct.
4482 Out << ' ';
4483 writeOperand(SI.getCondition(), true);
4484 Out << ", ";
4485 writeOperand(SI.getDefaultDest(), true);
4486 Out << " [";
4487 for (auto Case : SI.cases()) {
4488 Out << "\n ";
4489 writeOperand(Case.getCaseValue(), true);
4490 Out << ", ";
4491 writeOperand(Case.getCaseSuccessor(), true);
4492 }
4493 Out << "\n ]";
4494 } else if (isa<IndirectBrInst>(I)) {
4495 // Special case indirectbr instruction to get formatting nice and correct.
4496 Out << ' ';
4497 writeOperand(Operand, true);
4498 Out << ", [";
4499
4500 ListSeparator LS;
4501 for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) {
4502 Out << LS;
4503 writeOperand(I.getOperand(i), true);
4504 }
4505 Out << ']';
4506 } else if (const auto *PN = dyn_cast<PHINode>(&I)) {
4507 Out << ' ';
4508 TypePrinter.print(I.getType(), Out);
4509 Out << ' ';
4510
4511 ListSeparator LS;
4512 for (const auto &[V, Block] :
4513 zip_equal(PN->incoming_values(), PN->blocks())) {
4514 Out << LS << "[ ";
4515 writeOperand(V, false);
4516 Out << ", ";
4517 writeOperand(Block, false);
4518 Out << " ]";
4519 }
4520 } else if (const auto *EVI = dyn_cast<ExtractValueInst>(&I)) {
4521 Out << ' ';
4522 writeOperand(I.getOperand(0), true);
4523 Out << ", ";
4524 Out << llvm::interleaved(EVI->indices());
4525 } else if (const auto *IVI = dyn_cast<InsertValueInst>(&I)) {
4526 Out << ' ';
4527 writeOperand(I.getOperand(0), true); Out << ", ";
4528 writeOperand(I.getOperand(1), true);
4529 Out << ", ";
4530 Out << llvm::interleaved(IVI->indices());
4531 } else if (const auto *LPI = dyn_cast<LandingPadInst>(&I)) {
4532 Out << ' ';
4533 TypePrinter.print(I.getType(), Out);
4534 if (LPI->isCleanup() || LPI->getNumClauses() != 0)
4535 Out << '\n';
4536
4537 if (LPI->isCleanup())
4538 Out << " cleanup";
4539
4540 for (unsigned i = 0, e = LPI->getNumClauses(); i != e; ++i) {
4541 if (i != 0 || LPI->isCleanup()) Out << "\n";
4542 if (LPI->isCatch(i))
4543 Out << " catch ";
4544 else
4545 Out << " filter ";
4546
4547 writeOperand(LPI->getClause(i), true);
4548 }
4549 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(&I)) {
4550 Out << " within ";
4551 writeOperand(CatchSwitch->getParentPad(), /*PrintType=*/false);
4552 Out << " [";
4553 ListSeparator LS;
4554 for (const BasicBlock *PadBB : CatchSwitch->handlers()) {
4555 Out << LS;
4556 writeOperand(PadBB, /*PrintType=*/true);
4557 }
4558 Out << "] unwind ";
4559 if (const BasicBlock *UnwindDest = CatchSwitch->getUnwindDest())
4560 writeOperand(UnwindDest, /*PrintType=*/true);
4561 else
4562 Out << "to caller";
4563 } else if (const auto *FPI = dyn_cast<FuncletPadInst>(&I)) {
4564 Out << " within ";
4565 writeOperand(FPI->getParentPad(), /*PrintType=*/false);
4566 Out << " [";
4567 ListSeparator LS;
4568 for (const Value *Op : FPI->arg_operands()) {
4569 Out << LS;
4570 writeOperand(Op, /*PrintType=*/true);
4571 }
4572 Out << ']';
4573 } else if (isa<ReturnInst>(I) && !Operand) {
4574 Out << " void";
4575 } else if (const auto *CRI = dyn_cast<CatchReturnInst>(&I)) {
4576 Out << " from ";
4577 writeOperand(CRI->getOperand(0), /*PrintType=*/false);
4578
4579 Out << " to ";
4580 writeOperand(CRI->getOperand(1), /*PrintType=*/true);
4581 } else if (const auto *CRI = dyn_cast<CleanupReturnInst>(&I)) {
4582 Out << " from ";
4583 writeOperand(CRI->getOperand(0), /*PrintType=*/false);
4584
4585 Out << " unwind ";
4586 if (CRI->hasUnwindDest())
4587 writeOperand(CRI->getOperand(1), /*PrintType=*/true);
4588 else
4589 Out << "to caller";
4590 } else if (const auto *CI = dyn_cast<CallInst>(&I)) {
4591 // Print the calling convention being used.
4592 if (CI->getCallingConv() != CallingConv::C) {
4593 Out << " ";
4594 printCallingConv(CI->getCallingConv(), Out);
4595 }
4596
4597 Operand = CI->getCalledOperand();
4598 FunctionType *FTy = CI->getFunctionType();
4599 Type *RetTy = FTy->getReturnType();
4600 const AttributeList &PAL = CI->getAttributes();
4601
4602 if (PAL.hasRetAttrs())
4603 Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);
4604
4605 // Only print addrspace(N) if necessary:
4606 maybePrintCallAddrSpace(Operand, &I, Out);
4607
4608 // If possible, print out the short form of the call instruction. We can
4609 // only do this if the first argument is a pointer to a nonvararg function,
4610 // and if the return type is not a pointer to a function.
4611 Out << ' ';
4612 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4613 Out << ' ';
4614 writeOperand(Operand, false);
4615 Out << '(';
4616 bool HasPrettyPrintedArgs =
4617 isa<IntrinsicInst>(CI) &&
4618 Intrinsic::hasPrettyPrintedArgs(CI->getIntrinsicID());
4619
4620 ListSeparator LS;
4621 Function *CalledFunc = CI->getCalledFunction();
4622 auto PrintArgComment = [&](unsigned ArgNo) {
4623 const auto *ConstArg = dyn_cast<Constant>(CI->getArgOperand(ArgNo));
4624 if (!ConstArg)
4625 return;
4626 std::string ArgComment;
4627 raw_string_ostream ArgCommentStream(ArgComment);
4628 Intrinsic::ID IID = CalledFunc->getIntrinsicID();
4629 Intrinsic::printImmArg(IID, ArgNo, ArgCommentStream, ConstArg);
4630 if (ArgComment.empty())
4631 return;
4632 Out << "/* " << ArgComment << " */ ";
4633 };
4634 if (HasPrettyPrintedArgs) {
4635 for (unsigned ArgNo = 0, NumArgs = CI->arg_size(); ArgNo < NumArgs;
4636 ++ArgNo) {
4637 Out << LS;
4638 PrintArgComment(ArgNo);
4639 writeParamOperand(CI->getArgOperand(ArgNo), PAL.getParamAttrs(ArgNo));
4640 }
4641 } else {
4642 for (unsigned ArgNo = 0, NumArgs = CI->arg_size(); ArgNo < NumArgs;
4643 ++ArgNo) {
4644 Out << LS;
4645 writeParamOperand(CI->getArgOperand(ArgNo), PAL.getParamAttrs(ArgNo));
4646 }
4647 }
4648 // Emit an ellipsis if this is a musttail call in a vararg function. This
4649 // is only to aid readability, musttail calls forward varargs by default.
4650 if (CI->isMustTailCall() && CI->getParent() &&
4651 CI->getParent()->getParent() &&
4652 CI->getParent()->getParent()->isVarArg()) {
4653 if (CI->arg_size() > 0)
4654 Out << ", ";
4655 Out << "...";
4656 }
4657
4658 Out << ')';
4659 if (PAL.hasFnAttrs())
4660 Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4661
4662 writeOperandBundles(CI);
4663 } else if (const auto *II = dyn_cast<InvokeInst>(&I)) {
4664 Operand = II->getCalledOperand();
4665 FunctionType *FTy = II->getFunctionType();
4666 Type *RetTy = FTy->getReturnType();
4667 const AttributeList &PAL = II->getAttributes();
4668
4669 // Print the calling convention being used.
4670 if (II->getCallingConv() != CallingConv::C) {
4671 Out << " ";
4672 printCallingConv(II->getCallingConv(), Out);
4673 }
4674
4675 if (PAL.hasRetAttrs())
4676 Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);
4677
4678 // Only print addrspace(N) if necessary:
4679 maybePrintCallAddrSpace(Operand, &I, Out);
4680
4681 // If possible, print out the short form of the invoke instruction. We can
4682 // only do this if the first argument is a pointer to a nonvararg function,
4683 // and if the return type is not a pointer to a function.
4684 //
4685 Out << ' ';
4686 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4687 Out << ' ';
4688 writeOperand(Operand, false);
4689 Out << '(';
4690 ListSeparator LS;
4691 for (unsigned op = 0, Eop = II->arg_size(); op < Eop; ++op) {
4692 Out << LS;
4693 writeParamOperand(II->getArgOperand(op), PAL.getParamAttrs(op));
4694 }
4695
4696 Out << ')';
4697 if (PAL.hasFnAttrs())
4698 Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4699
4700 writeOperandBundles(II);
4701
4702 Out << "\n to ";
4703 writeOperand(II->getNormalDest(), true);
4704 Out << " unwind ";
4705 writeOperand(II->getUnwindDest(), true);
4706 } else if (const auto *CBI = dyn_cast<CallBrInst>(&I)) {
4707 Operand = CBI->getCalledOperand();
4708 FunctionType *FTy = CBI->getFunctionType();
4709 Type *RetTy = FTy->getReturnType();
4710 const AttributeList &PAL = CBI->getAttributes();
4711
4712 // Print the calling convention being used.
4713 if (CBI->getCallingConv() != CallingConv::C) {
4714 Out << " ";
4715 printCallingConv(CBI->getCallingConv(), Out);
4716 }
4717
4718 if (PAL.hasRetAttrs())
4719 Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);
4720
4721 // If possible, print out the short form of the callbr instruction. We can
4722 // only do this if the first argument is a pointer to a nonvararg function,
4723 // and if the return type is not a pointer to a function.
4724 //
4725 Out << ' ';
4726 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4727 Out << ' ';
4728 writeOperand(Operand, false);
4729 Out << '(';
4730 ListSeparator ArgLS;
4731 for (unsigned op = 0, Eop = CBI->arg_size(); op < Eop; ++op) {
4732 Out << ArgLS;
4733 writeParamOperand(CBI->getArgOperand(op), PAL.getParamAttrs(op));
4734 }
4735
4736 Out << ')';
4737 if (PAL.hasFnAttrs())
4738 Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4739
4740 writeOperandBundles(CBI);
4741
4742 Out << "\n to ";
4743 writeOperand(CBI->getDefaultDest(), true);
4744 Out << " [";
4745 ListSeparator DestLS;
4746 for (const BasicBlock *Dest : CBI->getIndirectDests()) {
4747 Out << DestLS;
4748 writeOperand(Dest, true);
4749 }
4750 Out << ']';
4751 } else if (const auto *AI = dyn_cast<AllocaInst>(&I)) {
4752 Out << ' ';
4753 if (AI->isUsedWithInAlloca())
4754 Out << "inalloca ";
4755 if (AI->isSwiftError())
4756 Out << "swifterror ";
4757 TypePrinter.print(AI->getAllocatedType(), Out);
4758
4759 // Explicitly write the array size if the code is broken, if it's an array
4760 // allocation, or if the type is not canonical for scalar allocations. The
4761 // latter case prevents the type from mutating when round-tripping through
4762 // assembly.
4763 if (!AI->getArraySize() || AI->isArrayAllocation() ||
4764 !AI->getArraySize()->getType()->isIntegerTy(32)) {
4765 Out << ", ";
4766 writeOperand(AI->getArraySize(), true);
4767 }
4768 if (MaybeAlign A = AI->getAlign()) {
4769 Out << ", align " << A->value();
4770 }
4771
4772 printAddressSpace(AI->getModule(), AI->getAddressSpace(), Out,
4773 /*Prefix=*/", ");
4774 } else if (isa<CastInst>(I)) {
4775 if (Operand) {
4776 Out << ' ';
4777 writeOperand(Operand, true); // Work with broken code
4778 }
4779 Out << " to ";
4780 TypePrinter.print(I.getType(), Out);
4781 } else if (isa<VAArgInst>(I)) {
4782 if (Operand) {
4783 Out << ' ';
4784 writeOperand(Operand, true); // Work with broken code
4785 }
4786 Out << ", ";
4787 TypePrinter.print(I.getType(), Out);
4788 } else if (Operand) { // Print the normal way.
4789 if (const auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
4790 Out << ' ';
4791 TypePrinter.print(GEP->getSourceElementType(), Out);
4792 Out << ',';
4793 } else if (const auto *LI = dyn_cast<LoadInst>(&I)) {
4794 Out << ' ';
4795 TypePrinter.print(LI->getType(), Out);
4796 Out << ',';
4797 }
4798
4799 // PrintAllTypes - Instructions who have operands of all the same type
4800 // omit the type from all but the first operand. If the instruction has
4801 // different type operands (for example br), then they are all printed.
4802 bool PrintAllTypes = false;
4803 Type *TheType = Operand->getType();
4804
4805 // Select, Store, ShuffleVector, CmpXchg and AtomicRMW always print all
4806 // types.
4810 PrintAllTypes = true;
4811 } else {
4812 for (unsigned i = 1, E = I.getNumOperands(); i != E; ++i) {
4813 Operand = I.getOperand(i);
4814 // note that Operand shouldn't be null, but the test helps make dump()
4815 // more tolerant of malformed IR
4816 if (Operand && Operand->getType() != TheType) {
4817 PrintAllTypes = true; // We have differing types! Print them all!
4818 break;
4819 }
4820 }
4821 }
4822
4823 if (!PrintAllTypes) {
4824 Out << ' ';
4825 TypePrinter.print(TheType, Out);
4826 }
4827
4828 Out << ' ';
4829 ListSeparator LS;
4830 for (const Value *Op : I.operands()) {
4831 Out << LS;
4832 writeOperand(Op, PrintAllTypes);
4833 }
4834 }
4835
4836 // Print atomic ordering/alignment for memory operations
4837 if (const auto *LI = dyn_cast<LoadInst>(&I)) {
4838 if (LI->isAtomic())
4839 writeAtomic(LI->getContext(), LI->getOrdering(), LI->getSyncScopeID());
4840 if (MaybeAlign A = LI->getAlign())
4841 Out << ", align " << A->value();
4842 } else if (const auto *SI = dyn_cast<StoreInst>(&I)) {
4843 if (SI->isAtomic())
4844 writeAtomic(SI->getContext(), SI->getOrdering(), SI->getSyncScopeID());
4845 if (MaybeAlign A = SI->getAlign())
4846 Out << ", align " << A->value();
4847 } else if (const auto *CXI = dyn_cast<AtomicCmpXchgInst>(&I)) {
4848 writeAtomicCmpXchg(CXI->getContext(), CXI->getSuccessOrdering(),
4849 CXI->getFailureOrdering(), CXI->getSyncScopeID());
4850 Out << ", align " << CXI->getAlign().value();
4851 } else if (const auto *RMWI = dyn_cast<AtomicRMWInst>(&I)) {
4852 writeAtomic(RMWI->getContext(), RMWI->getOrdering(),
4853 RMWI->getSyncScopeID());
4854 Out << ", align " << RMWI->getAlign().value();
4855 } else if (const auto *FI = dyn_cast<FenceInst>(&I)) {
4856 writeAtomic(FI->getContext(), FI->getOrdering(), FI->getSyncScopeID());
4857 } else if (const auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) {
4858 printShuffleMask(Out, SVI->getType(), SVI->getShuffleMask());
4859 }
4860
4861 // Print Metadata info.
4863 I.getAllMetadata(InstMD);
4864 printMetadataAttachments(InstMD, ", ");
4865
4866 // Print a nice comment.
4867 printInfoComment(I);
4868}
4869
4870void AssemblyWriter::printDbgMarker(const DbgMarker &Marker) {
4871 // There's no formal representation of a DbgMarker -- print purely as a
4872 // debugging aid.
4873 for (const DbgRecord &DPR : Marker.StoredDbgRecords) {
4874 printDbgRecord(DPR);
4875 Out << "\n";
4876 }
4877
4878 Out << " DbgMarker -> { ";
4879 printInstruction(*Marker.MarkedInstr);
4880 Out << " }";
4881}
4882
4883void AssemblyWriter::printDbgRecord(const DbgRecord &DR) {
4884 if (auto *DVR = dyn_cast<DbgVariableRecord>(&DR))
4885 printDbgVariableRecord(*DVR);
4886 else if (auto *DLR = dyn_cast<DbgLabelRecord>(&DR))
4887 printDbgLabelRecord(*DLR);
4888 else
4889 llvm_unreachable("Unexpected DbgRecord kind");
4890}
4891
4892void AssemblyWriter::printDbgVariableRecord(const DbgVariableRecord &DVR) {
4893 auto WriterCtx = getContext();
4894 Out << "#dbg_";
4895 switch (DVR.getType()) {
4896 case DbgVariableRecord::LocationType::Value:
4897 Out << "value";
4898 break;
4899 case DbgVariableRecord::LocationType::Declare:
4900 Out << "declare";
4901 break;
4902 case DbgVariableRecord::LocationType::DeclareValue:
4903 Out << "declare_value";
4904 break;
4905 case DbgVariableRecord::LocationType::Assign:
4906 Out << "assign";
4907 break;
4908 default:
4910 "Tried to print a DbgVariableRecord with an invalid LocationType!");
4911 }
4912
4913 auto PrintOrNull = [&](Metadata *M) {
4914 if (!M)
4915 Out << "(null)";
4916 else
4917 writeAsOperandInternal(Out, M, WriterCtx, true);
4918 };
4919
4920 Out << "(";
4921 PrintOrNull(DVR.getRawLocation());
4922 Out << ", ";
4923 PrintOrNull(DVR.getRawVariable());
4924 Out << ", ";
4925 PrintOrNull(DVR.getRawExpression());
4926 Out << ", ";
4927 if (DVR.isDbgAssign()) {
4928 PrintOrNull(DVR.getRawAssignID());
4929 Out << ", ";
4930 PrintOrNull(DVR.getRawAddress());
4931 Out << ", ";
4932 PrintOrNull(DVR.getRawAddressExpression());
4933 Out << ", ";
4934 }
4935 PrintOrNull(DVR.getDebugLoc().getAsMDNode());
4936 Out << ")";
4937}
4938
4939/// printDbgRecordLine - Print a DbgRecord with indentation and a newline
4940/// character.
4941void AssemblyWriter::printDbgRecordLine(const DbgRecord &DR) {
4942 // Print lengthier indentation to bring out-of-line with instructions.
4943 Out << " ";
4944 printDbgRecord(DR);
4945 Out << '\n';
4946}
4947
4948void AssemblyWriter::printDbgLabelRecord(const DbgLabelRecord &Label) {
4949 auto WriterCtx = getContext();
4950 Out << "#dbg_label(";
4951 writeAsOperandInternal(Out, Label.getRawLabel(), WriterCtx, true);
4952 Out << ", ";
4953 writeAsOperandInternal(Out, Label.getDebugLoc(), WriterCtx, true);
4954 Out << ")";
4955}
4956
4957void AssemblyWriter::printMetadataAttachments(
4958 const SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs,
4959 StringRef Separator) {
4960 if (MDs.empty())
4961 return;
4962
4963 if (MDNames.empty())
4964 MDs[0].second->getContext().getMDKindNames(MDNames);
4965
4966 auto WriterCtx = getContext();
4967 for (const auto &I : MDs) {
4968 unsigned Kind = I.first;
4969 Out << Separator;
4970 if (Kind < MDNames.size()) {
4971 Out << "!";
4972 printMetadataIdentifier(MDNames[Kind], Out);
4973 } else
4974 Out << "!<unknown kind #" << Kind << ">";
4975 Out << ' ';
4976 writeAsOperandInternal(Out, I.second, WriterCtx);
4977 }
4978}
4979
4980void AssemblyWriter::writeMDNode(unsigned Slot, const MDNode *Node) {
4981 Out << '!' << Slot << " = ";
4982 printMDNodeBody(Node);
4983 Out << "\n";
4984}
4985
4986void AssemblyWriter::writeAllMDNodes() {
4988 Nodes.resize(Machine.mdn_size());
4989 for (auto &I : llvm::make_range(Machine.mdn_begin(), Machine.mdn_end()))
4990 Nodes[I.second] = cast<MDNode>(I.first);
4991
4992 for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
4993 writeMDNode(i, Nodes[i]);
4994 }
4995}
4996
4997void AssemblyWriter::printMDNodeBody(const MDNode *Node) {
4998 auto WriterCtx = getContext();
4999 writeMDNodeBodyInternal(Out, Node, WriterCtx);
5000}
5001
5002void AssemblyWriter::writeAttribute(const Attribute &Attr, bool InAttrGroup) {
5003 if (!Attr.isTypeAttribute()) {
5004 Out << Attr.getAsString(InAttrGroup);
5005 return;
5006 }
5007
5008 Out << Attribute::getNameFromAttrKind(Attr.getKindAsEnum());
5009 if (Type *Ty = Attr.getValueAsType()) {
5010 Out << '(';
5011 TypePrinter.print(Ty, Out);
5012 Out << ')';
5013 }
5014}
5015
5016void AssemblyWriter::writeAttributeSet(const AttributeSet &AttrSet,
5017 bool InAttrGroup) {
5018 ListSeparator LS(" ");
5019 for (const auto &Attr : AttrSet) {
5020 Out << LS;
5021 writeAttribute(Attr, InAttrGroup);
5022 }
5023}
5024
5025void AssemblyWriter::writeAllAttributeGroups() {
5026 std::vector<std::pair<AttributeSet, unsigned>> asVec;
5027 asVec.resize(Machine.as_size());
5028
5029 for (auto &I : llvm::make_range(Machine.as_begin(), Machine.as_end()))
5030 asVec[I.second] = I;
5031
5032 for (const auto &I : asVec)
5033 Out << "attributes #" << I.second << " = { "
5034 << I.first.getAsString(true) << " }\n";
5035}
5036
5037void AssemblyWriter::printUseListOrder(const Value *V,
5038 ArrayRef<unsigned> Shuffle) {
5039 bool IsInFunction = Machine.getFunction();
5040 if (IsInFunction)
5041 Out << " ";
5042
5043 Out << "uselistorder";
5044 if (const BasicBlock *BB = IsInFunction ? nullptr : dyn_cast<BasicBlock>(V)) {
5045 Out << "_bb ";
5046 writeOperand(BB->getParent(), false);
5047 Out << ", ";
5048 writeOperand(BB, false);
5049 } else {
5050 Out << " ";
5051 writeOperand(V, true);
5052 }
5053
5054 assert(Shuffle.size() >= 2 && "Shuffle too small");
5055 Out << ", { " << llvm::interleaved(Shuffle) << " }\n";
5056}
5057
5058void AssemblyWriter::printUseLists(const Function *F) {
5059 auto It = UseListOrders.find(F);
5060 if (It == UseListOrders.end())
5061 return;
5062
5063 Out << "\n; uselistorder directives\n";
5064 for (const auto &Pair : It->second)
5065 printUseListOrder(Pair.first, Pair.second);
5066}
5067
5068//===----------------------------------------------------------------------===//
5069// External Interface declarations
5070//===----------------------------------------------------------------------===//
5071
5073 bool ShouldPreserveUseListOrder, bool IsForDebug) const {
5074 SlotTracker SlotTable(this->getParent());
5075 formatted_raw_ostream OS(ROS);
5076 AssemblyWriter W(OS, SlotTable, this->getParent(), AAW, IsForDebug,
5077 ShouldPreserveUseListOrder);
5078 W.printFunction(this);
5079}
5080
5082 bool ShouldPreserveUseListOrder,
5083 bool IsForDebug) const {
5084 SlotTracker SlotTable(this->getParent());
5085 formatted_raw_ostream OS(ROS);
5086 AssemblyWriter W(OS, SlotTable, this->getModule(), AAW,
5087 IsForDebug,
5088 ShouldPreserveUseListOrder);
5089 W.printBasicBlock(this);
5090}
5091
5093 bool ShouldPreserveUseListOrder, bool IsForDebug) const {
5094 SlotTracker SlotTable(this);
5095 formatted_raw_ostream OS(ROS);
5096 AssemblyWriter W(OS, SlotTable, this, AAW, IsForDebug,
5097 ShouldPreserveUseListOrder);
5098 W.printModule(this);
5099}
5100
5101void NamedMDNode::print(raw_ostream &ROS, bool IsForDebug) const {
5102 SlotTracker SlotTable(getParent());
5103 formatted_raw_ostream OS(ROS);
5104 AssemblyWriter W(OS, SlotTable, getParent(), nullptr, IsForDebug);
5105 W.printNamedMDNode(this);
5106}
5107
5109 bool IsForDebug) const {
5110 std::optional<SlotTracker> LocalST;
5111 SlotTracker *SlotTable;
5112 if (auto *ST = MST.getMachine())
5113 SlotTable = ST;
5114 else {
5115 LocalST.emplace(getParent());
5116 SlotTable = &*LocalST;
5117 }
5118
5119 formatted_raw_ostream OS(ROS);
5120 AssemblyWriter W(OS, *SlotTable, getParent(), nullptr, IsForDebug);
5121 W.printNamedMDNode(this);
5122}
5123
5124void Comdat::print(raw_ostream &ROS, bool /*IsForDebug*/) const {
5126 ROS << " = comdat ";
5127
5128 switch (getSelectionKind()) {
5129 case Comdat::Any:
5130 ROS << "any";
5131 break;
5132 case Comdat::ExactMatch:
5133 ROS << "exactmatch";
5134 break;
5135 case Comdat::Largest:
5136 ROS << "largest";
5137 break;
5139 ROS << "nodeduplicate";
5140 break;
5141 case Comdat::SameSize:
5142 ROS << "samesize";
5143 break;
5144 }
5145
5146 ROS << '\n';
5147}
5148
5149void Type::print(raw_ostream &OS, bool /*IsForDebug*/, bool NoDetails) const {
5150 TypePrinting TP;
5151 TP.print(const_cast<Type*>(this), OS);
5152
5153 if (NoDetails)
5154 return;
5155
5156 // If the type is a named struct type, print the body as well.
5157 if (auto *STy = dyn_cast<StructType>(const_cast<Type *>(this)))
5158 if (!STy->isLiteral()) {
5159 OS << " = type ";
5160 TP.printStructBody(STy, OS);
5161 }
5162}
5163
5164static bool isReferencingMDNode(const Instruction &I) {
5165 if (const auto *CI = dyn_cast<CallInst>(&I))
5166 if (Function *F = CI->getCalledFunction())
5167 if (F->isIntrinsic())
5168 for (auto &Op : I.operands())
5170 if (isa<MDNode>(V->getMetadata()))
5171 return true;
5172 return false;
5173}
5174
5175void DbgMarker::print(raw_ostream &ROS, bool IsForDebug) const {
5176
5177 ModuleSlotTracker MST(getModuleFromDPI(this), true);
5178 print(ROS, MST, IsForDebug);
5179}
5180
5181void DbgVariableRecord::print(raw_ostream &ROS, bool IsForDebug) const {
5182
5183 ModuleSlotTracker MST(getModuleFromDPI(this), true);
5184 print(ROS, MST, IsForDebug);
5185}
5186
5188 bool IsForDebug) const {
5189 formatted_raw_ostream OS(ROS);
5190 SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));
5191 SlotTracker &SlotTable =
5192 MST.getMachine() ? *MST.getMachine() : EmptySlotTable;
5193 const Function *F = getParent() ? getParent()->getParent() : nullptr;
5194 if (F)
5195 MST.incorporateFunction(*F);
5196 AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);
5197 W.printDbgMarker(*this);
5198}
5199
5200void DbgLabelRecord::print(raw_ostream &ROS, bool IsForDebug) const {
5201
5202 ModuleSlotTracker MST(getModuleFromDPI(this), true);
5203 print(ROS, MST, IsForDebug);
5204}
5205
5207 bool IsForDebug) const {
5208 formatted_raw_ostream OS(ROS);
5209 SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));
5210 SlotTracker &SlotTable =
5211 MST.getMachine() ? *MST.getMachine() : EmptySlotTable;
5212 const Function *F = Marker && Marker->getParent()
5213 ? Marker->getParent()->getParent()
5214 : nullptr;
5215 if (F)
5216 MST.incorporateFunction(*F);
5217 AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);
5218 W.printDbgVariableRecord(*this);
5219}
5220
5222 bool IsForDebug) const {
5223 formatted_raw_ostream OS(ROS);
5224 SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));
5225 SlotTracker &SlotTable =
5226 MST.getMachine() ? *MST.getMachine() : EmptySlotTable;
5227 const Function *F =
5228 Marker->getParent() ? Marker->getParent()->getParent() : nullptr;
5229 if (F)
5230 MST.incorporateFunction(*F);
5231
5232 AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);
5233 W.printDbgLabelRecord(*this);
5234}
5235
5236void Value::print(raw_ostream &ROS, bool IsForDebug) const {
5237 bool ShouldInitializeAllMetadata = false;
5238 if (auto *I = dyn_cast<Instruction>(this))
5239 ShouldInitializeAllMetadata = isReferencingMDNode(*I);
5240 else if (isa<Function>(this) || isa<MetadataAsValue>(this))
5241 ShouldInitializeAllMetadata = true;
5242
5243 ModuleSlotTracker MST(getModuleFromVal(this), ShouldInitializeAllMetadata);
5244 print(ROS, MST, IsForDebug);
5245}
5246
5248 bool IsForDebug) const {
5249 formatted_raw_ostream OS(ROS);
5250 SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));
5251 SlotTracker &SlotTable =
5252 MST.getMachine() ? *MST.getMachine() : EmptySlotTable;
5253 auto IncorporateFunction = [&](const Function *F) {
5254 if (F)
5255 MST.incorporateFunction(*F);
5256 };
5257
5258 if (const auto *I = dyn_cast<Instruction>(this)) {
5259 IncorporateFunction(I->getParent() ? I->getParent()->getParent() : nullptr);
5260 AssemblyWriter W(OS, SlotTable, getModuleFromVal(I), nullptr, IsForDebug);
5261 W.printInstruction(*I);
5262 } else if (const auto *BB = dyn_cast<BasicBlock>(this)) {
5263 IncorporateFunction(BB->getParent());
5264 AssemblyWriter W(OS, SlotTable, getModuleFromVal(BB), nullptr, IsForDebug);
5265 W.printBasicBlock(BB);
5266 } else if (const auto *GV = dyn_cast<GlobalValue>(this)) {
5267 AssemblyWriter W(OS, SlotTable, GV->getParent(), nullptr, IsForDebug);
5268 if (const auto *V = dyn_cast<GlobalVariable>(GV))
5269 W.printGlobal(V);
5270 else if (const auto *F = dyn_cast<Function>(GV))
5271 W.printFunction(F);
5272 else if (const auto *A = dyn_cast<GlobalAlias>(GV))
5273 W.printAlias(A);
5274 else if (const auto *I = dyn_cast<GlobalIFunc>(GV))
5275 W.printIFunc(I);
5276 else
5277 llvm_unreachable("Unknown GlobalValue to print out!");
5278 } else if (const auto *V = dyn_cast<MetadataAsValue>(this)) {
5279 V->getMetadata()->print(ROS, MST, getModuleFromVal(V));
5280 } else if (const auto *C = dyn_cast<Constant>(this)) {
5281 TypePrinting TypePrinter;
5282 TypePrinter.print(C->getType(), OS);
5283 OS << ' ';
5284 AsmWriterContext WriterCtx(&TypePrinter, MST.getMachine());
5285 writeConstantInternal(OS, C, WriterCtx);
5286 } else if (isa<InlineAsm>(this) || isa<Argument>(this)) {
5287 this->printAsOperand(OS, /* PrintType */ true, MST);
5288 } else {
5289 llvm_unreachable("Unknown value to print out!");
5290 }
5291}
5292
5293/// Print without a type, skipping the TypePrinting object.
5294///
5295/// \return \c true iff printing was successful.
5296static bool printWithoutType(const Value &V, raw_ostream &O,
5297 SlotTracker *Machine, const Module *M) {
5298 if (V.hasName() || isa<GlobalValue>(V) ||
5299 (!isa<Constant>(V) && !isa<MetadataAsValue>(V))) {
5300 AsmWriterContext WriterCtx(nullptr, Machine, M);
5301 writeAsOperandInternal(O, &V, WriterCtx);
5302 return true;
5303 }
5304 return false;
5305}
5306
5307static void printAsOperandImpl(const Value &V, raw_ostream &O, bool PrintType,
5308 ModuleSlotTracker &MST) {
5309 TypePrinting TypePrinter(MST.getModule());
5310 AsmWriterContext WriterCtx(&TypePrinter, MST.getMachine(), MST.getModule());
5311 writeAsOperandInternal(O, &V, WriterCtx, PrintType);
5312}
5313
5314void Value::printAsOperand(raw_ostream &O, bool PrintType,
5315 const Module *M) const {
5316 if (!M)
5317 M = getModuleFromVal(this);
5318
5319 if (!PrintType)
5320 if (printWithoutType(*this, O, nullptr, M))
5321 return;
5322
5324 M, /* ShouldInitializeAllMetadata */ isa<MetadataAsValue>(this));
5325 ModuleSlotTracker MST(Machine, M);
5326 printAsOperandImpl(*this, O, PrintType, MST);
5327}
5328
5329void Value::printAsOperand(raw_ostream &O, bool PrintType,
5330 ModuleSlotTracker &MST) const {
5331 if (!PrintType)
5332 if (printWithoutType(*this, O, MST.getMachine(), MST.getModule()))
5333 return;
5334
5335 printAsOperandImpl(*this, O, PrintType, MST);
5336}
5337
5338/// Recursive version of printMetadataImpl.
5339static void printMetadataImplRec(raw_ostream &ROS, const Metadata &MD,
5340 AsmWriterContext &WriterCtx) {
5341 formatted_raw_ostream OS(ROS);
5342 writeAsOperandInternal(OS, &MD, WriterCtx, /* FromValue */ true);
5343
5344 auto *N = dyn_cast<MDNode>(&MD);
5345 if (!N || isa<DIExpression>(MD))
5346 return;
5347
5348 OS << " = ";
5349 writeMDNodeBodyInternal(OS, N, WriterCtx);
5350}
5351
5352namespace {
5353struct MDTreeAsmWriterContext : public AsmWriterContext {
5354 unsigned Level;
5355 // {Level, Printed string}
5356 using EntryTy = std::pair<unsigned, std::string>;
5358
5359 // Used to break the cycle in case there is any.
5360 SmallPtrSet<const Metadata *, 4> Visited;
5361
5362 raw_ostream &MainOS;
5363
5364 MDTreeAsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M,
5365 raw_ostream &OS, const Metadata *InitMD)
5366 : AsmWriterContext(TP, ST, M), Level(0U), Visited({InitMD}), MainOS(OS) {}
5367
5368 void onWriteMetadataAsOperand(const Metadata *MD) override {
5369 if (!Visited.insert(MD).second)
5370 return;
5371
5372 std::string Str;
5373 raw_string_ostream SS(Str);
5374 ++Level;
5375 // A placeholder entry to memorize the correct
5376 // position in buffer.
5377 Buffer.emplace_back(std::make_pair(Level, ""));
5378 unsigned InsertIdx = Buffer.size() - 1;
5379
5380 printMetadataImplRec(SS, *MD, *this);
5381 Buffer[InsertIdx].second = std::move(SS.str());
5382 --Level;
5383 }
5384
5385 ~MDTreeAsmWriterContext() override {
5386 for (const auto &Entry : Buffer) {
5387 MainOS << "\n";
5388 unsigned NumIndent = Entry.first * 2U;
5389 MainOS.indent(NumIndent) << Entry.second;
5390 }
5391 }
5392};
5393} // end anonymous namespace
5394
5395static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD,
5396 ModuleSlotTracker &MST, const Module *M,
5397 bool OnlyAsOperand, bool PrintAsTree = false) {
5398 formatted_raw_ostream OS(ROS);
5399
5400 TypePrinting TypePrinter(M);
5401
5402 std::unique_ptr<AsmWriterContext> WriterCtx;
5403 if (PrintAsTree && !OnlyAsOperand)
5404 WriterCtx = std::make_unique<MDTreeAsmWriterContext>(
5405 &TypePrinter, MST.getMachine(), M, OS, &MD);
5406 else
5407 WriterCtx =
5408 std::make_unique<AsmWriterContext>(&TypePrinter, MST.getMachine(), M);
5409
5410 writeAsOperandInternal(OS, &MD, *WriterCtx, /* FromValue */ true);
5411
5412 auto *N = dyn_cast<MDNode>(&MD);
5413 if (OnlyAsOperand || !N || isa<DIExpression>(MD))
5414 return;
5415
5416 OS << " = ";
5417 writeMDNodeBodyInternal(OS, N, *WriterCtx);
5418}
5419
5421 ModuleSlotTracker MST(M, isa<MDNode>(this));
5422 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);
5423}
5424
5426 const Module *M) const {
5427 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);
5428}
5429
5431 bool /*IsForDebug*/) const {
5432 ModuleSlotTracker MST(M, isa<MDNode>(this));
5433 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false);
5434}
5435
5437 const Module *M, bool /*IsForDebug*/) const {
5438 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false);
5439}
5440
5441void MDNode::printTree(raw_ostream &OS, const Module *M) const {
5442 ModuleSlotTracker MST(M, true);
5443 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false,
5444 /*PrintAsTree=*/true);
5445}
5446
5448 const Module *M) const {
5449 printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false,
5450 /*PrintAsTree=*/true);
5451}
5452
5453void ModuleSummaryIndex::print(raw_ostream &ROS, bool IsForDebug) const {
5454 SlotTracker SlotTable(this);
5455 formatted_raw_ostream OS(ROS);
5456 AssemblyWriter W(OS, SlotTable, this, IsForDebug);
5457 W.printModuleSummaryIndex();
5458}
5459
5461 unsigned UB) const {
5462 SlotTracker *ST = MachineStorage.get();
5463 if (!ST)
5464 return;
5465
5466 for (auto &I : llvm::make_range(ST->mdn_begin(), ST->mdn_end()))
5467 if (I.second >= LB && I.second < UB)
5468 L.push_back(std::make_pair(I.second, I.first));
5469}
5470
5471#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
5472// Value::dump - allow easy printing of Values from the debugger.
5474void Value::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5475
5476// Value::dump - allow easy printing of Values from the debugger.
5478void DbgMarker::dump() const {
5479 print(dbgs(), /*IsForDebug=*/true);
5480 dbgs() << '\n';
5481}
5482
5483// Value::dump - allow easy printing of Values from the debugger.
5485void DbgRecord::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5486
5487// Type::dump - allow easy printing of Types from the debugger.
5489void Type::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5490
5491// Module::dump() - Allow printing of Modules from the debugger.
5493void Module::dump() const {
5494 print(dbgs(), nullptr,
5495 /*ShouldPreserveUseListOrder=*/false, /*IsForDebug=*/true);
5496}
5497
5498// Allow printing of Comdats from the debugger.
5500void Comdat::dump() const { print(dbgs(), /*IsForDebug=*/true); }
5501
5502// NamedMDNode::dump() - Allow printing of NamedMDNodes from the debugger.
5504void NamedMDNode::dump() const { print(dbgs(), /*IsForDebug=*/true); }
5505
5507void Metadata::dump() const { dump(nullptr); }
5508
5510void Metadata::dump(const Module *M) const {
5511 print(dbgs(), M, /*IsForDebug=*/true);
5512 dbgs() << '\n';
5513}
5514
5516void MDNode::dumpTree() const { dumpTree(nullptr); }
5517
5519void MDNode::dumpTree(const Module *M) const {
5520 printTree(dbgs(), M);
5521 dbgs() << '\n';
5522}
5523
5524// Allow printing of ModuleSummaryIndex from the debugger.
5526void ModuleSummaryIndex::dump() const { print(dbgs(), /*IsForDebug=*/true); }
5527#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu next use AMDGPU Next Use Analysis Printer
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 WriteFullHexAPInt(raw_ostream &Out, const APInt &Val)
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 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:253
#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 & PPCDoubleDouble()
Definition APFloat.h:299
bool isNegative() const
Definition APFloat.h:1538
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Definition APFloat.h:1575
const fltSemantics & getSemantics() const
Definition APFloat.h:1546
bool isNaN() const
Definition APFloat.h:1536
bool isSignaling() const
Definition APFloat.h:1540
APInt bitcastToAPInt() const
Definition APFloat.h:1430
APInt getNaNPayload() const
If the value is a NaN value, return an integer containing the payload of this value.
Definition APFloat.h:1564
bool isInfinity() const
Definition APFloat.h:1535
Class for arbitrary precision integers.
Definition APInt.h:78
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1429
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1535
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
void toStringUnsigned(SmallVectorImpl< char > &Str, unsigned Radix=10) const
Considers the APInt to be unsigned and converts it into a string in the radix given.
Definition APInt.h:1714
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:467
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1511
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
Abstract interface of slot tracker storage.
const GlobalValueSummary & getAliasee() const
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
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:407
bool hasAttributes() const
Return true if attributes exists in this set.
Definition Attributes.h:477
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
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
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:246
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:166
const Argument * const_arg_iterator
Definition Function.h:74
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:80
LLVM_ABI const SanitizerMetadata & getSanitizerMetadata() const
Definition Globals.cpp:254
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:231
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:47
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:38
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:737
iterator_range< global_iterator > globals()
Definition Module.h:686
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
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
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:766
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:46
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:95
LLVM_ABI void dump() const
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
LLVM_ABI unsigned getByteBitWidth() const
TypeID getTypeID() const
Return the type id for the type.
Definition Type.h:138
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:255
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:261
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:318
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:587
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:621
LLVM_ABI StringRef MacinfoString(unsigned Encoding)
Definition Dwarf.cpp:685
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.
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:1738
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:840
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:2172
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:1635
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
char hexdigit(unsigned X, bool LowerCase=false)
hexdigit - Return the hexadecimal character for the given number X (which should be less than 16).
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:1969
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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...
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.
@ Default
The result value is uniform if and only if all operands are uniform.
Definition Uniformity.h:20
#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 NoRenameOnPromotion
This field is written by the ThinLTO prelink stage to decide whether a particular static global value...
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:1447