1 //===- AsmWriter.cpp - Printing LLVM as an assembly file ------------------===//
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
7 //===----------------------------------------------------------------------===//
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.
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.
16 //===----------------------------------------------------------------------===//
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"
24 #include "llvm/ADT/SmallPtrSet.h"
25 #include "llvm/ADT/SmallString.h"
26 #include "llvm/ADT/SmallVector.h"
27 #include "llvm/ADT/StringExtras.h"
28 #include "llvm/ADT/StringRef.h"
29 #include "llvm/ADT/iterator_range.h"
30 #include "llvm/BinaryFormat/Dwarf.h"
31 #include "llvm/Config/llvm-config.h"
32 #include "llvm/IR/Argument.h"
33 #include "llvm/IR/AssemblyAnnotationWriter.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"
41 #include "llvm/IR/DebugInfoMetadata.h"
42 #include "llvm/IR/DebugProgramInstruction.h"
43 #include "llvm/IR/DerivedTypes.h"
44 #include "llvm/IR/Function.h"
45 #include "llvm/IR/GlobalAlias.h"
46 #include "llvm/IR/GlobalIFunc.h"
47 #include "llvm/IR/GlobalObject.h"
48 #include "llvm/IR/GlobalValue.h"
49 #include "llvm/IR/GlobalVariable.h"
50 #include "llvm/IR/IRPrintingPasses.h"
51 #include "llvm/IR/InlineAsm.h"
52 #include "llvm/IR/InstrTypes.h"
53 #include "llvm/IR/Instruction.h"
54 #include "llvm/IR/Instructions.h"
55 #include "llvm/IR/IntrinsicInst.h"
56 #include "llvm/IR/LLVMContext.h"
57 #include "llvm/IR/Metadata.h"
58 #include "llvm/IR/Module.h"
59 #include "llvm/IR/ModuleSlotTracker.h"
60 #include "llvm/IR/ModuleSummaryIndex.h"
61 #include "llvm/IR/Operator.h"
62 #include "llvm/IR/Type.h"
63 #include "llvm/IR/TypeFinder.h"
64 #include "llvm/IR/TypedPointerType.h"
65 #include "llvm/IR/Use.h"
66 #include "llvm/IR/User.h"
67 #include "llvm/IR/Value.h"
68 #include "llvm/Support/AtomicOrdering.h"
69 #include "llvm/Support/Casting.h"
70 #include "llvm/Support/Compiler.h"
71 #include "llvm/Support/Debug.h"
72 #include "llvm/Support/ErrorHandling.h"
73 #include "llvm/Support/Format.h"
74 #include "llvm/Support/FormattedStream.h"
75 #include "llvm/Support/SaveAndRestore.h"
76 #include "llvm/Support/raw_ostream.h"
91 // Make virtual table appear in this compilation unit.
92 AssemblyAnnotationWriter::~AssemblyAnnotationWriter() = default;
94 //===----------------------------------------------------------------------===//
96 //===----------------------------------------------------------------------===//
98 using OrderMap
= MapVector
<const Value
*, unsigned>;
100 using UseListOrderMap
=
101 DenseMap
<const Function
*, MapVector
<const Value
*, std::vector
<unsigned>>>;
103 /// Look for a value that might be wrapped as metadata, e.g. a value in a
104 /// metadata operand. Returns the input value as-is if it is not wrapped.
105 static const Value
*skipMetadataWrapper(const Value
*V
) {
106 if (const auto *MAV
= dyn_cast
<MetadataAsValue
>(V
))
107 if (const auto *VAM
= dyn_cast
<ValueAsMetadata
>(MAV
->getMetadata()))
108 return VAM
->getValue();
112 static void orderValue(const Value
*V
, OrderMap
&OM
) {
116 if (const Constant
*C
= dyn_cast
<Constant
>(V
))
117 if (C
->getNumOperands() && !isa
<GlobalValue
>(C
))
118 for (const Value
*Op
: C
->operands())
119 if (!isa
<BasicBlock
>(Op
) && !isa
<GlobalValue
>(Op
))
122 // Note: we cannot cache this lookup above, since inserting into the map
123 // changes the map's size, and thus affects the other IDs.
124 unsigned ID
= OM
.size() + 1;
128 static OrderMap
orderModule(const Module
*M
) {
131 for (const GlobalVariable
&G
: M
->globals()) {
132 if (G
.hasInitializer())
133 if (!isa
<GlobalValue
>(G
.getInitializer()))
134 orderValue(G
.getInitializer(), OM
);
137 for (const GlobalAlias
&A
: M
->aliases()) {
138 if (!isa
<GlobalValue
>(A
.getAliasee()))
139 orderValue(A
.getAliasee(), OM
);
142 for (const GlobalIFunc
&I
: M
->ifuncs()) {
143 if (!isa
<GlobalValue
>(I
.getResolver()))
144 orderValue(I
.getResolver(), OM
);
147 for (const Function
&F
: *M
) {
148 for (const Use
&U
: F
.operands())
149 if (!isa
<GlobalValue
>(U
.get()))
150 orderValue(U
.get(), OM
);
154 if (F
.isDeclaration())
157 for (const Argument
&A
: F
.args())
159 for (const BasicBlock
&BB
: F
) {
161 for (const Instruction
&I
: BB
) {
162 for (const Value
*Op
: I
.operands()) {
163 Op
= skipMetadataWrapper(Op
);
164 if ((isa
<Constant
>(*Op
) && !isa
<GlobalValue
>(*Op
)) ||
175 static std::vector
<unsigned>
176 predictValueUseListOrder(const Value
*V
, unsigned ID
, const OrderMap
&OM
) {
177 // Predict use-list order for this one.
178 using Entry
= std::pair
<const Use
*, unsigned>;
179 SmallVector
<Entry
, 64> List
;
180 for (const Use
&U
: V
->uses())
181 // Check if this user will be serialized.
182 if (OM
.lookup(U
.getUser()))
183 List
.push_back(std::make_pair(&U
, List
.size()));
186 // We may have lost some users.
189 // When referencing a value before its declaration, a temporary value is
190 // created, which will later be RAUWed with the actual value. This reverses
191 // the use list. This happens for all values apart from basic blocks.
192 bool GetsReversed
= !isa
<BasicBlock
>(V
);
193 if (auto *BA
= dyn_cast
<BlockAddress
>(V
))
194 ID
= OM
.lookup(BA
->getBasicBlock());
195 llvm::sort(List
, [&](const Entry
&L
, const Entry
&R
) {
196 const Use
*LU
= L
.first
;
197 const Use
*RU
= R
.first
;
201 auto LID
= OM
.lookup(LU
->getUser());
202 auto RID
= OM
.lookup(RU
->getUser());
204 // If ID is 4, then expect: 7 6 5 1 2 3.
218 // LID and RID are equal, so we have different operands of the same user.
219 // Assume operands are added in order for all instructions.
222 return LU
->getOperandNo() < RU
->getOperandNo();
223 return LU
->getOperandNo() > RU
->getOperandNo();
226 if (llvm::is_sorted(List
, llvm::less_second()))
227 // Order is already correct.
230 // Store the shuffle.
231 std::vector
<unsigned> Shuffle(List
.size());
232 for (size_t I
= 0, E
= List
.size(); I
!= E
; ++I
)
233 Shuffle
[I
] = List
[I
].second
;
237 static UseListOrderMap
predictUseListOrder(const Module
*M
) {
238 OrderMap OM
= orderModule(M
);
239 UseListOrderMap ULOM
;
240 for (const auto &Pair
: OM
) {
241 const Value
*V
= Pair
.first
;
242 if (V
->use_empty() || std::next(V
->use_begin()) == V
->use_end())
245 std::vector
<unsigned> Shuffle
=
246 predictValueUseListOrder(V
, Pair
.second
, OM
);
250 const Function
*F
= nullptr;
251 if (auto *I
= dyn_cast
<Instruction
>(V
))
252 F
= I
->getFunction();
253 if (auto *A
= dyn_cast
<Argument
>(V
))
255 if (auto *BB
= dyn_cast
<BasicBlock
>(V
))
257 ULOM
[F
][V
] = std::move(Shuffle
);
262 static const Module
*getModuleFromVal(const Value
*V
) {
263 if (const Argument
*MA
= dyn_cast
<Argument
>(V
))
264 return MA
->getParent() ? MA
->getParent()->getParent() : nullptr;
266 if (const BasicBlock
*BB
= dyn_cast
<BasicBlock
>(V
))
267 return BB
->getParent() ? BB
->getParent()->getParent() : nullptr;
269 if (const Instruction
*I
= dyn_cast
<Instruction
>(V
)) {
270 const Function
*M
= I
->getParent() ? I
->getParent()->getParent() : nullptr;
271 return M
? M
->getParent() : nullptr;
274 if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(V
))
275 return GV
->getParent();
277 if (const auto *MAV
= dyn_cast
<MetadataAsValue
>(V
)) {
278 for (const User
*U
: MAV
->users())
279 if (isa
<Instruction
>(U
))
280 if (const Module
*M
= getModuleFromVal(U
))
288 static const Module
*getModuleFromDPI(const DbgMarker
*Marker
) {
290 Marker
->getParent() ? Marker
->getParent()->getParent() : nullptr;
291 return M
? M
->getParent() : nullptr;
294 static const Module
*getModuleFromDPI(const DbgRecord
*DR
) {
295 return DR
->getMarker() ? getModuleFromDPI(DR
->getMarker()) : nullptr;
298 static void PrintCallingConv(unsigned cc
, raw_ostream
&Out
) {
300 default: Out
<< "cc" << cc
; break;
301 case CallingConv::Fast
: Out
<< "fastcc"; break;
302 case CallingConv::Cold
: Out
<< "coldcc"; break;
303 case CallingConv::AnyReg
: Out
<< "anyregcc"; break;
304 case CallingConv::PreserveMost
: Out
<< "preserve_mostcc"; break;
305 case CallingConv::PreserveAll
: Out
<< "preserve_allcc"; break;
306 case CallingConv::PreserveNone
: Out
<< "preserve_nonecc"; break;
307 case CallingConv::CXX_FAST_TLS
: Out
<< "cxx_fast_tlscc"; break;
308 case CallingConv::GHC
: Out
<< "ghccc"; break;
309 case CallingConv::Tail
: Out
<< "tailcc"; break;
310 case CallingConv::GRAAL
: Out
<< "graalcc"; break;
311 case CallingConv::CFGuard_Check
: Out
<< "cfguard_checkcc"; break;
312 case CallingConv::X86_StdCall
: Out
<< "x86_stdcallcc"; break;
313 case CallingConv::X86_FastCall
: Out
<< "x86_fastcallcc"; break;
314 case CallingConv::X86_ThisCall
: Out
<< "x86_thiscallcc"; break;
315 case CallingConv::X86_RegCall
: Out
<< "x86_regcallcc"; break;
316 case CallingConv::X86_VectorCall
:Out
<< "x86_vectorcallcc"; break;
317 case CallingConv::Intel_OCL_BI
: Out
<< "intel_ocl_bicc"; break;
318 case CallingConv::ARM_APCS
: Out
<< "arm_apcscc"; break;
319 case CallingConv::ARM_AAPCS
: Out
<< "arm_aapcscc"; break;
320 case CallingConv::ARM_AAPCS_VFP
: Out
<< "arm_aapcs_vfpcc"; break;
321 case CallingConv::AArch64_VectorCall
: Out
<< "aarch64_vector_pcs"; break;
322 case CallingConv::AArch64_SVE_VectorCall
:
323 Out
<< "aarch64_sve_vector_pcs";
325 case CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0
:
326 Out
<< "aarch64_sme_preservemost_from_x0";
328 case CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1
:
329 Out
<< "aarch64_sme_preservemost_from_x1";
331 case CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2
:
332 Out
<< "aarch64_sme_preservemost_from_x2";
334 case CallingConv::MSP430_INTR
: Out
<< "msp430_intrcc"; break;
335 case CallingConv::AVR_INTR
: Out
<< "avr_intrcc "; break;
336 case CallingConv::AVR_SIGNAL
: Out
<< "avr_signalcc "; break;
337 case CallingConv::PTX_Kernel
: Out
<< "ptx_kernel"; break;
338 case CallingConv::PTX_Device
: Out
<< "ptx_device"; break;
339 case CallingConv::X86_64_SysV
: Out
<< "x86_64_sysvcc"; break;
340 case CallingConv::Win64
: Out
<< "win64cc"; break;
341 case CallingConv::SPIR_FUNC
: Out
<< "spir_func"; break;
342 case CallingConv::SPIR_KERNEL
: Out
<< "spir_kernel"; break;
343 case CallingConv::Swift
: Out
<< "swiftcc"; break;
344 case CallingConv::SwiftTail
: Out
<< "swifttailcc"; break;
345 case CallingConv::X86_INTR
: Out
<< "x86_intrcc"; break;
346 case CallingConv::DUMMY_HHVM
:
349 case CallingConv::DUMMY_HHVM_C
:
352 case CallingConv::AMDGPU_VS
: Out
<< "amdgpu_vs"; break;
353 case CallingConv::AMDGPU_LS
: Out
<< "amdgpu_ls"; break;
354 case CallingConv::AMDGPU_HS
: Out
<< "amdgpu_hs"; break;
355 case CallingConv::AMDGPU_ES
: Out
<< "amdgpu_es"; break;
356 case CallingConv::AMDGPU_GS
: Out
<< "amdgpu_gs"; break;
357 case CallingConv::AMDGPU_PS
: Out
<< "amdgpu_ps"; break;
358 case CallingConv::AMDGPU_CS
: Out
<< "amdgpu_cs"; break;
359 case CallingConv::AMDGPU_CS_Chain
:
360 Out
<< "amdgpu_cs_chain";
362 case CallingConv::AMDGPU_CS_ChainPreserve
:
363 Out
<< "amdgpu_cs_chain_preserve";
365 case CallingConv::AMDGPU_KERNEL
: Out
<< "amdgpu_kernel"; break;
366 case CallingConv::AMDGPU_Gfx
: Out
<< "amdgpu_gfx"; break;
367 case CallingConv::M68k_RTD
: Out
<< "m68k_rtdcc"; break;
368 case CallingConv::RISCV_VectorCall
:
369 Out
<< "riscv_vector_cc";
382 void llvm::printLLVMNameWithoutPrefix(raw_ostream
&OS
, StringRef Name
) {
383 assert(!Name
.empty() && "Cannot get empty name!");
385 // Scan the name to see if it needs quotes first.
386 bool NeedsQuotes
= isdigit(static_cast<unsigned char>(Name
[0]));
388 for (unsigned char C
: Name
) {
389 // By making this unsigned, the value passed in to isalnum will always be
390 // in the range 0-255. This is important when building with MSVC because
391 // its implementation will assert. This situation can arise when dealing
392 // with UTF-8 multibyte characters.
393 if (!isalnum(static_cast<unsigned char>(C
)) && C
!= '-' && C
!= '.' &&
401 // If we didn't need any quotes, just write out the name in one blast.
407 // Okay, we need quotes. Output the quotes and escape any scary characters as
410 printEscapedString(Name
, OS
);
414 /// Turn the specified name into an 'LLVM name', which is either prefixed with %
415 /// (if the string only contains simple characters) or is surrounded with ""'s
416 /// (if it has special chars in it). Print it out.
417 static void PrintLLVMName(raw_ostream
&OS
, StringRef Name
, PrefixType Prefix
) {
433 printLLVMNameWithoutPrefix(OS
, Name
);
436 /// Turn the specified name into an 'LLVM name', which is either prefixed with %
437 /// (if the string only contains simple characters) or is surrounded with ""'s
438 /// (if it has special chars in it). Print it out.
439 static void PrintLLVMName(raw_ostream
&OS
, const Value
*V
) {
440 PrintLLVMName(OS
, V
->getName(),
441 isa
<GlobalValue
>(V
) ? GlobalPrefix
: LocalPrefix
);
444 static void PrintShuffleMask(raw_ostream
&Out
, Type
*Ty
, ArrayRef
<int> Mask
) {
446 if (isa
<ScalableVectorType
>(Ty
))
448 Out
<< Mask
.size() << " x i32> ";
449 bool FirstElt
= true;
450 if (all_of(Mask
, [](int Elt
) { return Elt
== 0; })) {
451 Out
<< "zeroinitializer";
452 } else if (all_of(Mask
, [](int Elt
) { return Elt
== PoisonMaskElem
; })) {
456 for (int Elt
: Mask
) {
462 if (Elt
== PoisonMaskElem
)
475 TypePrinting(const Module
*M
= nullptr) : DeferredM(M
) {}
477 TypePrinting(const TypePrinting
&) = delete;
478 TypePrinting
&operator=(const TypePrinting
&) = delete;
480 /// The named types that are used by the current module.
481 TypeFinder
&getNamedTypes();
483 /// The numbered types, number to type mapping.
484 std::vector
<StructType
*> &getNumberedTypes();
488 void print(Type
*Ty
, raw_ostream
&OS
);
490 void printStructBody(StructType
*Ty
, raw_ostream
&OS
);
493 void incorporateTypes();
495 /// A module to process lazily when needed. Set to nullptr as soon as used.
496 const Module
*DeferredM
;
498 TypeFinder NamedTypes
;
500 // The numbered types, along with their value.
501 DenseMap
<StructType
*, unsigned> Type2Number
;
503 std::vector
<StructType
*> NumberedTypes
;
506 } // end anonymous namespace
508 TypeFinder
&TypePrinting::getNamedTypes() {
513 std::vector
<StructType
*> &TypePrinting::getNumberedTypes() {
516 // We know all the numbers that each type is used and we know that it is a
517 // dense assignment. Convert the map to an index table, if it's not done
518 // already (judging from the sizes):
519 if (NumberedTypes
.size() == Type2Number
.size())
520 return NumberedTypes
;
522 NumberedTypes
.resize(Type2Number
.size());
523 for (const auto &P
: Type2Number
) {
524 assert(P
.second
< NumberedTypes
.size() && "Didn't get a dense numbering?");
525 assert(!NumberedTypes
[P
.second
] && "Didn't get a unique numbering?");
526 NumberedTypes
[P
.second
] = P
.first
;
528 return NumberedTypes
;
531 bool TypePrinting::empty() {
533 return NamedTypes
.empty() && Type2Number
.empty();
536 void TypePrinting::incorporateTypes() {
540 NamedTypes
.run(*DeferredM
, false);
543 // The list of struct types we got back includes all the struct types, split
544 // the unnamed ones out to a numbering and remove the anonymous structs.
545 unsigned NextNumber
= 0;
547 std::vector
<StructType
*>::iterator NextToUse
= NamedTypes
.begin();
548 for (StructType
*STy
: NamedTypes
) {
549 // Ignore anonymous types.
550 if (STy
->isLiteral())
553 if (STy
->getName().empty())
554 Type2Number
[STy
] = NextNumber
++;
559 NamedTypes
.erase(NextToUse
, NamedTypes
.end());
562 /// Write the specified type to the specified raw_ostream, making use of type
563 /// names or up references to shorten the type name where possible.
564 void TypePrinting::print(Type
*Ty
, raw_ostream
&OS
) {
565 switch (Ty
->getTypeID()) {
566 case Type::VoidTyID
: OS
<< "void"; return;
567 case Type::HalfTyID
: OS
<< "half"; return;
568 case Type::BFloatTyID
: OS
<< "bfloat"; return;
569 case Type::FloatTyID
: OS
<< "float"; return;
570 case Type::DoubleTyID
: OS
<< "double"; return;
571 case Type::X86_FP80TyID
: OS
<< "x86_fp80"; return;
572 case Type::FP128TyID
: OS
<< "fp128"; return;
573 case Type::PPC_FP128TyID
: OS
<< "ppc_fp128"; return;
574 case Type::LabelTyID
: OS
<< "label"; return;
575 case Type::MetadataTyID
:
578 case Type::X86_AMXTyID
: OS
<< "x86_amx"; return;
579 case Type::TokenTyID
: OS
<< "token"; return;
580 case Type::IntegerTyID
:
581 OS
<< 'i' << cast
<IntegerType
>(Ty
)->getBitWidth();
584 case Type::FunctionTyID
: {
585 FunctionType
*FTy
= cast
<FunctionType
>(Ty
);
586 print(FTy
->getReturnType(), OS
);
589 for (Type
*Ty
: FTy
->params()) {
598 case Type::StructTyID
: {
599 StructType
*STy
= cast
<StructType
>(Ty
);
601 if (STy
->isLiteral())
602 return printStructBody(STy
, OS
);
604 if (!STy
->getName().empty())
605 return PrintLLVMName(OS
, STy
->getName(), LocalPrefix
);
608 const auto I
= Type2Number
.find(STy
);
609 if (I
!= Type2Number
.end())
610 OS
<< '%' << I
->second
;
611 else // Not enumerated, print the hex address.
612 OS
<< "%\"type " << STy
<< '\"';
615 case Type::PointerTyID
: {
616 PointerType
*PTy
= cast
<PointerType
>(Ty
);
618 if (unsigned AddressSpace
= PTy
->getAddressSpace())
619 OS
<< " addrspace(" << AddressSpace
<< ')';
622 case Type::ArrayTyID
: {
623 ArrayType
*ATy
= cast
<ArrayType
>(Ty
);
624 OS
<< '[' << ATy
->getNumElements() << " x ";
625 print(ATy
->getElementType(), OS
);
629 case Type::FixedVectorTyID
:
630 case Type::ScalableVectorTyID
: {
631 VectorType
*PTy
= cast
<VectorType
>(Ty
);
632 ElementCount EC
= PTy
->getElementCount();
636 OS
<< EC
.getKnownMinValue() << " x ";
637 print(PTy
->getElementType(), OS
);
641 case Type::TypedPointerTyID
: {
642 TypedPointerType
*TPTy
= cast
<TypedPointerType
>(Ty
);
643 OS
<< "typedptr(" << *TPTy
->getElementType() << ", "
644 << TPTy
->getAddressSpace() << ")";
647 case Type::TargetExtTyID
:
648 TargetExtType
*TETy
= cast
<TargetExtType
>(Ty
);
650 printEscapedString(Ty
->getTargetExtName(), OS
);
652 for (Type
*Inner
: TETy
->type_params()) {
654 Inner
->print(OS
, /*IsForDebug=*/false, /*NoDetails=*/true);
656 for (unsigned IntParam
: TETy
->int_params())
657 OS
<< ", " << IntParam
;
661 llvm_unreachable("Invalid TypeID");
664 void TypePrinting::printStructBody(StructType
*STy
, raw_ostream
&OS
) {
665 if (STy
->isOpaque()) {
673 if (STy
->getNumElements() == 0) {
678 for (Type
*Ty
: STy
->elements()) {
689 AbstractSlotTrackerStorage::~AbstractSlotTrackerStorage() = default;
693 //===----------------------------------------------------------------------===//
694 // SlotTracker Class: Enumerate slot numbers for unnamed values
695 //===----------------------------------------------------------------------===//
696 /// This class provides computation of slot numbers for LLVM Assembly writing.
698 class SlotTracker
: public AbstractSlotTrackerStorage
{
700 /// ValueMap - A mapping of Values to slot numbers.
701 using ValueMap
= DenseMap
<const Value
*, unsigned>;
704 /// TheModule - The module for which we are holding slot numbers.
705 const Module
* TheModule
;
707 /// TheFunction - The function for which we are holding slot numbers.
708 const Function
* TheFunction
= nullptr;
709 bool FunctionProcessed
= false;
710 bool ShouldInitializeAllMetadata
;
712 std::function
<void(AbstractSlotTrackerStorage
*, const Module
*, bool)>
714 std::function
<void(AbstractSlotTrackerStorage
*, const Function
*, bool)>
715 ProcessFunctionHookFn
;
717 /// The summary index for which we are holding slot numbers.
718 const ModuleSummaryIndex
*TheIndex
= nullptr;
720 /// mMap - The slot map for the module level data.
724 /// fMap - The slot map for the function level data.
728 /// mdnMap - Map for MDNodes.
729 DenseMap
<const MDNode
*, unsigned> mdnMap
;
730 unsigned mdnNext
= 0;
732 /// asMap - The slot map for attribute sets.
733 DenseMap
<AttributeSet
, unsigned> asMap
;
736 /// ModulePathMap - The slot map for Module paths used in the summary index.
737 StringMap
<unsigned> ModulePathMap
;
738 unsigned ModulePathNext
= 0;
740 /// GUIDMap - The slot map for GUIDs used in the summary index.
741 DenseMap
<GlobalValue::GUID
, unsigned> GUIDMap
;
742 unsigned GUIDNext
= 0;
744 /// TypeIdMap - The slot map for type ids used in the summary index.
745 StringMap
<unsigned> TypeIdMap
;
746 unsigned TypeIdNext
= 0;
748 /// TypeIdCompatibleVtableMap - The slot map for type compatible vtable ids
749 /// used in the summary index.
750 StringMap
<unsigned> TypeIdCompatibleVtableMap
;
751 unsigned TypeIdCompatibleVtableNext
= 0;
754 /// Construct from a module.
756 /// If \c ShouldInitializeAllMetadata, initializes all metadata in all
757 /// functions, giving correct numbering for metadata referenced only from
758 /// within a function (even if no functions have been initialized).
759 explicit SlotTracker(const Module
*M
,
760 bool ShouldInitializeAllMetadata
= false);
762 /// Construct from a function, starting out in incorp state.
764 /// If \c ShouldInitializeAllMetadata, initializes all metadata in all
765 /// functions, giving correct numbering for metadata referenced only from
766 /// within a function (even if no functions have been initialized).
767 explicit SlotTracker(const Function
*F
,
768 bool ShouldInitializeAllMetadata
= false);
770 /// Construct from a module summary index.
771 explicit SlotTracker(const ModuleSummaryIndex
*Index
);
773 SlotTracker(const SlotTracker
&) = delete;
774 SlotTracker
&operator=(const SlotTracker
&) = delete;
776 ~SlotTracker() = default;
779 std::function
<void(AbstractSlotTrackerStorage
*, const Module
*, bool)>);
780 void setProcessHook(std::function
<void(AbstractSlotTrackerStorage
*,
781 const Function
*, bool)>);
783 unsigned getNextMetadataSlot() override
{ return mdnNext
; }
785 void createMetadataSlot(const MDNode
*N
) override
;
787 /// Return the slot number of the specified value in it's type
788 /// plane. If something is not in the SlotTracker, return -1.
789 int getLocalSlot(const Value
*V
);
790 int getGlobalSlot(const GlobalValue
*V
);
791 int getMetadataSlot(const MDNode
*N
) override
;
792 int getAttributeGroupSlot(AttributeSet AS
);
793 int getModulePathSlot(StringRef Path
);
794 int getGUIDSlot(GlobalValue::GUID GUID
);
795 int getTypeIdSlot(StringRef Id
);
796 int getTypeIdCompatibleVtableSlot(StringRef Id
);
798 /// If you'd like to deal with a function instead of just a module, use
799 /// this method to get its data into the SlotTracker.
800 void incorporateFunction(const Function
*F
) {
802 FunctionProcessed
= false;
805 const Function
*getFunction() const { return TheFunction
; }
807 /// After calling incorporateFunction, use this method to remove the
808 /// most recently incorporated function from the SlotTracker. This
809 /// will reset the state of the machine back to just the module contents.
810 void purgeFunction();
812 /// MDNode map iterators.
813 using mdn_iterator
= DenseMap
<const MDNode
*, unsigned>::iterator
;
815 mdn_iterator
mdn_begin() { return mdnMap
.begin(); }
816 mdn_iterator
mdn_end() { return mdnMap
.end(); }
817 unsigned mdn_size() const { return mdnMap
.size(); }
818 bool mdn_empty() const { return mdnMap
.empty(); }
820 /// AttributeSet map iterators.
821 using as_iterator
= DenseMap
<AttributeSet
, unsigned>::iterator
;
823 as_iterator
as_begin() { return asMap
.begin(); }
824 as_iterator
as_end() { return asMap
.end(); }
825 unsigned as_size() const { return asMap
.size(); }
826 bool as_empty() const { return asMap
.empty(); }
828 /// GUID map iterators.
829 using guid_iterator
= DenseMap
<GlobalValue::GUID
, unsigned>::iterator
;
831 /// These functions do the actual initialization.
832 inline void initializeIfNeeded();
833 int initializeIndexIfNeeded();
835 // Implementation Details
837 /// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.
838 void CreateModuleSlot(const GlobalValue
*V
);
840 /// CreateMetadataSlot - Insert the specified MDNode* into the slot table.
841 void CreateMetadataSlot(const MDNode
*N
);
843 /// CreateFunctionSlot - Insert the specified Value* into the slot table.
844 void CreateFunctionSlot(const Value
*V
);
846 /// Insert the specified AttributeSet into the slot table.
847 void CreateAttributeSetSlot(AttributeSet AS
);
849 inline void CreateModulePathSlot(StringRef Path
);
850 void CreateGUIDSlot(GlobalValue::GUID GUID
);
851 void CreateTypeIdSlot(StringRef Id
);
852 void CreateTypeIdCompatibleVtableSlot(StringRef Id
);
854 /// Add all of the module level global variables (and their initializers)
855 /// and function declarations, but not the contents of those functions.
856 void processModule();
857 // Returns number of allocated slots
860 /// Add all of the functions arguments, basic blocks, and instructions.
861 void processFunction();
863 /// Add the metadata directly attached to a GlobalObject.
864 void processGlobalObjectMetadata(const GlobalObject
&GO
);
866 /// Add all of the metadata from a function.
867 void processFunctionMetadata(const Function
&F
);
869 /// Add all of the metadata from an instruction.
870 void processInstructionMetadata(const Instruction
&I
);
872 /// Add all of the metadata from a DbgRecord.
873 void processDbgRecordMetadata(const DbgRecord
&DVR
);
876 } // end namespace llvm
878 ModuleSlotTracker::ModuleSlotTracker(SlotTracker
&Machine
, const Module
*M
,
880 : M(M
), F(F
), Machine(&Machine
) {}
882 ModuleSlotTracker::ModuleSlotTracker(const Module
*M
,
883 bool ShouldInitializeAllMetadata
)
884 : ShouldCreateStorage(M
),
885 ShouldInitializeAllMetadata(ShouldInitializeAllMetadata
), M(M
) {}
887 ModuleSlotTracker::~ModuleSlotTracker() = default;
889 SlotTracker
*ModuleSlotTracker::getMachine() {
890 if (!ShouldCreateStorage
)
893 ShouldCreateStorage
= false;
895 std::make_unique
<SlotTracker
>(M
, ShouldInitializeAllMetadata
);
896 Machine
= MachineStorage
.get();
897 if (ProcessModuleHookFn
)
898 Machine
->setProcessHook(ProcessModuleHookFn
);
899 if (ProcessFunctionHookFn
)
900 Machine
->setProcessHook(ProcessFunctionHookFn
);
904 void ModuleSlotTracker::incorporateFunction(const Function
&F
) {
905 // Using getMachine() may lazily create the slot tracker.
909 // Nothing to do if this is the right function already.
913 Machine
->purgeFunction();
914 Machine
->incorporateFunction(&F
);
918 int ModuleSlotTracker::getLocalSlot(const Value
*V
) {
919 assert(F
&& "No function incorporated");
920 return Machine
->getLocalSlot(V
);
923 void ModuleSlotTracker::setProcessHook(
924 std::function
<void(AbstractSlotTrackerStorage
*, const Module
*, bool)>
926 ProcessModuleHookFn
= Fn
;
929 void ModuleSlotTracker::setProcessHook(
930 std::function
<void(AbstractSlotTrackerStorage
*, const Function
*, bool)>
932 ProcessFunctionHookFn
= Fn
;
935 static SlotTracker
*createSlotTracker(const Value
*V
) {
936 if (const Argument
*FA
= dyn_cast
<Argument
>(V
))
937 return new SlotTracker(FA
->getParent());
939 if (const Instruction
*I
= dyn_cast
<Instruction
>(V
))
941 return new SlotTracker(I
->getParent()->getParent());
943 if (const BasicBlock
*BB
= dyn_cast
<BasicBlock
>(V
))
944 return new SlotTracker(BB
->getParent());
946 if (const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(V
))
947 return new SlotTracker(GV
->getParent());
949 if (const GlobalAlias
*GA
= dyn_cast
<GlobalAlias
>(V
))
950 return new SlotTracker(GA
->getParent());
952 if (const GlobalIFunc
*GIF
= dyn_cast
<GlobalIFunc
>(V
))
953 return new SlotTracker(GIF
->getParent());
955 if (const Function
*Func
= dyn_cast
<Function
>(V
))
956 return new SlotTracker(Func
);
962 #define ST_DEBUG(X) dbgs() << X
967 // Module level constructor. Causes the contents of the Module (sans functions)
968 // to be added to the slot table.
969 SlotTracker::SlotTracker(const Module
*M
, bool ShouldInitializeAllMetadata
)
970 : TheModule(M
), ShouldInitializeAllMetadata(ShouldInitializeAllMetadata
) {}
972 // Function level constructor. Causes the contents of the Module and the one
973 // function provided to be added to the slot table.
974 SlotTracker::SlotTracker(const Function
*F
, bool ShouldInitializeAllMetadata
)
975 : TheModule(F
? F
->getParent() : nullptr), TheFunction(F
),
976 ShouldInitializeAllMetadata(ShouldInitializeAllMetadata
) {}
978 SlotTracker::SlotTracker(const ModuleSummaryIndex
*Index
)
979 : TheModule(nullptr), ShouldInitializeAllMetadata(false), TheIndex(Index
) {}
981 inline void SlotTracker::initializeIfNeeded() {
984 TheModule
= nullptr; ///< Prevent re-processing next time we're called.
987 if (TheFunction
&& !FunctionProcessed
)
991 int SlotTracker::initializeIndexIfNeeded() {
994 int NumSlots
= processIndex();
995 TheIndex
= nullptr; ///< Prevent re-processing next time we're called.
999 // Iterate through all the global variables, functions, and global
1000 // variable initializers and create slots for them.
1001 void SlotTracker::processModule() {
1002 ST_DEBUG("begin processModule!\n");
1004 // Add all of the unnamed global variables to the value table.
1005 for (const GlobalVariable
&Var
: TheModule
->globals()) {
1007 CreateModuleSlot(&Var
);
1008 processGlobalObjectMetadata(Var
);
1009 auto Attrs
= Var
.getAttributes();
1010 if (Attrs
.hasAttributes())
1011 CreateAttributeSetSlot(Attrs
);
1014 for (const GlobalAlias
&A
: TheModule
->aliases()) {
1016 CreateModuleSlot(&A
);
1019 for (const GlobalIFunc
&I
: TheModule
->ifuncs()) {
1021 CreateModuleSlot(&I
);
1024 // Add metadata used by named metadata.
1025 for (const NamedMDNode
&NMD
: TheModule
->named_metadata()) {
1026 for (const MDNode
*N
: NMD
.operands())
1027 CreateMetadataSlot(N
);
1030 for (const Function
&F
: *TheModule
) {
1032 // Add all the unnamed functions to the table.
1033 CreateModuleSlot(&F
);
1035 if (ShouldInitializeAllMetadata
)
1036 processFunctionMetadata(F
);
1038 // Add all the function attributes to the table.
1039 // FIXME: Add attributes of other objects?
1040 AttributeSet FnAttrs
= F
.getAttributes().getFnAttrs();
1041 if (FnAttrs
.hasAttributes())
1042 CreateAttributeSetSlot(FnAttrs
);
1045 if (ProcessModuleHookFn
)
1046 ProcessModuleHookFn(this, TheModule
, ShouldInitializeAllMetadata
);
1048 ST_DEBUG("end processModule!\n");
1051 // Process the arguments, basic blocks, and instructions of a function.
1052 void SlotTracker::processFunction() {
1053 ST_DEBUG("begin processFunction!\n");
1056 // Process function metadata if it wasn't hit at the module-level.
1057 if (!ShouldInitializeAllMetadata
)
1058 processFunctionMetadata(*TheFunction
);
1060 // Add all the function arguments with no names.
1061 for(Function::const_arg_iterator AI
= TheFunction
->arg_begin(),
1062 AE
= TheFunction
->arg_end(); AI
!= AE
; ++AI
)
1064 CreateFunctionSlot(&*AI
);
1066 ST_DEBUG("Inserting Instructions:\n");
1068 // Add all of the basic blocks and instructions with no names.
1069 for (auto &BB
: *TheFunction
) {
1071 CreateFunctionSlot(&BB
);
1073 for (auto &I
: BB
) {
1074 if (!I
.getType()->isVoidTy() && !I
.hasName())
1075 CreateFunctionSlot(&I
);
1077 // We allow direct calls to any llvm.foo function here, because the
1078 // target may not be linked into the optimizer.
1079 if (const auto *Call
= dyn_cast
<CallBase
>(&I
)) {
1080 // Add all the call attributes to the table.
1081 AttributeSet Attrs
= Call
->getAttributes().getFnAttrs();
1082 if (Attrs
.hasAttributes())
1083 CreateAttributeSetSlot(Attrs
);
1088 if (ProcessFunctionHookFn
)
1089 ProcessFunctionHookFn(this, TheFunction
, ShouldInitializeAllMetadata
);
1091 FunctionProcessed
= true;
1093 ST_DEBUG("end processFunction!\n");
1096 // Iterate through all the GUID in the index and create slots for them.
1097 int SlotTracker::processIndex() {
1098 ST_DEBUG("begin processIndex!\n");
1101 // The first block of slots are just the module ids, which start at 0 and are
1102 // assigned consecutively. Since the StringMap iteration order isn't
1103 // guaranteed, order by path string before assigning slots.
1104 std::vector
<StringRef
> ModulePaths
;
1105 for (auto &[ModPath
, _
] : TheIndex
->modulePaths())
1106 ModulePaths
.push_back(ModPath
);
1107 llvm::sort(ModulePaths
.begin(), ModulePaths
.end());
1108 for (auto &ModPath
: ModulePaths
)
1109 CreateModulePathSlot(ModPath
);
1111 // Start numbering the GUIDs after the module ids.
1112 GUIDNext
= ModulePathNext
;
1114 for (auto &GlobalList
: *TheIndex
)
1115 CreateGUIDSlot(GlobalList
.first
);
1117 // Start numbering the TypeIdCompatibleVtables after the GUIDs.
1118 TypeIdCompatibleVtableNext
= GUIDNext
;
1119 for (auto &TId
: TheIndex
->typeIdCompatibleVtableMap())
1120 CreateTypeIdCompatibleVtableSlot(TId
.first
);
1122 // Start numbering the TypeIds after the TypeIdCompatibleVtables.
1123 TypeIdNext
= TypeIdCompatibleVtableNext
;
1124 for (const auto &TID
: TheIndex
->typeIds())
1125 CreateTypeIdSlot(TID
.second
.first
);
1127 ST_DEBUG("end processIndex!\n");
1131 void SlotTracker::processGlobalObjectMetadata(const GlobalObject
&GO
) {
1132 SmallVector
<std::pair
<unsigned, MDNode
*>, 4> MDs
;
1133 GO
.getAllMetadata(MDs
);
1134 for (auto &MD
: MDs
)
1135 CreateMetadataSlot(MD
.second
);
1138 void SlotTracker::processFunctionMetadata(const Function
&F
) {
1139 processGlobalObjectMetadata(F
);
1140 for (auto &BB
: F
) {
1141 for (auto &I
: BB
) {
1142 for (const DbgRecord
&DR
: I
.getDbgRecordRange())
1143 processDbgRecordMetadata(DR
);
1144 processInstructionMetadata(I
);
1149 void SlotTracker::processDbgRecordMetadata(const DbgRecord
&DR
) {
1150 if (const DbgVariableRecord
*DVR
= dyn_cast
<const DbgVariableRecord
>(&DR
)) {
1151 // Process metadata used by DbgRecords; we only specifically care about the
1152 // DILocalVariable, DILocation, and DIAssignID fields, as the Value and
1153 // Expression fields should only be printed inline and so do not use a slot.
1154 // Note: The above doesn't apply for empty-metadata operands.
1155 if (auto *Empty
= dyn_cast
<MDNode
>(DVR
->getRawLocation()))
1156 CreateMetadataSlot(Empty
);
1157 CreateMetadataSlot(DVR
->getRawVariable());
1158 if (DVR
->isDbgAssign()) {
1159 CreateMetadataSlot(cast
<MDNode
>(DVR
->getRawAssignID()));
1160 if (auto *Empty
= dyn_cast
<MDNode
>(DVR
->getRawAddress()))
1161 CreateMetadataSlot(Empty
);
1163 } else if (const DbgLabelRecord
*DLR
= dyn_cast
<const DbgLabelRecord
>(&DR
)) {
1164 CreateMetadataSlot(DLR
->getRawLabel());
1166 llvm_unreachable("unsupported DbgRecord kind");
1168 CreateMetadataSlot(DR
.getDebugLoc().getAsMDNode());
1171 void SlotTracker::processInstructionMetadata(const Instruction
&I
) {
1172 // Process metadata used directly by intrinsics.
1173 if (const CallInst
*CI
= dyn_cast
<CallInst
>(&I
))
1174 if (Function
*F
= CI
->getCalledFunction())
1175 if (F
->isIntrinsic())
1176 for (auto &Op
: I
.operands())
1177 if (auto *V
= dyn_cast_or_null
<MetadataAsValue
>(Op
))
1178 if (MDNode
*N
= dyn_cast
<MDNode
>(V
->getMetadata()))
1179 CreateMetadataSlot(N
);
1181 // Process metadata attached to this instruction.
1182 SmallVector
<std::pair
<unsigned, MDNode
*>, 4> MDs
;
1183 I
.getAllMetadata(MDs
);
1184 for (auto &MD
: MDs
)
1185 CreateMetadataSlot(MD
.second
);
1188 /// Clean up after incorporating a function. This is the only way to get out of
1189 /// the function incorporation state that affects get*Slot/Create*Slot. Function
1190 /// incorporation state is indicated by TheFunction != 0.
1191 void SlotTracker::purgeFunction() {
1192 ST_DEBUG("begin purgeFunction!\n");
1193 fMap
.clear(); // Simply discard the function level map
1194 TheFunction
= nullptr;
1195 FunctionProcessed
= false;
1196 ST_DEBUG("end purgeFunction!\n");
1199 /// getGlobalSlot - Get the slot number of a global value.
1200 int SlotTracker::getGlobalSlot(const GlobalValue
*V
) {
1201 // Check for uninitialized state and do lazy initialization.
1202 initializeIfNeeded();
1204 // Find the value in the module map
1205 ValueMap::iterator MI
= mMap
.find(V
);
1206 return MI
== mMap
.end() ? -1 : (int)MI
->second
;
1209 void SlotTracker::setProcessHook(
1210 std::function
<void(AbstractSlotTrackerStorage
*, const Module
*, bool)>
1212 ProcessModuleHookFn
= Fn
;
1215 void SlotTracker::setProcessHook(
1216 std::function
<void(AbstractSlotTrackerStorage
*, const Function
*, bool)>
1218 ProcessFunctionHookFn
= Fn
;
1221 /// getMetadataSlot - Get the slot number of a MDNode.
1222 void SlotTracker::createMetadataSlot(const MDNode
*N
) { CreateMetadataSlot(N
); }
1224 /// getMetadataSlot - Get the slot number of a MDNode.
1225 int SlotTracker::getMetadataSlot(const MDNode
*N
) {
1226 // Check for uninitialized state and do lazy initialization.
1227 initializeIfNeeded();
1229 // Find the MDNode in the module map
1230 mdn_iterator MI
= mdnMap
.find(N
);
1231 return MI
== mdnMap
.end() ? -1 : (int)MI
->second
;
1234 /// getLocalSlot - Get the slot number for a value that is local to a function.
1235 int SlotTracker::getLocalSlot(const Value
*V
) {
1236 assert(!isa
<Constant
>(V
) && "Can't get a constant or global slot with this!");
1238 // Check for uninitialized state and do lazy initialization.
1239 initializeIfNeeded();
1241 ValueMap::iterator FI
= fMap
.find(V
);
1242 return FI
== fMap
.end() ? -1 : (int)FI
->second
;
1245 int SlotTracker::getAttributeGroupSlot(AttributeSet AS
) {
1246 // Check for uninitialized state and do lazy initialization.
1247 initializeIfNeeded();
1249 // Find the AttributeSet in the module map.
1250 as_iterator AI
= asMap
.find(AS
);
1251 return AI
== asMap
.end() ? -1 : (int)AI
->second
;
1254 int SlotTracker::getModulePathSlot(StringRef Path
) {
1255 // Check for uninitialized state and do lazy initialization.
1256 initializeIndexIfNeeded();
1258 // Find the Module path in the map
1259 auto I
= ModulePathMap
.find(Path
);
1260 return I
== ModulePathMap
.end() ? -1 : (int)I
->second
;
1263 int SlotTracker::getGUIDSlot(GlobalValue::GUID GUID
) {
1264 // Check for uninitialized state and do lazy initialization.
1265 initializeIndexIfNeeded();
1267 // Find the GUID in the map
1268 guid_iterator I
= GUIDMap
.find(GUID
);
1269 return I
== GUIDMap
.end() ? -1 : (int)I
->second
;
1272 int SlotTracker::getTypeIdSlot(StringRef Id
) {
1273 // Check for uninitialized state and do lazy initialization.
1274 initializeIndexIfNeeded();
1276 // Find the TypeId string in the map
1277 auto I
= TypeIdMap
.find(Id
);
1278 return I
== TypeIdMap
.end() ? -1 : (int)I
->second
;
1281 int SlotTracker::getTypeIdCompatibleVtableSlot(StringRef Id
) {
1282 // Check for uninitialized state and do lazy initialization.
1283 initializeIndexIfNeeded();
1285 // Find the TypeIdCompatibleVtable string in the map
1286 auto I
= TypeIdCompatibleVtableMap
.find(Id
);
1287 return I
== TypeIdCompatibleVtableMap
.end() ? -1 : (int)I
->second
;
1290 /// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.
1291 void SlotTracker::CreateModuleSlot(const GlobalValue
*V
) {
1292 assert(V
&& "Can't insert a null Value into SlotTracker!");
1293 assert(!V
->getType()->isVoidTy() && "Doesn't need a slot!");
1294 assert(!V
->hasName() && "Doesn't need a slot!");
1296 unsigned DestSlot
= mNext
++;
1299 ST_DEBUG(" Inserting value [" << V
->getType() << "] = " << V
<< " slot=" <<
1301 // G = Global, F = Function, A = Alias, I = IFunc, o = other
1302 ST_DEBUG((isa
<GlobalVariable
>(V
) ? 'G' :
1303 (isa
<Function
>(V
) ? 'F' :
1304 (isa
<GlobalAlias
>(V
) ? 'A' :
1305 (isa
<GlobalIFunc
>(V
) ? 'I' : 'o')))) << "]\n");
1308 /// CreateSlot - Create a new slot for the specified value if it has no name.
1309 void SlotTracker::CreateFunctionSlot(const Value
*V
) {
1310 assert(!V
->getType()->isVoidTy() && !V
->hasName() && "Doesn't need a slot!");
1312 unsigned DestSlot
= fNext
++;
1315 // G = Global, F = Function, o = other
1316 ST_DEBUG(" Inserting value [" << V
->getType() << "] = " << V
<< " slot=" <<
1317 DestSlot
<< " [o]\n");
1320 /// CreateModuleSlot - Insert the specified MDNode* into the slot table.
1321 void SlotTracker::CreateMetadataSlot(const MDNode
*N
) {
1322 assert(N
&& "Can't insert a null Value into SlotTracker!");
1324 // Don't make slots for DIExpressions. We just print them inline everywhere.
1325 if (isa
<DIExpression
>(N
))
1328 unsigned DestSlot
= mdnNext
;
1329 if (!mdnMap
.insert(std::make_pair(N
, DestSlot
)).second
)
1333 // Recursively add any MDNodes referenced by operands.
1334 for (unsigned i
= 0, e
= N
->getNumOperands(); i
!= e
; ++i
)
1335 if (const MDNode
*Op
= dyn_cast_or_null
<MDNode
>(N
->getOperand(i
)))
1336 CreateMetadataSlot(Op
);
1339 void SlotTracker::CreateAttributeSetSlot(AttributeSet AS
) {
1340 assert(AS
.hasAttributes() && "Doesn't need a slot!");
1342 if (asMap
.try_emplace(AS
, asNext
).second
)
1346 /// Create a new slot for the specified Module
1347 void SlotTracker::CreateModulePathSlot(StringRef Path
) {
1348 ModulePathMap
[Path
] = ModulePathNext
++;
1351 /// Create a new slot for the specified GUID
1352 void SlotTracker::CreateGUIDSlot(GlobalValue::GUID GUID
) {
1353 GUIDMap
[GUID
] = GUIDNext
++;
1356 /// Create a new slot for the specified Id
1357 void SlotTracker::CreateTypeIdSlot(StringRef Id
) {
1358 TypeIdMap
[Id
] = TypeIdNext
++;
1361 /// Create a new slot for the specified Id
1362 void SlotTracker::CreateTypeIdCompatibleVtableSlot(StringRef Id
) {
1363 TypeIdCompatibleVtableMap
[Id
] = TypeIdCompatibleVtableNext
++;
1367 /// Common instances used by most of the printer functions.
1368 struct AsmWriterContext
{
1369 TypePrinting
*TypePrinter
= nullptr;
1370 SlotTracker
*Machine
= nullptr;
1371 const Module
*Context
= nullptr;
1373 AsmWriterContext(TypePrinting
*TP
, SlotTracker
*ST
, const Module
*M
= nullptr)
1374 : TypePrinter(TP
), Machine(ST
), Context(M
) {}
1376 static AsmWriterContext
&getEmpty() {
1377 static AsmWriterContext
EmptyCtx(nullptr, nullptr);
1381 /// A callback that will be triggered when the underlying printer
1382 /// prints a Metadata as operand.
1383 virtual void onWriteMetadataAsOperand(const Metadata
*) {}
1385 virtual ~AsmWriterContext() = default;
1387 } // end anonymous namespace
1389 //===----------------------------------------------------------------------===//
1390 // AsmWriter Implementation
1391 //===----------------------------------------------------------------------===//
1393 static void WriteAsOperandInternal(raw_ostream
&Out
, const Value
*V
,
1394 AsmWriterContext
&WriterCtx
);
1396 static void WriteAsOperandInternal(raw_ostream
&Out
, const Metadata
*MD
,
1397 AsmWriterContext
&WriterCtx
,
1398 bool FromValue
= false);
1400 static void WriteOptimizationInfo(raw_ostream
&Out
, const User
*U
) {
1401 if (const FPMathOperator
*FPO
= dyn_cast
<const FPMathOperator
>(U
))
1402 Out
<< FPO
->getFastMathFlags();
1404 if (const OverflowingBinaryOperator
*OBO
=
1405 dyn_cast
<OverflowingBinaryOperator
>(U
)) {
1406 if (OBO
->hasNoUnsignedWrap())
1408 if (OBO
->hasNoSignedWrap())
1410 } else if (const PossiblyExactOperator
*Div
=
1411 dyn_cast
<PossiblyExactOperator
>(U
)) {
1414 } else if (const PossiblyDisjointInst
*PDI
=
1415 dyn_cast
<PossiblyDisjointInst
>(U
)) {
1416 if (PDI
->isDisjoint())
1418 } else if (const GEPOperator
*GEP
= dyn_cast
<GEPOperator
>(U
)) {
1419 if (GEP
->isInBounds())
1421 else if (GEP
->hasNoUnsignedSignedWrap())
1423 if (GEP
->hasNoUnsignedWrap())
1425 if (auto InRange
= GEP
->getInRange()) {
1426 Out
<< " inrange(" << InRange
->getLower() << ", " << InRange
->getUpper()
1429 } else if (const auto *NNI
= dyn_cast
<PossiblyNonNegInst
>(U
)) {
1430 if (NNI
->hasNonNeg())
1432 } else if (const auto *TI
= dyn_cast
<TruncInst
>(U
)) {
1433 if (TI
->hasNoUnsignedWrap())
1435 if (TI
->hasNoSignedWrap())
1437 } else if (const auto *ICmp
= dyn_cast
<ICmpInst
>(U
)) {
1438 if (ICmp
->hasSameSign())
1443 static void WriteAPFloatInternal(raw_ostream
&Out
, const APFloat
&APF
) {
1444 if (&APF
.getSemantics() == &APFloat::IEEEsingle() ||
1445 &APF
.getSemantics() == &APFloat::IEEEdouble()) {
1446 // We would like to output the FP constant value in exponential notation,
1447 // but we cannot do this if doing so will lose precision. Check here to
1448 // make sure that we only output it in exponential format if we can parse
1449 // the value back and get the same value.
1452 bool isDouble
= &APF
.getSemantics() == &APFloat::IEEEdouble();
1453 bool isInf
= APF
.isInfinity();
1454 bool isNaN
= APF
.isNaN();
1456 if (!isInf
&& !isNaN
) {
1457 double Val
= APF
.convertToDouble();
1458 SmallString
<128> StrVal
;
1459 APF
.toString(StrVal
, 6, 0, false);
1460 // Check to make sure that the stringized number is not some string like
1461 // "Inf" or NaN, that atof will accept, but the lexer will not. Check
1462 // that the string matches the "[-+]?[0-9]" regex.
1464 assert((isDigit(StrVal
[0]) ||
1465 ((StrVal
[0] == '-' || StrVal
[0] == '+') && isDigit(StrVal
[1]))) &&
1466 "[-+]?[0-9] regex does not match!");
1467 // Reparse stringized version!
1468 if (APFloat(APFloat::IEEEdouble(), StrVal
).convertToDouble() == Val
) {
1474 // Otherwise we could not reparse it to exactly the same value, so we must
1475 // output the string in hexadecimal format! Note that loading and storing
1476 // floating point types changes the bits of NaNs on some hosts, notably
1477 // x86, so we must not use these types.
1478 static_assert(sizeof(double) == sizeof(uint64_t),
1479 "assuming that double is 64 bits!");
1482 // Floats are represented in ASCII IR as double, convert.
1483 // FIXME: We should allow 32-bit hex float and remove this.
1485 // A signaling NaN is quieted on conversion, so we need to recreate the
1486 // expected value after convert (quiet bit of the payload is clear).
1487 bool IsSNAN
= apf
.isSignaling();
1488 apf
.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven
,
1491 APInt Payload
= apf
.bitcastToAPInt();
1493 APFloat::getSNaN(APFloat::IEEEdouble(), apf
.isNegative(), &Payload
);
1497 Out
<< format_hex(apf
.bitcastToAPInt().getZExtValue(), 0, /*Upper=*/true);
1501 // Either half, bfloat or some form of long double.
1502 // These appear as a magic letter identifying the type, then a
1503 // fixed number of hex digits.
1505 APInt API
= APF
.bitcastToAPInt();
1506 if (&APF
.getSemantics() == &APFloat::x87DoubleExtended()) {
1508 Out
<< format_hex_no_prefix(API
.getHiBits(16).getZExtValue(), 4,
1510 Out
<< format_hex_no_prefix(API
.getLoBits(64).getZExtValue(), 16,
1512 } else if (&APF
.getSemantics() == &APFloat::IEEEquad()) {
1514 Out
<< format_hex_no_prefix(API
.getLoBits(64).getZExtValue(), 16,
1516 Out
<< format_hex_no_prefix(API
.getHiBits(64).getZExtValue(), 16,
1518 } else if (&APF
.getSemantics() == &APFloat::PPCDoubleDouble()) {
1520 Out
<< format_hex_no_prefix(API
.getLoBits(64).getZExtValue(), 16,
1522 Out
<< format_hex_no_prefix(API
.getHiBits(64).getZExtValue(), 16,
1524 } else if (&APF
.getSemantics() == &APFloat::IEEEhalf()) {
1526 Out
<< format_hex_no_prefix(API
.getZExtValue(), 4,
1528 } else if (&APF
.getSemantics() == &APFloat::BFloat()) {
1530 Out
<< format_hex_no_prefix(API
.getZExtValue(), 4,
1533 llvm_unreachable("Unsupported floating point type");
1536 static void WriteConstantInternal(raw_ostream
&Out
, const Constant
*CV
,
1537 AsmWriterContext
&WriterCtx
) {
1538 if (const ConstantInt
*CI
= dyn_cast
<ConstantInt
>(CV
)) {
1539 Type
*Ty
= CI
->getType();
1541 if (Ty
->isVectorTy()) {
1543 WriterCtx
.TypePrinter
->print(Ty
->getScalarType(), Out
);
1547 if (Ty
->getScalarType()->isIntegerTy(1))
1548 Out
<< (CI
->getZExtValue() ? "true" : "false");
1550 Out
<< CI
->getValue();
1552 if (Ty
->isVectorTy())
1558 if (const ConstantFP
*CFP
= dyn_cast
<ConstantFP
>(CV
)) {
1559 Type
*Ty
= CFP
->getType();
1561 if (Ty
->isVectorTy()) {
1563 WriterCtx
.TypePrinter
->print(Ty
->getScalarType(), Out
);
1567 WriteAPFloatInternal(Out
, CFP
->getValueAPF());
1569 if (Ty
->isVectorTy())
1575 if (isa
<ConstantAggregateZero
>(CV
) || isa
<ConstantTargetNone
>(CV
)) {
1576 Out
<< "zeroinitializer";
1580 if (const BlockAddress
*BA
= dyn_cast
<BlockAddress
>(CV
)) {
1581 Out
<< "blockaddress(";
1582 WriteAsOperandInternal(Out
, BA
->getFunction(), WriterCtx
);
1584 WriteAsOperandInternal(Out
, BA
->getBasicBlock(), WriterCtx
);
1589 if (const auto *Equiv
= dyn_cast
<DSOLocalEquivalent
>(CV
)) {
1590 Out
<< "dso_local_equivalent ";
1591 WriteAsOperandInternal(Out
, Equiv
->getGlobalValue(), WriterCtx
);
1595 if (const auto *NC
= dyn_cast
<NoCFIValue
>(CV
)) {
1597 WriteAsOperandInternal(Out
, NC
->getGlobalValue(), WriterCtx
);
1601 if (const ConstantPtrAuth
*CPA
= dyn_cast
<ConstantPtrAuth
>(CV
)) {
1604 // ptrauth (ptr CST, i32 KEY[, i64 DISC[, ptr ADDRDISC]?]?)
1605 unsigned NumOpsToWrite
= 2;
1606 if (!CPA
->getOperand(2)->isNullValue())
1608 if (!CPA
->getOperand(3)->isNullValue())
1612 for (unsigned i
= 0, e
= NumOpsToWrite
; i
!= e
; ++i
) {
1614 WriterCtx
.TypePrinter
->print(CPA
->getOperand(i
)->getType(), Out
);
1616 WriteAsOperandInternal(Out
, CPA
->getOperand(i
), WriterCtx
);
1622 if (const ConstantArray
*CA
= dyn_cast
<ConstantArray
>(CV
)) {
1623 Type
*ETy
= CA
->getType()->getElementType();
1625 WriterCtx
.TypePrinter
->print(ETy
, Out
);
1627 WriteAsOperandInternal(Out
, CA
->getOperand(0), WriterCtx
);
1628 for (unsigned i
= 1, e
= CA
->getNumOperands(); i
!= e
; ++i
) {
1630 WriterCtx
.TypePrinter
->print(ETy
, Out
);
1632 WriteAsOperandInternal(Out
, CA
->getOperand(i
), WriterCtx
);
1638 if (const ConstantDataArray
*CA
= dyn_cast
<ConstantDataArray
>(CV
)) {
1639 // As a special case, print the array as a string if it is an array of
1640 // i8 with ConstantInt values.
1641 if (CA
->isString()) {
1643 printEscapedString(CA
->getAsString(), Out
);
1648 Type
*ETy
= CA
->getType()->getElementType();
1650 WriterCtx
.TypePrinter
->print(ETy
, Out
);
1652 WriteAsOperandInternal(Out
, CA
->getElementAsConstant(0), WriterCtx
);
1653 for (unsigned i
= 1, e
= CA
->getNumElements(); i
!= e
; ++i
) {
1655 WriterCtx
.TypePrinter
->print(ETy
, Out
);
1657 WriteAsOperandInternal(Out
, CA
->getElementAsConstant(i
), WriterCtx
);
1663 if (const ConstantStruct
*CS
= dyn_cast
<ConstantStruct
>(CV
)) {
1664 if (CS
->getType()->isPacked())
1667 unsigned N
= CS
->getNumOperands();
1670 WriterCtx
.TypePrinter
->print(CS
->getOperand(0)->getType(), Out
);
1673 WriteAsOperandInternal(Out
, CS
->getOperand(0), WriterCtx
);
1675 for (unsigned i
= 1; i
< N
; i
++) {
1677 WriterCtx
.TypePrinter
->print(CS
->getOperand(i
)->getType(), Out
);
1680 WriteAsOperandInternal(Out
, CS
->getOperand(i
), WriterCtx
);
1686 if (CS
->getType()->isPacked())
1691 if (isa
<ConstantVector
>(CV
) || isa
<ConstantDataVector
>(CV
)) {
1692 auto *CVVTy
= cast
<FixedVectorType
>(CV
->getType());
1693 Type
*ETy
= CVVTy
->getElementType();
1695 // Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is
1696 // permitted on IR input to reduce the output changes when enabling
1697 // UseConstant{Int,FP}ForFixedLengthSplat.
1698 // TODO: Remove this block when the UseConstant{Int,FP}ForFixedLengthSplat
1699 // options are removed.
1700 if (auto *SplatVal
= CV
->getSplatValue()) {
1701 if (isa
<ConstantInt
>(SplatVal
) || isa
<ConstantFP
>(SplatVal
)) {
1703 WriterCtx
.TypePrinter
->print(ETy
, Out
);
1705 WriteAsOperandInternal(Out
, SplatVal
, WriterCtx
);
1712 WriterCtx
.TypePrinter
->print(ETy
, Out
);
1714 WriteAsOperandInternal(Out
, CV
->getAggregateElement(0U), WriterCtx
);
1715 for (unsigned i
= 1, e
= CVVTy
->getNumElements(); i
!= e
; ++i
) {
1717 WriterCtx
.TypePrinter
->print(ETy
, Out
);
1719 WriteAsOperandInternal(Out
, CV
->getAggregateElement(i
), WriterCtx
);
1725 if (isa
<ConstantPointerNull
>(CV
)) {
1730 if (isa
<ConstantTokenNone
>(CV
)) {
1735 if (isa
<PoisonValue
>(CV
)) {
1740 if (isa
<UndefValue
>(CV
)) {
1745 if (const ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(CV
)) {
1746 // Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is
1747 // permitted on IR input to reduce the output changes when enabling
1748 // UseConstant{Int,FP}ForScalableSplat.
1749 // TODO: Remove this block when the UseConstant{Int,FP}ForScalableSplat
1750 // options are removed.
1751 if (CE
->getOpcode() == Instruction::ShuffleVector
) {
1752 if (auto *SplatVal
= CE
->getSplatValue()) {
1753 if (isa
<ConstantInt
>(SplatVal
) || isa
<ConstantFP
>(SplatVal
)) {
1755 WriterCtx
.TypePrinter
->print(SplatVal
->getType(), Out
);
1757 WriteAsOperandInternal(Out
, SplatVal
, WriterCtx
);
1764 Out
<< CE
->getOpcodeName();
1765 WriteOptimizationInfo(Out
, CE
);
1768 if (const GEPOperator
*GEP
= dyn_cast
<GEPOperator
>(CE
)) {
1769 WriterCtx
.TypePrinter
->print(GEP
->getSourceElementType(), Out
);
1773 for (User::const_op_iterator OI
= CE
->op_begin(); OI
!= CE
->op_end();
1775 WriterCtx
.TypePrinter
->print((*OI
)->getType(), Out
);
1777 WriteAsOperandInternal(Out
, *OI
, WriterCtx
);
1778 if (OI
+1 != CE
->op_end())
1784 WriterCtx
.TypePrinter
->print(CE
->getType(), Out
);
1787 if (CE
->getOpcode() == Instruction::ShuffleVector
)
1788 PrintShuffleMask(Out
, CE
->getType(), CE
->getShuffleMask());
1794 Out
<< "<placeholder or erroneous Constant>";
1797 static void writeMDTuple(raw_ostream
&Out
, const MDTuple
*Node
,
1798 AsmWriterContext
&WriterCtx
) {
1800 for (unsigned mi
= 0, me
= Node
->getNumOperands(); mi
!= me
; ++mi
) {
1801 const Metadata
*MD
= Node
->getOperand(mi
);
1804 else if (auto *MDV
= dyn_cast
<ValueAsMetadata
>(MD
)) {
1805 Value
*V
= MDV
->getValue();
1806 WriterCtx
.TypePrinter
->print(V
->getType(), Out
);
1808 WriteAsOperandInternal(Out
, V
, WriterCtx
);
1810 WriteAsOperandInternal(Out
, MD
, WriterCtx
);
1811 WriterCtx
.onWriteMetadataAsOperand(MD
);
1822 struct FieldSeparator
{
1826 FieldSeparator(const char *Sep
= ", ") : Sep(Sep
) {}
1829 raw_ostream
&operator<<(raw_ostream
&OS
, FieldSeparator
&FS
) {
1834 return OS
<< FS
.Sep
;
1837 struct MDFieldPrinter
{
1840 AsmWriterContext
&WriterCtx
;
1842 explicit MDFieldPrinter(raw_ostream
&Out
)
1843 : Out(Out
), WriterCtx(AsmWriterContext::getEmpty()) {}
1844 MDFieldPrinter(raw_ostream
&Out
, AsmWriterContext
&Ctx
)
1845 : Out(Out
), WriterCtx(Ctx
) {}
1847 void printTag(const DINode
*N
);
1848 void printMacinfoType(const DIMacroNode
*N
);
1849 void printChecksum(const DIFile::ChecksumInfo
<StringRef
> &N
);
1850 void printString(StringRef Name
, StringRef Value
,
1851 bool ShouldSkipEmpty
= true);
1852 void printMetadata(StringRef Name
, const Metadata
*MD
,
1853 bool ShouldSkipNull
= true);
1854 template <class IntTy
>
1855 void printInt(StringRef Name
, IntTy Int
, bool ShouldSkipZero
= true);
1856 void printAPInt(StringRef Name
, const APInt
&Int
, bool IsUnsigned
,
1857 bool ShouldSkipZero
);
1858 void printBool(StringRef Name
, bool Value
,
1859 std::optional
<bool> Default
= std::nullopt
);
1860 void printDIFlags(StringRef Name
, DINode::DIFlags Flags
);
1861 void printDISPFlags(StringRef Name
, DISubprogram::DISPFlags Flags
);
1862 template <class IntTy
, class Stringifier
>
1863 void printDwarfEnum(StringRef Name
, IntTy Value
, Stringifier toString
,
1864 bool ShouldSkipZero
= true);
1865 void printEmissionKind(StringRef Name
, DICompileUnit::DebugEmissionKind EK
);
1866 void printNameTableKind(StringRef Name
,
1867 DICompileUnit::DebugNameTableKind NTK
);
1870 } // end anonymous namespace
1872 void MDFieldPrinter::printTag(const DINode
*N
) {
1873 Out
<< FS
<< "tag: ";
1874 auto Tag
= dwarf::TagString(N
->getTag());
1881 void MDFieldPrinter::printMacinfoType(const DIMacroNode
*N
) {
1882 Out
<< FS
<< "type: ";
1883 auto Type
= dwarf::MacinfoString(N
->getMacinfoType());
1887 Out
<< N
->getMacinfoType();
1890 void MDFieldPrinter::printChecksum(
1891 const DIFile::ChecksumInfo
<StringRef
> &Checksum
) {
1892 Out
<< FS
<< "checksumkind: " << Checksum
.getKindAsString();
1893 printString("checksum", Checksum
.Value
, /* ShouldSkipEmpty */ false);
1896 void MDFieldPrinter::printString(StringRef Name
, StringRef Value
,
1897 bool ShouldSkipEmpty
) {
1898 if (ShouldSkipEmpty
&& Value
.empty())
1901 Out
<< FS
<< Name
<< ": \"";
1902 printEscapedString(Value
, Out
);
1906 static void writeMetadataAsOperand(raw_ostream
&Out
, const Metadata
*MD
,
1907 AsmWriterContext
&WriterCtx
) {
1912 WriteAsOperandInternal(Out
, MD
, WriterCtx
);
1913 WriterCtx
.onWriteMetadataAsOperand(MD
);
1916 void MDFieldPrinter::printMetadata(StringRef Name
, const Metadata
*MD
,
1917 bool ShouldSkipNull
) {
1918 if (ShouldSkipNull
&& !MD
)
1921 Out
<< FS
<< Name
<< ": ";
1922 writeMetadataAsOperand(Out
, MD
, WriterCtx
);
1925 template <class IntTy
>
1926 void MDFieldPrinter::printInt(StringRef Name
, IntTy Int
, bool ShouldSkipZero
) {
1927 if (ShouldSkipZero
&& !Int
)
1930 Out
<< FS
<< Name
<< ": " << Int
;
1933 void MDFieldPrinter::printAPInt(StringRef Name
, const APInt
&Int
,
1934 bool IsUnsigned
, bool ShouldSkipZero
) {
1935 if (ShouldSkipZero
&& Int
.isZero())
1938 Out
<< FS
<< Name
<< ": ";
1939 Int
.print(Out
, !IsUnsigned
);
1942 void MDFieldPrinter::printBool(StringRef Name
, bool Value
,
1943 std::optional
<bool> Default
) {
1944 if (Default
&& Value
== *Default
)
1946 Out
<< FS
<< Name
<< ": " << (Value
? "true" : "false");
1949 void MDFieldPrinter::printDIFlags(StringRef Name
, DINode::DIFlags Flags
) {
1953 Out
<< FS
<< Name
<< ": ";
1955 SmallVector
<DINode::DIFlags
, 8> SplitFlags
;
1956 auto Extra
= DINode::splitFlags(Flags
, SplitFlags
);
1958 FieldSeparator
FlagsFS(" | ");
1959 for (auto F
: SplitFlags
) {
1960 auto StringF
= DINode::getFlagString(F
);
1961 assert(!StringF
.empty() && "Expected valid flag");
1962 Out
<< FlagsFS
<< StringF
;
1964 if (Extra
|| SplitFlags
.empty())
1965 Out
<< FlagsFS
<< Extra
;
1968 void MDFieldPrinter::printDISPFlags(StringRef Name
,
1969 DISubprogram::DISPFlags Flags
) {
1970 // Always print this field, because no flags in the IR at all will be
1971 // interpreted as old-style isDefinition: true.
1972 Out
<< FS
<< Name
<< ": ";
1979 SmallVector
<DISubprogram::DISPFlags
, 8> SplitFlags
;
1980 auto Extra
= DISubprogram::splitFlags(Flags
, SplitFlags
);
1982 FieldSeparator
FlagsFS(" | ");
1983 for (auto F
: SplitFlags
) {
1984 auto StringF
= DISubprogram::getFlagString(F
);
1985 assert(!StringF
.empty() && "Expected valid flag");
1986 Out
<< FlagsFS
<< StringF
;
1988 if (Extra
|| SplitFlags
.empty())
1989 Out
<< FlagsFS
<< Extra
;
1992 void MDFieldPrinter::printEmissionKind(StringRef Name
,
1993 DICompileUnit::DebugEmissionKind EK
) {
1994 Out
<< FS
<< Name
<< ": " << DICompileUnit::emissionKindString(EK
);
1997 void MDFieldPrinter::printNameTableKind(StringRef Name
,
1998 DICompileUnit::DebugNameTableKind NTK
) {
1999 if (NTK
== DICompileUnit::DebugNameTableKind::Default
)
2001 Out
<< FS
<< Name
<< ": " << DICompileUnit::nameTableKindString(NTK
);
2004 template <class IntTy
, class Stringifier
>
2005 void MDFieldPrinter::printDwarfEnum(StringRef Name
, IntTy Value
,
2006 Stringifier toString
, bool ShouldSkipZero
) {
2010 Out
<< FS
<< Name
<< ": ";
2011 auto S
= toString(Value
);
2018 static void writeGenericDINode(raw_ostream
&Out
, const GenericDINode
*N
,
2019 AsmWriterContext
&WriterCtx
) {
2020 Out
<< "!GenericDINode(";
2021 MDFieldPrinter
Printer(Out
, WriterCtx
);
2022 Printer
.printTag(N
);
2023 Printer
.printString("header", N
->getHeader());
2024 if (N
->getNumDwarfOperands()) {
2025 Out
<< Printer
.FS
<< "operands: {";
2027 for (auto &I
: N
->dwarf_operands()) {
2029 writeMetadataAsOperand(Out
, I
, WriterCtx
);
2036 static void writeDILocation(raw_ostream
&Out
, const DILocation
*DL
,
2037 AsmWriterContext
&WriterCtx
) {
2038 Out
<< "!DILocation(";
2039 MDFieldPrinter
Printer(Out
, WriterCtx
);
2040 // Always output the line, since 0 is a relevant and important value for it.
2041 Printer
.printInt("line", DL
->getLine(), /* ShouldSkipZero */ false);
2042 Printer
.printInt("column", DL
->getColumn());
2043 Printer
.printMetadata("scope", DL
->getRawScope(), /* ShouldSkipNull */ false);
2044 Printer
.printMetadata("inlinedAt", DL
->getRawInlinedAt());
2045 Printer
.printBool("isImplicitCode", DL
->isImplicitCode(),
2046 /* Default */ false);
2050 static void writeDIAssignID(raw_ostream
&Out
, const DIAssignID
*DL
,
2051 AsmWriterContext
&WriterCtx
) {
2052 Out
<< "!DIAssignID()";
2053 MDFieldPrinter
Printer(Out
, WriterCtx
);
2056 static void writeDISubrange(raw_ostream
&Out
, const DISubrange
*N
,
2057 AsmWriterContext
&WriterCtx
) {
2058 Out
<< "!DISubrange(";
2059 MDFieldPrinter
Printer(Out
, WriterCtx
);
2061 auto *Count
= N
->getRawCountNode();
2062 if (auto *CE
= dyn_cast_or_null
<ConstantAsMetadata
>(Count
)) {
2063 auto *CV
= cast
<ConstantInt
>(CE
->getValue());
2064 Printer
.printInt("count", CV
->getSExtValue(),
2065 /* ShouldSkipZero */ false);
2067 Printer
.printMetadata("count", Count
, /*ShouldSkipNull */ true);
2069 // A lowerBound of constant 0 should not be skipped, since it is different
2070 // from an unspecified lower bound (= nullptr).
2071 auto *LBound
= N
->getRawLowerBound();
2072 if (auto *LE
= dyn_cast_or_null
<ConstantAsMetadata
>(LBound
)) {
2073 auto *LV
= cast
<ConstantInt
>(LE
->getValue());
2074 Printer
.printInt("lowerBound", LV
->getSExtValue(),
2075 /* ShouldSkipZero */ false);
2077 Printer
.printMetadata("lowerBound", LBound
, /*ShouldSkipNull */ true);
2079 auto *UBound
= N
->getRawUpperBound();
2080 if (auto *UE
= dyn_cast_or_null
<ConstantAsMetadata
>(UBound
)) {
2081 auto *UV
= cast
<ConstantInt
>(UE
->getValue());
2082 Printer
.printInt("upperBound", UV
->getSExtValue(),
2083 /* ShouldSkipZero */ false);
2085 Printer
.printMetadata("upperBound", UBound
, /*ShouldSkipNull */ true);
2087 auto *Stride
= N
->getRawStride();
2088 if (auto *SE
= dyn_cast_or_null
<ConstantAsMetadata
>(Stride
)) {
2089 auto *SV
= cast
<ConstantInt
>(SE
->getValue());
2090 Printer
.printInt("stride", SV
->getSExtValue(), /* ShouldSkipZero */ false);
2092 Printer
.printMetadata("stride", Stride
, /*ShouldSkipNull */ true);
2097 static void writeDIGenericSubrange(raw_ostream
&Out
, const DIGenericSubrange
*N
,
2098 AsmWriterContext
&WriterCtx
) {
2099 Out
<< "!DIGenericSubrange(";
2100 MDFieldPrinter
Printer(Out
, WriterCtx
);
2102 auto IsConstant
= [&](Metadata
*Bound
) -> bool {
2103 if (auto *BE
= dyn_cast_or_null
<DIExpression
>(Bound
)) {
2104 return BE
->isConstant() &&
2105 DIExpression::SignedOrUnsignedConstant::SignedConstant
==
2111 auto GetConstant
= [&](Metadata
*Bound
) -> int64_t {
2112 assert(IsConstant(Bound
) && "Expected constant");
2113 auto *BE
= dyn_cast_or_null
<DIExpression
>(Bound
);
2114 return static_cast<int64_t>(BE
->getElement(1));
2117 auto *Count
= N
->getRawCountNode();
2118 if (IsConstant(Count
))
2119 Printer
.printInt("count", GetConstant(Count
),
2120 /* ShouldSkipZero */ false);
2122 Printer
.printMetadata("count", Count
, /*ShouldSkipNull */ true);
2124 auto *LBound
= N
->getRawLowerBound();
2125 if (IsConstant(LBound
))
2126 Printer
.printInt("lowerBound", GetConstant(LBound
),
2127 /* ShouldSkipZero */ false);
2129 Printer
.printMetadata("lowerBound", LBound
, /*ShouldSkipNull */ true);
2131 auto *UBound
= N
->getRawUpperBound();
2132 if (IsConstant(UBound
))
2133 Printer
.printInt("upperBound", GetConstant(UBound
),
2134 /* ShouldSkipZero */ false);
2136 Printer
.printMetadata("upperBound", UBound
, /*ShouldSkipNull */ true);
2138 auto *Stride
= N
->getRawStride();
2139 if (IsConstant(Stride
))
2140 Printer
.printInt("stride", GetConstant(Stride
),
2141 /* ShouldSkipZero */ false);
2143 Printer
.printMetadata("stride", Stride
, /*ShouldSkipNull */ true);
2148 static void writeDIEnumerator(raw_ostream
&Out
, const DIEnumerator
*N
,
2149 AsmWriterContext
&) {
2150 Out
<< "!DIEnumerator(";
2151 MDFieldPrinter
Printer(Out
);
2152 Printer
.printString("name", N
->getName(), /* ShouldSkipEmpty */ false);
2153 Printer
.printAPInt("value", N
->getValue(), N
->isUnsigned(),
2154 /*ShouldSkipZero=*/false);
2155 if (N
->isUnsigned())
2156 Printer
.printBool("isUnsigned", true);
2160 static void writeDIBasicType(raw_ostream
&Out
, const DIBasicType
*N
,
2161 AsmWriterContext
&) {
2162 Out
<< "!DIBasicType(";
2163 MDFieldPrinter
Printer(Out
);
2164 if (N
->getTag() != dwarf::DW_TAG_base_type
)
2165 Printer
.printTag(N
);
2166 Printer
.printString("name", N
->getName());
2167 Printer
.printInt("size", N
->getSizeInBits());
2168 Printer
.printInt("align", N
->getAlignInBits());
2169 Printer
.printDwarfEnum("encoding", N
->getEncoding(),
2170 dwarf::AttributeEncodingString
);
2171 Printer
.printInt("num_extra_inhabitants", N
->getNumExtraInhabitants());
2172 Printer
.printDIFlags("flags", N
->getFlags());
2176 static void writeDIStringType(raw_ostream
&Out
, const DIStringType
*N
,
2177 AsmWriterContext
&WriterCtx
) {
2178 Out
<< "!DIStringType(";
2179 MDFieldPrinter
Printer(Out
, WriterCtx
);
2180 if (N
->getTag() != dwarf::DW_TAG_string_type
)
2181 Printer
.printTag(N
);
2182 Printer
.printString("name", N
->getName());
2183 Printer
.printMetadata("stringLength", N
->getRawStringLength());
2184 Printer
.printMetadata("stringLengthExpression", N
->getRawStringLengthExp());
2185 Printer
.printMetadata("stringLocationExpression",
2186 N
->getRawStringLocationExp());
2187 Printer
.printInt("size", N
->getSizeInBits());
2188 Printer
.printInt("align", N
->getAlignInBits());
2189 Printer
.printDwarfEnum("encoding", N
->getEncoding(),
2190 dwarf::AttributeEncodingString
);
2194 static void writeDIDerivedType(raw_ostream
&Out
, const DIDerivedType
*N
,
2195 AsmWriterContext
&WriterCtx
) {
2196 Out
<< "!DIDerivedType(";
2197 MDFieldPrinter
Printer(Out
, WriterCtx
);
2198 Printer
.printTag(N
);
2199 Printer
.printString("name", N
->getName());
2200 Printer
.printMetadata("scope", N
->getRawScope());
2201 Printer
.printMetadata("file", N
->getRawFile());
2202 Printer
.printInt("line", N
->getLine());
2203 Printer
.printMetadata("baseType", N
->getRawBaseType(),
2204 /* ShouldSkipNull */ false);
2205 Printer
.printInt("size", N
->getSizeInBits());
2206 Printer
.printInt("align", N
->getAlignInBits());
2207 Printer
.printInt("offset", N
->getOffsetInBits());
2208 Printer
.printDIFlags("flags", N
->getFlags());
2209 Printer
.printMetadata("extraData", N
->getRawExtraData());
2210 if (const auto &DWARFAddressSpace
= N
->getDWARFAddressSpace())
2211 Printer
.printInt("dwarfAddressSpace", *DWARFAddressSpace
,
2212 /* ShouldSkipZero */ false);
2213 Printer
.printMetadata("annotations", N
->getRawAnnotations());
2214 if (auto PtrAuthData
= N
->getPtrAuthData()) {
2215 Printer
.printInt("ptrAuthKey", PtrAuthData
->key());
2216 Printer
.printBool("ptrAuthIsAddressDiscriminated",
2217 PtrAuthData
->isAddressDiscriminated());
2218 Printer
.printInt("ptrAuthExtraDiscriminator",
2219 PtrAuthData
->extraDiscriminator());
2220 Printer
.printBool("ptrAuthIsaPointer", PtrAuthData
->isaPointer());
2221 Printer
.printBool("ptrAuthAuthenticatesNullValues",
2222 PtrAuthData
->authenticatesNullValues());
2227 static void writeDICompositeType(raw_ostream
&Out
, const DICompositeType
*N
,
2228 AsmWriterContext
&WriterCtx
) {
2229 Out
<< "!DICompositeType(";
2230 MDFieldPrinter
Printer(Out
, WriterCtx
);
2231 Printer
.printTag(N
);
2232 Printer
.printString("name", N
->getName());
2233 Printer
.printMetadata("scope", N
->getRawScope());
2234 Printer
.printMetadata("file", N
->getRawFile());
2235 Printer
.printInt("line", N
->getLine());
2236 Printer
.printMetadata("baseType", N
->getRawBaseType());
2237 Printer
.printInt("size", N
->getSizeInBits());
2238 Printer
.printInt("align", N
->getAlignInBits());
2239 Printer
.printInt("offset", N
->getOffsetInBits());
2240 Printer
.printInt("num_extra_inhabitants", N
->getNumExtraInhabitants());
2241 Printer
.printDIFlags("flags", N
->getFlags());
2242 Printer
.printMetadata("elements", N
->getRawElements());
2243 Printer
.printDwarfEnum("runtimeLang", N
->getRuntimeLang(),
2244 dwarf::LanguageString
);
2245 Printer
.printMetadata("vtableHolder", N
->getRawVTableHolder());
2246 Printer
.printMetadata("templateParams", N
->getRawTemplateParams());
2247 Printer
.printString("identifier", N
->getIdentifier());
2248 Printer
.printMetadata("discriminator", N
->getRawDiscriminator());
2249 Printer
.printMetadata("dataLocation", N
->getRawDataLocation());
2250 Printer
.printMetadata("associated", N
->getRawAssociated());
2251 Printer
.printMetadata("allocated", N
->getRawAllocated());
2252 if (auto *RankConst
= N
->getRankConst())
2253 Printer
.printInt("rank", RankConst
->getSExtValue(),
2254 /* ShouldSkipZero */ false);
2256 Printer
.printMetadata("rank", N
->getRawRank(), /*ShouldSkipNull */ true);
2257 Printer
.printMetadata("annotations", N
->getRawAnnotations());
2258 if (auto *Specification
= N
->getRawSpecification())
2259 Printer
.printMetadata("specification", Specification
);
2263 static void writeDISubroutineType(raw_ostream
&Out
, const DISubroutineType
*N
,
2264 AsmWriterContext
&WriterCtx
) {
2265 Out
<< "!DISubroutineType(";
2266 MDFieldPrinter
Printer(Out
, WriterCtx
);
2267 Printer
.printDIFlags("flags", N
->getFlags());
2268 Printer
.printDwarfEnum("cc", N
->getCC(), dwarf::ConventionString
);
2269 Printer
.printMetadata("types", N
->getRawTypeArray(),
2270 /* ShouldSkipNull */ false);
2274 static void writeDIFile(raw_ostream
&Out
, const DIFile
*N
, AsmWriterContext
&) {
2276 MDFieldPrinter
Printer(Out
);
2277 Printer
.printString("filename", N
->getFilename(),
2278 /* ShouldSkipEmpty */ false);
2279 Printer
.printString("directory", N
->getDirectory(),
2280 /* ShouldSkipEmpty */ false);
2281 // Print all values for checksum together, or not at all.
2282 if (N
->getChecksum())
2283 Printer
.printChecksum(*N
->getChecksum());
2284 Printer
.printString("source", N
->getSource().value_or(StringRef()),
2285 /* ShouldSkipEmpty */ true);
2289 static void writeDICompileUnit(raw_ostream
&Out
, const DICompileUnit
*N
,
2290 AsmWriterContext
&WriterCtx
) {
2291 Out
<< "!DICompileUnit(";
2292 MDFieldPrinter
Printer(Out
, WriterCtx
);
2293 Printer
.printDwarfEnum("language", N
->getSourceLanguage(),
2294 dwarf::LanguageString
, /* ShouldSkipZero */ false);
2295 Printer
.printMetadata("file", N
->getRawFile(), /* ShouldSkipNull */ false);
2296 Printer
.printString("producer", N
->getProducer());
2297 Printer
.printBool("isOptimized", N
->isOptimized());
2298 Printer
.printString("flags", N
->getFlags());
2299 Printer
.printInt("runtimeVersion", N
->getRuntimeVersion(),
2300 /* ShouldSkipZero */ false);
2301 Printer
.printString("splitDebugFilename", N
->getSplitDebugFilename());
2302 Printer
.printEmissionKind("emissionKind", N
->getEmissionKind());
2303 Printer
.printMetadata("enums", N
->getRawEnumTypes());
2304 Printer
.printMetadata("retainedTypes", N
->getRawRetainedTypes());
2305 Printer
.printMetadata("globals", N
->getRawGlobalVariables());
2306 Printer
.printMetadata("imports", N
->getRawImportedEntities());
2307 Printer
.printMetadata("macros", N
->getRawMacros());
2308 Printer
.printInt("dwoId", N
->getDWOId());
2309 Printer
.printBool("splitDebugInlining", N
->getSplitDebugInlining(), true);
2310 Printer
.printBool("debugInfoForProfiling", N
->getDebugInfoForProfiling(),
2312 Printer
.printNameTableKind("nameTableKind", N
->getNameTableKind());
2313 Printer
.printBool("rangesBaseAddress", N
->getRangesBaseAddress(), false);
2314 Printer
.printString("sysroot", N
->getSysRoot());
2315 Printer
.printString("sdk", N
->getSDK());
2319 static void writeDISubprogram(raw_ostream
&Out
, const DISubprogram
*N
,
2320 AsmWriterContext
&WriterCtx
) {
2321 Out
<< "!DISubprogram(";
2322 MDFieldPrinter
Printer(Out
, WriterCtx
);
2323 Printer
.printString("name", N
->getName());
2324 Printer
.printString("linkageName", N
->getLinkageName());
2325 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2326 Printer
.printMetadata("file", N
->getRawFile());
2327 Printer
.printInt("line", N
->getLine());
2328 Printer
.printMetadata("type", N
->getRawType());
2329 Printer
.printInt("scopeLine", N
->getScopeLine());
2330 Printer
.printMetadata("containingType", N
->getRawContainingType());
2331 if (N
->getVirtuality() != dwarf::DW_VIRTUALITY_none
||
2332 N
->getVirtualIndex() != 0)
2333 Printer
.printInt("virtualIndex", N
->getVirtualIndex(), false);
2334 Printer
.printInt("thisAdjustment", N
->getThisAdjustment());
2335 Printer
.printDIFlags("flags", N
->getFlags());
2336 Printer
.printDISPFlags("spFlags", N
->getSPFlags());
2337 Printer
.printMetadata("unit", N
->getRawUnit());
2338 Printer
.printMetadata("templateParams", N
->getRawTemplateParams());
2339 Printer
.printMetadata("declaration", N
->getRawDeclaration());
2340 Printer
.printMetadata("retainedNodes", N
->getRawRetainedNodes());
2341 Printer
.printMetadata("thrownTypes", N
->getRawThrownTypes());
2342 Printer
.printMetadata("annotations", N
->getRawAnnotations());
2343 Printer
.printString("targetFuncName", N
->getTargetFuncName());
2347 static void writeDILexicalBlock(raw_ostream
&Out
, const DILexicalBlock
*N
,
2348 AsmWriterContext
&WriterCtx
) {
2349 Out
<< "!DILexicalBlock(";
2350 MDFieldPrinter
Printer(Out
, WriterCtx
);
2351 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2352 Printer
.printMetadata("file", N
->getRawFile());
2353 Printer
.printInt("line", N
->getLine());
2354 Printer
.printInt("column", N
->getColumn());
2358 static void writeDILexicalBlockFile(raw_ostream
&Out
,
2359 const DILexicalBlockFile
*N
,
2360 AsmWriterContext
&WriterCtx
) {
2361 Out
<< "!DILexicalBlockFile(";
2362 MDFieldPrinter
Printer(Out
, WriterCtx
);
2363 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2364 Printer
.printMetadata("file", N
->getRawFile());
2365 Printer
.printInt("discriminator", N
->getDiscriminator(),
2366 /* ShouldSkipZero */ false);
2370 static void writeDINamespace(raw_ostream
&Out
, const DINamespace
*N
,
2371 AsmWriterContext
&WriterCtx
) {
2372 Out
<< "!DINamespace(";
2373 MDFieldPrinter
Printer(Out
, WriterCtx
);
2374 Printer
.printString("name", N
->getName());
2375 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2376 Printer
.printBool("exportSymbols", N
->getExportSymbols(), false);
2380 static void writeDICommonBlock(raw_ostream
&Out
, const DICommonBlock
*N
,
2381 AsmWriterContext
&WriterCtx
) {
2382 Out
<< "!DICommonBlock(";
2383 MDFieldPrinter
Printer(Out
, WriterCtx
);
2384 Printer
.printMetadata("scope", N
->getRawScope(), false);
2385 Printer
.printMetadata("declaration", N
->getRawDecl(), false);
2386 Printer
.printString("name", N
->getName());
2387 Printer
.printMetadata("file", N
->getRawFile());
2388 Printer
.printInt("line", N
->getLineNo());
2392 static void writeDIMacro(raw_ostream
&Out
, const DIMacro
*N
,
2393 AsmWriterContext
&WriterCtx
) {
2395 MDFieldPrinter
Printer(Out
, WriterCtx
);
2396 Printer
.printMacinfoType(N
);
2397 Printer
.printInt("line", N
->getLine());
2398 Printer
.printString("name", N
->getName());
2399 Printer
.printString("value", N
->getValue());
2403 static void writeDIMacroFile(raw_ostream
&Out
, const DIMacroFile
*N
,
2404 AsmWriterContext
&WriterCtx
) {
2405 Out
<< "!DIMacroFile(";
2406 MDFieldPrinter
Printer(Out
, WriterCtx
);
2407 Printer
.printInt("line", N
->getLine());
2408 Printer
.printMetadata("file", N
->getRawFile(), /* ShouldSkipNull */ false);
2409 Printer
.printMetadata("nodes", N
->getRawElements());
2413 static void writeDIModule(raw_ostream
&Out
, const DIModule
*N
,
2414 AsmWriterContext
&WriterCtx
) {
2415 Out
<< "!DIModule(";
2416 MDFieldPrinter
Printer(Out
, WriterCtx
);
2417 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2418 Printer
.printString("name", N
->getName());
2419 Printer
.printString("configMacros", N
->getConfigurationMacros());
2420 Printer
.printString("includePath", N
->getIncludePath());
2421 Printer
.printString("apinotes", N
->getAPINotesFile());
2422 Printer
.printMetadata("file", N
->getRawFile());
2423 Printer
.printInt("line", N
->getLineNo());
2424 Printer
.printBool("isDecl", N
->getIsDecl(), /* Default */ false);
2428 static void writeDITemplateTypeParameter(raw_ostream
&Out
,
2429 const DITemplateTypeParameter
*N
,
2430 AsmWriterContext
&WriterCtx
) {
2431 Out
<< "!DITemplateTypeParameter(";
2432 MDFieldPrinter
Printer(Out
, WriterCtx
);
2433 Printer
.printString("name", N
->getName());
2434 Printer
.printMetadata("type", N
->getRawType(), /* ShouldSkipNull */ false);
2435 Printer
.printBool("defaulted", N
->isDefault(), /* Default= */ false);
2439 static void writeDITemplateValueParameter(raw_ostream
&Out
,
2440 const DITemplateValueParameter
*N
,
2441 AsmWriterContext
&WriterCtx
) {
2442 Out
<< "!DITemplateValueParameter(";
2443 MDFieldPrinter
Printer(Out
, WriterCtx
);
2444 if (N
->getTag() != dwarf::DW_TAG_template_value_parameter
)
2445 Printer
.printTag(N
);
2446 Printer
.printString("name", N
->getName());
2447 Printer
.printMetadata("type", N
->getRawType());
2448 Printer
.printBool("defaulted", N
->isDefault(), /* Default= */ false);
2449 Printer
.printMetadata("value", N
->getValue(), /* ShouldSkipNull */ false);
2453 static void writeDIGlobalVariable(raw_ostream
&Out
, const DIGlobalVariable
*N
,
2454 AsmWriterContext
&WriterCtx
) {
2455 Out
<< "!DIGlobalVariable(";
2456 MDFieldPrinter
Printer(Out
, WriterCtx
);
2457 Printer
.printString("name", N
->getName());
2458 Printer
.printString("linkageName", N
->getLinkageName());
2459 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2460 Printer
.printMetadata("file", N
->getRawFile());
2461 Printer
.printInt("line", N
->getLine());
2462 Printer
.printMetadata("type", N
->getRawType());
2463 Printer
.printBool("isLocal", N
->isLocalToUnit());
2464 Printer
.printBool("isDefinition", N
->isDefinition());
2465 Printer
.printMetadata("declaration", N
->getRawStaticDataMemberDeclaration());
2466 Printer
.printMetadata("templateParams", N
->getRawTemplateParams());
2467 Printer
.printInt("align", N
->getAlignInBits());
2468 Printer
.printMetadata("annotations", N
->getRawAnnotations());
2472 static void writeDILocalVariable(raw_ostream
&Out
, const DILocalVariable
*N
,
2473 AsmWriterContext
&WriterCtx
) {
2474 Out
<< "!DILocalVariable(";
2475 MDFieldPrinter
Printer(Out
, WriterCtx
);
2476 Printer
.printString("name", N
->getName());
2477 Printer
.printInt("arg", N
->getArg());
2478 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2479 Printer
.printMetadata("file", N
->getRawFile());
2480 Printer
.printInt("line", N
->getLine());
2481 Printer
.printMetadata("type", N
->getRawType());
2482 Printer
.printDIFlags("flags", N
->getFlags());
2483 Printer
.printInt("align", N
->getAlignInBits());
2484 Printer
.printMetadata("annotations", N
->getRawAnnotations());
2488 static void writeDILabel(raw_ostream
&Out
, const DILabel
*N
,
2489 AsmWriterContext
&WriterCtx
) {
2491 MDFieldPrinter
Printer(Out
, WriterCtx
);
2492 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2493 Printer
.printString("name", N
->getName());
2494 Printer
.printMetadata("file", N
->getRawFile());
2495 Printer
.printInt("line", N
->getLine());
2499 static void writeDIExpression(raw_ostream
&Out
, const DIExpression
*N
,
2500 AsmWriterContext
&WriterCtx
) {
2501 Out
<< "!DIExpression(";
2504 for (const DIExpression::ExprOperand
&Op
: N
->expr_ops()) {
2505 auto OpStr
= dwarf::OperationEncodingString(Op
.getOp());
2506 assert(!OpStr
.empty() && "Expected valid opcode");
2509 if (Op
.getOp() == dwarf::DW_OP_LLVM_convert
) {
2510 Out
<< FS
<< Op
.getArg(0);
2511 Out
<< FS
<< dwarf::AttributeEncodingString(Op
.getArg(1));
2513 for (unsigned A
= 0, AE
= Op
.getNumArgs(); A
!= AE
; ++A
)
2514 Out
<< FS
<< Op
.getArg(A
);
2518 for (const auto &I
: N
->getElements())
2524 static void writeDIArgList(raw_ostream
&Out
, const DIArgList
*N
,
2525 AsmWriterContext
&WriterCtx
,
2526 bool FromValue
= false) {
2528 "Unexpected DIArgList metadata outside of value argument");
2529 Out
<< "!DIArgList(";
2531 MDFieldPrinter
Printer(Out
, WriterCtx
);
2532 for (Metadata
*Arg
: N
->getArgs()) {
2534 WriteAsOperandInternal(Out
, Arg
, WriterCtx
, true);
2539 static void writeDIGlobalVariableExpression(raw_ostream
&Out
,
2540 const DIGlobalVariableExpression
*N
,
2541 AsmWriterContext
&WriterCtx
) {
2542 Out
<< "!DIGlobalVariableExpression(";
2543 MDFieldPrinter
Printer(Out
, WriterCtx
);
2544 Printer
.printMetadata("var", N
->getVariable());
2545 Printer
.printMetadata("expr", N
->getExpression());
2549 static void writeDIObjCProperty(raw_ostream
&Out
, const DIObjCProperty
*N
,
2550 AsmWriterContext
&WriterCtx
) {
2551 Out
<< "!DIObjCProperty(";
2552 MDFieldPrinter
Printer(Out
, WriterCtx
);
2553 Printer
.printString("name", N
->getName());
2554 Printer
.printMetadata("file", N
->getRawFile());
2555 Printer
.printInt("line", N
->getLine());
2556 Printer
.printString("setter", N
->getSetterName());
2557 Printer
.printString("getter", N
->getGetterName());
2558 Printer
.printInt("attributes", N
->getAttributes());
2559 Printer
.printMetadata("type", N
->getRawType());
2563 static void writeDIImportedEntity(raw_ostream
&Out
, const DIImportedEntity
*N
,
2564 AsmWriterContext
&WriterCtx
) {
2565 Out
<< "!DIImportedEntity(";
2566 MDFieldPrinter
Printer(Out
, WriterCtx
);
2567 Printer
.printTag(N
);
2568 Printer
.printString("name", N
->getName());
2569 Printer
.printMetadata("scope", N
->getRawScope(), /* ShouldSkipNull */ false);
2570 Printer
.printMetadata("entity", N
->getRawEntity());
2571 Printer
.printMetadata("file", N
->getRawFile());
2572 Printer
.printInt("line", N
->getLine());
2573 Printer
.printMetadata("elements", N
->getRawElements());
2577 static void WriteMDNodeBodyInternal(raw_ostream
&Out
, const MDNode
*Node
,
2578 AsmWriterContext
&Ctx
) {
2579 if (Node
->isDistinct())
2581 else if (Node
->isTemporary())
2582 Out
<< "<temporary!> "; // Handle broken code.
2584 switch (Node
->getMetadataID()) {
2586 llvm_unreachable("Expected uniquable MDNode");
2587 #define HANDLE_MDNODE_LEAF(CLASS) \
2588 case Metadata::CLASS##Kind: \
2589 write##CLASS(Out, cast<CLASS>(Node), Ctx); \
2591 #include "llvm/IR/Metadata.def"
2595 // Full implementation of printing a Value as an operand with support for
2596 // TypePrinting, etc.
2597 static void WriteAsOperandInternal(raw_ostream
&Out
, const Value
*V
,
2598 AsmWriterContext
&WriterCtx
) {
2600 PrintLLVMName(Out
, V
);
2604 const Constant
*CV
= dyn_cast
<Constant
>(V
);
2605 if (CV
&& !isa
<GlobalValue
>(CV
)) {
2606 assert(WriterCtx
.TypePrinter
&& "Constants require TypePrinting!");
2607 WriteConstantInternal(Out
, CV
, WriterCtx
);
2611 if (const InlineAsm
*IA
= dyn_cast
<InlineAsm
>(V
)) {
2613 if (IA
->hasSideEffects())
2614 Out
<< "sideeffect ";
2615 if (IA
->isAlignStack())
2616 Out
<< "alignstack ";
2617 // We don't emit the AD_ATT dialect as it's the assumed default.
2618 if (IA
->getDialect() == InlineAsm::AD_Intel
)
2619 Out
<< "inteldialect ";
2623 printEscapedString(IA
->getAsmString(), Out
);
2625 printEscapedString(IA
->getConstraintString(), Out
);
2630 if (auto *MD
= dyn_cast
<MetadataAsValue
>(V
)) {
2631 WriteAsOperandInternal(Out
, MD
->getMetadata(), WriterCtx
,
2632 /* FromValue */ true);
2638 auto *Machine
= WriterCtx
.Machine
;
2639 // If we have a SlotTracker, use it.
2641 if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(V
)) {
2642 Slot
= Machine
->getGlobalSlot(GV
);
2645 Slot
= Machine
->getLocalSlot(V
);
2647 // If the local value didn't succeed, then we may be referring to a value
2648 // from a different function. Translate it, as this can happen when using
2649 // address of blocks.
2651 if ((Machine
= createSlotTracker(V
))) {
2652 Slot
= Machine
->getLocalSlot(V
);
2656 } else if ((Machine
= createSlotTracker(V
))) {
2657 // Otherwise, create one to get the # and then destroy it.
2658 if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(V
)) {
2659 Slot
= Machine
->getGlobalSlot(GV
);
2662 Slot
= Machine
->getLocalSlot(V
);
2671 Out
<< Prefix
<< Slot
;
2676 static void WriteAsOperandInternal(raw_ostream
&Out
, const Metadata
*MD
,
2677 AsmWriterContext
&WriterCtx
,
2679 // Write DIExpressions and DIArgLists inline when used as a value. Improves
2680 // readability of debug info intrinsics.
2681 if (const DIExpression
*Expr
= dyn_cast
<DIExpression
>(MD
)) {
2682 writeDIExpression(Out
, Expr
, WriterCtx
);
2685 if (const DIArgList
*ArgList
= dyn_cast
<DIArgList
>(MD
)) {
2686 writeDIArgList(Out
, ArgList
, WriterCtx
, FromValue
);
2690 if (const MDNode
*N
= dyn_cast
<MDNode
>(MD
)) {
2691 std::unique_ptr
<SlotTracker
> MachineStorage
;
2692 SaveAndRestore
SARMachine(WriterCtx
.Machine
);
2693 if (!WriterCtx
.Machine
) {
2694 MachineStorage
= std::make_unique
<SlotTracker
>(WriterCtx
.Context
);
2695 WriterCtx
.Machine
= MachineStorage
.get();
2697 int Slot
= WriterCtx
.Machine
->getMetadataSlot(N
);
2699 if (const DILocation
*Loc
= dyn_cast
<DILocation
>(N
)) {
2700 writeDILocation(Out
, Loc
, WriterCtx
);
2703 // Give the pointer value instead of "badref", since this comes up all
2704 // the time when debugging.
2705 Out
<< "<" << N
<< ">";
2711 if (const MDString
*MDS
= dyn_cast
<MDString
>(MD
)) {
2713 printEscapedString(MDS
->getString(), Out
);
2718 auto *V
= cast
<ValueAsMetadata
>(MD
);
2719 assert(WriterCtx
.TypePrinter
&& "TypePrinter required for metadata values");
2720 assert((FromValue
|| !isa
<LocalAsMetadata
>(V
)) &&
2721 "Unexpected function-local metadata outside of value argument");
2723 WriterCtx
.TypePrinter
->print(V
->getValue()->getType(), Out
);
2725 WriteAsOperandInternal(Out
, V
->getValue(), WriterCtx
);
2730 class AssemblyWriter
{
2731 formatted_raw_ostream
&Out
;
2732 const Module
*TheModule
= nullptr;
2733 const ModuleSummaryIndex
*TheIndex
= nullptr;
2734 std::unique_ptr
<SlotTracker
> SlotTrackerStorage
;
2735 SlotTracker
&Machine
;
2736 TypePrinting TypePrinter
;
2737 AssemblyAnnotationWriter
*AnnotationWriter
= nullptr;
2738 SetVector
<const Comdat
*> Comdats
;
2740 bool ShouldPreserveUseListOrder
;
2741 UseListOrderMap UseListOrders
;
2742 SmallVector
<StringRef
, 8> MDNames
;
2743 /// Synchronization scope names registered with LLVMContext.
2744 SmallVector
<StringRef
, 8> SSNs
;
2745 DenseMap
<const GlobalValueSummary
*, GlobalValue::GUID
> SummaryToGUIDMap
;
2748 /// Construct an AssemblyWriter with an external SlotTracker
2749 AssemblyWriter(formatted_raw_ostream
&o
, SlotTracker
&Mac
, const Module
*M
,
2750 AssemblyAnnotationWriter
*AAW
, bool IsForDebug
,
2751 bool ShouldPreserveUseListOrder
= false);
2753 AssemblyWriter(formatted_raw_ostream
&o
, SlotTracker
&Mac
,
2754 const ModuleSummaryIndex
*Index
, bool IsForDebug
);
2756 AsmWriterContext
getContext() {
2757 return AsmWriterContext(&TypePrinter
, &Machine
, TheModule
);
2760 void printMDNodeBody(const MDNode
*MD
);
2761 void printNamedMDNode(const NamedMDNode
*NMD
);
2763 void printModule(const Module
*M
);
2765 void writeOperand(const Value
*Op
, bool PrintType
);
2766 void writeParamOperand(const Value
*Operand
, AttributeSet Attrs
);
2767 void writeOperandBundles(const CallBase
*Call
);
2768 void writeSyncScope(const LLVMContext
&Context
,
2769 SyncScope::ID SSID
);
2770 void writeAtomic(const LLVMContext
&Context
,
2771 AtomicOrdering Ordering
,
2772 SyncScope::ID SSID
);
2773 void writeAtomicCmpXchg(const LLVMContext
&Context
,
2774 AtomicOrdering SuccessOrdering
,
2775 AtomicOrdering FailureOrdering
,
2776 SyncScope::ID SSID
);
2778 void writeAllMDNodes();
2779 void writeMDNode(unsigned Slot
, const MDNode
*Node
);
2780 void writeAttribute(const Attribute
&Attr
, bool InAttrGroup
= false);
2781 void writeAttributeSet(const AttributeSet
&AttrSet
, bool InAttrGroup
= false);
2782 void writeAllAttributeGroups();
2784 void printTypeIdentities();
2785 void printGlobal(const GlobalVariable
*GV
);
2786 void printAlias(const GlobalAlias
*GA
);
2787 void printIFunc(const GlobalIFunc
*GI
);
2788 void printComdat(const Comdat
*C
);
2789 void printFunction(const Function
*F
);
2790 void printArgument(const Argument
*FA
, AttributeSet Attrs
);
2791 void printBasicBlock(const BasicBlock
*BB
);
2792 void printInstructionLine(const Instruction
&I
);
2793 void printInstruction(const Instruction
&I
);
2794 void printDbgMarker(const DbgMarker
&DPI
);
2795 void printDbgVariableRecord(const DbgVariableRecord
&DVR
);
2796 void printDbgLabelRecord(const DbgLabelRecord
&DLR
);
2797 void printDbgRecord(const DbgRecord
&DR
);
2798 void printDbgRecordLine(const DbgRecord
&DR
);
2800 void printUseListOrder(const Value
*V
, const std::vector
<unsigned> &Shuffle
);
2801 void printUseLists(const Function
*F
);
2803 void printModuleSummaryIndex();
2804 void printSummaryInfo(unsigned Slot
, const ValueInfo
&VI
);
2805 void printSummary(const GlobalValueSummary
&Summary
);
2806 void printAliasSummary(const AliasSummary
*AS
);
2807 void printGlobalVarSummary(const GlobalVarSummary
*GS
);
2808 void printFunctionSummary(const FunctionSummary
*FS
);
2809 void printTypeIdSummary(const TypeIdSummary
&TIS
);
2810 void printTypeIdCompatibleVtableSummary(const TypeIdCompatibleVtableInfo
&TI
);
2811 void printTypeTestResolution(const TypeTestResolution
&TTRes
);
2812 void printArgs(const std::vector
<uint64_t> &Args
);
2813 void printWPDRes(const WholeProgramDevirtResolution
&WPDRes
);
2814 void printTypeIdInfo(const FunctionSummary::TypeIdInfo
&TIDInfo
);
2815 void printVFuncId(const FunctionSummary::VFuncId VFId
);
2817 printNonConstVCalls(const std::vector
<FunctionSummary::VFuncId
> &VCallList
,
2820 printConstVCalls(const std::vector
<FunctionSummary::ConstVCall
> &VCallList
,
2824 /// Print out metadata attachments.
2825 void printMetadataAttachments(
2826 const SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &MDs
,
2827 StringRef Separator
);
2829 // printInfoComment - Print a little comment after the instruction indicating
2830 // which slot it occupies.
2831 void printInfoComment(const Value
&V
);
2833 // printGCRelocateComment - print comment after call to the gc.relocate
2834 // intrinsic indicating base and derived pointer names.
2835 void printGCRelocateComment(const GCRelocateInst
&Relocate
);
2838 } // end anonymous namespace
2840 AssemblyWriter::AssemblyWriter(formatted_raw_ostream
&o
, SlotTracker
&Mac
,
2841 const Module
*M
, AssemblyAnnotationWriter
*AAW
,
2842 bool IsForDebug
, bool ShouldPreserveUseListOrder
)
2843 : Out(o
), TheModule(M
), Machine(Mac
), TypePrinter(M
), AnnotationWriter(AAW
),
2844 IsForDebug(IsForDebug
),
2845 ShouldPreserveUseListOrder(ShouldPreserveUseListOrder
) {
2848 for (const GlobalObject
&GO
: TheModule
->global_objects())
2849 if (const Comdat
*C
= GO
.getComdat())
2853 AssemblyWriter::AssemblyWriter(formatted_raw_ostream
&o
, SlotTracker
&Mac
,
2854 const ModuleSummaryIndex
*Index
, bool IsForDebug
)
2855 : Out(o
), TheIndex(Index
), Machine(Mac
), TypePrinter(/*Module=*/nullptr),
2856 IsForDebug(IsForDebug
), ShouldPreserveUseListOrder(false) {}
2858 void AssemblyWriter::writeOperand(const Value
*Operand
, bool PrintType
) {
2860 Out
<< "<null operand!>";
2864 TypePrinter
.print(Operand
->getType(), Out
);
2867 auto WriterCtx
= getContext();
2868 WriteAsOperandInternal(Out
, Operand
, WriterCtx
);
2871 void AssemblyWriter::writeSyncScope(const LLVMContext
&Context
,
2872 SyncScope::ID SSID
) {
2874 case SyncScope::System
: {
2879 Context
.getSyncScopeNames(SSNs
);
2881 Out
<< " syncscope(\"";
2882 printEscapedString(SSNs
[SSID
], Out
);
2889 void AssemblyWriter::writeAtomic(const LLVMContext
&Context
,
2890 AtomicOrdering Ordering
,
2891 SyncScope::ID SSID
) {
2892 if (Ordering
== AtomicOrdering::NotAtomic
)
2895 writeSyncScope(Context
, SSID
);
2896 Out
<< " " << toIRString(Ordering
);
2899 void AssemblyWriter::writeAtomicCmpXchg(const LLVMContext
&Context
,
2900 AtomicOrdering SuccessOrdering
,
2901 AtomicOrdering FailureOrdering
,
2902 SyncScope::ID SSID
) {
2903 assert(SuccessOrdering
!= AtomicOrdering::NotAtomic
&&
2904 FailureOrdering
!= AtomicOrdering::NotAtomic
);
2906 writeSyncScope(Context
, SSID
);
2907 Out
<< " " << toIRString(SuccessOrdering
);
2908 Out
<< " " << toIRString(FailureOrdering
);
2911 void AssemblyWriter::writeParamOperand(const Value
*Operand
,
2912 AttributeSet Attrs
) {
2914 Out
<< "<null operand!>";
2919 TypePrinter
.print(Operand
->getType(), Out
);
2920 // Print parameter attributes list
2921 if (Attrs
.hasAttributes()) {
2923 writeAttributeSet(Attrs
);
2926 // Print the operand
2927 auto WriterCtx
= getContext();
2928 WriteAsOperandInternal(Out
, Operand
, WriterCtx
);
2931 void AssemblyWriter::writeOperandBundles(const CallBase
*Call
) {
2932 if (!Call
->hasOperandBundles())
2937 bool FirstBundle
= true;
2938 for (unsigned i
= 0, e
= Call
->getNumOperandBundles(); i
!= e
; ++i
) {
2939 OperandBundleUse BU
= Call
->getOperandBundleAt(i
);
2943 FirstBundle
= false;
2946 printEscapedString(BU
.getTagName(), Out
);
2951 bool FirstInput
= true;
2952 auto WriterCtx
= getContext();
2953 for (const auto &Input
: BU
.Inputs
) {
2958 if (Input
== nullptr)
2959 Out
<< "<null operand bundle!>";
2961 TypePrinter
.print(Input
->getType(), Out
);
2963 WriteAsOperandInternal(Out
, Input
, WriterCtx
);
2973 void AssemblyWriter::printModule(const Module
*M
) {
2974 Machine
.initializeIfNeeded();
2976 if (ShouldPreserveUseListOrder
)
2977 UseListOrders
= predictUseListOrder(M
);
2979 if (!M
->getModuleIdentifier().empty() &&
2980 // Don't print the ID if it will start a new line (which would
2981 // require a comment char before it).
2982 M
->getModuleIdentifier().find('\n') == std::string::npos
)
2983 Out
<< "; ModuleID = '" << M
->getModuleIdentifier() << "'\n";
2985 if (!M
->getSourceFileName().empty()) {
2986 Out
<< "source_filename = \"";
2987 printEscapedString(M
->getSourceFileName(), Out
);
2991 const std::string
&DL
= M
->getDataLayoutStr();
2993 Out
<< "target datalayout = \"" << DL
<< "\"\n";
2994 if (!M
->getTargetTriple().empty())
2995 Out
<< "target triple = \"" << M
->getTargetTriple() << "\"\n";
2997 if (!M
->getModuleInlineAsm().empty()) {
3000 // Split the string into lines, to make it easier to read the .ll file.
3001 StringRef Asm
= M
->getModuleInlineAsm();
3004 std::tie(Front
, Asm
) = Asm
.split('\n');
3006 // We found a newline, print the portion of the asm string from the
3007 // last newline up to this newline.
3008 Out
<< "module asm \"";
3009 printEscapedString(Front
, Out
);
3011 } while (!Asm
.empty());
3014 printTypeIdentities();
3016 // Output all comdats.
3017 if (!Comdats
.empty())
3019 for (const Comdat
*C
: Comdats
) {
3021 if (C
!= Comdats
.back())
3025 // Output all globals.
3026 if (!M
->global_empty()) Out
<< '\n';
3027 for (const GlobalVariable
&GV
: M
->globals()) {
3028 printGlobal(&GV
); Out
<< '\n';
3031 // Output all aliases.
3032 if (!M
->alias_empty()) Out
<< "\n";
3033 for (const GlobalAlias
&GA
: M
->aliases())
3036 // Output all ifuncs.
3037 if (!M
->ifunc_empty()) Out
<< "\n";
3038 for (const GlobalIFunc
&GI
: M
->ifuncs())
3041 // Output all of the functions.
3042 for (const Function
&F
: *M
) {
3047 // Output global use-lists.
3048 printUseLists(nullptr);
3050 // Output all attribute groups.
3051 if (!Machine
.as_empty()) {
3053 writeAllAttributeGroups();
3056 // Output named metadata.
3057 if (!M
->named_metadata_empty()) Out
<< '\n';
3059 for (const NamedMDNode
&Node
: M
->named_metadata())
3060 printNamedMDNode(&Node
);
3063 if (!Machine
.mdn_empty()) {
3069 void AssemblyWriter::printModuleSummaryIndex() {
3071 int NumSlots
= Machine
.initializeIndexIfNeeded();
3075 // Print module path entries. To print in order, add paths to a vector
3076 // indexed by module slot.
3077 std::vector
<std::pair
<std::string
, ModuleHash
>> moduleVec
;
3078 std::string RegularLTOModuleName
=
3079 ModuleSummaryIndex::getRegularLTOModuleName();
3080 moduleVec
.resize(TheIndex
->modulePaths().size());
3081 for (auto &[ModPath
, ModHash
] : TheIndex
->modulePaths())
3082 moduleVec
[Machine
.getModulePathSlot(ModPath
)] = std::make_pair(
3083 // An empty module path is a special entry for a regular LTO module
3084 // created during the thin link.
3085 ModPath
.empty() ? RegularLTOModuleName
: std::string(ModPath
), ModHash
);
3088 for (auto &ModPair
: moduleVec
) {
3089 Out
<< "^" << i
++ << " = module: (";
3091 printEscapedString(ModPair
.first
, Out
);
3092 Out
<< "\", hash: (";
3094 for (auto Hash
: ModPair
.second
)
3099 // FIXME: Change AliasSummary to hold a ValueInfo instead of summary pointer
3100 // for aliasee (then update BitcodeWriter.cpp and remove get/setAliaseeGUID).
3101 for (auto &GlobalList
: *TheIndex
) {
3102 auto GUID
= GlobalList
.first
;
3103 for (auto &Summary
: GlobalList
.second
.SummaryList
)
3104 SummaryToGUIDMap
[Summary
.get()] = GUID
;
3107 // Print the global value summary entries.
3108 for (auto &GlobalList
: *TheIndex
) {
3109 auto GUID
= GlobalList
.first
;
3110 auto VI
= TheIndex
->getValueInfo(GlobalList
);
3111 printSummaryInfo(Machine
.getGUIDSlot(GUID
), VI
);
3114 // Print the TypeIdMap entries.
3115 for (const auto &TID
: TheIndex
->typeIds()) {
3116 Out
<< "^" << Machine
.getTypeIdSlot(TID
.second
.first
)
3117 << " = typeid: (name: \"" << TID
.second
.first
<< "\"";
3118 printTypeIdSummary(TID
.second
.second
);
3119 Out
<< ") ; guid = " << TID
.first
<< "\n";
3122 // Print the TypeIdCompatibleVtableMap entries.
3123 for (auto &TId
: TheIndex
->typeIdCompatibleVtableMap()) {
3124 auto GUID
= GlobalValue::getGUID(TId
.first
);
3125 Out
<< "^" << Machine
.getTypeIdCompatibleVtableSlot(TId
.first
)
3126 << " = typeidCompatibleVTable: (name: \"" << TId
.first
<< "\"";
3127 printTypeIdCompatibleVtableSummary(TId
.second
);
3128 Out
<< ") ; guid = " << GUID
<< "\n";
3131 // Don't emit flags when it's not really needed (value is zero by default).
3132 if (TheIndex
->getFlags()) {
3133 Out
<< "^" << NumSlots
<< " = flags: " << TheIndex
->getFlags() << "\n";
3137 Out
<< "^" << NumSlots
<< " = blockcount: " << TheIndex
->getBlockCount()
3142 getWholeProgDevirtResKindName(WholeProgramDevirtResolution::Kind K
) {
3144 case WholeProgramDevirtResolution::Indir
:
3146 case WholeProgramDevirtResolution::SingleImpl
:
3147 return "singleImpl";
3148 case WholeProgramDevirtResolution::BranchFunnel
:
3149 return "branchFunnel";
3151 llvm_unreachable("invalid WholeProgramDevirtResolution kind");
3154 static const char *getWholeProgDevirtResByArgKindName(
3155 WholeProgramDevirtResolution::ByArg::Kind K
) {
3157 case WholeProgramDevirtResolution::ByArg::Indir
:
3159 case WholeProgramDevirtResolution::ByArg::UniformRetVal
:
3160 return "uniformRetVal";
3161 case WholeProgramDevirtResolution::ByArg::UniqueRetVal
:
3162 return "uniqueRetVal";
3163 case WholeProgramDevirtResolution::ByArg::VirtualConstProp
:
3164 return "virtualConstProp";
3166 llvm_unreachable("invalid WholeProgramDevirtResolution::ByArg kind");
3169 static const char *getTTResKindName(TypeTestResolution::Kind K
) {
3171 case TypeTestResolution::Unknown
:
3173 case TypeTestResolution::Unsat
:
3175 case TypeTestResolution::ByteArray
:
3177 case TypeTestResolution::Inline
:
3179 case TypeTestResolution::Single
:
3181 case TypeTestResolution::AllOnes
:
3184 llvm_unreachable("invalid TypeTestResolution kind");
3187 void AssemblyWriter::printTypeTestResolution(const TypeTestResolution
&TTRes
) {
3188 Out
<< "typeTestRes: (kind: " << getTTResKindName(TTRes
.TheKind
)
3189 << ", sizeM1BitWidth: " << TTRes
.SizeM1BitWidth
;
3191 // The following fields are only used if the target does not support the use
3192 // of absolute symbols to store constants. Print only if non-zero.
3193 if (TTRes
.AlignLog2
)
3194 Out
<< ", alignLog2: " << TTRes
.AlignLog2
;
3196 Out
<< ", sizeM1: " << TTRes
.SizeM1
;
3198 // BitMask is uint8_t which causes it to print the corresponding char.
3199 Out
<< ", bitMask: " << (unsigned)TTRes
.BitMask
;
3200 if (TTRes
.InlineBits
)
3201 Out
<< ", inlineBits: " << TTRes
.InlineBits
;
3206 void AssemblyWriter::printTypeIdSummary(const TypeIdSummary
&TIS
) {
3207 Out
<< ", summary: (";
3208 printTypeTestResolution(TIS
.TTRes
);
3209 if (!TIS
.WPDRes
.empty()) {
3210 Out
<< ", wpdResolutions: (";
3212 for (auto &WPDRes
: TIS
.WPDRes
) {
3214 Out
<< "(offset: " << WPDRes
.first
<< ", ";
3215 printWPDRes(WPDRes
.second
);
3223 void AssemblyWriter::printTypeIdCompatibleVtableSummary(
3224 const TypeIdCompatibleVtableInfo
&TI
) {
3225 Out
<< ", summary: (";
3227 for (auto &P
: TI
) {
3229 Out
<< "(offset: " << P
.AddressPointOffset
<< ", ";
3230 Out
<< "^" << Machine
.getGUIDSlot(P
.VTableVI
.getGUID());
3236 void AssemblyWriter::printArgs(const std::vector
<uint64_t> &Args
) {
3239 for (auto arg
: Args
) {
3246 void AssemblyWriter::printWPDRes(const WholeProgramDevirtResolution
&WPDRes
) {
3247 Out
<< "wpdRes: (kind: ";
3248 Out
<< getWholeProgDevirtResKindName(WPDRes
.TheKind
);
3250 if (WPDRes
.TheKind
== WholeProgramDevirtResolution::SingleImpl
)
3251 Out
<< ", singleImplName: \"" << WPDRes
.SingleImplName
<< "\"";
3253 if (!WPDRes
.ResByArg
.empty()) {
3254 Out
<< ", resByArg: (";
3256 for (auto &ResByArg
: WPDRes
.ResByArg
) {
3258 printArgs(ResByArg
.first
);
3259 Out
<< ", byArg: (kind: ";
3260 Out
<< getWholeProgDevirtResByArgKindName(ResByArg
.second
.TheKind
);
3261 if (ResByArg
.second
.TheKind
==
3262 WholeProgramDevirtResolution::ByArg::UniformRetVal
||
3263 ResByArg
.second
.TheKind
==
3264 WholeProgramDevirtResolution::ByArg::UniqueRetVal
)
3265 Out
<< ", info: " << ResByArg
.second
.Info
;
3267 // The following fields are only used if the target does not support the
3268 // use of absolute symbols to store constants. Print only if non-zero.
3269 if (ResByArg
.second
.Byte
|| ResByArg
.second
.Bit
)
3270 Out
<< ", byte: " << ResByArg
.second
.Byte
3271 << ", bit: " << ResByArg
.second
.Bit
;
3280 static const char *getSummaryKindName(GlobalValueSummary::SummaryKind SK
) {
3282 case GlobalValueSummary::AliasKind
:
3284 case GlobalValueSummary::FunctionKind
:
3286 case GlobalValueSummary::GlobalVarKind
:
3289 llvm_unreachable("invalid summary kind");
3292 void AssemblyWriter::printAliasSummary(const AliasSummary
*AS
) {
3293 Out
<< ", aliasee: ";
3294 // The indexes emitted for distributed backends may not include the
3295 // aliasee summary (only if it is being imported directly). Handle
3296 // that case by just emitting "null" as the aliasee.
3297 if (AS
->hasAliasee())
3298 Out
<< "^" << Machine
.getGUIDSlot(SummaryToGUIDMap
[&AS
->getAliasee()]);
3303 void AssemblyWriter::printGlobalVarSummary(const GlobalVarSummary
*GS
) {
3304 auto VTableFuncs
= GS
->vTableFuncs();
3305 Out
<< ", varFlags: (readonly: " << GS
->VarFlags
.MaybeReadOnly
<< ", "
3306 << "writeonly: " << GS
->VarFlags
.MaybeWriteOnly
<< ", "
3307 << "constant: " << GS
->VarFlags
.Constant
;
3308 if (!VTableFuncs
.empty())
3310 << "vcall_visibility: " << GS
->VarFlags
.VCallVisibility
;
3313 if (!VTableFuncs
.empty()) {
3314 Out
<< ", vTableFuncs: (";
3316 for (auto &P
: VTableFuncs
) {
3318 Out
<< "(virtFunc: ^" << Machine
.getGUIDSlot(P
.FuncVI
.getGUID())
3319 << ", offset: " << P
.VTableOffset
;
3326 static std::string
getLinkageName(GlobalValue::LinkageTypes LT
) {
3328 case GlobalValue::ExternalLinkage
:
3330 case GlobalValue::PrivateLinkage
:
3332 case GlobalValue::InternalLinkage
:
3334 case GlobalValue::LinkOnceAnyLinkage
:
3336 case GlobalValue::LinkOnceODRLinkage
:
3337 return "linkonce_odr";
3338 case GlobalValue::WeakAnyLinkage
:
3340 case GlobalValue::WeakODRLinkage
:
3342 case GlobalValue::CommonLinkage
:
3344 case GlobalValue::AppendingLinkage
:
3346 case GlobalValue::ExternalWeakLinkage
:
3347 return "extern_weak";
3348 case GlobalValue::AvailableExternallyLinkage
:
3349 return "available_externally";
3351 llvm_unreachable("invalid linkage");
3354 // When printing the linkage types in IR where the ExternalLinkage is
3355 // not printed, and other linkage types are expected to be printed with
3356 // a space after the name.
3357 static std::string
getLinkageNameWithSpace(GlobalValue::LinkageTypes LT
) {
3358 if (LT
== GlobalValue::ExternalLinkage
)
3360 return getLinkageName(LT
) + " ";
3363 static const char *getVisibilityName(GlobalValue::VisibilityTypes Vis
) {
3365 case GlobalValue::DefaultVisibility
:
3367 case GlobalValue::HiddenVisibility
:
3369 case GlobalValue::ProtectedVisibility
:
3372 llvm_unreachable("invalid visibility");
3375 static const char *getImportTypeName(GlobalValueSummary::ImportKind IK
) {
3377 case GlobalValueSummary::Definition
:
3378 return "definition";
3379 case GlobalValueSummary::Declaration
:
3380 return "declaration";
3382 llvm_unreachable("invalid import kind");
3385 void AssemblyWriter::printFunctionSummary(const FunctionSummary
*FS
) {
3386 Out
<< ", insts: " << FS
->instCount();
3387 if (FS
->fflags().anyFlagSet())
3388 Out
<< ", " << FS
->fflags();
3390 if (!FS
->calls().empty()) {
3391 Out
<< ", calls: (";
3393 for (auto &Call
: FS
->calls()) {
3395 Out
<< "(callee: ^" << Machine
.getGUIDSlot(Call
.first
.getGUID());
3396 if (Call
.second
.getHotness() != CalleeInfo::HotnessType::Unknown
)
3397 Out
<< ", hotness: " << getHotnessName(Call
.second
.getHotness());
3398 else if (Call
.second
.RelBlockFreq
)
3399 Out
<< ", relbf: " << Call
.second
.RelBlockFreq
;
3400 // Follow the convention of emitting flags as a boolean value, but only
3401 // emit if true to avoid unnecessary verbosity and test churn.
3402 if (Call
.second
.HasTailCall
)
3409 if (const auto *TIdInfo
= FS
->getTypeIdInfo())
3410 printTypeIdInfo(*TIdInfo
);
3412 // The AllocationType identifiers capture the profiled context behavior
3413 // reaching a specific static allocation site (possibly cloned).
3414 auto AllocTypeName
= [](uint8_t Type
) -> const char * {
3416 case (uint8_t)AllocationType::None
:
3418 case (uint8_t)AllocationType::NotCold
:
3420 case (uint8_t)AllocationType::Cold
:
3422 case (uint8_t)AllocationType::Hot
:
3425 llvm_unreachable("Unexpected alloc type");
3428 if (!FS
->allocs().empty()) {
3429 Out
<< ", allocs: (";
3431 for (auto &AI
: FS
->allocs()) {
3433 Out
<< "(versions: (";
3435 for (auto V
: AI
.Versions
) {
3437 Out
<< AllocTypeName(V
);
3439 Out
<< "), memProf: (";
3440 FieldSeparator MIBFS
;
3441 for (auto &MIB
: AI
.MIBs
) {
3443 Out
<< "(type: " << AllocTypeName((uint8_t)MIB
.AllocType
);
3444 Out
<< ", stackIds: (";
3445 FieldSeparator SIDFS
;
3446 for (auto Id
: MIB
.StackIdIndices
) {
3448 Out
<< TheIndex
->getStackIdAtIndex(Id
);
3457 if (!FS
->callsites().empty()) {
3458 Out
<< ", callsites: (";
3459 FieldSeparator SNFS
;
3460 for (auto &CI
: FS
->callsites()) {
3463 Out
<< "(callee: ^" << Machine
.getGUIDSlot(CI
.Callee
.getGUID());
3465 Out
<< "(callee: null";
3466 Out
<< ", clones: (";
3468 for (auto V
: CI
.Clones
) {
3472 Out
<< "), stackIds: (";
3473 FieldSeparator SIDFS
;
3474 for (auto Id
: CI
.StackIdIndices
) {
3476 Out
<< TheIndex
->getStackIdAtIndex(Id
);
3483 auto PrintRange
= [&](const ConstantRange
&Range
) {
3484 Out
<< "[" << Range
.getSignedMin() << ", " << Range
.getSignedMax() << "]";
3487 if (!FS
->paramAccesses().empty()) {
3488 Out
<< ", params: (";
3490 for (auto &PS
: FS
->paramAccesses()) {
3492 Out
<< "(param: " << PS
.ParamNo
;
3493 Out
<< ", offset: ";
3495 if (!PS
.Calls
.empty()) {
3496 Out
<< ", calls: (";
3498 for (auto &Call
: PS
.Calls
) {
3500 Out
<< "(callee: ^" << Machine
.getGUIDSlot(Call
.Callee
.getGUID());
3501 Out
<< ", param: " << Call
.ParamNo
;
3502 Out
<< ", offset: ";
3503 PrintRange(Call
.Offsets
);
3514 void AssemblyWriter::printTypeIdInfo(
3515 const FunctionSummary::TypeIdInfo
&TIDInfo
) {
3516 Out
<< ", typeIdInfo: (";
3517 FieldSeparator TIDFS
;
3518 if (!TIDInfo
.TypeTests
.empty()) {
3520 Out
<< "typeTests: (";
3522 for (auto &GUID
: TIDInfo
.TypeTests
) {
3523 auto TidIter
= TheIndex
->typeIds().equal_range(GUID
);
3524 if (TidIter
.first
== TidIter
.second
) {
3529 // Print all type id that correspond to this GUID.
3530 for (const auto &[GUID
, TypeIdPair
] : make_range(TidIter
)) {
3532 auto Slot
= Machine
.getTypeIdSlot(TypeIdPair
.first
);
3539 if (!TIDInfo
.TypeTestAssumeVCalls
.empty()) {
3541 printNonConstVCalls(TIDInfo
.TypeTestAssumeVCalls
, "typeTestAssumeVCalls");
3543 if (!TIDInfo
.TypeCheckedLoadVCalls
.empty()) {
3545 printNonConstVCalls(TIDInfo
.TypeCheckedLoadVCalls
, "typeCheckedLoadVCalls");
3547 if (!TIDInfo
.TypeTestAssumeConstVCalls
.empty()) {
3549 printConstVCalls(TIDInfo
.TypeTestAssumeConstVCalls
,
3550 "typeTestAssumeConstVCalls");
3552 if (!TIDInfo
.TypeCheckedLoadConstVCalls
.empty()) {
3554 printConstVCalls(TIDInfo
.TypeCheckedLoadConstVCalls
,
3555 "typeCheckedLoadConstVCalls");
3560 void AssemblyWriter::printVFuncId(const FunctionSummary::VFuncId VFId
) {
3561 auto TidIter
= TheIndex
->typeIds().equal_range(VFId
.GUID
);
3562 if (TidIter
.first
== TidIter
.second
) {
3563 Out
<< "vFuncId: (";
3564 Out
<< "guid: " << VFId
.GUID
;
3565 Out
<< ", offset: " << VFId
.Offset
;
3569 // Print all type id that correspond to this GUID.
3571 for (const auto &[GUID
, TypeIdPair
] : make_range(TidIter
)) {
3573 Out
<< "vFuncId: (";
3574 auto Slot
= Machine
.getTypeIdSlot(TypeIdPair
.first
);
3577 Out
<< ", offset: " << VFId
.Offset
;
3582 void AssemblyWriter::printNonConstVCalls(
3583 const std::vector
<FunctionSummary::VFuncId
> &VCallList
, const char *Tag
) {
3584 Out
<< Tag
<< ": (";
3586 for (auto &VFuncId
: VCallList
) {
3588 printVFuncId(VFuncId
);
3593 void AssemblyWriter::printConstVCalls(
3594 const std::vector
<FunctionSummary::ConstVCall
> &VCallList
,
3596 Out
<< Tag
<< ": (";
3598 for (auto &ConstVCall
: VCallList
) {
3601 printVFuncId(ConstVCall
.VFunc
);
3602 if (!ConstVCall
.Args
.empty()) {
3604 printArgs(ConstVCall
.Args
);
3611 void AssemblyWriter::printSummary(const GlobalValueSummary
&Summary
) {
3612 GlobalValueSummary::GVFlags GVFlags
= Summary
.flags();
3613 GlobalValue::LinkageTypes LT
= (GlobalValue::LinkageTypes
)GVFlags
.Linkage
;
3614 Out
<< getSummaryKindName(Summary
.getSummaryKind()) << ": ";
3615 Out
<< "(module: ^" << Machine
.getModulePathSlot(Summary
.modulePath())
3617 Out
<< "linkage: " << getLinkageName(LT
);
3618 Out
<< ", visibility: "
3619 << getVisibilityName((GlobalValue::VisibilityTypes
)GVFlags
.Visibility
);
3620 Out
<< ", notEligibleToImport: " << GVFlags
.NotEligibleToImport
;
3621 Out
<< ", live: " << GVFlags
.Live
;
3622 Out
<< ", dsoLocal: " << GVFlags
.DSOLocal
;
3623 Out
<< ", canAutoHide: " << GVFlags
.CanAutoHide
;
3624 Out
<< ", importType: "
3625 << getImportTypeName(GlobalValueSummary::ImportKind(GVFlags
.ImportType
));
3628 if (Summary
.getSummaryKind() == GlobalValueSummary::AliasKind
)
3629 printAliasSummary(cast
<AliasSummary
>(&Summary
));
3630 else if (Summary
.getSummaryKind() == GlobalValueSummary::FunctionKind
)
3631 printFunctionSummary(cast
<FunctionSummary
>(&Summary
));
3633 printGlobalVarSummary(cast
<GlobalVarSummary
>(&Summary
));
3635 auto RefList
= Summary
.refs();
3636 if (!RefList
.empty()) {
3639 for (auto &Ref
: RefList
) {
3641 if (Ref
.isReadOnly())
3643 else if (Ref
.isWriteOnly())
3644 Out
<< "writeonly ";
3645 Out
<< "^" << Machine
.getGUIDSlot(Ref
.getGUID());
3653 void AssemblyWriter::printSummaryInfo(unsigned Slot
, const ValueInfo
&VI
) {
3654 Out
<< "^" << Slot
<< " = gv: (";
3655 if (VI
.hasName() && !VI
.name().empty())
3656 Out
<< "name: \"" << VI
.name() << "\"";
3658 Out
<< "guid: " << VI
.getGUID();
3659 if (!VI
.getSummaryList().empty()) {
3660 Out
<< ", summaries: (";
3662 for (auto &Summary
: VI
.getSummaryList()) {
3664 printSummary(*Summary
);
3669 if (VI
.hasName() && !VI
.name().empty())
3670 Out
<< " ; guid = " << VI
.getGUID();
3674 static void printMetadataIdentifier(StringRef Name
,
3675 formatted_raw_ostream
&Out
) {
3677 Out
<< "<empty name> ";
3679 unsigned char FirstC
= static_cast<unsigned char>(Name
[0]);
3680 if (isalpha(FirstC
) || FirstC
== '-' || FirstC
== '$' || FirstC
== '.' ||
3684 Out
<< '\\' << hexdigit(FirstC
>> 4) << hexdigit(FirstC
& 0x0F);
3685 for (unsigned i
= 1, e
= Name
.size(); i
!= e
; ++i
) {
3686 unsigned char C
= Name
[i
];
3687 if (isalnum(C
) || C
== '-' || C
== '$' || C
== '.' || C
== '_')
3690 Out
<< '\\' << hexdigit(C
>> 4) << hexdigit(C
& 0x0F);
3695 void AssemblyWriter::printNamedMDNode(const NamedMDNode
*NMD
) {
3697 printMetadataIdentifier(NMD
->getName(), Out
);
3699 for (unsigned i
= 0, e
= NMD
->getNumOperands(); i
!= e
; ++i
) {
3703 // Write DIExpressions inline.
3704 // FIXME: Ban DIExpressions in NamedMDNodes, they will serve no purpose.
3705 MDNode
*Op
= NMD
->getOperand(i
);
3706 if (auto *Expr
= dyn_cast
<DIExpression
>(Op
)) {
3707 writeDIExpression(Out
, Expr
, AsmWriterContext::getEmpty());
3711 int Slot
= Machine
.getMetadataSlot(Op
);
3720 static void PrintVisibility(GlobalValue::VisibilityTypes Vis
,
3721 formatted_raw_ostream
&Out
) {
3723 case GlobalValue::DefaultVisibility
: break;
3724 case GlobalValue::HiddenVisibility
: Out
<< "hidden "; break;
3725 case GlobalValue::ProtectedVisibility
: Out
<< "protected "; break;
3729 static void PrintDSOLocation(const GlobalValue
&GV
,
3730 formatted_raw_ostream
&Out
) {
3731 if (GV
.isDSOLocal() && !GV
.isImplicitDSOLocal())
3732 Out
<< "dso_local ";
3735 static void PrintDLLStorageClass(GlobalValue::DLLStorageClassTypes SCT
,
3736 formatted_raw_ostream
&Out
) {
3738 case GlobalValue::DefaultStorageClass
: break;
3739 case GlobalValue::DLLImportStorageClass
: Out
<< "dllimport "; break;
3740 case GlobalValue::DLLExportStorageClass
: Out
<< "dllexport "; break;
3744 static void PrintThreadLocalModel(GlobalVariable::ThreadLocalMode TLM
,
3745 formatted_raw_ostream
&Out
) {
3747 case GlobalVariable::NotThreadLocal
:
3749 case GlobalVariable::GeneralDynamicTLSModel
:
3750 Out
<< "thread_local ";
3752 case GlobalVariable::LocalDynamicTLSModel
:
3753 Out
<< "thread_local(localdynamic) ";
3755 case GlobalVariable::InitialExecTLSModel
:
3756 Out
<< "thread_local(initialexec) ";
3758 case GlobalVariable::LocalExecTLSModel
:
3759 Out
<< "thread_local(localexec) ";
3764 static StringRef
getUnnamedAddrEncoding(GlobalVariable::UnnamedAddr UA
) {
3766 case GlobalVariable::UnnamedAddr::None
:
3768 case GlobalVariable::UnnamedAddr::Local
:
3769 return "local_unnamed_addr";
3770 case GlobalVariable::UnnamedAddr::Global
:
3771 return "unnamed_addr";
3773 llvm_unreachable("Unknown UnnamedAddr");
3776 static void maybePrintComdat(formatted_raw_ostream
&Out
,
3777 const GlobalObject
&GO
) {
3778 const Comdat
*C
= GO
.getComdat();
3782 if (isa
<GlobalVariable
>(GO
))
3786 if (GO
.getName() == C
->getName())
3790 PrintLLVMName(Out
, C
->getName(), ComdatPrefix
);
3794 void AssemblyWriter::printGlobal(const GlobalVariable
*GV
) {
3795 if (GV
->isMaterializable())
3796 Out
<< "; Materializable\n";
3798 AsmWriterContext
WriterCtx(&TypePrinter
, &Machine
, GV
->getParent());
3799 WriteAsOperandInternal(Out
, GV
, WriterCtx
);
3802 if (!GV
->hasInitializer() && GV
->hasExternalLinkage())
3805 Out
<< getLinkageNameWithSpace(GV
->getLinkage());
3806 PrintDSOLocation(*GV
, Out
);
3807 PrintVisibility(GV
->getVisibility(), Out
);
3808 PrintDLLStorageClass(GV
->getDLLStorageClass(), Out
);
3809 PrintThreadLocalModel(GV
->getThreadLocalMode(), Out
);
3810 StringRef UA
= getUnnamedAddrEncoding(GV
->getUnnamedAddr());
3814 if (unsigned AddressSpace
= GV
->getType()->getAddressSpace())
3815 Out
<< "addrspace(" << AddressSpace
<< ") ";
3816 if (GV
->isExternallyInitialized()) Out
<< "externally_initialized ";
3817 Out
<< (GV
->isConstant() ? "constant " : "global ");
3818 TypePrinter
.print(GV
->getValueType(), Out
);
3820 if (GV
->hasInitializer()) {
3822 writeOperand(GV
->getInitializer(), false);
3825 if (GV
->hasSection()) {
3826 Out
<< ", section \"";
3827 printEscapedString(GV
->getSection(), Out
);
3830 if (GV
->hasPartition()) {
3831 Out
<< ", partition \"";
3832 printEscapedString(GV
->getPartition(), Out
);
3835 if (auto CM
= GV
->getCodeModel()) {
3836 Out
<< ", code_model \"";
3838 case CodeModel::Tiny
:
3841 case CodeModel::Small
:
3844 case CodeModel::Kernel
:
3847 case CodeModel::Medium
:
3850 case CodeModel::Large
:
3857 using SanitizerMetadata
= llvm::GlobalValue::SanitizerMetadata
;
3858 if (GV
->hasSanitizerMetadata()) {
3859 SanitizerMetadata MD
= GV
->getSanitizerMetadata();
3861 Out
<< ", no_sanitize_address";
3863 Out
<< ", no_sanitize_hwaddress";
3865 Out
<< ", sanitize_memtag";
3867 Out
<< ", sanitize_address_dyninit";
3870 maybePrintComdat(Out
, *GV
);
3871 if (MaybeAlign A
= GV
->getAlign())
3872 Out
<< ", align " << A
->value();
3874 SmallVector
<std::pair
<unsigned, MDNode
*>, 4> MDs
;
3875 GV
->getAllMetadata(MDs
);
3876 printMetadataAttachments(MDs
, ", ");
3878 auto Attrs
= GV
->getAttributes();
3879 if (Attrs
.hasAttributes())
3880 Out
<< " #" << Machine
.getAttributeGroupSlot(Attrs
);
3882 printInfoComment(*GV
);
3885 void AssemblyWriter::printAlias(const GlobalAlias
*GA
) {
3886 if (GA
->isMaterializable())
3887 Out
<< "; Materializable\n";
3889 AsmWriterContext
WriterCtx(&TypePrinter
, &Machine
, GA
->getParent());
3890 WriteAsOperandInternal(Out
, GA
, WriterCtx
);
3893 Out
<< getLinkageNameWithSpace(GA
->getLinkage());
3894 PrintDSOLocation(*GA
, Out
);
3895 PrintVisibility(GA
->getVisibility(), Out
);
3896 PrintDLLStorageClass(GA
->getDLLStorageClass(), Out
);
3897 PrintThreadLocalModel(GA
->getThreadLocalMode(), Out
);
3898 StringRef UA
= getUnnamedAddrEncoding(GA
->getUnnamedAddr());
3904 TypePrinter
.print(GA
->getValueType(), Out
);
3907 if (const Constant
*Aliasee
= GA
->getAliasee()) {
3908 writeOperand(Aliasee
, !isa
<ConstantExpr
>(Aliasee
));
3910 TypePrinter
.print(GA
->getType(), Out
);
3911 Out
<< " <<NULL ALIASEE>>";
3914 if (GA
->hasPartition()) {
3915 Out
<< ", partition \"";
3916 printEscapedString(GA
->getPartition(), Out
);
3920 printInfoComment(*GA
);
3924 void AssemblyWriter::printIFunc(const GlobalIFunc
*GI
) {
3925 if (GI
->isMaterializable())
3926 Out
<< "; Materializable\n";
3928 AsmWriterContext
WriterCtx(&TypePrinter
, &Machine
, GI
->getParent());
3929 WriteAsOperandInternal(Out
, GI
, WriterCtx
);
3932 Out
<< getLinkageNameWithSpace(GI
->getLinkage());
3933 PrintDSOLocation(*GI
, Out
);
3934 PrintVisibility(GI
->getVisibility(), Out
);
3938 TypePrinter
.print(GI
->getValueType(), Out
);
3941 if (const Constant
*Resolver
= GI
->getResolver()) {
3942 writeOperand(Resolver
, !isa
<ConstantExpr
>(Resolver
));
3944 TypePrinter
.print(GI
->getType(), Out
);
3945 Out
<< " <<NULL RESOLVER>>";
3948 if (GI
->hasPartition()) {
3949 Out
<< ", partition \"";
3950 printEscapedString(GI
->getPartition(), Out
);
3954 printInfoComment(*GI
);
3958 void AssemblyWriter::printComdat(const Comdat
*C
) {
3962 void AssemblyWriter::printTypeIdentities() {
3963 if (TypePrinter
.empty())
3968 // Emit all numbered types.
3969 auto &NumberedTypes
= TypePrinter
.getNumberedTypes();
3970 for (unsigned I
= 0, E
= NumberedTypes
.size(); I
!= E
; ++I
) {
3971 Out
<< '%' << I
<< " = type ";
3973 // Make sure we print out at least one level of the type structure, so
3974 // that we do not get %2 = type %2
3975 TypePrinter
.printStructBody(NumberedTypes
[I
], Out
);
3979 auto &NamedTypes
= TypePrinter
.getNamedTypes();
3980 for (StructType
*NamedType
: NamedTypes
) {
3981 PrintLLVMName(Out
, NamedType
->getName(), LocalPrefix
);
3984 // Make sure we print out at least one level of the type structure, so
3985 // that we do not get %FILE = type %FILE
3986 TypePrinter
.printStructBody(NamedType
, Out
);
3991 /// printFunction - Print all aspects of a function.
3992 void AssemblyWriter::printFunction(const Function
*F
) {
3993 if (AnnotationWriter
) AnnotationWriter
->emitFunctionAnnot(F
, Out
);
3995 if (F
->isMaterializable())
3996 Out
<< "; Materializable\n";
3998 const AttributeList
&Attrs
= F
->getAttributes();
3999 if (Attrs
.hasFnAttrs()) {
4000 AttributeSet AS
= Attrs
.getFnAttrs();
4001 std::string AttrStr
;
4003 for (const Attribute
&Attr
: AS
) {
4004 if (!Attr
.isStringAttribute()) {
4005 if (!AttrStr
.empty()) AttrStr
+= ' ';
4006 AttrStr
+= Attr
.getAsString();
4010 if (!AttrStr
.empty())
4011 Out
<< "; Function Attrs: " << AttrStr
<< '\n';
4014 Machine
.incorporateFunction(F
);
4016 if (F
->isDeclaration()) {
4018 SmallVector
<std::pair
<unsigned, MDNode
*>, 4> MDs
;
4019 F
->getAllMetadata(MDs
);
4020 printMetadataAttachments(MDs
, " ");
4025 Out
<< getLinkageNameWithSpace(F
->getLinkage());
4026 PrintDSOLocation(*F
, Out
);
4027 PrintVisibility(F
->getVisibility(), Out
);
4028 PrintDLLStorageClass(F
->getDLLStorageClass(), Out
);
4030 // Print the calling convention.
4031 if (F
->getCallingConv() != CallingConv::C
) {
4032 PrintCallingConv(F
->getCallingConv(), Out
);
4036 FunctionType
*FT
= F
->getFunctionType();
4037 if (Attrs
.hasRetAttrs())
4038 Out
<< Attrs
.getAsString(AttributeList::ReturnIndex
) << ' ';
4039 TypePrinter
.print(F
->getReturnType(), Out
);
4040 AsmWriterContext
WriterCtx(&TypePrinter
, &Machine
, F
->getParent());
4042 WriteAsOperandInternal(Out
, F
, WriterCtx
);
4045 // Loop over the arguments, printing them...
4046 if (F
->isDeclaration() && !IsForDebug
) {
4047 // We're only interested in the type here - don't print argument names.
4048 for (unsigned I
= 0, E
= FT
->getNumParams(); I
!= E
; ++I
) {
4049 // Insert commas as we go... the first arg doesn't get a comma
4053 TypePrinter
.print(FT
->getParamType(I
), Out
);
4055 AttributeSet ArgAttrs
= Attrs
.getParamAttrs(I
);
4056 if (ArgAttrs
.hasAttributes()) {
4058 writeAttributeSet(ArgAttrs
);
4062 // The arguments are meaningful here, print them in detail.
4063 for (const Argument
&Arg
: F
->args()) {
4064 // Insert commas as we go... the first arg doesn't get a comma
4065 if (Arg
.getArgNo() != 0)
4067 printArgument(&Arg
, Attrs
.getParamAttrs(Arg
.getArgNo()));
4071 // Finish printing arguments...
4072 if (FT
->isVarArg()) {
4073 if (FT
->getNumParams()) Out
<< ", ";
4074 Out
<< "..."; // Output varargs portion of signature!
4077 StringRef UA
= getUnnamedAddrEncoding(F
->getUnnamedAddr());
4080 // We print the function address space if it is non-zero or if we are writing
4081 // a module with a non-zero program address space or if there is no valid
4082 // Module* so that the file can be parsed without the datalayout string.
4083 const Module
*Mod
= F
->getParent();
4084 if (F
->getAddressSpace() != 0 || !Mod
||
4085 Mod
->getDataLayout().getProgramAddressSpace() != 0)
4086 Out
<< " addrspace(" << F
->getAddressSpace() << ")";
4087 if (Attrs
.hasFnAttrs())
4088 Out
<< " #" << Machine
.getAttributeGroupSlot(Attrs
.getFnAttrs());
4089 if (F
->hasSection()) {
4090 Out
<< " section \"";
4091 printEscapedString(F
->getSection(), Out
);
4094 if (F
->hasPartition()) {
4095 Out
<< " partition \"";
4096 printEscapedString(F
->getPartition(), Out
);
4099 maybePrintComdat(Out
, *F
);
4100 if (MaybeAlign A
= F
->getAlign())
4101 Out
<< " align " << A
->value();
4103 Out
<< " gc \"" << F
->getGC() << '"';
4104 if (F
->hasPrefixData()) {
4106 writeOperand(F
->getPrefixData(), true);
4108 if (F
->hasPrologueData()) {
4109 Out
<< " prologue ";
4110 writeOperand(F
->getPrologueData(), true);
4112 if (F
->hasPersonalityFn()) {
4113 Out
<< " personality ";
4114 writeOperand(F
->getPersonalityFn(), /*PrintType=*/true);
4117 if (F
->isDeclaration()) {
4120 SmallVector
<std::pair
<unsigned, MDNode
*>, 4> MDs
;
4121 F
->getAllMetadata(MDs
);
4122 printMetadataAttachments(MDs
, " ");
4125 // Output all of the function's basic blocks.
4126 for (const BasicBlock
&BB
: *F
)
4127 printBasicBlock(&BB
);
4129 // Output the function's use-lists.
4135 Machine
.purgeFunction();
4138 /// printArgument - This member is called for every argument that is passed into
4139 /// the function. Simply print it out
4140 void AssemblyWriter::printArgument(const Argument
*Arg
, AttributeSet Attrs
) {
4142 TypePrinter
.print(Arg
->getType(), Out
);
4144 // Output parameter attributes list
4145 if (Attrs
.hasAttributes()) {
4147 writeAttributeSet(Attrs
);
4150 // Output name, if available...
4151 if (Arg
->hasName()) {
4153 PrintLLVMName(Out
, Arg
);
4155 int Slot
= Machine
.getLocalSlot(Arg
);
4156 assert(Slot
!= -1 && "expect argument in function here");
4157 Out
<< " %" << Slot
;
4161 /// printBasicBlock - This member is called for each basic block in a method.
4162 void AssemblyWriter::printBasicBlock(const BasicBlock
*BB
) {
4163 bool IsEntryBlock
= BB
->getParent() && BB
->isEntryBlock();
4164 if (BB
->hasName()) { // Print out the label if it exists...
4166 PrintLLVMName(Out
, BB
->getName(), LabelPrefix
);
4168 } else if (!IsEntryBlock
) {
4170 int Slot
= Machine
.getLocalSlot(BB
);
4177 if (!IsEntryBlock
) {
4178 // Output predecessors for the block.
4179 Out
.PadToColumn(50);
4181 const_pred_iterator PI
= pred_begin(BB
), PE
= pred_end(BB
);
4184 Out
<< " No predecessors!";
4187 writeOperand(*PI
, false);
4188 for (++PI
; PI
!= PE
; ++PI
) {
4190 writeOperand(*PI
, false);
4197 if (AnnotationWriter
) AnnotationWriter
->emitBasicBlockStartAnnot(BB
, Out
);
4199 // Output all of the instructions in the basic block...
4200 for (const Instruction
&I
: *BB
) {
4201 for (const DbgRecord
&DR
: I
.getDbgRecordRange())
4202 printDbgRecordLine(DR
);
4203 printInstructionLine(I
);
4206 if (AnnotationWriter
) AnnotationWriter
->emitBasicBlockEndAnnot(BB
, Out
);
4209 /// printInstructionLine - Print an instruction and a newline character.
4210 void AssemblyWriter::printInstructionLine(const Instruction
&I
) {
4211 printInstruction(I
);
4215 /// printGCRelocateComment - print comment after call to the gc.relocate
4216 /// intrinsic indicating base and derived pointer names.
4217 void AssemblyWriter::printGCRelocateComment(const GCRelocateInst
&Relocate
) {
4219 writeOperand(Relocate
.getBasePtr(), false);
4221 writeOperand(Relocate
.getDerivedPtr(), false);
4225 /// printInfoComment - Print a little comment after the instruction indicating
4226 /// which slot it occupies.
4227 void AssemblyWriter::printInfoComment(const Value
&V
) {
4228 if (const auto *Relocate
= dyn_cast
<GCRelocateInst
>(&V
))
4229 printGCRelocateComment(*Relocate
);
4231 if (AnnotationWriter
) {
4232 AnnotationWriter
->printInfoComment(V
, Out
);
4236 static void maybePrintCallAddrSpace(const Value
*Operand
, const Instruction
*I
,
4238 // We print the address space of the call if it is non-zero.
4239 if (Operand
== nullptr) {
4240 Out
<< " <cannot get addrspace!>";
4243 unsigned CallAddrSpace
= Operand
->getType()->getPointerAddressSpace();
4244 bool PrintAddrSpace
= CallAddrSpace
!= 0;
4245 if (!PrintAddrSpace
) {
4246 const Module
*Mod
= getModuleFromVal(I
);
4247 // We also print it if it is zero but not equal to the program address space
4248 // or if we can't find a valid Module* to make it possible to parse
4249 // the resulting file even without a datalayout string.
4250 if (!Mod
|| Mod
->getDataLayout().getProgramAddressSpace() != 0)
4251 PrintAddrSpace
= true;
4254 Out
<< " addrspace(" << CallAddrSpace
<< ")";
4257 // This member is called for each Instruction in a function..
4258 void AssemblyWriter::printInstruction(const Instruction
&I
) {
4259 if (AnnotationWriter
) AnnotationWriter
->emitInstructionAnnot(&I
, Out
);
4261 // Print out indentation for an instruction.
4264 // Print out name if it exists...
4266 PrintLLVMName(Out
, &I
);
4268 } else if (!I
.getType()->isVoidTy()) {
4269 // Print out the def slot taken.
4270 int SlotNum
= Machine
.getLocalSlot(&I
);
4272 Out
<< "<badref> = ";
4274 Out
<< '%' << SlotNum
<< " = ";
4277 if (const CallInst
*CI
= dyn_cast
<CallInst
>(&I
)) {
4278 if (CI
->isMustTailCall())
4280 else if (CI
->isTailCall())
4282 else if (CI
->isNoTailCall())
4286 // Print out the opcode...
4287 Out
<< I
.getOpcodeName();
4289 // If this is an atomic load or store, print out the atomic marker.
4290 if ((isa
<LoadInst
>(I
) && cast
<LoadInst
>(I
).isAtomic()) ||
4291 (isa
<StoreInst
>(I
) && cast
<StoreInst
>(I
).isAtomic()))
4294 if (isa
<AtomicCmpXchgInst
>(I
) && cast
<AtomicCmpXchgInst
>(I
).isWeak())
4297 // If this is a volatile operation, print out the volatile marker.
4298 if ((isa
<LoadInst
>(I
) && cast
<LoadInst
>(I
).isVolatile()) ||
4299 (isa
<StoreInst
>(I
) && cast
<StoreInst
>(I
).isVolatile()) ||
4300 (isa
<AtomicCmpXchgInst
>(I
) && cast
<AtomicCmpXchgInst
>(I
).isVolatile()) ||
4301 (isa
<AtomicRMWInst
>(I
) && cast
<AtomicRMWInst
>(I
).isVolatile()))
4304 // Print out optimization information.
4305 WriteOptimizationInfo(Out
, &I
);
4307 // Print out the compare instruction predicates
4308 if (const CmpInst
*CI
= dyn_cast
<CmpInst
>(&I
))
4309 Out
<< ' ' << CI
->getPredicate();
4311 // Print out the atomicrmw operation
4312 if (const AtomicRMWInst
*RMWI
= dyn_cast
<AtomicRMWInst
>(&I
))
4313 Out
<< ' ' << AtomicRMWInst::getOperationName(RMWI
->getOperation());
4315 // Print out the type of the operands...
4316 const Value
*Operand
= I
.getNumOperands() ? I
.getOperand(0) : nullptr;
4318 // Special case conditional branches to swizzle the condition out to the front
4319 if (isa
<BranchInst
>(I
) && cast
<BranchInst
>(I
).isConditional()) {
4320 const BranchInst
&BI(cast
<BranchInst
>(I
));
4322 writeOperand(BI
.getCondition(), true);
4324 writeOperand(BI
.getSuccessor(0), true);
4326 writeOperand(BI
.getSuccessor(1), true);
4328 } else if (isa
<SwitchInst
>(I
)) {
4329 const SwitchInst
& SI(cast
<SwitchInst
>(I
));
4330 // Special case switch instruction to get formatting nice and correct.
4332 writeOperand(SI
.getCondition(), true);
4334 writeOperand(SI
.getDefaultDest(), true);
4336 for (auto Case
: SI
.cases()) {
4338 writeOperand(Case
.getCaseValue(), true);
4340 writeOperand(Case
.getCaseSuccessor(), true);
4343 } else if (isa
<IndirectBrInst
>(I
)) {
4344 // Special case indirectbr instruction to get formatting nice and correct.
4346 writeOperand(Operand
, true);
4349 for (unsigned i
= 1, e
= I
.getNumOperands(); i
!= e
; ++i
) {
4352 writeOperand(I
.getOperand(i
), true);
4355 } else if (const PHINode
*PN
= dyn_cast
<PHINode
>(&I
)) {
4357 TypePrinter
.print(I
.getType(), Out
);
4360 for (unsigned op
= 0, Eop
= PN
->getNumIncomingValues(); op
< Eop
; ++op
) {
4361 if (op
) Out
<< ", ";
4363 writeOperand(PN
->getIncomingValue(op
), false); Out
<< ", ";
4364 writeOperand(PN
->getIncomingBlock(op
), false); Out
<< " ]";
4366 } else if (const ExtractValueInst
*EVI
= dyn_cast
<ExtractValueInst
>(&I
)) {
4368 writeOperand(I
.getOperand(0), true);
4369 for (unsigned i
: EVI
->indices())
4371 } else if (const InsertValueInst
*IVI
= dyn_cast
<InsertValueInst
>(&I
)) {
4373 writeOperand(I
.getOperand(0), true); Out
<< ", ";
4374 writeOperand(I
.getOperand(1), true);
4375 for (unsigned i
: IVI
->indices())
4377 } else if (const LandingPadInst
*LPI
= dyn_cast
<LandingPadInst
>(&I
)) {
4379 TypePrinter
.print(I
.getType(), Out
);
4380 if (LPI
->isCleanup() || LPI
->getNumClauses() != 0)
4383 if (LPI
->isCleanup())
4386 for (unsigned i
= 0, e
= LPI
->getNumClauses(); i
!= e
; ++i
) {
4387 if (i
!= 0 || LPI
->isCleanup()) Out
<< "\n";
4388 if (LPI
->isCatch(i
))
4393 writeOperand(LPI
->getClause(i
), true);
4395 } else if (const auto *CatchSwitch
= dyn_cast
<CatchSwitchInst
>(&I
)) {
4397 writeOperand(CatchSwitch
->getParentPad(), /*PrintType=*/false);
4400 for (const BasicBlock
*PadBB
: CatchSwitch
->handlers()) {
4403 writeOperand(PadBB
, /*PrintType=*/true);
4407 if (const BasicBlock
*UnwindDest
= CatchSwitch
->getUnwindDest())
4408 writeOperand(UnwindDest
, /*PrintType=*/true);
4411 } else if (const auto *FPI
= dyn_cast
<FuncletPadInst
>(&I
)) {
4413 writeOperand(FPI
->getParentPad(), /*PrintType=*/false);
4415 for (unsigned Op
= 0, NumOps
= FPI
->arg_size(); Op
< NumOps
; ++Op
) {
4418 writeOperand(FPI
->getArgOperand(Op
), /*PrintType=*/true);
4421 } else if (isa
<ReturnInst
>(I
) && !Operand
) {
4423 } else if (const auto *CRI
= dyn_cast
<CatchReturnInst
>(&I
)) {
4425 writeOperand(CRI
->getOperand(0), /*PrintType=*/false);
4428 writeOperand(CRI
->getOperand(1), /*PrintType=*/true);
4429 } else if (const auto *CRI
= dyn_cast
<CleanupReturnInst
>(&I
)) {
4431 writeOperand(CRI
->getOperand(0), /*PrintType=*/false);
4434 if (CRI
->hasUnwindDest())
4435 writeOperand(CRI
->getOperand(1), /*PrintType=*/true);
4438 } else if (const CallInst
*CI
= dyn_cast
<CallInst
>(&I
)) {
4439 // Print the calling convention being used.
4440 if (CI
->getCallingConv() != CallingConv::C
) {
4442 PrintCallingConv(CI
->getCallingConv(), Out
);
4445 Operand
= CI
->getCalledOperand();
4446 FunctionType
*FTy
= CI
->getFunctionType();
4447 Type
*RetTy
= FTy
->getReturnType();
4448 const AttributeList
&PAL
= CI
->getAttributes();
4450 if (PAL
.hasRetAttrs())
4451 Out
<< ' ' << PAL
.getAsString(AttributeList::ReturnIndex
);
4453 // Only print addrspace(N) if necessary:
4454 maybePrintCallAddrSpace(Operand
, &I
, Out
);
4456 // If possible, print out the short form of the call instruction. We can
4457 // only do this if the first argument is a pointer to a nonvararg function,
4458 // and if the return type is not a pointer to a function.
4460 TypePrinter
.print(FTy
->isVarArg() ? FTy
: RetTy
, Out
);
4462 writeOperand(Operand
, false);
4464 for (unsigned op
= 0, Eop
= CI
->arg_size(); op
< Eop
; ++op
) {
4467 writeParamOperand(CI
->getArgOperand(op
), PAL
.getParamAttrs(op
));
4470 // Emit an ellipsis if this is a musttail call in a vararg function. This
4471 // is only to aid readability, musttail calls forward varargs by default.
4472 if (CI
->isMustTailCall() && CI
->getParent() &&
4473 CI
->getParent()->getParent() &&
4474 CI
->getParent()->getParent()->isVarArg()) {
4475 if (CI
->arg_size() > 0)
4481 if (PAL
.hasFnAttrs())
4482 Out
<< " #" << Machine
.getAttributeGroupSlot(PAL
.getFnAttrs());
4484 writeOperandBundles(CI
);
4485 } else if (const InvokeInst
*II
= dyn_cast
<InvokeInst
>(&I
)) {
4486 Operand
= II
->getCalledOperand();
4487 FunctionType
*FTy
= II
->getFunctionType();
4488 Type
*RetTy
= FTy
->getReturnType();
4489 const AttributeList
&PAL
= II
->getAttributes();
4491 // Print the calling convention being used.
4492 if (II
->getCallingConv() != CallingConv::C
) {
4494 PrintCallingConv(II
->getCallingConv(), Out
);
4497 if (PAL
.hasRetAttrs())
4498 Out
<< ' ' << PAL
.getAsString(AttributeList::ReturnIndex
);
4500 // Only print addrspace(N) if necessary:
4501 maybePrintCallAddrSpace(Operand
, &I
, Out
);
4503 // If possible, print out the short form of the invoke instruction. We can
4504 // only do this if the first argument is a pointer to a nonvararg function,
4505 // and if the return type is not a pointer to a function.
4508 TypePrinter
.print(FTy
->isVarArg() ? FTy
: RetTy
, Out
);
4510 writeOperand(Operand
, false);
4512 for (unsigned op
= 0, Eop
= II
->arg_size(); op
< Eop
; ++op
) {
4515 writeParamOperand(II
->getArgOperand(op
), PAL
.getParamAttrs(op
));
4519 if (PAL
.hasFnAttrs())
4520 Out
<< " #" << Machine
.getAttributeGroupSlot(PAL
.getFnAttrs());
4522 writeOperandBundles(II
);
4525 writeOperand(II
->getNormalDest(), true);
4527 writeOperand(II
->getUnwindDest(), true);
4528 } else if (const CallBrInst
*CBI
= dyn_cast
<CallBrInst
>(&I
)) {
4529 Operand
= CBI
->getCalledOperand();
4530 FunctionType
*FTy
= CBI
->getFunctionType();
4531 Type
*RetTy
= FTy
->getReturnType();
4532 const AttributeList
&PAL
= CBI
->getAttributes();
4534 // Print the calling convention being used.
4535 if (CBI
->getCallingConv() != CallingConv::C
) {
4537 PrintCallingConv(CBI
->getCallingConv(), Out
);
4540 if (PAL
.hasRetAttrs())
4541 Out
<< ' ' << PAL
.getAsString(AttributeList::ReturnIndex
);
4543 // If possible, print out the short form of the callbr instruction. We can
4544 // only do this if the first argument is a pointer to a nonvararg function,
4545 // and if the return type is not a pointer to a function.
4548 TypePrinter
.print(FTy
->isVarArg() ? FTy
: RetTy
, Out
);
4550 writeOperand(Operand
, false);
4552 for (unsigned op
= 0, Eop
= CBI
->arg_size(); op
< Eop
; ++op
) {
4555 writeParamOperand(CBI
->getArgOperand(op
), PAL
.getParamAttrs(op
));
4559 if (PAL
.hasFnAttrs())
4560 Out
<< " #" << Machine
.getAttributeGroupSlot(PAL
.getFnAttrs());
4562 writeOperandBundles(CBI
);
4565 writeOperand(CBI
->getDefaultDest(), true);
4567 for (unsigned i
= 0, e
= CBI
->getNumIndirectDests(); i
!= e
; ++i
) {
4570 writeOperand(CBI
->getIndirectDest(i
), true);
4573 } else if (const AllocaInst
*AI
= dyn_cast
<AllocaInst
>(&I
)) {
4575 if (AI
->isUsedWithInAlloca())
4577 if (AI
->isSwiftError())
4578 Out
<< "swifterror ";
4579 TypePrinter
.print(AI
->getAllocatedType(), Out
);
4581 // Explicitly write the array size if the code is broken, if it's an array
4582 // allocation, or if the type is not canonical for scalar allocations. The
4583 // latter case prevents the type from mutating when round-tripping through
4585 if (!AI
->getArraySize() || AI
->isArrayAllocation() ||
4586 !AI
->getArraySize()->getType()->isIntegerTy(32)) {
4588 writeOperand(AI
->getArraySize(), true);
4590 if (MaybeAlign A
= AI
->getAlign()) {
4591 Out
<< ", align " << A
->value();
4594 unsigned AddrSpace
= AI
->getAddressSpace();
4595 if (AddrSpace
!= 0) {
4596 Out
<< ", addrspace(" << AddrSpace
<< ')';
4598 } else if (isa
<CastInst
>(I
)) {
4601 writeOperand(Operand
, true); // Work with broken code
4604 TypePrinter
.print(I
.getType(), Out
);
4605 } else if (isa
<VAArgInst
>(I
)) {
4608 writeOperand(Operand
, true); // Work with broken code
4611 TypePrinter
.print(I
.getType(), Out
);
4612 } else if (Operand
) { // Print the normal way.
4613 if (const auto *GEP
= dyn_cast
<GetElementPtrInst
>(&I
)) {
4615 TypePrinter
.print(GEP
->getSourceElementType(), Out
);
4617 } else if (const auto *LI
= dyn_cast
<LoadInst
>(&I
)) {
4619 TypePrinter
.print(LI
->getType(), Out
);
4623 // PrintAllTypes - Instructions who have operands of all the same type
4624 // omit the type from all but the first operand. If the instruction has
4625 // different type operands (for example br), then they are all printed.
4626 bool PrintAllTypes
= false;
4627 Type
*TheType
= Operand
->getType();
4629 // Select, Store, ShuffleVector, CmpXchg and AtomicRMW always print all
4631 if (isa
<SelectInst
>(I
) || isa
<StoreInst
>(I
) || isa
<ShuffleVectorInst
>(I
) ||
4632 isa
<ReturnInst
>(I
) || isa
<AtomicCmpXchgInst
>(I
) ||
4633 isa
<AtomicRMWInst
>(I
)) {
4634 PrintAllTypes
= true;
4636 for (unsigned i
= 1, E
= I
.getNumOperands(); i
!= E
; ++i
) {
4637 Operand
= I
.getOperand(i
);
4638 // note that Operand shouldn't be null, but the test helps make dump()
4639 // more tolerant of malformed IR
4640 if (Operand
&& Operand
->getType() != TheType
) {
4641 PrintAllTypes
= true; // We have differing types! Print them all!
4647 if (!PrintAllTypes
) {
4649 TypePrinter
.print(TheType
, Out
);
4653 for (unsigned i
= 0, E
= I
.getNumOperands(); i
!= E
; ++i
) {
4655 writeOperand(I
.getOperand(i
), PrintAllTypes
);
4659 // Print atomic ordering/alignment for memory operations
4660 if (const LoadInst
*LI
= dyn_cast
<LoadInst
>(&I
)) {
4662 writeAtomic(LI
->getContext(), LI
->getOrdering(), LI
->getSyncScopeID());
4663 if (MaybeAlign A
= LI
->getAlign())
4664 Out
<< ", align " << A
->value();
4665 } else if (const StoreInst
*SI
= dyn_cast
<StoreInst
>(&I
)) {
4667 writeAtomic(SI
->getContext(), SI
->getOrdering(), SI
->getSyncScopeID());
4668 if (MaybeAlign A
= SI
->getAlign())
4669 Out
<< ", align " << A
->value();
4670 } else if (const AtomicCmpXchgInst
*CXI
= dyn_cast
<AtomicCmpXchgInst
>(&I
)) {
4671 writeAtomicCmpXchg(CXI
->getContext(), CXI
->getSuccessOrdering(),
4672 CXI
->getFailureOrdering(), CXI
->getSyncScopeID());
4673 Out
<< ", align " << CXI
->getAlign().value();
4674 } else if (const AtomicRMWInst
*RMWI
= dyn_cast
<AtomicRMWInst
>(&I
)) {
4675 writeAtomic(RMWI
->getContext(), RMWI
->getOrdering(),
4676 RMWI
->getSyncScopeID());
4677 Out
<< ", align " << RMWI
->getAlign().value();
4678 } else if (const FenceInst
*FI
= dyn_cast
<FenceInst
>(&I
)) {
4679 writeAtomic(FI
->getContext(), FI
->getOrdering(), FI
->getSyncScopeID());
4680 } else if (const ShuffleVectorInst
*SVI
= dyn_cast
<ShuffleVectorInst
>(&I
)) {
4681 PrintShuffleMask(Out
, SVI
->getType(), SVI
->getShuffleMask());
4684 // Print Metadata info.
4685 SmallVector
<std::pair
<unsigned, MDNode
*>, 4> InstMD
;
4686 I
.getAllMetadata(InstMD
);
4687 printMetadataAttachments(InstMD
, ", ");
4689 // Print a nice comment.
4690 printInfoComment(I
);
4693 void AssemblyWriter::printDbgMarker(const DbgMarker
&Marker
) {
4694 // There's no formal representation of a DbgMarker -- print purely as a
4696 for (const DbgRecord
&DPR
: Marker
.StoredDbgRecords
) {
4697 printDbgRecord(DPR
);
4701 Out
<< " DbgMarker -> { ";
4702 printInstruction(*Marker
.MarkedInstr
);
4706 void AssemblyWriter::printDbgRecord(const DbgRecord
&DR
) {
4707 if (auto *DVR
= dyn_cast
<DbgVariableRecord
>(&DR
))
4708 printDbgVariableRecord(*DVR
);
4709 else if (auto *DLR
= dyn_cast
<DbgLabelRecord
>(&DR
))
4710 printDbgLabelRecord(*DLR
);
4712 llvm_unreachable("Unexpected DbgRecord kind");
4715 void AssemblyWriter::printDbgVariableRecord(const DbgVariableRecord
&DVR
) {
4716 auto WriterCtx
= getContext();
4718 switch (DVR
.getType()) {
4719 case DbgVariableRecord::LocationType::Value
:
4722 case DbgVariableRecord::LocationType::Declare
:
4725 case DbgVariableRecord::LocationType::Assign
:
4730 "Tried to print a DbgVariableRecord with an invalid LocationType!");
4733 WriteAsOperandInternal(Out
, DVR
.getRawLocation(), WriterCtx
, true);
4735 WriteAsOperandInternal(Out
, DVR
.getRawVariable(), WriterCtx
, true);
4737 WriteAsOperandInternal(Out
, DVR
.getRawExpression(), WriterCtx
, true);
4739 if (DVR
.isDbgAssign()) {
4740 WriteAsOperandInternal(Out
, DVR
.getRawAssignID(), WriterCtx
, true);
4742 WriteAsOperandInternal(Out
, DVR
.getRawAddress(), WriterCtx
, true);
4744 WriteAsOperandInternal(Out
, DVR
.getRawAddressExpression(), WriterCtx
, true);
4747 WriteAsOperandInternal(Out
, DVR
.getDebugLoc().getAsMDNode(), WriterCtx
, true);
4751 /// printDbgRecordLine - Print a DbgRecord with indentation and a newline
4753 void AssemblyWriter::printDbgRecordLine(const DbgRecord
&DR
) {
4754 // Print lengthier indentation to bring out-of-line with instructions.
4760 void AssemblyWriter::printDbgLabelRecord(const DbgLabelRecord
&Label
) {
4761 auto WriterCtx
= getContext();
4762 Out
<< "#dbg_label(";
4763 WriteAsOperandInternal(Out
, Label
.getRawLabel(), WriterCtx
, true);
4765 WriteAsOperandInternal(Out
, Label
.getDebugLoc(), WriterCtx
, true);
4769 void AssemblyWriter::printMetadataAttachments(
4770 const SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &MDs
,
4771 StringRef Separator
) {
4775 if (MDNames
.empty())
4776 MDs
[0].second
->getContext().getMDKindNames(MDNames
);
4778 auto WriterCtx
= getContext();
4779 for (const auto &I
: MDs
) {
4780 unsigned Kind
= I
.first
;
4782 if (Kind
< MDNames
.size()) {
4784 printMetadataIdentifier(MDNames
[Kind
], Out
);
4786 Out
<< "!<unknown kind #" << Kind
<< ">";
4788 WriteAsOperandInternal(Out
, I
.second
, WriterCtx
);
4792 void AssemblyWriter::writeMDNode(unsigned Slot
, const MDNode
*Node
) {
4793 Out
<< '!' << Slot
<< " = ";
4794 printMDNodeBody(Node
);
4798 void AssemblyWriter::writeAllMDNodes() {
4799 SmallVector
<const MDNode
*, 16> Nodes
;
4800 Nodes
.resize(Machine
.mdn_size());
4801 for (auto &I
: llvm::make_range(Machine
.mdn_begin(), Machine
.mdn_end()))
4802 Nodes
[I
.second
] = cast
<MDNode
>(I
.first
);
4804 for (unsigned i
= 0, e
= Nodes
.size(); i
!= e
; ++i
) {
4805 writeMDNode(i
, Nodes
[i
]);
4809 void AssemblyWriter::printMDNodeBody(const MDNode
*Node
) {
4810 auto WriterCtx
= getContext();
4811 WriteMDNodeBodyInternal(Out
, Node
, WriterCtx
);
4814 void AssemblyWriter::writeAttribute(const Attribute
&Attr
, bool InAttrGroup
) {
4815 if (!Attr
.isTypeAttribute()) {
4816 Out
<< Attr
.getAsString(InAttrGroup
);
4820 Out
<< Attribute::getNameFromAttrKind(Attr
.getKindAsEnum());
4821 if (Type
*Ty
= Attr
.getValueAsType()) {
4823 TypePrinter
.print(Ty
, Out
);
4828 void AssemblyWriter::writeAttributeSet(const AttributeSet
&AttrSet
,
4830 bool FirstAttr
= true;
4831 for (const auto &Attr
: AttrSet
) {
4834 writeAttribute(Attr
, InAttrGroup
);
4839 void AssemblyWriter::writeAllAttributeGroups() {
4840 std::vector
<std::pair
<AttributeSet
, unsigned>> asVec
;
4841 asVec
.resize(Machine
.as_size());
4843 for (auto &I
: llvm::make_range(Machine
.as_begin(), Machine
.as_end()))
4844 asVec
[I
.second
] = I
;
4846 for (const auto &I
: asVec
)
4847 Out
<< "attributes #" << I
.second
<< " = { "
4848 << I
.first
.getAsString(true) << " }\n";
4851 void AssemblyWriter::printUseListOrder(const Value
*V
,
4852 const std::vector
<unsigned> &Shuffle
) {
4853 bool IsInFunction
= Machine
.getFunction();
4857 Out
<< "uselistorder";
4858 if (const BasicBlock
*BB
= IsInFunction
? nullptr : dyn_cast
<BasicBlock
>(V
)) {
4860 writeOperand(BB
->getParent(), false);
4862 writeOperand(BB
, false);
4865 writeOperand(V
, true);
4869 assert(Shuffle
.size() >= 2 && "Shuffle too small");
4871 for (unsigned I
= 1, E
= Shuffle
.size(); I
!= E
; ++I
)
4872 Out
<< ", " << Shuffle
[I
];
4876 void AssemblyWriter::printUseLists(const Function
*F
) {
4877 auto It
= UseListOrders
.find(F
);
4878 if (It
== UseListOrders
.end())
4881 Out
<< "\n; uselistorder directives\n";
4882 for (const auto &Pair
: It
->second
)
4883 printUseListOrder(Pair
.first
, Pair
.second
);
4886 //===----------------------------------------------------------------------===//
4887 // External Interface declarations
4888 //===----------------------------------------------------------------------===//
4890 void Function::print(raw_ostream
&ROS
, AssemblyAnnotationWriter
*AAW
,
4891 bool ShouldPreserveUseListOrder
,
4892 bool IsForDebug
) const {
4893 SlotTracker
SlotTable(this->getParent());
4894 formatted_raw_ostream
OS(ROS
);
4895 AssemblyWriter
W(OS
, SlotTable
, this->getParent(), AAW
,
4897 ShouldPreserveUseListOrder
);
4898 W
.printFunction(this);
4901 void BasicBlock::print(raw_ostream
&ROS
, AssemblyAnnotationWriter
*AAW
,
4902 bool ShouldPreserveUseListOrder
,
4903 bool IsForDebug
) const {
4904 SlotTracker
SlotTable(this->getParent());
4905 formatted_raw_ostream
OS(ROS
);
4906 AssemblyWriter
W(OS
, SlotTable
, this->getModule(), AAW
,
4908 ShouldPreserveUseListOrder
);
4909 W
.printBasicBlock(this);
4912 void Module::print(raw_ostream
&ROS
, AssemblyAnnotationWriter
*AAW
,
4913 bool ShouldPreserveUseListOrder
, bool IsForDebug
) const {
4914 SlotTracker
SlotTable(this);
4915 formatted_raw_ostream
OS(ROS
);
4916 AssemblyWriter
W(OS
, SlotTable
, this, AAW
, IsForDebug
,
4917 ShouldPreserveUseListOrder
);
4918 W
.printModule(this);
4921 void NamedMDNode::print(raw_ostream
&ROS
, bool IsForDebug
) const {
4922 SlotTracker
SlotTable(getParent());
4923 formatted_raw_ostream
OS(ROS
);
4924 AssemblyWriter
W(OS
, SlotTable
, getParent(), nullptr, IsForDebug
);
4925 W
.printNamedMDNode(this);
4928 void NamedMDNode::print(raw_ostream
&ROS
, ModuleSlotTracker
&MST
,
4929 bool IsForDebug
) const {
4930 std::optional
<SlotTracker
> LocalST
;
4931 SlotTracker
*SlotTable
;
4932 if (auto *ST
= MST
.getMachine())
4935 LocalST
.emplace(getParent());
4936 SlotTable
= &*LocalST
;
4939 formatted_raw_ostream
OS(ROS
);
4940 AssemblyWriter
W(OS
, *SlotTable
, getParent(), nullptr, IsForDebug
);
4941 W
.printNamedMDNode(this);
4944 void Comdat::print(raw_ostream
&ROS
, bool /*IsForDebug*/) const {
4945 PrintLLVMName(ROS
, getName(), ComdatPrefix
);
4946 ROS
<< " = comdat ";
4948 switch (getSelectionKind()) {
4952 case Comdat::ExactMatch
:
4953 ROS
<< "exactmatch";
4955 case Comdat::Largest
:
4958 case Comdat::NoDeduplicate
:
4959 ROS
<< "nodeduplicate";
4961 case Comdat::SameSize
:
4969 void Type::print(raw_ostream
&OS
, bool /*IsForDebug*/, bool NoDetails
) const {
4971 TP
.print(const_cast<Type
*>(this), OS
);
4976 // If the type is a named struct type, print the body as well.
4977 if (StructType
*STy
= dyn_cast
<StructType
>(const_cast<Type
*>(this)))
4978 if (!STy
->isLiteral()) {
4980 TP
.printStructBody(STy
, OS
);
4984 static bool isReferencingMDNode(const Instruction
&I
) {
4985 if (const auto *CI
= dyn_cast
<CallInst
>(&I
))
4986 if (Function
*F
= CI
->getCalledFunction())
4987 if (F
->isIntrinsic())
4988 for (auto &Op
: I
.operands())
4989 if (auto *V
= dyn_cast_or_null
<MetadataAsValue
>(Op
))
4990 if (isa
<MDNode
>(V
->getMetadata()))
4995 void DbgMarker::print(raw_ostream
&ROS
, bool IsForDebug
) const {
4997 ModuleSlotTracker
MST(getModuleFromDPI(this), true);
4998 print(ROS
, MST
, IsForDebug
);
5001 void DbgVariableRecord::print(raw_ostream
&ROS
, bool IsForDebug
) const {
5003 ModuleSlotTracker
MST(getModuleFromDPI(this), true);
5004 print(ROS
, MST
, IsForDebug
);
5007 void DbgMarker::print(raw_ostream
&ROS
, ModuleSlotTracker
&MST
,
5008 bool IsForDebug
) const {
5009 formatted_raw_ostream
OS(ROS
);
5010 SlotTracker
EmptySlotTable(static_cast<const Module
*>(nullptr));
5011 SlotTracker
&SlotTable
=
5012 MST
.getMachine() ? *MST
.getMachine() : EmptySlotTable
;
5013 auto incorporateFunction
= [&](const Function
*F
) {
5015 MST
.incorporateFunction(*F
);
5017 incorporateFunction(getParent() ? getParent()->getParent() : nullptr);
5018 AssemblyWriter
W(OS
, SlotTable
, getModuleFromDPI(this), nullptr, IsForDebug
);
5019 W
.printDbgMarker(*this);
5022 void DbgLabelRecord::print(raw_ostream
&ROS
, bool IsForDebug
) const {
5024 ModuleSlotTracker
MST(getModuleFromDPI(this), true);
5025 print(ROS
, MST
, IsForDebug
);
5028 void DbgVariableRecord::print(raw_ostream
&ROS
, ModuleSlotTracker
&MST
,
5029 bool IsForDebug
) const {
5030 formatted_raw_ostream
OS(ROS
);
5031 SlotTracker
EmptySlotTable(static_cast<const Module
*>(nullptr));
5032 SlotTracker
&SlotTable
=
5033 MST
.getMachine() ? *MST
.getMachine() : EmptySlotTable
;
5034 auto incorporateFunction
= [&](const Function
*F
) {
5036 MST
.incorporateFunction(*F
);
5038 incorporateFunction(Marker
&& Marker
->getParent()
5039 ? Marker
->getParent()->getParent()
5041 AssemblyWriter
W(OS
, SlotTable
, getModuleFromDPI(this), nullptr, IsForDebug
);
5042 W
.printDbgVariableRecord(*this);
5045 void DbgLabelRecord::print(raw_ostream
&ROS
, ModuleSlotTracker
&MST
,
5046 bool IsForDebug
) const {
5047 formatted_raw_ostream
OS(ROS
);
5048 SlotTracker
EmptySlotTable(static_cast<const Module
*>(nullptr));
5049 SlotTracker
&SlotTable
=
5050 MST
.getMachine() ? *MST
.getMachine() : EmptySlotTable
;
5051 auto incorporateFunction
= [&](const Function
*F
) {
5053 MST
.incorporateFunction(*F
);
5055 incorporateFunction(Marker
->getParent() ? Marker
->getParent()->getParent()
5057 AssemblyWriter
W(OS
, SlotTable
, getModuleFromDPI(this), nullptr, IsForDebug
);
5058 W
.printDbgLabelRecord(*this);
5061 void Value::print(raw_ostream
&ROS
, bool IsForDebug
) const {
5062 bool ShouldInitializeAllMetadata
= false;
5063 if (auto *I
= dyn_cast
<Instruction
>(this))
5064 ShouldInitializeAllMetadata
= isReferencingMDNode(*I
);
5065 else if (isa
<Function
>(this) || isa
<MetadataAsValue
>(this))
5066 ShouldInitializeAllMetadata
= true;
5068 ModuleSlotTracker
MST(getModuleFromVal(this), ShouldInitializeAllMetadata
);
5069 print(ROS
, MST
, IsForDebug
);
5072 void Value::print(raw_ostream
&ROS
, ModuleSlotTracker
&MST
,
5073 bool IsForDebug
) const {
5074 formatted_raw_ostream
OS(ROS
);
5075 SlotTracker
EmptySlotTable(static_cast<const Module
*>(nullptr));
5076 SlotTracker
&SlotTable
=
5077 MST
.getMachine() ? *MST
.getMachine() : EmptySlotTable
;
5078 auto incorporateFunction
= [&](const Function
*F
) {
5080 MST
.incorporateFunction(*F
);
5083 if (const Instruction
*I
= dyn_cast
<Instruction
>(this)) {
5084 incorporateFunction(I
->getParent() ? I
->getParent()->getParent() : nullptr);
5085 AssemblyWriter
W(OS
, SlotTable
, getModuleFromVal(I
), nullptr, IsForDebug
);
5086 W
.printInstruction(*I
);
5087 } else if (const BasicBlock
*BB
= dyn_cast
<BasicBlock
>(this)) {
5088 incorporateFunction(BB
->getParent());
5089 AssemblyWriter
W(OS
, SlotTable
, getModuleFromVal(BB
), nullptr, IsForDebug
);
5090 W
.printBasicBlock(BB
);
5091 } else if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(this)) {
5092 AssemblyWriter
W(OS
, SlotTable
, GV
->getParent(), nullptr, IsForDebug
);
5093 if (const GlobalVariable
*V
= dyn_cast
<GlobalVariable
>(GV
))
5095 else if (const Function
*F
= dyn_cast
<Function
>(GV
))
5097 else if (const GlobalAlias
*A
= dyn_cast
<GlobalAlias
>(GV
))
5099 else if (const GlobalIFunc
*I
= dyn_cast
<GlobalIFunc
>(GV
))
5102 llvm_unreachable("Unknown GlobalValue to print out!");
5103 } else if (const MetadataAsValue
*V
= dyn_cast
<MetadataAsValue
>(this)) {
5104 V
->getMetadata()->print(ROS
, MST
, getModuleFromVal(V
));
5105 } else if (const Constant
*C
= dyn_cast
<Constant
>(this)) {
5106 TypePrinting TypePrinter
;
5107 TypePrinter
.print(C
->getType(), OS
);
5109 AsmWriterContext
WriterCtx(&TypePrinter
, MST
.getMachine());
5110 WriteConstantInternal(OS
, C
, WriterCtx
);
5111 } else if (isa
<InlineAsm
>(this) || isa
<Argument
>(this)) {
5112 this->printAsOperand(OS
, /* PrintType */ true, MST
);
5114 llvm_unreachable("Unknown value to print out!");
5118 /// Print without a type, skipping the TypePrinting object.
5120 /// \return \c true iff printing was successful.
5121 static bool printWithoutType(const Value
&V
, raw_ostream
&O
,
5122 SlotTracker
*Machine
, const Module
*M
) {
5123 if (V
.hasName() || isa
<GlobalValue
>(V
) ||
5124 (!isa
<Constant
>(V
) && !isa
<MetadataAsValue
>(V
))) {
5125 AsmWriterContext
WriterCtx(nullptr, Machine
, M
);
5126 WriteAsOperandInternal(O
, &V
, WriterCtx
);
5132 static void printAsOperandImpl(const Value
&V
, raw_ostream
&O
, bool PrintType
,
5133 ModuleSlotTracker
&MST
) {
5134 TypePrinting
TypePrinter(MST
.getModule());
5136 TypePrinter
.print(V
.getType(), O
);
5140 AsmWriterContext
WriterCtx(&TypePrinter
, MST
.getMachine(), MST
.getModule());
5141 WriteAsOperandInternal(O
, &V
, WriterCtx
);
5144 void Value::printAsOperand(raw_ostream
&O
, bool PrintType
,
5145 const Module
*M
) const {
5147 M
= getModuleFromVal(this);
5150 if (printWithoutType(*this, O
, nullptr, M
))
5153 SlotTracker
Machine(
5154 M
, /* ShouldInitializeAllMetadata */ isa
<MetadataAsValue
>(this));
5155 ModuleSlotTracker
MST(Machine
, M
);
5156 printAsOperandImpl(*this, O
, PrintType
, MST
);
5159 void Value::printAsOperand(raw_ostream
&O
, bool PrintType
,
5160 ModuleSlotTracker
&MST
) const {
5162 if (printWithoutType(*this, O
, MST
.getMachine(), MST
.getModule()))
5165 printAsOperandImpl(*this, O
, PrintType
, MST
);
5168 /// Recursive version of printMetadataImpl.
5169 static void printMetadataImplRec(raw_ostream
&ROS
, const Metadata
&MD
,
5170 AsmWriterContext
&WriterCtx
) {
5171 formatted_raw_ostream
OS(ROS
);
5172 WriteAsOperandInternal(OS
, &MD
, WriterCtx
, /* FromValue */ true);
5174 auto *N
= dyn_cast
<MDNode
>(&MD
);
5175 if (!N
|| isa
<DIExpression
>(MD
))
5179 WriteMDNodeBodyInternal(OS
, N
, WriterCtx
);
5183 struct MDTreeAsmWriterContext
: public AsmWriterContext
{
5185 // {Level, Printed string}
5186 using EntryTy
= std::pair
<unsigned, std::string
>;
5187 SmallVector
<EntryTy
, 4> Buffer
;
5189 // Used to break the cycle in case there is any.
5190 SmallPtrSet
<const Metadata
*, 4> Visited
;
5192 raw_ostream
&MainOS
;
5194 MDTreeAsmWriterContext(TypePrinting
*TP
, SlotTracker
*ST
, const Module
*M
,
5195 raw_ostream
&OS
, const Metadata
*InitMD
)
5196 : AsmWriterContext(TP
, ST
, M
), Level(0U), Visited({InitMD
}), MainOS(OS
) {}
5198 void onWriteMetadataAsOperand(const Metadata
*MD
) override
{
5199 if (!Visited
.insert(MD
).second
)
5203 raw_string_ostream
SS(Str
);
5205 // A placeholder entry to memorize the correct
5206 // position in buffer.
5207 Buffer
.emplace_back(std::make_pair(Level
, ""));
5208 unsigned InsertIdx
= Buffer
.size() - 1;
5210 printMetadataImplRec(SS
, *MD
, *this);
5211 Buffer
[InsertIdx
].second
= std::move(SS
.str());
5215 ~MDTreeAsmWriterContext() {
5216 for (const auto &Entry
: Buffer
) {
5218 unsigned NumIndent
= Entry
.first
* 2U;
5219 MainOS
.indent(NumIndent
) << Entry
.second
;
5223 } // end anonymous namespace
5225 static void printMetadataImpl(raw_ostream
&ROS
, const Metadata
&MD
,
5226 ModuleSlotTracker
&MST
, const Module
*M
,
5227 bool OnlyAsOperand
, bool PrintAsTree
= false) {
5228 formatted_raw_ostream
OS(ROS
);
5230 TypePrinting
TypePrinter(M
);
5232 std::unique_ptr
<AsmWriterContext
> WriterCtx
;
5233 if (PrintAsTree
&& !OnlyAsOperand
)
5234 WriterCtx
= std::make_unique
<MDTreeAsmWriterContext
>(
5235 &TypePrinter
, MST
.getMachine(), M
, OS
, &MD
);
5238 std::make_unique
<AsmWriterContext
>(&TypePrinter
, MST
.getMachine(), M
);
5240 WriteAsOperandInternal(OS
, &MD
, *WriterCtx
, /* FromValue */ true);
5242 auto *N
= dyn_cast
<MDNode
>(&MD
);
5243 if (OnlyAsOperand
|| !N
|| isa
<DIExpression
>(MD
))
5247 WriteMDNodeBodyInternal(OS
, N
, *WriterCtx
);
5250 void Metadata::printAsOperand(raw_ostream
&OS
, const Module
*M
) const {
5251 ModuleSlotTracker
MST(M
, isa
<MDNode
>(this));
5252 printMetadataImpl(OS
, *this, MST
, M
, /* OnlyAsOperand */ true);
5255 void Metadata::printAsOperand(raw_ostream
&OS
, ModuleSlotTracker
&MST
,
5256 const Module
*M
) const {
5257 printMetadataImpl(OS
, *this, MST
, M
, /* OnlyAsOperand */ true);
5260 void Metadata::print(raw_ostream
&OS
, const Module
*M
,
5261 bool /*IsForDebug*/) const {
5262 ModuleSlotTracker
MST(M
, isa
<MDNode
>(this));
5263 printMetadataImpl(OS
, *this, MST
, M
, /* OnlyAsOperand */ false);
5266 void Metadata::print(raw_ostream
&OS
, ModuleSlotTracker
&MST
,
5267 const Module
*M
, bool /*IsForDebug*/) const {
5268 printMetadataImpl(OS
, *this, MST
, M
, /* OnlyAsOperand */ false);
5271 void MDNode::printTree(raw_ostream
&OS
, const Module
*M
) const {
5272 ModuleSlotTracker
MST(M
, true);
5273 printMetadataImpl(OS
, *this, MST
, M
, /* OnlyAsOperand */ false,
5274 /*PrintAsTree=*/true);
5277 void MDNode::printTree(raw_ostream
&OS
, ModuleSlotTracker
&MST
,
5278 const Module
*M
) const {
5279 printMetadataImpl(OS
, *this, MST
, M
, /* OnlyAsOperand */ false,
5280 /*PrintAsTree=*/true);
5283 void ModuleSummaryIndex::print(raw_ostream
&ROS
, bool IsForDebug
) const {
5284 SlotTracker
SlotTable(this);
5285 formatted_raw_ostream
OS(ROS
);
5286 AssemblyWriter
W(OS
, SlotTable
, this, IsForDebug
);
5287 W
.printModuleSummaryIndex();
5290 void ModuleSlotTracker::collectMDNodes(MachineMDNodeListType
&L
, unsigned LB
,
5291 unsigned UB
) const {
5292 SlotTracker
*ST
= MachineStorage
.get();
5296 for (auto &I
: llvm::make_range(ST
->mdn_begin(), ST
->mdn_end()))
5297 if (I
.second
>= LB
&& I
.second
< UB
)
5298 L
.push_back(std::make_pair(I
.second
, I
.first
));
5301 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
5302 // Value::dump - allow easy printing of Values from the debugger.
5304 void Value::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5306 // Value::dump - allow easy printing of Values from the debugger.
5308 void DbgMarker::dump() const {
5309 print(dbgs(), /*IsForDebug=*/true);
5313 // Value::dump - allow easy printing of Values from the debugger.
5315 void DbgRecord::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5317 // Type::dump - allow easy printing of Types from the debugger.
5319 void Type::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }
5321 // Module::dump() - Allow printing of Modules from the debugger.
5323 void Module::dump() const {
5324 print(dbgs(), nullptr,
5325 /*ShouldPreserveUseListOrder=*/false, /*IsForDebug=*/true);
5328 // Allow printing of Comdats from the debugger.
5330 void Comdat::dump() const { print(dbgs(), /*IsForDebug=*/true); }
5332 // NamedMDNode::dump() - Allow printing of NamedMDNodes from the debugger.
5334 void NamedMDNode::dump() const { print(dbgs(), /*IsForDebug=*/true); }
5337 void Metadata::dump() const { dump(nullptr); }
5340 void Metadata::dump(const Module
*M
) const {
5341 print(dbgs(), M
, /*IsForDebug=*/true);
5346 void MDNode::dumpTree() const { dumpTree(nullptr); }
5349 void MDNode::dumpTree(const Module
*M
) const {
5350 printTree(dbgs(), M
);
5354 // Allow printing of ModuleSummaryIndex from the debugger.
5356 void ModuleSummaryIndex::dump() const { print(dbgs(), /*IsForDebug=*/true); }