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