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