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