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