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