Thanks to visit codestin.com
Credit goes to llvm.org

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