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