LLVM 22.0.0git
AsmPrinter.h
Go to the documentation of this file.
1//===- llvm/CodeGen/AsmPrinter.h - AsmPrinter Framework ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains a class to be used as the base class for target specific
10// asm writers. This class primarily handles common functionality used by
11// all asm writers.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_ASMPRINTER_H
16#define LLVM_CODEGEN_ASMPRINTER_H
17
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/MapVector.h"
28#include "llvm/IR/InlineAsm.h"
31#include <cstdint>
32#include <memory>
33#include <utility>
34#include <vector>
35
36namespace llvm {
37
38class AddrLabelMap;
40class BasicBlock;
41class BlockAddress;
42class Constant;
43class ConstantArray;
44class ConstantPtrAuth;
45class DataLayout;
47class DIE;
48class DIEAbbrev;
49class DwarfDebug;
50class EHStreamer;
52class GCStrategy;
53class GlobalAlias;
54class GlobalObject;
55class GlobalValue;
56class GlobalVariable;
60class MachineFunction;
61class MachineInstr;
63class MachineLoopInfo;
66class MCAsmInfo;
68class MCContext;
69class MCExpr;
70class MCInst;
71class MCSection;
72class MCStreamer;
73class MCSubtargetInfo;
74class MCSymbol;
75class MCTargetOptions;
76class MDNode;
77class Module;
79class raw_ostream;
80class StringRef;
82class TargetMachine;
83class Twine;
84
85namespace remarks {
86class RemarkStreamer;
87}
88
89/// This class is intended to be used as a driving class for all asm writers.
91public:
92 /// Target machine description.
94
95 /// Target Asm Printer information.
96 const MCAsmInfo *MAI = nullptr;
97
98 /// This is the context for the output file that we are streaming. This owns
99 /// all of the global MC-related objects for the generated translation unit.
101
102 /// This is the MCStreamer object for the file we are generating. This
103 /// contains the transient state for the current translation unit that we are
104 /// generating (such as the current section etc).
105 std::unique_ptr<MCStreamer> OutStreamer;
106
107 /// The current machine function.
108 MachineFunction *MF = nullptr;
109
110 /// This is a pointer to the current MachineModuleInfo.
112
113 /// This is a pointer to the current MachineDominatorTree.
115
116 /// This is a pointer to the current MachineLoopInfo.
118
119 /// Optimization remark emitter.
121
122 /// The symbol for the entry in __patchable_function_entires.
124
125 /// The symbol for the current function. This is recalculated at the beginning
126 /// of each call to runOnMachineFunction().
128
129 /// The symbol for the current function descriptor on AIX. This is created
130 /// at the beginning of each call to SetupMachineFunction().
132
133 /// The symbol used to represent the start of the current function for the
134 /// purpose of calculating its size (e.g. using the .size directive). By
135 /// default, this is equal to CurrentFnSym.
137
138 /// Vector of symbols marking the end of the callsites in the current
139 /// function, keyed by their containing basic block.
140 /// The callsite symbols of each block are stored in the order they appear
141 /// in that block.
144
145 /// Provides the profile information for constants.
146 const StaticDataProfileInfo *SDPI = nullptr;
147
148 /// The profile summary information.
149 const ProfileSummaryInfo *PSI = nullptr;
150
151 /// Map a basic block section ID to the begin and end symbols of that section
152 /// which determine the section's range.
156
158
159 /// Map global GOT equivalent MCSymbols to GlobalVariables and keep track of
160 /// its number of uses by other globals.
161 using GOTEquivUsePair = std::pair<const GlobalVariable *, unsigned>;
163
164 // Flags representing which CFI section is required for a function/module.
165 enum class CFISection : unsigned {
166 None = 0, ///< Do not emit either .eh_frame or .debug_frame
167 EH = 1, ///< Emit .eh_frame
168 Debug = 2 ///< Emit .debug_frame
169 };
170
171private:
172 MCSymbol *CurrentFnEnd = nullptr;
173
174 /// Map a basic block section ID to the exception symbol associated with that
175 /// section. Map entries are assigned and looked up via
176 /// AsmPrinter::getMBBExceptionSym.
177 DenseMap<MBBSectionID, MCSymbol *> MBBSectionExceptionSyms;
178
179 // The symbol used to represent the start of the current BB section of the
180 // function. This is used to calculate the size of the BB section.
181 MCSymbol *CurrentSectionBeginSym = nullptr;
182
183 /// This map keeps track of which symbol is being used for the specified basic
184 /// block's address of label.
185 std::unique_ptr<AddrLabelMap> AddrLabelSymbols;
186
187 /// The garbage collection metadata printer table.
189
190 /// Emit comments in assembly output if this is true.
191 bool VerboseAsm;
192
193 /// Store symbols and type identifiers used to create callgraph section
194 /// entries related to a function.
195 struct FunctionInfo {
196 /// Numeric type identifier used in callgraph section for indirect calls
197 /// and targets.
198 using CGTypeId = uint64_t;
199
200 /// Enumeration of function kinds, and their mapping to function kind values
201 /// stored in callgraph section entries.
202 /// Must match the enum in llvm/tools/llvm-objdump/llvm-objdump.cpp.
203 enum class FunctionKind : uint64_t {
204 /// Function cannot be target to indirect calls.
205 NOT_INDIRECT_TARGET = 0,
206
207 /// Function may be target to indirect calls but its type id is unknown.
208 INDIRECT_TARGET_UNKNOWN_TID = 1,
209
210 /// Function may be target to indirect calls and its type id is known.
211 INDIRECT_TARGET_KNOWN_TID = 2,
212 };
213
214 /// Map type identifiers to callsite labels. Labels are generated for each
215 /// indirect callsite in the function.
216 SmallVector<std::pair<CGTypeId, MCSymbol *>> CallSiteLabels;
217 };
218
219 enum CallGraphSectionFormatVersion : uint64_t {
220 V_0 = 0,
221 };
222
223 /// Output stream for the stack usage file (i.e., .su file).
224 std::unique_ptr<raw_fd_ostream> StackUsageStream;
225
226 /// List of symbols to be inserted into PC sections.
227 DenseMap<const MDNode *, SmallVector<const MCSymbol *>> PCSectionsSymbols;
228
229 static char ID;
230
231protected:
233
234 /// For dso_local functions, the current $local alias for the function.
236
237 /// A handle to the EH info emitter (if present).
238 // Only for EHStreamer subtypes, but some C++ compilers will incorrectly warn
239 // us if we declare that directly.
241
242 // A vector of all Debuginfo emitters we should use. Protected so that
243 // targets can add their own. This vector maintains ownership of the
244 // emitters.
246 size_t NumUserHandlers = 0;
247
249
250private:
251 /// If generated on the fly this own the instance.
252 std::unique_ptr<MachineDominatorTree> OwnedMDT;
253
254 /// If generated on the fly this own the instance.
255 std::unique_ptr<MachineLoopInfo> OwnedMLI;
256
257 /// If the target supports dwarf debug info, this pointer is non-null.
258 DwarfDebug *DD = nullptr;
259
260 /// A handler that supports pseudo probe emission with embedded inline
261 /// context.
262 std::unique_ptr<PseudoProbeHandler> PP;
263
264 /// CFISection type the module needs i.e. either .eh_frame or .debug_frame.
265 CFISection ModuleCFISection = CFISection::None;
266
267 /// True if the module contains split-stack functions. This is used to
268 /// emit .note.GNU-split-stack section as required by the linker for
269 /// special handling split-stack function calling no-split-stack function.
270 bool HasSplitStack = false;
271
272 /// True if the module contains no-split-stack functions. This is used to emit
273 /// .note.GNU-no-split-stack section when it also contains functions without a
274 /// split stack prologue.
275 bool HasNoSplitStack = false;
276
277 /// True if debugging information is available in this module.
278 bool DbgInfoAvailable = false;
279
280protected:
281 AsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer,
282 char &ID = AsmPrinter::ID);
283
284public:
285 ~AsmPrinter() override;
286
287 DwarfDebug *getDwarfDebug() { return DD; }
288 DwarfDebug *getDwarfDebug() const { return DD; }
289
290 uint16_t getDwarfVersion() const;
291 void setDwarfVersion(uint16_t Version);
292
293 bool isDwarf64() const;
294
295 /// Returns 4 for DWARF32 and 8 for DWARF64.
296 unsigned int getDwarfOffsetByteSize() const;
297
298 /// Returns 4 for DWARF32 and 12 for DWARF64.
299 unsigned int getUnitLengthFieldByteSize() const;
300
301 /// Returns information about the byte size of DW_FORM values.
302 dwarf::FormParams getDwarfFormParams() const;
303
304 bool isPositionIndependent() const;
305
306 /// Return true if assembly output should contain comments.
307 bool isVerbose() const { return VerboseAsm; }
308
309 /// Return a unique ID for the current function.
310 unsigned getFunctionNumber() const;
311
312 /// Return symbol for the function pseudo stack if the stack frame is not a
313 /// register based.
314 virtual const MCSymbol *getFunctionFrameSymbol() const { return nullptr; }
315
317 MCSymbol *getFunctionEnd() const { return CurrentFnEnd; }
318
319 // Return the exception symbol associated with the MBB section containing a
320 // given basic block.
321 MCSymbol *getMBBExceptionSym(const MachineBasicBlock &MBB);
322
323 /// Return the symbol to be used for the specified basic block when its
324 /// address is taken. This cannot be its normal LBB label because the block
325 /// may be accessed outside its containing function.
327 return getAddrLabelSymbolToEmit(BB).front();
328 }
329
330 /// Return the symbol to be used for the specified basic block when its
331 /// address is taken. If other blocks were RAUW'd to this one, we may have
332 /// to emit them as well, return the whole set.
333 ArrayRef<MCSymbol *> getAddrLabelSymbolToEmit(const BasicBlock *BB);
334
335 /// Creates a new symbol to be used for the end of a callsite at the specified
336 /// basic block.
337 MCSymbol *createCallsiteEndSymbol(const MachineBasicBlock &MBB);
338
339 /// If the specified function has had any references to address-taken blocks
340 /// generated, but the block got deleted, return the symbol now so we can
341 /// emit it. This prevents emitting a reference to a symbol that has no
342 /// definition.
343 void takeDeletedSymbolsForFunction(const Function *F,
344 std::vector<MCSymbol *> &Result);
345
346 /// Return information about object file lowering.
347 const TargetLoweringObjectFile &getObjFileLowering() const;
348
349 /// Return information about data layout.
350 const DataLayout &getDataLayout() const;
351
352 /// Return the pointer size from the TargetMachine
353 unsigned getPointerSize() const;
354
355 /// Return information about subtarget.
356 const MCSubtargetInfo &getSubtargetInfo() const;
357
358 void EmitToStreamer(MCStreamer &S, const MCInst &Inst);
359
360 /// Emits inital debug location directive.
361 void emitInitialRawDwarfLocDirective(const MachineFunction &MF);
362
363 /// Return the current section we are emitting to.
364 const MCSection *getCurrentSection() const;
365
366 void getNameWithPrefix(SmallVectorImpl<char> &Name,
367 const GlobalValue *GV) const;
368
369 MCSymbol *getSymbol(const GlobalValue *GV) const;
370
371 /// Similar to getSymbol() but preferred for references. On ELF, this uses a
372 /// local symbol if a reference to GV is guaranteed to be resolved to the
373 /// definition in the same module.
374 MCSymbol *getSymbolPreferLocal(const GlobalValue &GV) const;
375
377 return DwarfUsesRelocationsAcrossSections;
378 }
379
381 DwarfUsesRelocationsAcrossSections = Enable;
382 }
383
384 /// Returns a section suffix (hot or unlikely) for the constant if profiles
385 /// are available. Returns empty string otherwise.
386 StringRef getConstantSectionSuffix(const Constant *C) const;
387
388 /// Generate and emit labels for callees of the indirect callsites which will
389 /// be used to populate the .callgraph section.
390 void emitIndirectCalleeLabels(
391 FunctionInfo &FuncInfo,
392 const MachineFunction::CallSiteInfoMap &CallSitesInfoMap,
393 const MachineInstr &MI);
394
395 //===------------------------------------------------------------------===//
396 // XRay instrumentation implementation.
397 //===------------------------------------------------------------------===//
398public:
399 // This describes the kind of sled we're storing in the XRay table.
408
409 // The table will contain these structs that point to the sled, the function
410 // containing the sled, and what kind of sled (and whether they should always
411 // be instrumented). We also use a version identifier that the runtime can use
412 // to decide what to do with the sled, depending on the version of the sled.
418 const class Function *Fn;
420
421 LLVM_ABI void emit(int, MCStreamer *) const;
422 };
423
424 // All the sleds to be emitted.
426
427 // Helper function to record a given XRay sled.
428 void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind,
429 uint8_t Version = 0);
430
431 /// Emit a table with all XRay instrumentation points.
432 void emitXRayTable();
433
435
436 //===------------------------------------------------------------------===//
437 // MachineFunctionPass Implementation.
438 //===------------------------------------------------------------------===//
439
440 /// Record analysis usage.
441 void getAnalysisUsage(AnalysisUsage &AU) const override;
442
443 /// Set up the AsmPrinter when we are working on a new module. If your pass
444 /// overrides this, it must make sure to explicitly call this implementation.
445 bool doInitialization(Module &M) override;
446
447 /// Shut down the asmprinter. If you override this in your pass, you must make
448 /// sure to call it explicitly.
449 bool doFinalization(Module &M) override;
450
451 /// Emit the specified function out to the OutStreamer.
455 return false;
456 }
457
458 //===------------------------------------------------------------------===//
459 // Coarse grained IR lowering routines.
460 //===------------------------------------------------------------------===//
461
462 /// This should be called when a new MachineFunction is being processed from
463 /// runOnMachineFunction.
464 virtual void SetupMachineFunction(MachineFunction &MF);
465
466 /// This method emits the body and trailer for a function.
467 void emitFunctionBody();
468
469 void emitCFIInstruction(const MachineInstr &MI);
470
471 void emitFrameAlloc(const MachineInstr &MI);
472
473 void emitStackSizeSection(const MachineFunction &MF);
474
475 void emitStackUsage(const MachineFunction &MF);
476
477 void emitBBAddrMapSection(const MachineFunction &MF);
478
479 void emitKCFITrapEntry(const MachineFunction &MF, const MCSymbol *Symbol);
480 virtual void emitKCFITypeId(const MachineFunction &MF);
481
482 void emitCallGraphSection(const MachineFunction &MF, FunctionInfo &FuncInfo);
483
484 void emitPseudoProbe(const MachineInstr &MI);
485
486 void emitRemarksSection(remarks::RemarkStreamer &RS);
487
488 /// Emits a label as reference for PC sections.
489 void emitPCSectionsLabel(const MachineFunction &MF, const MDNode &MD);
490
491 /// Emits the PC sections collected from instructions.
492 void emitPCSections(const MachineFunction &MF);
493
494 /// Get the CFISection type for a function.
495 CFISection getFunctionCFISectionType(const Function &F) const;
496
497 /// Get the CFISection type for a function.
498 CFISection getFunctionCFISectionType(const MachineFunction &MF) const;
499
500 /// Get the CFISection type for the module.
501 CFISection getModuleCFISectionType() const { return ModuleCFISection; }
502
503 /// Returns true if valid debug info is present.
504 bool hasDebugInfo() const { return DbgInfoAvailable; }
505
506 bool needsSEHMoves();
507
508 /// Since emitting CFI unwind information is entangled with supporting the
509 /// exceptions, this returns true for platforms which use CFI unwind
510 /// information for other purposes (debugging, sanitizers, ...) when
511 /// `MCAsmInfo::ExceptionsType == ExceptionHandling::None`.
512 bool usesCFIWithoutEH() const;
513
514 /// Print to the current output stream assembly representations of the
515 /// constants in the constant pool MCP. This is used to print out constants
516 /// which have been "spilled to memory" by the code generator.
517 virtual void emitConstantPool();
518
519 /// Print assembly representations of the jump tables used by the current
520 /// function to the current output stream.
521 virtual void emitJumpTableInfo();
522
523 /// Emit the specified global variable to the .s file.
524 virtual void emitGlobalVariable(const GlobalVariable *GV);
525
526 /// Check to see if the specified global is a special global used by LLVM. If
527 /// so, emit it and return true, otherwise do nothing and return false.
528 bool emitSpecialLLVMGlobal(const GlobalVariable *GV);
529
530 /// `llvm.global_ctors` and `llvm.global_dtors` are arrays of Structor
531 /// structs.
532 ///
533 /// Priority - init priority
534 /// Func - global initialization or global clean-up function
535 /// ComdatKey - associated data
536 struct Structor {
537 int Priority = 0;
538 Constant *Func = nullptr;
540
541 Structor() = default;
542 };
543
544 /// This method gathers an array of Structors and then sorts them out by
545 /// Priority.
546 /// @param List The initializer of `llvm.global_ctors` or `llvm.global_dtors`
547 /// array.
548 /// @param[out] Structors Sorted Structor structs by Priority.
550 SmallVector<Structor, 8> &Structors);
551
552 /// This method emits `llvm.global_ctors` or `llvm.global_dtors` list.
553 virtual void emitXXStructorList(const DataLayout &DL, const Constant *List,
554 bool IsCtor);
555
556 /// Emit an alignment directive to the specified power of two boundary. If a
557 /// global value is specified, and if that global has an explicit alignment
558 /// requested, it will override the alignment request if required for
559 /// correctness.
560 void emitAlignment(Align Alignment, const GlobalObject *GV = nullptr,
561 unsigned MaxBytesToEmit = 0) const;
562
563 /// Lower the specified LLVM Constant to an MCExpr.
564 /// When BaseCV is present, we are lowering the element at BaseCV plus Offset.
565 virtual const MCExpr *lowerConstant(const Constant *CV,
566 const Constant *BaseCV = nullptr,
567 uint64_t Offset = 0);
568
569 /// Print a general LLVM constant to the .s file.
570 /// On AIX, when an alias refers to a sub-element of a global variable, the
571 /// label of that alias needs to be emitted before the corresponding element.
573 void emitGlobalConstant(const DataLayout &DL, const Constant *CV,
574 AliasMapTy *AliasList = nullptr);
575
576 /// Unnamed constant global variables solely contaning a pointer to
577 /// another globals variable act like a global variable "proxy", or GOT
578 /// equivalents, i.e., it's only used to hold the address of the latter. One
579 /// optimization is to replace accesses to these proxies by using the GOT
580 /// entry for the final global instead. Hence, we select GOT equivalent
581 /// candidates among all the module global variables, avoid emitting them
582 /// unnecessarily and finally replace references to them by pc relative
583 /// accesses to GOT entries.
585
586 /// Constant expressions using GOT equivalent globals may not be
587 /// eligible for PC relative GOT entry conversion, in such cases we need to
588 /// emit the proxies we previously omitted in EmitGlobalVariable.
589 void emitGlobalGOTEquivs();
590
591 /// Emit the stack maps.
592 void emitStackMaps();
593
594 //===------------------------------------------------------------------===//
595 // Overridable Hooks
596 //===------------------------------------------------------------------===//
597
598 void addAsmPrinterHandler(std::unique_ptr<AsmPrinterHandler> Handler);
599
600 // Targets can, or in the case of EmitInstruction, must implement these to
601 // customize output.
602
603 /// This virtual method can be overridden by targets that want to emit
604 /// something at the start of their file.
605 virtual void emitStartOfAsmFile(Module &) {}
606
607 /// This virtual method can be overridden by targets that want to emit
608 /// something at the end of their file.
609 virtual void emitEndOfAsmFile(Module &) {}
610
611 /// Targets can override this to emit stuff before the first basic block in
612 /// the function.
613 virtual void emitFunctionBodyStart() {}
614
615 /// Targets can override this to emit stuff after the last basic block in the
616 /// function.
617 virtual void emitFunctionBodyEnd() {}
618
619 /// Targets can override this to emit stuff at the start of a basic block.
620 /// By default, this method prints the label for the specified
621 /// MachineBasicBlock, an alignment (if present) and a comment describing it
622 /// if appropriate.
623 virtual void emitBasicBlockStart(const MachineBasicBlock &MBB);
624
625 /// Targets can override this to emit stuff at the end of a basic block.
626 virtual void emitBasicBlockEnd(const MachineBasicBlock &MBB);
627
628 /// Targets should implement this to emit instructions.
629 virtual void emitInstruction(const MachineInstr *) {
630 llvm_unreachable("EmitInstruction not implemented");
631 }
632
633 /// Return the symbol for the specified constant pool entry.
634 virtual MCSymbol *GetCPISymbol(unsigned CPID) const;
635
636 virtual void emitFunctionEntryLabel();
637
638 virtual void emitFunctionDescriptor() {
639 llvm_unreachable("Function descriptor is target-specific.");
640 }
641
642 virtual void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
643
644 /// Targets can override this to change how global constants that are part of
645 /// a C++ static/global constructor list are emitted.
646 virtual void emitXXStructor(const DataLayout &DL, const Constant *CV) {
648 }
649
650 virtual const MCExpr *lowerConstantPtrAuth(const ConstantPtrAuth &CPA) {
651 report_fatal_error("ptrauth constant lowering not implemented");
652 }
653
654 /// Lower the specified BlockAddress to an MCExpr.
655 virtual const MCExpr *lowerBlockAddressConstant(const BlockAddress &BA);
656
657 /// Return true if the basic block has exactly one predecessor and the control
658 /// transfer mechanism between the predecessor and this block is a
659 /// fall-through.
660 virtual bool
661 isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const;
662
663 /// Targets can override this to customize the output of IMPLICIT_DEF
664 /// instructions in verbose mode.
665 virtual void emitImplicitDef(const MachineInstr *MI) const;
666
667 /// getSubtargetInfo() cannot be used where this is needed because we don't
668 /// have a MachineFunction when we're lowering a GlobalIFunc, and
669 /// getSubtargetInfo requires one. Override the implementation in targets
670 /// that support the Mach-O IFunc lowering.
672 return nullptr;
673 }
674
675 virtual void emitMachOIFuncStubBody(Module &M, const GlobalIFunc &GI,
676 MCSymbol *LazyPointer) {
678 "Mach-O IFunc lowering is not yet supported on this target");
679 }
680
682 MCSymbol *LazyPointer) {
684 "Mach-O IFunc lowering is not yet supported on this target");
685 }
686
687 /// Emit N NOP instructions.
688 void emitNops(unsigned N);
689
690 //===------------------------------------------------------------------===//
691 // Symbol Lowering Routines.
692 //===------------------------------------------------------------------===//
693
694 MCSymbol *createTempSymbol(const Twine &Name) const;
695
696 /// Return the MCSymbol for a private symbol with global value name as its
697 /// base, with the specified suffix.
698 MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV,
699 StringRef Suffix) const;
700
701 /// Return the MCSymbol for the specified ExternalSymbol.
702 MCSymbol *GetExternalSymbolSymbol(const Twine &Sym) const;
703
704 /// Return the symbol for the specified jump table entry.
705 MCSymbol *GetJTISymbol(unsigned JTID, bool isLinkerPrivate = false) const;
706
707 /// Return the symbol for the specified jump table .set
708 /// FIXME: privatize to AsmPrinter.
709 MCSymbol *GetJTSetSymbol(unsigned UID, unsigned MBBID) const;
710
711 /// Return the MCSymbol used to satisfy BlockAddress uses of the specified
712 /// basic block.
713 MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const;
714 MCSymbol *GetBlockAddressSymbol(const BasicBlock *BB) const;
715
716 //===------------------------------------------------------------------===//
717 // Emission Helper Routines.
718 //===------------------------------------------------------------------===//
719
720 /// This is just convenient handler for printing offsets.
721 void printOffset(int64_t Offset, raw_ostream &OS) const;
722
723 /// Emit a byte directive and value.
724 void emitInt8(int Value) const;
725
726 /// Emit a short directive and value.
727 void emitInt16(int Value) const;
728
729 /// Emit a long directive and value.
730 void emitInt32(int Value) const;
731
732 /// Emit a long long directive and value.
733 void emitInt64(uint64_t Value) const;
734
735 /// Emit the specified signed leb128 value.
736 void emitSLEB128(int64_t Value, const char *Desc = nullptr) const;
737
738 /// Emit the specified unsigned leb128 value.
739 void emitULEB128(uint64_t Value, const char *Desc = nullptr,
740 unsigned PadTo = 0) const;
741
742 /// Emit something like ".long Hi-Lo" where the size in bytes of the directive
743 /// is specified by Size and Hi/Lo specify the labels. This implicitly uses
744 /// .set if it is available.
745 void emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
746 unsigned Size) const;
747
748 /// Emit something like ".uleb128 Hi-Lo".
749 void emitLabelDifferenceAsULEB128(const MCSymbol *Hi,
750 const MCSymbol *Lo) const;
751
752 /// Emit something like ".long Label+Offset" where the size in bytes of the
753 /// directive is specified by Size and Label specifies the label. This
754 /// implicitly uses .set if it is available.
755 void emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset,
756 unsigned Size, bool IsSectionRelative = false) const;
757
758 /// Emit something like ".long Label" where the size in bytes of the directive
759 /// is specified by Size and Label specifies the label.
760 void emitLabelReference(const MCSymbol *Label, unsigned Size,
761 bool IsSectionRelative = false) const {
762 emitLabelPlusOffset(Label, 0, Size, IsSectionRelative);
763 }
764
765 //===------------------------------------------------------------------===//
766 // Dwarf Emission Helper Routines
767 //===------------------------------------------------------------------===//
768
769 /// Emit a .byte 42 directive that corresponds to an encoding. If verbose
770 /// assembly output is enabled, we output comments describing the encoding.
771 /// Desc is a string saying what the encoding is specifying (e.g. "LSDA").
772 void emitEncodingByte(unsigned Val, const char *Desc = nullptr) const;
773
774 /// Return the size of the encoding in bytes.
775 unsigned GetSizeOfEncodedValue(unsigned Encoding) const;
776
777 /// Emit reference to a ttype global with a specified encoding.
778 virtual void emitTTypeReference(const GlobalValue *GV, unsigned Encoding);
779
780 /// Emit a reference to a symbol for use in dwarf. Different object formats
781 /// represent this in different ways. Some use a relocation others encode
782 /// the label offset in its section.
783 void emitDwarfSymbolReference(const MCSymbol *Label,
784 bool ForceOffset = false) const;
785
786 /// Emit the 4- or 8-byte offset of a string from the start of its section.
787 ///
788 /// When possible, emit a DwarfStringPool section offset without any
789 /// relocations, and without using the symbol. Otherwise, defers to \a
790 /// emitDwarfSymbolReference().
791 ///
792 /// The length of the emitted value depends on the DWARF format.
793 void emitDwarfStringOffset(DwarfStringPoolEntry S) const;
794
795 /// Emit the 4-or 8-byte offset of a string from the start of its section.
799
800 /// Emit something like ".long Label + Offset" or ".quad Label + Offset"
801 /// depending on the DWARF format.
802 void emitDwarfOffset(const MCSymbol *Label, uint64_t Offset) const;
803
804 /// Emit 32- or 64-bit value depending on the DWARF format.
805 void emitDwarfLengthOrOffset(uint64_t Value) const;
806
807 /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
808 /// according to the settings.
809 void emitDwarfUnitLength(uint64_t Length, const Twine &Comment) const;
810
811 /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
812 /// according to the settings.
813 /// Return the end symbol generated inside, the caller needs to emit it.
814 MCSymbol *emitDwarfUnitLength(const Twine &Prefix,
815 const Twine &Comment) const;
816
817 /// Emit reference to a call site with a specified encoding
818 void emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo,
819 unsigned Encoding) const;
820 /// Emit an integer value corresponding to the call site encoding
821 void emitCallSiteValue(uint64_t Value, unsigned Encoding) const;
822
823 /// Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified.
824 virtual unsigned getISAEncoding() { return 0; }
825
826 /// Emit the directive and value for debug thread local expression
827 ///
828 /// \p Value - The value to emit.
829 /// \p Size - The size of the integer (in bytes) to emit.
830 virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const;
831
832 //===------------------------------------------------------------------===//
833 // Dwarf Lowering Routines
834 //===------------------------------------------------------------------===//
835
836 /// Emit frame instruction to describe the layout of the frame.
837 void emitCFIInstruction(const MCCFIInstruction &Inst) const;
838
839 /// Emit Dwarf abbreviation table.
840 template <typename T> void emitDwarfAbbrevs(const T &Abbrevs) const {
841 // For each abbreviation.
842 for (const auto &Abbrev : Abbrevs)
843 emitDwarfAbbrev(*Abbrev);
844
845 // Mark end of abbreviations.
846 emitULEB128(0, "EOM(3)");
847 }
848
849 void emitDwarfAbbrev(const DIEAbbrev &Abbrev) const;
850
851 /// Recursively emit Dwarf DIE tree.
852 void emitDwarfDIE(const DIE &Die) const;
853
854 //===------------------------------------------------------------------===//
855 // CodeView Helper Routines
856 //===------------------------------------------------------------------===//
857
858 /// Gets information required to create a CodeView debug symbol for a jump
859 /// table.
860 /// Return value is <Base Address, Base Offset, Branch Address, Entry Size>
861 virtual std::tuple<const MCSymbol *, uint64_t, const MCSymbol *,
863 getCodeViewJumpTableInfo(int JTI, const MachineInstr *BranchInstr,
864 const MCSymbol *BranchLabel) const;
865
866 //===------------------------------------------------------------------===//
867 // COFF Helper Routines
868 //===------------------------------------------------------------------===//
869
870 /// Emits symbols and data to allow functions marked with the
871 /// loader-replaceable attribute to be replaceable.
872 void emitCOFFReplaceableFunctionData(Module &M);
873
874 /// Emits the @feat.00 symbol indicating the features enabled in this module.
875 void emitCOFFFeatureSymbol(Module &M);
876
877 //===------------------------------------------------------------------===//
878 // Inline Asm Support
879 //===------------------------------------------------------------------===//
880
881 // These are hooks that targets can override to implement inline asm
882 // support. These should probably be moved out of AsmPrinter someday.
883
884 /// Print information related to the specified machine instr that is
885 /// independent of the operand, and may be independent of the instr itself.
886 /// This can be useful for portably encoding the comment character or other
887 /// bits of target-specific knowledge into the asmstrings. The syntax used is
888 /// ${:comment}. Targets can override this to add support for their own
889 /// strange codes.
890 virtual void PrintSpecial(const MachineInstr *MI, raw_ostream &OS,
891 StringRef Code) const;
892
893 /// Print the MachineOperand as a symbol. Targets with complex handling of
894 /// symbol references should override the base implementation.
895 virtual void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &OS);
896
897 /// Print the specified operand of MI, an INLINEASM instruction, using the
898 /// specified assembler variant. Targets should override this to format as
899 /// appropriate. This method can return true if the operand is erroneous.
900 virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
901 const char *ExtraCode, raw_ostream &OS);
902
903 /// Print the specified operand of MI, an INLINEASM instruction, using the
904 /// specified assembler variant as an address. Targets should override this to
905 /// format as appropriate. This method can return true if the operand is
906 /// erroneous.
907 virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
908 const char *ExtraCode, raw_ostream &OS);
909
910 /// Let the target do anything it needs to do before emitting inlineasm.
911 /// \p StartInfo - the subtarget info before parsing inline asm
912 virtual void emitInlineAsmStart() const;
913
914 /// Let the target do anything it needs to do after emitting inlineasm.
915 /// This callback can be used restore the original mode in case the
916 /// inlineasm contains directives to switch modes.
917 /// \p StartInfo - the original subtarget info before inline asm
918 /// \p EndInfo - the final subtarget info after parsing the inline asm,
919 /// or NULL if the value is unknown.
920 virtual void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
921 const MCSubtargetInfo *EndInfo) const;
922
923 /// This emits visibility information about symbol, if this is supported by
924 /// the target.
925 void emitVisibility(MCSymbol *Sym, unsigned Visibility,
926 bool IsDefinition = true) const;
927
928 /// This emits linkage information about \p GVSym based on \p GV, if this is
929 /// supported by the target.
930 virtual void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const;
931
932 /// Return the alignment for the specified \p GV.
933 static Align getGVAlignment(const GlobalObject *GV, const DataLayout &DL,
934 Align InAlign = Align(1));
935
936private:
937 /// Private state for PrintSpecial()
938 // Assign a unique ID to this machine instruction.
939 mutable const MachineInstr *LastMI = nullptr;
940 mutable unsigned LastFn = 0;
941 mutable unsigned Counter = ~0U;
942
943 bool DwarfUsesRelocationsAcrossSections = false;
944
945 /// This method emits the header for the current function.
946 virtual void emitFunctionHeader();
947
948 /// This method emits a comment next to header for the current function.
949 virtual void emitFunctionHeaderComment();
950
951 /// This method emits prefix-like data before the current function.
952 void emitFunctionPrefix(ArrayRef<const Constant *> Prefix);
953
954 /// Emit a blob of inline asm to the output streamer.
955 void
957 const MCTargetOptions &MCOptions,
958 const MDNode *LocMDNode = nullptr,
959 InlineAsm::AsmDialect AsmDialect = InlineAsm::AD_ATT) const;
960
961 /// This method formats and emits the specified machine instruction that is an
962 /// inline asm.
963 void emitInlineAsm(const MachineInstr *MI) const;
964
965 /// Add inline assembly info to the diagnostics machinery, so we can
966 /// emit file and position info. Returns SrcMgr memory buffer position.
967 unsigned addInlineAsmDiagBuffer(StringRef AsmStr,
968 const MDNode *LocMDNode) const;
969
970 //===------------------------------------------------------------------===//
971 // Internal Implementation Details
972 //===------------------------------------------------------------------===//
973
974 virtual void emitJumpTableImpl(const MachineJumpTableInfo &MJTI,
975 ArrayRef<unsigned> JumpTableIndices);
976
977 void emitJumpTableSizesSection(const MachineJumpTableInfo &MJTI,
978 const Function &F) const;
979
980 void emitLLVMUsedList(const ConstantArray *InitList);
981 /// Emit llvm.ident metadata in an '.ident' directive.
982 void emitModuleIdents(Module &M);
983 /// Emit bytes for llvm.commandline metadata.
984 virtual void emitModuleCommandLines(Module &M);
985
986 GCMetadataPrinter *getOrCreateGCPrinter(GCStrategy &S);
987 void emitGlobalIFunc(Module &M, const GlobalIFunc &GI);
988
989 /// This method decides whether the specified basic block requires a label.
990 bool shouldEmitLabelForBasicBlock(const MachineBasicBlock &MBB) const;
991
992protected:
993 virtual void emitJumpTableEntry(const MachineJumpTableInfo &MJTI,
994 const MachineBasicBlock *MBB,
995 unsigned uid) const;
996 virtual void emitGlobalAlias(const Module &M, const GlobalAlias &GA);
998 return false;
999 }
1000};
1001
1002} // end namespace llvm
1003
1004#endif // LLVM_CODEGEN_ASMPRINTER_H
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define LLVM_ABI
Definition Compiler.h:213
static void emitConstantPool(MCStreamer &Streamer, MCSection *Section, ConstantPool &CP)
static std::optional< TypeSize > getPointerSize(const Value *V, const DataLayout &DL, const TargetLibraryInfo &TLI, const Function *F)
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
IRTranslator LLVM IR MI
static void emitEncodingByte(MCObjectStreamer &Streamer, unsigned Encoding)
Definition MCDwarf.cpp:1366
#define F(x, y, z)
Definition MD5.cpp:55
This file implements a map that provides insertion order iteration.
static void emitInlineAsm(LLVMContext &C, BasicBlock *BB, StringRef AsmText)
#define T
static SDValue lowerConstant(SDValue Op, SelectionDAG &DAG, const RISCVSubtarget &Subtarget)
This file defines the SmallVector class.
Represent the analysis usage information of a pass.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
Collects and handles AsmPrinter objects required to build debug or EH information.
virtual void emitInstruction(const MachineInstr *)
Targets should implement this to emit instructions.
Definition AsmPrinter.h:629
void emitULEB128(uint64_t Value, const char *Desc=nullptr, unsigned PadTo=0) const
Emit the specified unsigned leb128 value.
SmallVector< XRayFunctionEntry, 4 > Sleds
Definition AsmPrinter.h:425
MapVector< MBBSectionID, MBBSectionRange > MBBSectionRanges
Definition AsmPrinter.h:157
CFISection getModuleCFISectionType() const
Get the CFISection type for the module.
Definition AsmPrinter.h:501
MCSymbol * CurrentFnBegin
Definition AsmPrinter.h:232
MachineLoopInfo * MLI
This is a pointer to the current MachineLoopInfo.
Definition AsmPrinter.h:117
DwarfDebug * getDwarfDebug()
Definition AsmPrinter.h:287
virtual const MCExpr * lowerConstantPtrAuth(const ConstantPtrAuth &CPA)
Definition AsmPrinter.h:650
void emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset, unsigned Size, bool IsSectionRelative=false) const
Emit something like ".long Label+Offset" where the size in bytes of the directive is specified by Siz...
TargetMachine & TM
Target machine description.
Definition AsmPrinter.h:93
void emitXRayTable()
Emit a table with all XRay instrumentation points.
DenseMap< const MachineBasicBlock *, SmallVector< MCSymbol *, 1 > > CurrentFnCallsiteEndSymbols
Vector of symbols marking the end of the callsites in the current function, keyed by their containing...
Definition AsmPrinter.h:143
DwarfDebug * getDwarfDebug() const
Definition AsmPrinter.h:288
MCSymbol * CurrentFnDescSym
The symbol for the current function descriptor on AIX.
Definition AsmPrinter.h:131
MCSymbol * CurrentFnBeginLocal
For dso_local functions, the current $local alias for the function.
Definition AsmPrinter.h:235
MapVector< const MCSymbol *, GOTEquivUsePair > GlobalGOTEquivs
Definition AsmPrinter.h:162
void emitDwarfStringOffset(DwarfStringPoolEntry S) const
Emit the 4- or 8-byte offset of a string from the start of its section.
void emitGlobalGOTEquivs()
Constant expressions using GOT equivalent globals may not be eligible for PC relative GOT entry conve...
MCSymbol * getFunctionBegin() const
Definition AsmPrinter.h:316
virtual void emitMachOIFuncStubHelperBody(Module &M, const GlobalIFunc &GI, MCSymbol *LazyPointer)
Definition AsmPrinter.h:681
MCSymbol * getAddrLabelSymbol(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
Definition AsmPrinter.h:326
const MCAsmInfo * MAI
Target Asm Printer information.
Definition AsmPrinter.h:96
SmallVector< std::unique_ptr< AsmPrinterHandler >, 2 > Handlers
Definition AsmPrinter.h:245
MachineFunction * MF
The current machine function.
Definition AsmPrinter.h:108
void computeGlobalGOTEquivs(Module &M)
Unnamed constant global variables solely contaning a pointer to another globals variable act like a g...
virtual void SetupMachineFunction(MachineFunction &MF)
This should be called when a new MachineFunction is being processed from runOnMachineFunction.
void emitFunctionBody()
This method emits the body and trailer for a function.
MachineDominatorTree * MDT
This is a pointer to the current MachineDominatorTree.
Definition AsmPrinter.h:114
virtual void emitStartOfAsmFile(Module &)
This virtual method can be overridden by targets that want to emit something at the start of their fi...
Definition AsmPrinter.h:605
void emitStackMaps()
Emit the stack maps.
bool hasDebugInfo() const
Returns true if valid debug info is present.
Definition AsmPrinter.h:504
virtual void emitFunctionBodyStart()
Targets can override this to emit stuff before the first basic block in the function.
Definition AsmPrinter.h:613
std::pair< const GlobalVariable *, unsigned > GOTEquivUsePair
Map global GOT equivalent MCSymbols to GlobalVariables and keep track of its number of uses by other ...
Definition AsmPrinter.h:161
void emitPatchableFunctionEntries()
void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind, uint8_t Version=0)
virtual void emitEndOfAsmFile(Module &)
This virtual method can be overridden by targets that want to emit something at the end of their file...
Definition AsmPrinter.h:609
bool doInitialization(Module &M) override
Set up the AsmPrinter when we are working on a new module.
virtual void emitMachOIFuncStubBody(Module &M, const GlobalIFunc &GI, MCSymbol *LazyPointer)
Definition AsmPrinter.h:675
void getAnalysisUsage(AnalysisUsage &AU) const override
Record analysis usage.
MachineOptimizationRemarkEmitter * ORE
Optimization remark emitter.
Definition AsmPrinter.h:120
DenseMap< uint64_t, SmallVector< const GlobalAlias *, 1 > > AliasMapTy
Print a general LLVM constant to the .s file.
Definition AsmPrinter.h:572
virtual bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const
Definition AsmPrinter.h:997
AsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer, char &ID=AsmPrinter::ID)
void emitGlobalConstant(const DataLayout &DL, const Constant *CV, AliasMapTy *AliasList=nullptr)
EmitGlobalConstant - Print a general LLVM constant to the .s file.
virtual const MCSymbol * getFunctionFrameSymbol() const
Return symbol for the function pseudo stack if the stack frame is not a register based.
Definition AsmPrinter.h:314
void emitDwarfStringOffset(DwarfStringPoolEntryRef S) const
Emit the 4-or 8-byte offset of a string from the start of its section.
Definition AsmPrinter.h:796
MCSymbol * CurrentFnSym
The symbol for the current function.
Definition AsmPrinter.h:127
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
Definition AsmPrinter.h:111
void emitDwarfAbbrevs(const T &Abbrevs) const
Emit Dwarf abbreviation table.
Definition AsmPrinter.h:840
void emitAlignment(Align Alignment, const GlobalObject *GV=nullptr, unsigned MaxBytesToEmit=0) const
Emit an alignment directive to the specified power of two boundary.
MCContext & OutContext
This is the context for the output file that we are streaming.
Definition AsmPrinter.h:100
const StaticDataProfileInfo * SDPI
Provides the profile information for constants.
Definition AsmPrinter.h:146
bool doFinalization(Module &M) override
Shut down the asmprinter.
virtual const MCSubtargetInfo * getIFuncMCSubtargetInfo() const
getSubtargetInfo() cannot be used where this is needed because we don't have a MachineFunction when w...
Definition AsmPrinter.h:671
virtual void emitXXStructorList(const DataLayout &DL, const Constant *List, bool IsCtor)
This method emits llvm.global_ctors or llvm.global_dtors list.
MCSymbol * CurrentPatchableFunctionEntrySym
The symbol for the entry in __patchable_function_entires.
Definition AsmPrinter.h:123
bool runOnMachineFunction(MachineFunction &MF) override
Emit the specified function out to the OutStreamer.
Definition AsmPrinter.h:452
void emitDwarfAbbrev(const DIEAbbrev &Abbrev) const
void setDwarfUsesRelocationsAcrossSections(bool Enable)
Definition AsmPrinter.h:380
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
Definition AsmPrinter.h:105
const ProfileSummaryInfo * PSI
The profile summary information.
Definition AsmPrinter.h:149
void emitLabelReference(const MCSymbol *Label, unsigned Size, bool IsSectionRelative=false) const
Emit something like ".long Label" where the size in bytes of the directive is specified by Size and L...
Definition AsmPrinter.h:760
virtual void emitFunctionDescriptor()
Definition AsmPrinter.h:638
size_t NumUserHandlers
Definition AsmPrinter.h:246
MCSymbol * CurrentFnSymForSize
The symbol used to represent the start of the current function for the purpose of calculating its siz...
Definition AsmPrinter.h:136
virtual unsigned getISAEncoding()
Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified.
Definition AsmPrinter.h:824
bool isVerbose() const
Return true if assembly output should contain comments.
Definition AsmPrinter.h:307
MCSymbol * getFunctionEnd() const
Definition AsmPrinter.h:317
virtual void emitXXStructor(const DataLayout &DL, const Constant *CV)
Targets can override this to change how global constants that are part of a C++ static/global constru...
Definition AsmPrinter.h:646
void preprocessXXStructorList(const DataLayout &DL, const Constant *List, SmallVector< Structor, 8 > &Structors)
This method gathers an array of Structors and then sorts them out by Priority.
SmallVector< std::unique_ptr< AsmPrinterHandler >, 1 > EHHandlers
A handle to the EH info emitter (if present).
Definition AsmPrinter.h:240
ArrayRef< MCSymbol * > getAddrLabelSymbolToEmit(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
virtual void emitFunctionBodyEnd()
Targets can override this to emit stuff after the last basic block in the function.
Definition AsmPrinter.h:617
bool doesDwarfUseRelocationsAcrossSections() const
Definition AsmPrinter.h:376
@ None
Do not emit either .eh_frame or .debug_frame.
Definition AsmPrinter.h:166
@ Debug
Emit .debug_frame.
Definition AsmPrinter.h:168
void addAsmPrinterHandler(std::unique_ptr< AsmPrinterHandler > Handler)
LLVM Basic Block Representation.
Definition BasicBlock.h:62
The address of a basic block.
Definition Constants.h:899
ConstantArray - Constant Array Declarations.
Definition Constants.h:433
A signed pointer, in the ptrauth sense.
Definition Constants.h:1032
This is an important base class in LLVM.
Definition Constant.h:43
Dwarf abbreviation, describes the organization of a debug information object.
Definition DIE.h:80
A structured debug information entry.
Definition DIE.h:828
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
Base class for debug information backends.
Collects and handles dwarf debug information.
Definition DwarfDebug.h:351
DwarfStringPoolEntryRef: Dwarf string pool entry reference.
const DwarfStringPoolEntry & getEntry() const
Emits exception handling directives.
Definition EHStreamer.h:30
GCMetadataPrinter - Emits GC metadata as assembly code.
GCStrategy describes a garbage collector algorithm's code generation requirements,...
Definition GCStrategy.h:64
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:64
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:496
Streaming machine code generation interface.
Definition MCStreamer.h:220
Generic base class for all target subtargets.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1077
Abstract base class for all machine specific constantpool value subclasses.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
DenseMap< const MachineInstr *, CallSiteInfo > CallSiteInfoMap
Representation of each machine instruction.
This class contains meta information specific to a module.
MachineOperand class - Representation of each machine instruction operand.
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:36
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Analysis providing profile information.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A class that holds the constants that represent static data and their profile information and provide...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Primary interface to the complete machine description for the target machine.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
LLVM Value Representation.
Definition Value.h:75
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
@ Length
Definition DWP.cpp:477
Op::Description Desc
FunctionAddr VTableAddr uintptr_t uintptr_t Version
Definition InstrProf.h:302
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
@ Enable
Enable colors.
Definition WithColor.h:47
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Map a basic block section ID to the begin and end symbols of that section which determine the section...
Definition AsmPrinter.h:153
LLVM_ABI void emit(int, MCStreamer *) const
Data for a string pool entry.
A helper struct providing information about the byte size of DW_FORM values that vary in size dependi...
Definition Dwarf.h:1093