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