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"
21#include "llvm/ADT/SmallVector.h"
22#include "llvm/Analysis/ProfileSummaryInfo.h"
23#include "llvm/Analysis/StaticDataProfileInfo.h"
24#include "llvm/BinaryFormat/Dwarf.h"
25#include "llvm/CodeGen/DwarfStringPoolEntry.h"
26#include "llvm/CodeGen/MachineFunctionPass.h"
27#include "llvm/CodeGen/StackMaps.h"
28#include "llvm/DebugInfo/CodeView/CodeView.h"
29#include "llvm/IR/InlineAsm.h"
30#include "llvm/Support/Compiler.h"
31#include "llvm/Support/ErrorHandling.h"
32#include <cstdint>
33#include <memory>
34#include <utility>
35#include <vector>
36
37namespace llvm {
38
39class AddrLabelMap;
40class AsmPrinterHandler;
41class BasicBlock;
42class BlockAddress;
43class Constant;
44class ConstantArray;
45class ConstantPtrAuth;
46class DataLayout;
47class DebugHandlerBase;
48class DIE;
49class DIEAbbrev;
50class DwarfDebug;
51class EHStreamer;
52class GCMetadataPrinter;
53class GCStrategy;
54class GlobalAlias;
55class GlobalObject;
56class GlobalValue;
57class GlobalVariable;
58class MachineBasicBlock;
59class MachineConstantPoolValue;
60class MachineDominatorTree;
61class MachineFunction;
62class MachineInstr;
63class MachineJumpTableInfo;
64class MachineLoopInfo;
65class MachineModuleInfo;
66class MachineOptimizationRemarkEmitter;
67class MCAsmInfo;
68class MCCFIInstruction;
69class MCContext;
70class MCExpr;
71class MCInst;
72class MCSection;
73class MCStreamer;
74class MCSubtargetInfo;
75class MCSymbol;
76class MCTargetOptions;
77class MDNode;
78class Module;
79class PseudoProbeHandler;
80class raw_ostream;
81class StringRef;
82class TargetLoweringObjectFile;
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.
91class LLVM_ABI AsmPrinter : public MachineFunctionPass {
92public:
93 /// Target machine description.
94 TargetMachine &TM;
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.
101 MCContext &OutContext;
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.
112 MachineModuleInfo *MMI = nullptr;
113
114 /// This is a pointer to the current MachineDominatorTree.
115 MachineDominatorTree *MDT = nullptr;
116
117 /// This is a pointer to the current MachineLoopInfo.
118 MachineLoopInfo *MLI = nullptr;
119
120 /// Optimization remark emitter.
121 MachineOptimizationRemarkEmitter *ORE = nullptr;
122
123 /// The symbol for the entry in __patchable_function_entires.
124 MCSymbol *CurrentPatchableFunctionEntrySym = nullptr;
125
126 /// The symbol for the current function. This is recalculated at the beginning
127 /// of each call to runOnMachineFunction().
128 MCSymbol *CurrentFnSym = nullptr;
129
130 /// The symbol for the current function descriptor on AIX. This is created
131 /// at the beginning of each call to SetupMachineFunction().
132 MCSymbol *CurrentFnDescSym = nullptr;
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.
137 MCSymbol *CurrentFnSymForSize = nullptr;
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.
143 DenseMap<const MachineBasicBlock *, SmallVector<MCSymbol *, 1>>
144 CurrentFnCallsiteEndSymbols;
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.
154 struct MBBSectionRange {
155 MCSymbol *BeginLabel, *EndLabel;
156 };
157
158 MapVector<MBBSectionID, MBBSectionRange> MBBSectionRanges;
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>;
163 MapVector<const MCSymbol *, GOTEquivUsePair> GlobalGOTEquivs;
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;
177 std::function<MachineOptimizationRemarkEmitter *(MachineFunction &)> GetORE;
178 std::function<MachineDominatorTree *(MachineFunction &)> GetMDT;
179 std::function<MachineLoopInfo *(MachineFunction &)> GetMLI;
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.
202 DenseMap<GCStrategy *, std::unique_ptr<GCMetadataPrinter>> GCMetadataPrinters;
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:
233 MCSymbol *CurrentFnBegin = nullptr;
234
235 /// For dso_local functions, the current $local alias for the function.
236 MCSymbol *CurrentFnBeginLocal = nullptr;
237
238 /// A handle to the EH info emitter (if present).
239 SmallVector<std::unique_ptr<EHStreamer>, 1> EHHandlers;
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.
244 SmallVector<std::unique_ptr<AsmPrinterHandler>, 2> Handlers;
245 size_t NumUserHandlers = 0;
246
247 StackMaps SM;
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
319 MCSymbol *getFunctionBegin() const { return CurrentFnBegin; }
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.
329 MCSymbol *getAddrLabelSymbol(const BasicBlock *BB) {
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
376 bool doesDwarfUseRelocationsAcrossSections() const {
377 return DwarfUsesRelocationsAcrossSections;
378 }
379
380 void setDwarfUsesRelocationsAcrossSections(bool Enable) {
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.
401 enum class SledKind : uint8_t {
402 FUNCTION_ENTER = 0,
403 FUNCTION_EXIT = 1,
404 TAIL_CALL = 2,
405 LOG_ARGS_ENTER = 3,
406 CUSTOM_EVENT = 4,
407 TYPED_EVENT = 5,
408 };
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.
414 struct XRayFunctionEntry {
415 const MCSymbol *Sled;
416 const MCSymbol *Function;
417 SledKind Kind;
418 bool AlwaysInstrument;
419 const class Function *Fn;
420 uint8_t Version;
421
422 LLVM_ABI void emit(int, MCStreamer *) const;
423 };
424
425 // All the sleds to be emitted.
426 SmallVector<XRayFunctionEntry, 4> Sleds;
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
435 void emitPatchableFunctionEntries();
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.
453 bool runOnMachineFunction(MachineFunction &MF) override {
454 SetupMachineFunction(MF);
455 emitFunctionBody();
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 /// Check to see if the specified global is a special global used by LLVM. If
538 /// so, emit it and return true, otherwise do nothing and return false.
539 bool emitSpecialLLVMGlobal(const GlobalVariable *GV);
540
541 /// `llvm.global_ctors` and `llvm.global_dtors` are arrays of Structor
542 /// structs.
543 ///
544 /// Priority - init priority
545 /// Func - global initialization or global clean-up function
546 /// ComdatKey - associated data
547 struct Structor {
548 int Priority = 0;
549 Constant *Func = nullptr;
550 GlobalValue *ComdatKey = nullptr;
551
552 Structor() = default;
553 };
554
555 /// This method gathers an array of Structors and then sorts them out by
556 /// Priority.
557 /// @param List The initializer of `llvm.global_ctors` or `llvm.global_dtors`
558 /// array.
559 /// @param[out] Structors Sorted Structor structs by Priority.
560 void preprocessXXStructorList(const DataLayout &DL, const Constant *List,
561 SmallVector<Structor, 8> &Structors);
562
563 /// This method emits `llvm.global_ctors` or `llvm.global_dtors` list.
564 virtual void emitXXStructorList(const DataLayout &DL, const Constant *List,
565 bool IsCtor);
566
567 /// Emit an alignment directive to the specified power of two boundary. If a
568 /// global value is specified, and if that global has an explicit alignment
569 /// requested, it will override the alignment request if required for
570 /// correctness. Returns the effective alignment that was emitted (which may
571 /// exceed \p Alignment when \p GV has a stricter explicit alignment).
572 Align emitAlignment(Align Alignment, const GlobalObject *GV = nullptr,
573 unsigned MaxBytesToEmit = 0) const;
574
575 /// Lower the specified LLVM Constant to an MCExpr.
576 /// When BaseCV is present, we are lowering the element at BaseCV plus Offset.
577 virtual const MCExpr *lowerConstant(const Constant *CV,
578 const Constant *BaseCV = nullptr,
579 uint64_t Offset = 0);
580
581 /// Print a general LLVM constant to the .s file.
582 /// On AIX, when an alias refers to a sub-element of a global variable, the
583 /// label of that alias needs to be emitted before the corresponding element.
584 using AliasMapTy = DenseMap<uint64_t, SmallVector<const GlobalAlias *, 1>>;
585 void emitGlobalConstant(const DataLayout &DL, const Constant *CV,
586 AliasMapTy *AliasList = nullptr);
587
588 /// Unnamed constant global variables solely contaning a pointer to
589 /// another globals variable act like a global variable "proxy", or GOT
590 /// equivalents, i.e., it's only used to hold the address of the latter. One
591 /// optimization is to replace accesses to these proxies by using the GOT
592 /// entry for the final global instead. Hence, we select GOT equivalent
593 /// candidates among all the module global variables, avoid emitting them
594 /// unnecessarily and finally replace references to them by pc relative
595 /// accesses to GOT entries.
596 void computeGlobalGOTEquivs(Module &M);
597
598 /// Constant expressions using GOT equivalent globals may not be
599 /// eligible for PC relative GOT entry conversion, in such cases we need to
600 /// emit the proxies we previously omitted in EmitGlobalVariable.
601 void emitGlobalGOTEquivs();
602
603 //===------------------------------------------------------------------===//
604 // Overridable Hooks
605 //===------------------------------------------------------------------===//
606
607 void addAsmPrinterHandler(std::unique_ptr<AsmPrinterHandler> Handler);
608
609 // Targets can, or in the case of EmitInstruction, must implement these to
610 // customize output.
611
612 /// This virtual method can be overridden by targets that want to emit
613 /// something at the start of their file.
614 virtual void emitStartOfAsmFile(Module &) {}
615
616 /// This virtual method can be overridden by targets that want to emit
617 /// something at the end of their file.
618 virtual void emitEndOfAsmFile(Module &) {}
619
620 /// Targets can override this to emit stuff before the first basic block in
621 /// the function.
622 virtual void emitFunctionBodyStart() {}
623
624 /// Targets can override this to emit stuff after the last basic block in the
625 /// function.
626 virtual void emitFunctionBodyEnd() {}
627
628 /// Targets can override this to emit stuff at the start of a basic block.
629 /// By default, this method prints the label for the specified
630 /// MachineBasicBlock, an alignment (if present) and a comment describing it
631 /// if appropriate.
632 virtual void emitBasicBlockStart(const MachineBasicBlock &MBB);
633
634 /// Targets can override this to emit stuff at the end of a basic block.
635 virtual void emitBasicBlockEnd(const MachineBasicBlock &MBB);
636
637 /// Targets should implement this to emit instructions.
638 virtual void emitInstruction(const MachineInstr *) {
639 llvm_unreachable("EmitInstruction not implemented");
640 }
641
642 /// Return the symbol for the specified constant pool entry.
643 virtual MCSymbol *GetCPISymbol(unsigned CPID) const;
644
645 virtual void emitFunctionEntryLabel();
646
647 virtual void emitFunctionDescriptor() {
648 llvm_unreachable("Function descriptor is target-specific.");
649 }
650
651 virtual void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
652
653 /// Targets can override this to change how global constants that are part of
654 /// a C++ static/global constructor list are emitted.
655 virtual void emitXXStructor(const DataLayout &DL, const Constant *CV) {
656 emitGlobalConstant(DL, CV);
657 }
658
659 virtual const MCExpr *lowerConstantPtrAuth(const ConstantPtrAuth &CPA) {
660 report_fatal_error(reason: "ptrauth constant lowering not implemented");
661 }
662
663 /// Lower the specified BlockAddress to an MCExpr.
664 virtual const MCExpr *lowerBlockAddressConstant(const BlockAddress &BA);
665
666 /// Return true if the basic block has exactly one predecessor and the control
667 /// transfer mechanism between the predecessor and this block is a
668 /// fall-through.
669 virtual bool
670 isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const;
671
672 /// Targets can override this to customize the output of IMPLICIT_DEF
673 /// instructions in verbose mode.
674 virtual void emitImplicitDef(const MachineInstr *MI) const;
675
676 /// getSubtargetInfo() cannot be used where this is needed because we don't
677 /// have a MachineFunction when we're lowering a GlobalIFunc, and
678 /// getSubtargetInfo requires one. Override the implementation in targets
679 /// that support the Mach-O IFunc lowering.
680 virtual const MCSubtargetInfo *getIFuncMCSubtargetInfo() const {
681 return nullptr;
682 }
683
684 virtual void emitMachOIFuncStubBody(Module &M, const GlobalIFunc &GI,
685 MCSymbol *LazyPointer) {
686 llvm_unreachable(
687 "Mach-O IFunc lowering is not yet supported on this target");
688 }
689
690 virtual void emitMachOIFuncStubHelperBody(Module &M, const GlobalIFunc &GI,
691 MCSymbol *LazyPointer) {
692 llvm_unreachable(
693 "Mach-O IFunc lowering is not yet supported on this target");
694 }
695
696 /// Emit N NOP instructions.
697 void emitNops(unsigned N);
698
699 //===------------------------------------------------------------------===//
700 // Symbol Lowering Routines.
701 //===------------------------------------------------------------------===//
702
703 MCSymbol *createTempSymbol(const Twine &Name) const;
704
705 /// Return the MCSymbol for a private symbol with global value name as its
706 /// base, with the specified suffix.
707 MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV,
708 StringRef Suffix) const;
709
710 /// Return the MCSymbol for the specified ExternalSymbol.
711 MCSymbol *GetExternalSymbolSymbol(const Twine &Sym) const;
712
713 /// Return the symbol for the specified jump table entry.
714 MCSymbol *GetJTISymbol(unsigned JTID, bool isLinkerPrivate = false) const;
715
716 /// Return the symbol for the specified jump table .set
717 /// FIXME: privatize to AsmPrinter.
718 MCSymbol *GetJTSetSymbol(unsigned UID, unsigned MBBID) const;
719
720 /// Return the MCSymbol used to satisfy BlockAddress uses of the specified
721 /// basic block.
722 MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const;
723 MCSymbol *GetBlockAddressSymbol(const BasicBlock *BB) const;
724
725 //===------------------------------------------------------------------===//
726 // Emission Helper Routines.
727 //===------------------------------------------------------------------===//
728
729 /// This is just convenient handler for printing offsets.
730 void printOffset(int64_t Offset, raw_ostream &OS) const;
731
732 /// Emit a byte directive and value.
733 void emitInt8(int Value) const;
734
735 /// Emit a short directive and value.
736 void emitInt16(int Value) const;
737
738 /// Emit a long directive and value.
739 void emitInt32(int Value) const;
740
741 /// Emit a long long directive and value.
742 void emitInt64(uint64_t Value) const;
743
744 /// Emit the specified signed leb128 value.
745 void emitSLEB128(int64_t Value, const char *Desc = nullptr) const;
746
747 /// Emit the specified unsigned leb128 value.
748 void emitULEB128(uint64_t Value, const char *Desc = nullptr,
749 unsigned PadTo = 0) const;
750
751 /// Emit something like ".long Hi-Lo" where the size in bytes of the directive
752 /// is specified by Size and Hi/Lo specify the labels. This implicitly uses
753 /// .set if it is available.
754 void emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
755 unsigned Size) const;
756
757 /// Emit something like ".uleb128 Hi-Lo".
758 void emitLabelDifferenceAsULEB128(const MCSymbol *Hi,
759 const MCSymbol *Lo) const;
760
761 /// Emit something like ".long Label+Offset" where the size in bytes of the
762 /// directive is specified by Size and Label specifies the label. This
763 /// implicitly uses .set if it is available.
764 void emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset,
765 unsigned Size, bool IsSectionRelative = false) const;
766
767 /// Emit something like ".long Label" where the size in bytes of the directive
768 /// is specified by Size and Label specifies the label.
769 void emitLabelReference(const MCSymbol *Label, unsigned Size,
770 bool IsSectionRelative = false) const {
771 emitLabelPlusOffset(Label, Offset: 0, Size, IsSectionRelative);
772 }
773
774 //===------------------------------------------------------------------===//
775 // Dwarf Emission Helper Routines
776 //===------------------------------------------------------------------===//
777
778 /// Emit a .byte 42 directive that corresponds to an encoding. If verbose
779 /// assembly output is enabled, we output comments describing the encoding.
780 /// Desc is a string saying what the encoding is specifying (e.g. "LSDA").
781 void emitEncodingByte(unsigned Val, const char *Desc = nullptr) const;
782
783 /// Return the size of the encoding in bytes.
784 unsigned GetSizeOfEncodedValue(unsigned Encoding) const;
785
786 /// Emit reference to a ttype global with a specified encoding.
787 virtual void emitTTypeReference(const GlobalValue *GV, unsigned Encoding);
788
789 /// Emit a reference to a symbol for use in dwarf. Different object formats
790 /// represent this in different ways. Some use a relocation others encode
791 /// the label offset in its section.
792 void emitDwarfSymbolReference(const MCSymbol *Label,
793 bool ForceOffset = false) const;
794
795 /// Emit the 4- or 8-byte offset of a string from the start of its section.
796 ///
797 /// When possible, emit a DwarfStringPool section offset without any
798 /// relocations, and without using the symbol. Otherwise, defers to \a
799 /// emitDwarfSymbolReference().
800 ///
801 /// The length of the emitted value depends on the DWARF format.
802 void emitDwarfStringOffset(DwarfStringPoolEntry S) const;
803
804 /// Emit the 4-or 8-byte offset of a string from the start of its section.
805 void emitDwarfStringOffset(DwarfStringPoolEntryRef S) const {
806 emitDwarfStringOffset(S: S.getEntry());
807 }
808
809 /// Emit something like ".long Label + Offset" or ".quad Label + Offset"
810 /// depending on the DWARF format.
811 void emitDwarfOffset(const MCSymbol *Label, uint64_t Offset) const;
812
813 /// Emit 32- or 64-bit value depending on the DWARF format.
814 void emitDwarfLengthOrOffset(uint64_t Value) const;
815
816 /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
817 /// according to the settings.
818 void emitDwarfUnitLength(uint64_t Length, const Twine &Comment) const;
819
820 /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
821 /// according to the settings.
822 /// Return the end symbol generated inside, the caller needs to emit it.
823 MCSymbol *emitDwarfUnitLength(const Twine &Prefix,
824 const Twine &Comment) const;
825
826 /// Emit reference to a call site with a specified encoding
827 void emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo,
828 unsigned Encoding) const;
829 /// Emit an integer value corresponding to the call site encoding
830 void emitCallSiteValue(uint64_t Value, unsigned Encoding) const;
831
832 /// Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified.
833 virtual unsigned getISAEncoding() { return 0; }
834
835 /// Emit the directive and value for debug thread local expression
836 ///
837 /// \p Value - The value to emit.
838 /// \p Size - The size of the integer (in bytes) to emit.
839 virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const;
840
841 //===------------------------------------------------------------------===//
842 // Dwarf Lowering Routines
843 //===------------------------------------------------------------------===//
844
845 /// Emit frame instruction to describe the layout of the frame.
846 void emitCFIInstruction(const MCCFIInstruction &Inst) const;
847
848 /// Emit Dwarf abbreviation table.
849 template <typename T> void emitDwarfAbbrevs(const T &Abbrevs) const {
850 // For each abbreviation.
851 for (const auto &Abbrev : Abbrevs)
852 emitDwarfAbbrev(Abbrev: *Abbrev);
853
854 // Mark end of abbreviations.
855 emitULEB128(Value: 0, Desc: "EOM(3)");
856 }
857
858 void emitDwarfAbbrev(const DIEAbbrev &Abbrev) const;
859
860 /// Recursively emit Dwarf DIE tree.
861 void emitDwarfDIE(const DIE &Die) const;
862
863 //===------------------------------------------------------------------===//
864 // CodeView Helper Routines
865 //===------------------------------------------------------------------===//
866
867 /// Gets information required to create a CodeView debug symbol for a jump
868 /// table.
869 /// Return value is <Base Address, Base Offset, Branch Address, Entry Size>
870 virtual std::tuple<const MCSymbol *, uint64_t, const MCSymbol *,
871 codeview::JumpTableEntrySize>
872 getCodeViewJumpTableInfo(int JTI, const MachineInstr *BranchInstr,
873 const MCSymbol *BranchLabel) const;
874
875 //===------------------------------------------------------------------===//
876 // COFF Helper Routines
877 //===------------------------------------------------------------------===//
878
879 /// Emits symbols and data to allow functions marked with the
880 /// loader-replaceable attribute to be replaceable.
881 void emitCOFFReplaceableFunctionData(Module &M);
882
883 /// Emits the @feat.00 symbol indicating the features enabled in this module.
884 void emitCOFFFeatureSymbol(Module &M);
885
886 //===------------------------------------------------------------------===//
887 // Inline Asm Support
888 //===------------------------------------------------------------------===//
889
890 // These are hooks that targets can override to implement inline asm
891 // support. These should probably be moved out of AsmPrinter someday.
892
893 /// Print information related to the specified machine instr that is
894 /// independent of the operand, and may be independent of the instr itself.
895 /// This can be useful for portably encoding the comment character or other
896 /// bits of target-specific knowledge into the asmstrings. The syntax used is
897 /// ${:comment}. Targets can override this to add support for their own
898 /// strange codes.
899 virtual void PrintSpecial(const MachineInstr *MI, raw_ostream &OS,
900 StringRef Code) const;
901
902 /// Print the MachineOperand as a symbol. Targets with complex handling of
903 /// symbol references should override the base implementation.
904 virtual void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &OS);
905
906 /// Print the specified operand of MI, an INLINEASM instruction, using the
907 /// specified assembler variant. Targets should override this to format as
908 /// appropriate. This method can return true if the operand is erroneous.
909 virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
910 const char *ExtraCode, raw_ostream &OS);
911
912 /// Print the specified operand of MI, an INLINEASM instruction, using the
913 /// specified assembler variant as an address. Targets should override this to
914 /// format as appropriate. This method can return true if the operand is
915 /// erroneous.
916 virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
917 const char *ExtraCode, raw_ostream &OS);
918
919 /// Let the target do anything it needs to do before emitting inlineasm.
920 /// \p StartInfo - the subtarget info before parsing inline asm
921 virtual void emitInlineAsmStart() const;
922
923 /// Let the target do anything it needs to do after emitting inlineasm.
924 /// This callback can be used restore the original mode in case the
925 /// inlineasm contains directives to switch modes.
926 /// \p StartInfo - the original subtarget info before inline asm
927 /// \p EndInfo - the final subtarget info after parsing the inline asm,
928 /// or NULL if the value is unknown.
929 virtual void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
930 const MCSubtargetInfo *EndInfo,
931 const MachineInstr *MI);
932
933 /// This emits visibility information about symbol, if this is supported by
934 /// the target.
935 void emitVisibility(MCSymbol *Sym, unsigned Visibility,
936 bool IsDefinition = true) const;
937
938 /// This emits linkage information about \p GVSym based on \p GV, if this is
939 /// supported by the target.
940 virtual void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const;
941
942 /// Return the alignment for the specified \p GV.
943 static Align getGVAlignment(const GlobalObject *GV, const DataLayout &DL,
944 Align InAlign = Align(1));
945
946private:
947 /// Private state for PrintSpecial()
948 // Assign a unique ID to this machine instruction.
949 mutable const MachineInstr *LastMI = nullptr;
950 mutable unsigned LastFn = 0;
951 mutable unsigned Counter = ~0U;
952
953 bool DwarfUsesRelocationsAcrossSections = false;
954
955 /// This method emits the header for the current function.
956 virtual void emitFunctionHeader();
957
958 /// This method emits a comment next to header for the current function.
959 virtual void emitFunctionHeaderComment();
960
961 /// This method emits prefix-like data before the current function.
962 void emitFunctionPrefix(ArrayRef<const Constant *> Prefix);
963
964 /// Emit a blob of inline asm to the output streamer.
965 virtual void
966 emitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
967 const MCTargetOptions &MCOptions,
968 const MDNode *LocMDNode = nullptr,
969 InlineAsm::AsmDialect AsmDialect = InlineAsm::AD_ATT,
970 const MachineInstr *MI = nullptr);
971
972 /// This method formats and emits the specified machine instruction that is an
973 /// inline asm.
974 void emitInlineAsm(const MachineInstr *MI);
975
976 /// Add inline assembly info to the diagnostics machinery, so we can
977 /// emit file and position info. Returns SrcMgr memory buffer position.
978 unsigned addInlineAsmDiagBuffer(StringRef AsmStr,
979 const MDNode *LocMDNode) const;
980
981 //===------------------------------------------------------------------===//
982 // Internal Implementation Details
983 //===------------------------------------------------------------------===//
984
985 virtual void emitJumpTableImpl(const MachineJumpTableInfo &MJTI,
986 ArrayRef<unsigned> JumpTableIndices);
987
988 void emitJumpTableSizesSection(const MachineJumpTableInfo &MJTI,
989 const Function &F) const;
990
991 void emitLLVMUsedList(const ConstantArray *InitList);
992 /// Emit llvm.ident metadata in an '.ident' directive.
993 void emitModuleIdents(Module &M);
994 /// Emit bytes for llvm.commandline metadata.
995 virtual void emitModuleCommandLines(Module &M);
996
997 GCMetadataPrinter *getOrCreateGCPrinter(GCStrategy &S);
998 virtual void emitGlobalIFunc(Module &M, const GlobalIFunc &GI);
999
1000 /// This method decides whether the specified basic block requires a label.
1001 bool shouldEmitLabelForBasicBlock(const MachineBasicBlock &MBB) const;
1002
1003protected:
1004 virtual void emitJumpTableEntry(const MachineJumpTableInfo &MJTI,
1005 const MachineBasicBlock *MBB,
1006 unsigned uid) const;
1007 virtual void emitGlobalAlias(const Module &M, const GlobalAlias &GA);
1008 virtual bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const {
1009 return false;
1010 }
1011};
1012
1013LLVM_ABI void setupModuleAsmPrinter(Module &M, ModuleAnalysisManager &MAM,
1014 AsmPrinter &AsmPrinter);
1015
1016LLVM_ABI void
1017setupMachineFunctionAsmPrinter(MachineFunctionAnalysisManager &MFAM,
1018 MachineFunction &MF, AsmPrinter &AsmPrinter);
1019
1020} // end namespace llvm
1021
1022#endif // LLVM_CODEGEN_ASMPRINTER_H
1023