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