Home | History | Annotate | Line # | Download | only in CodeGen
      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/MapVector.h"
     19 #include "llvm/ADT/SmallVector.h"
     20 #include "llvm/CodeGen/AsmPrinterHandler.h"
     21 #include "llvm/CodeGen/DwarfStringPoolEntry.h"
     22 #include "llvm/CodeGen/MachineFunctionPass.h"
     23 #include "llvm/IR/InlineAsm.h"
     24 #include "llvm/IR/LLVMContext.h"
     25 #include "llvm/Support/ErrorHandling.h"
     26 #include "llvm/Support/SourceMgr.h"
     27 #include <cstdint>
     28 #include <memory>
     29 #include <utility>
     30 #include <vector>
     31 
     32 namespace llvm {
     33 
     34 class BasicBlock;
     35 class BlockAddress;
     36 class Constant;
     37 class ConstantArray;
     38 class DataLayout;
     39 class DIE;
     40 class DIEAbbrev;
     41 class DwarfDebug;
     42 class GCMetadataPrinter;
     43 class GCStrategy;
     44 class GlobalIndirectSymbol;
     45 class GlobalObject;
     46 class GlobalValue;
     47 class GlobalVariable;
     48 class MachineBasicBlock;
     49 class MachineConstantPoolValue;
     50 class MachineDominatorTree;
     51 class MachineFunction;
     52 class MachineInstr;
     53 class MachineJumpTableInfo;
     54 class MachineLoopInfo;
     55 class MachineModuleInfo;
     56 class MachineOptimizationRemarkEmitter;
     57 class MCAsmInfo;
     58 class MCCFIInstruction;
     59 class MCContext;
     60 class MCExpr;
     61 class MCInst;
     62 class MCSection;
     63 class MCStreamer;
     64 class MCSubtargetInfo;
     65 class MCSymbol;
     66 class MCTargetOptions;
     67 class MDNode;
     68 class Module;
     69 class PseudoProbeHandler;
     70 class raw_ostream;
     71 class StackMaps;
     72 class StringRef;
     73 class TargetLoweringObjectFile;
     74 class TargetMachine;
     75 class Twine;
     76 
     77 namespace remarks {
     78 class RemarkStreamer;
     79 }
     80 
     81 /// This class is intended to be used as a driving class for all asm writers.
     82 class AsmPrinter : public MachineFunctionPass {
     83 public:
     84   /// Target machine description.
     85   TargetMachine &TM;
     86 
     87   /// Target Asm Printer information.
     88   const MCAsmInfo *MAI;
     89 
     90   /// This is the context for the output file that we are streaming. This owns
     91   /// all of the global MC-related objects for the generated translation unit.
     92   MCContext &OutContext;
     93 
     94   /// This is the MCStreamer object for the file we are generating. This
     95   /// contains the transient state for the current translation unit that we are
     96   /// generating (such as the current section etc).
     97   std::unique_ptr<MCStreamer> OutStreamer;
     98 
     99   /// The current machine function.
    100   MachineFunction *MF = nullptr;
    101 
    102   /// This is a pointer to the current MachineModuleInfo.
    103   MachineModuleInfo *MMI = nullptr;
    104 
    105   /// This is a pointer to the current MachineDominatorTree.
    106   MachineDominatorTree *MDT = nullptr;
    107 
    108   /// This is a pointer to the current MachineLoopInfo.
    109   MachineLoopInfo *MLI = nullptr;
    110 
    111   /// Optimization remark emitter.
    112   MachineOptimizationRemarkEmitter *ORE;
    113 
    114   /// The symbol for the entry in __patchable_function_entires.
    115   MCSymbol *CurrentPatchableFunctionEntrySym = nullptr;
    116 
    117   /// The symbol for the current function. This is recalculated at the beginning
    118   /// of each call to runOnMachineFunction().
    119   MCSymbol *CurrentFnSym = nullptr;
    120 
    121   /// The symbol for the current function descriptor on AIX. This is created
    122   /// at the beginning of each call to SetupMachineFunction().
    123   MCSymbol *CurrentFnDescSym = nullptr;
    124 
    125   /// The symbol used to represent the start of the current function for the
    126   /// purpose of calculating its size (e.g. using the .size directive). By
    127   /// default, this is equal to CurrentFnSym.
    128   MCSymbol *CurrentFnSymForSize = nullptr;
    129 
    130   /// Map a basic block section ID to the begin and end symbols of that section
    131   ///  which determine the section's range.
    132   struct MBBSectionRange {
    133     MCSymbol *BeginLabel, *EndLabel;
    134   };
    135 
    136   MapVector<unsigned, MBBSectionRange> MBBSectionRanges;
    137 
    138   /// Map global GOT equivalent MCSymbols to GlobalVariables and keep track of
    139   /// its number of uses by other globals.
    140   using GOTEquivUsePair = std::pair<const GlobalVariable *, unsigned>;
    141   MapVector<const MCSymbol *, GOTEquivUsePair> GlobalGOTEquivs;
    142 
    143   /// struct HandlerInfo and Handlers permit users or target extended
    144   /// AsmPrinter to add their own handlers.
    145   struct HandlerInfo {
    146     std::unique_ptr<AsmPrinterHandler> Handler;
    147     StringRef TimerName;
    148     StringRef TimerDescription;
    149     StringRef TimerGroupName;
    150     StringRef TimerGroupDescription;
    151 
    152     HandlerInfo(std::unique_ptr<AsmPrinterHandler> Handler, StringRef TimerName,
    153                 StringRef TimerDescription, StringRef TimerGroupName,
    154                 StringRef TimerGroupDescription)
    155         : Handler(std::move(Handler)), TimerName(TimerName),
    156           TimerDescription(TimerDescription), TimerGroupName(TimerGroupName),
    157           TimerGroupDescription(TimerGroupDescription) {}
    158   };
    159 
    160   // Flags representing which CFI section is required for a function/module.
    161   enum class CFISection : unsigned {
    162     None = 0, ///< Do not emit either .eh_frame or .debug_frame
    163     EH = 1,   ///< Emit .eh_frame
    164     Debug = 2 ///< Emit .debug_frame
    165   };
    166 
    167 private:
    168   MCSymbol *CurrentFnEnd = nullptr;
    169 
    170   /// Map a basic block section ID to the exception symbol associated with that
    171   /// section. Map entries are assigned and looked up via
    172   /// AsmPrinter::getMBBExceptionSym.
    173   DenseMap<unsigned, MCSymbol *> MBBSectionExceptionSyms;
    174 
    175   // The symbol used to represent the start of the current BB section of the
    176   // function. This is used to calculate the size of the BB section.
    177   MCSymbol *CurrentSectionBeginSym = nullptr;
    178 
    179   // The garbage collection metadata printer table.
    180   void *GCMetadataPrinters = nullptr; // Really a DenseMap.
    181 
    182   /// Emit comments in assembly output if this is true.
    183   bool VerboseAsm;
    184 
    185   /// Output stream for the stack usage file (i.e., .su file).
    186   std::unique_ptr<raw_fd_ostream> StackUsageStream;
    187 
    188   static char ID;
    189 
    190 protected:
    191   MCSymbol *CurrentFnBegin = nullptr;
    192 
    193   /// A vector of all debug/EH info emitters we should use. This vector
    194   /// maintains ownership of the emitters.
    195   std::vector<HandlerInfo> Handlers;
    196   size_t NumUserHandlers = 0;
    197 
    198 private:
    199   /// If generated on the fly this own the instance.
    200   std::unique_ptr<MachineDominatorTree> OwnedMDT;
    201 
    202   /// If generated on the fly this own the instance.
    203   std::unique_ptr<MachineLoopInfo> OwnedMLI;
    204 
    205   /// If the target supports dwarf debug info, this pointer is non-null.
    206   DwarfDebug *DD = nullptr;
    207 
    208   /// A handler that supports pseudo probe emission with embedded inline
    209   /// context.
    210   PseudoProbeHandler *PP = nullptr;
    211 
    212   /// CFISection type the module needs i.e. either .eh_frame or .debug_frame.
    213   CFISection ModuleCFISection = CFISection::None;
    214 
    215 protected:
    216   explicit AsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer);
    217 
    218 public:
    219   ~AsmPrinter() override;
    220 
    221   DwarfDebug *getDwarfDebug() { return DD; }
    222   DwarfDebug *getDwarfDebug() const { return DD; }
    223 
    224   uint16_t getDwarfVersion() const;
    225   void setDwarfVersion(uint16_t Version);
    226 
    227   bool isDwarf64() const;
    228 
    229   /// Returns 4 for DWARF32 and 8 for DWARF64.
    230   unsigned int getDwarfOffsetByteSize() const;
    231 
    232   /// Returns 4 for DWARF32 and 12 for DWARF64.
    233   unsigned int getUnitLengthFieldByteSize() const;
    234 
    235   bool isPositionIndependent() const;
    236 
    237   /// Return true if assembly output should contain comments.
    238   bool isVerbose() const { return VerboseAsm; }
    239 
    240   /// Return a unique ID for the current function.
    241   unsigned getFunctionNumber() const;
    242 
    243   /// Return symbol for the function pseudo stack if the stack frame is not a
    244   /// register based.
    245   virtual const MCSymbol *getFunctionFrameSymbol() const { return nullptr; }
    246 
    247   MCSymbol *getFunctionBegin() const { return CurrentFnBegin; }
    248   MCSymbol *getFunctionEnd() const { return CurrentFnEnd; }
    249 
    250   // Return the exception symbol associated with the MBB section containing a
    251   // given basic block.
    252   MCSymbol *getMBBExceptionSym(const MachineBasicBlock &MBB);
    253 
    254   /// Return information about object file lowering.
    255   const TargetLoweringObjectFile &getObjFileLowering() const;
    256 
    257   /// Return information about data layout.
    258   const DataLayout &getDataLayout() const;
    259 
    260   /// Return the pointer size from the TargetMachine
    261   unsigned getPointerSize() const;
    262 
    263   /// Return information about subtarget.
    264   const MCSubtargetInfo &getSubtargetInfo() const;
    265 
    266   void EmitToStreamer(MCStreamer &S, const MCInst &Inst);
    267 
    268   /// Emits inital debug location directive.
    269   void emitInitialRawDwarfLocDirective(const MachineFunction &MF);
    270 
    271   /// Return the current section we are emitting to.
    272   const MCSection *getCurrentSection() const;
    273 
    274   void getNameWithPrefix(SmallVectorImpl<char> &Name,
    275                          const GlobalValue *GV) const;
    276 
    277   MCSymbol *getSymbol(const GlobalValue *GV) const;
    278 
    279   /// Similar to getSymbol() but preferred for references. On ELF, this uses a
    280   /// local symbol if a reference to GV is guaranteed to be resolved to the
    281   /// definition in the same module.
    282   MCSymbol *getSymbolPreferLocal(const GlobalValue &GV) const;
    283 
    284   //===------------------------------------------------------------------===//
    285   // XRay instrumentation implementation.
    286   //===------------------------------------------------------------------===//
    287 public:
    288   // This describes the kind of sled we're storing in the XRay table.
    289   enum class SledKind : uint8_t {
    290     FUNCTION_ENTER = 0,
    291     FUNCTION_EXIT = 1,
    292     TAIL_CALL = 2,
    293     LOG_ARGS_ENTER = 3,
    294     CUSTOM_EVENT = 4,
    295     TYPED_EVENT = 5,
    296   };
    297 
    298   // The table will contain these structs that point to the sled, the function
    299   // containing the sled, and what kind of sled (and whether they should always
    300   // be instrumented). We also use a version identifier that the runtime can use
    301   // to decide what to do with the sled, depending on the version of the sled.
    302   struct XRayFunctionEntry {
    303     const MCSymbol *Sled;
    304     const MCSymbol *Function;
    305     SledKind Kind;
    306     bool AlwaysInstrument;
    307     const class Function *Fn;
    308     uint8_t Version;
    309 
    310     void emit(int, MCStreamer *) const;
    311   };
    312 
    313   // All the sleds to be emitted.
    314   SmallVector<XRayFunctionEntry, 4> Sleds;
    315 
    316   // Helper function to record a given XRay sled.
    317   void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind,
    318                   uint8_t Version = 0);
    319 
    320   /// Emit a table with all XRay instrumentation points.
    321   void emitXRayTable();
    322 
    323   void emitPatchableFunctionEntries();
    324 
    325   //===------------------------------------------------------------------===//
    326   // MachineFunctionPass Implementation.
    327   //===------------------------------------------------------------------===//
    328 
    329   /// Record analysis usage.
    330   void getAnalysisUsage(AnalysisUsage &AU) const override;
    331 
    332   /// Set up the AsmPrinter when we are working on a new module. If your pass
    333   /// overrides this, it must make sure to explicitly call this implementation.
    334   bool doInitialization(Module &M) override;
    335 
    336   /// Shut down the asmprinter. If you override this in your pass, you must make
    337   /// sure to call it explicitly.
    338   bool doFinalization(Module &M) override;
    339 
    340   /// Emit the specified function out to the OutStreamer.
    341   bool runOnMachineFunction(MachineFunction &MF) override {
    342     SetupMachineFunction(MF);
    343     emitFunctionBody();
    344     return false;
    345   }
    346 
    347   //===------------------------------------------------------------------===//
    348   // Coarse grained IR lowering routines.
    349   //===------------------------------------------------------------------===//
    350 
    351   /// This should be called when a new MachineFunction is being processed from
    352   /// runOnMachineFunction.
    353   virtual void SetupMachineFunction(MachineFunction &MF);
    354 
    355   /// This method emits the body and trailer for a function.
    356   void emitFunctionBody();
    357 
    358   void emitCFIInstruction(const MachineInstr &MI);
    359 
    360   void emitFrameAlloc(const MachineInstr &MI);
    361 
    362   void emitStackSizeSection(const MachineFunction &MF);
    363 
    364   void emitStackUsage(const MachineFunction &MF);
    365 
    366   void emitBBAddrMapSection(const MachineFunction &MF);
    367 
    368   void emitPseudoProbe(const MachineInstr &MI);
    369 
    370   void emitRemarksSection(remarks::RemarkStreamer &RS);
    371 
    372   /// Get the CFISection type for a function.
    373   CFISection getFunctionCFISectionType(const Function &F) const;
    374 
    375   /// Get the CFISection type for a function.
    376   CFISection getFunctionCFISectionType(const MachineFunction &MF) const;
    377 
    378   /// Get the CFISection type for the module.
    379   CFISection getModuleCFISectionType() const { return ModuleCFISection; }
    380 
    381   bool needsSEHMoves();
    382 
    383   /// Since emitting CFI unwind information is entangled with supporting the
    384   /// exceptions, this returns true for platforms which use CFI unwind
    385   /// information for debugging purpose when
    386   /// `MCAsmInfo::ExceptionsType == ExceptionHandling::None`.
    387   bool needsCFIForDebug() const;
    388 
    389   /// Print to the current output stream assembly representations of the
    390   /// constants in the constant pool MCP. This is used to print out constants
    391   /// which have been "spilled to memory" by the code generator.
    392   virtual void emitConstantPool();
    393 
    394   /// Print assembly representations of the jump tables used by the current
    395   /// function to the current output stream.
    396   virtual void emitJumpTableInfo();
    397 
    398   /// Emit the specified global variable to the .s file.
    399   virtual void emitGlobalVariable(const GlobalVariable *GV);
    400 
    401   /// Check to see if the specified global is a special global used by LLVM. If
    402   /// so, emit it and return true, otherwise do nothing and return false.
    403   bool emitSpecialLLVMGlobal(const GlobalVariable *GV);
    404 
    405   /// `llvm.global_ctors` and `llvm.global_dtors` are arrays of Structor
    406   /// structs.
    407   ///
    408   /// Priority - init priority
    409   /// Func - global initialization or global clean-up function
    410   /// ComdatKey - associated data
    411   struct Structor {
    412     int Priority = 0;
    413     Constant *Func = nullptr;
    414     GlobalValue *ComdatKey = nullptr;
    415 
    416     Structor() = default;
    417   };
    418 
    419   /// This method gathers an array of Structors and then sorts them out by
    420   /// Priority.
    421   /// @param List The initializer of `llvm.global_ctors` or `llvm.global_dtors`
    422   /// array.
    423   /// @param[out] Structors Sorted Structor structs by Priority.
    424   void preprocessXXStructorList(const DataLayout &DL, const Constant *List,
    425                                 SmallVector<Structor, 8> &Structors);
    426 
    427   /// This method emits `llvm.global_ctors` or `llvm.global_dtors` list.
    428   virtual void emitXXStructorList(const DataLayout &DL, const Constant *List,
    429                                   bool IsCtor);
    430 
    431   /// Emit an alignment directive to the specified power of two boundary. If a
    432   /// global value is specified, and if that global has an explicit alignment
    433   /// requested, it will override the alignment request if required for
    434   /// correctness.
    435   void emitAlignment(Align Alignment, const GlobalObject *GV = nullptr) const;
    436 
    437   /// Lower the specified LLVM Constant to an MCExpr.
    438   virtual const MCExpr *lowerConstant(const Constant *CV);
    439 
    440   /// Print a general LLVM constant to the .s file.
    441   void emitGlobalConstant(const DataLayout &DL, const Constant *CV);
    442 
    443   /// Unnamed constant global variables solely contaning a pointer to
    444   /// another globals variable act like a global variable "proxy", or GOT
    445   /// equivalents, i.e., it's only used to hold the address of the latter. One
    446   /// optimization is to replace accesses to these proxies by using the GOT
    447   /// entry for the final global instead. Hence, we select GOT equivalent
    448   /// candidates among all the module global variables, avoid emitting them
    449   /// unnecessarily and finally replace references to them by pc relative
    450   /// accesses to GOT entries.
    451   void computeGlobalGOTEquivs(Module &M);
    452 
    453   /// Constant expressions using GOT equivalent globals may not be
    454   /// eligible for PC relative GOT entry conversion, in such cases we need to
    455   /// emit the proxies we previously omitted in EmitGlobalVariable.
    456   void emitGlobalGOTEquivs();
    457 
    458   /// Emit the stack maps.
    459   void emitStackMaps(StackMaps &SM);
    460 
    461   //===------------------------------------------------------------------===//
    462   // Overridable Hooks
    463   //===------------------------------------------------------------------===//
    464 
    465   void addAsmPrinterHandler(HandlerInfo Handler) {
    466     Handlers.insert(Handlers.begin(), std::move(Handler));
    467     NumUserHandlers++;
    468   }
    469 
    470   // Targets can, or in the case of EmitInstruction, must implement these to
    471   // customize output.
    472 
    473   /// This virtual method can be overridden by targets that want to emit
    474   /// something at the start of their file.
    475   virtual void emitStartOfAsmFile(Module &) {}
    476 
    477   /// This virtual method can be overridden by targets that want to emit
    478   /// something at the end of their file.
    479   virtual void emitEndOfAsmFile(Module &) {}
    480 
    481   /// Targets can override this to emit stuff before the first basic block in
    482   /// the function.
    483   virtual void emitFunctionBodyStart() {}
    484 
    485   /// Targets can override this to emit stuff after the last basic block in the
    486   /// function.
    487   virtual void emitFunctionBodyEnd() {}
    488 
    489   /// Targets can override this to emit stuff at the start of a basic block.
    490   /// By default, this method prints the label for the specified
    491   /// MachineBasicBlock, an alignment (if present) and a comment describing it
    492   /// if appropriate.
    493   virtual void emitBasicBlockStart(const MachineBasicBlock &MBB);
    494 
    495   /// Targets can override this to emit stuff at the end of a basic block.
    496   virtual void emitBasicBlockEnd(const MachineBasicBlock &MBB);
    497 
    498   /// Targets should implement this to emit instructions.
    499   virtual void emitInstruction(const MachineInstr *) {
    500     llvm_unreachable("EmitInstruction not implemented");
    501   }
    502 
    503   /// Return the symbol for the specified constant pool entry.
    504   virtual MCSymbol *GetCPISymbol(unsigned CPID) const;
    505 
    506   virtual void emitFunctionEntryLabel();
    507 
    508   virtual void emitFunctionDescriptor() {
    509     llvm_unreachable("Function descriptor is target-specific.");
    510   }
    511 
    512   virtual void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
    513 
    514   /// Targets can override this to change how global constants that are part of
    515   /// a C++ static/global constructor list are emitted.
    516   virtual void emitXXStructor(const DataLayout &DL, const Constant *CV) {
    517     emitGlobalConstant(DL, CV);
    518   }
    519 
    520   /// Return true if the basic block has exactly one predecessor and the control
    521   /// transfer mechanism between the predecessor and this block is a
    522   /// fall-through.
    523   virtual bool
    524   isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const;
    525 
    526   /// Targets can override this to customize the output of IMPLICIT_DEF
    527   /// instructions in verbose mode.
    528   virtual void emitImplicitDef(const MachineInstr *MI) const;
    529 
    530   /// Emit N NOP instructions.
    531   void emitNops(unsigned N);
    532 
    533   //===------------------------------------------------------------------===//
    534   // Symbol Lowering Routines.
    535   //===------------------------------------------------------------------===//
    536 
    537   MCSymbol *createTempSymbol(const Twine &Name) const;
    538 
    539   /// Return the MCSymbol for a private symbol with global value name as its
    540   /// base, with the specified suffix.
    541   MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV,
    542                                          StringRef Suffix) const;
    543 
    544   /// Return the MCSymbol for the specified ExternalSymbol.
    545   MCSymbol *GetExternalSymbolSymbol(StringRef Sym) const;
    546 
    547   /// Return the symbol for the specified jump table entry.
    548   MCSymbol *GetJTISymbol(unsigned JTID, bool isLinkerPrivate = false) const;
    549 
    550   /// Return the symbol for the specified jump table .set
    551   /// FIXME: privatize to AsmPrinter.
    552   MCSymbol *GetJTSetSymbol(unsigned UID, unsigned MBBID) const;
    553 
    554   /// Return the MCSymbol used to satisfy BlockAddress uses of the specified
    555   /// basic block.
    556   MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const;
    557   MCSymbol *GetBlockAddressSymbol(const BasicBlock *BB) const;
    558 
    559   //===------------------------------------------------------------------===//
    560   // Emission Helper Routines.
    561   //===------------------------------------------------------------------===//
    562 
    563   /// This is just convenient handler for printing offsets.
    564   void printOffset(int64_t Offset, raw_ostream &OS) const;
    565 
    566   /// Emit a byte directive and value.
    567   void emitInt8(int Value) const;
    568 
    569   /// Emit a short directive and value.
    570   void emitInt16(int Value) const;
    571 
    572   /// Emit a long directive and value.
    573   void emitInt32(int Value) const;
    574 
    575   /// Emit a long long directive and value.
    576   void emitInt64(uint64_t Value) const;
    577 
    578   /// Emit something like ".long Hi-Lo" where the size in bytes of the directive
    579   /// is specified by Size and Hi/Lo specify the labels.  This implicitly uses
    580   /// .set if it is available.
    581   void emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
    582                            unsigned Size) const;
    583 
    584   /// Emit something like ".uleb128 Hi-Lo".
    585   void emitLabelDifferenceAsULEB128(const MCSymbol *Hi,
    586                                     const MCSymbol *Lo) const;
    587 
    588   /// Emit something like ".long Label+Offset" where the size in bytes of the
    589   /// directive is specified by Size and Label specifies the label.  This
    590   /// implicitly uses .set if it is available.
    591   void emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset,
    592                            unsigned Size, bool IsSectionRelative = false) const;
    593 
    594   /// Emit something like ".long Label" where the size in bytes of the directive
    595   /// is specified by Size and Label specifies the label.
    596   void emitLabelReference(const MCSymbol *Label, unsigned Size,
    597                           bool IsSectionRelative = false) const {
    598     emitLabelPlusOffset(Label, 0, Size, IsSectionRelative);
    599   }
    600 
    601   //===------------------------------------------------------------------===//
    602   // Dwarf Emission Helper Routines
    603   //===------------------------------------------------------------------===//
    604 
    605   /// Emit the specified signed leb128 value.
    606   void emitSLEB128(int64_t Value, const char *Desc = nullptr) const;
    607 
    608   /// Emit the specified unsigned leb128 value.
    609   void emitULEB128(uint64_t Value, const char *Desc = nullptr,
    610                    unsigned PadTo = 0) const;
    611 
    612   /// Emit a .byte 42 directive that corresponds to an encoding.  If verbose
    613   /// assembly output is enabled, we output comments describing the encoding.
    614   /// Desc is a string saying what the encoding is specifying (e.g. "LSDA").
    615   void emitEncodingByte(unsigned Val, const char *Desc = nullptr) const;
    616 
    617   /// Return the size of the encoding in bytes.
    618   unsigned GetSizeOfEncodedValue(unsigned Encoding) const;
    619 
    620   /// Emit reference to a ttype global with a specified encoding.
    621   virtual void emitTTypeReference(const GlobalValue *GV, unsigned Encoding);
    622 
    623   /// Emit a reference to a symbol for use in dwarf. Different object formats
    624   /// represent this in different ways. Some use a relocation others encode
    625   /// the label offset in its section.
    626   void emitDwarfSymbolReference(const MCSymbol *Label,
    627                                 bool ForceOffset = false) const;
    628 
    629   /// Emit the 4- or 8-byte offset of a string from the start of its section.
    630   ///
    631   /// When possible, emit a DwarfStringPool section offset without any
    632   /// relocations, and without using the symbol.  Otherwise, defers to \a
    633   /// emitDwarfSymbolReference().
    634   ///
    635   /// The length of the emitted value depends on the DWARF format.
    636   void emitDwarfStringOffset(DwarfStringPoolEntry S) const;
    637 
    638   /// Emit the 4-or 8-byte offset of a string from the start of its section.
    639   void emitDwarfStringOffset(DwarfStringPoolEntryRef S) const {
    640     emitDwarfStringOffset(S.getEntry());
    641   }
    642 
    643   /// Emit something like ".long Label + Offset" or ".quad Label + Offset"
    644   /// depending on the DWARF format.
    645   void emitDwarfOffset(const MCSymbol *Label, uint64_t Offset) const;
    646 
    647   /// Emit 32- or 64-bit value depending on the DWARF format.
    648   void emitDwarfLengthOrOffset(uint64_t Value) const;
    649 
    650   /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
    651   /// according to the settings.
    652   void emitDwarfUnitLength(uint64_t Length, const Twine &Comment) const;
    653 
    654   /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
    655   /// according to the settings.
    656   /// Return the end symbol generated inside, the caller needs to emit it.
    657   MCSymbol *emitDwarfUnitLength(const Twine &Prefix,
    658                                 const Twine &Comment) const;
    659 
    660   /// Emit reference to a call site with a specified encoding
    661   void emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo,
    662                           unsigned Encoding) const;
    663   /// Emit an integer value corresponding to the call site encoding
    664   void emitCallSiteValue(uint64_t Value, unsigned Encoding) const;
    665 
    666   /// Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified.
    667   virtual unsigned getISAEncoding() { return 0; }
    668 
    669   /// Emit the directive and value for debug thread local expression
    670   ///
    671   /// \p Value - The value to emit.
    672   /// \p Size - The size of the integer (in bytes) to emit.
    673   virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const;
    674 
    675   //===------------------------------------------------------------------===//
    676   // Dwarf Lowering Routines
    677   //===------------------------------------------------------------------===//
    678 
    679   /// Emit frame instruction to describe the layout of the frame.
    680   void emitCFIInstruction(const MCCFIInstruction &Inst) const;
    681 
    682   /// Emit Dwarf abbreviation table.
    683   template <typename T> void emitDwarfAbbrevs(const T &Abbrevs) const {
    684     // For each abbreviation.
    685     for (const auto &Abbrev : Abbrevs)
    686       emitDwarfAbbrev(*Abbrev);
    687 
    688     // Mark end of abbreviations.
    689     emitULEB128(0, "EOM(3)");
    690   }
    691 
    692   void emitDwarfAbbrev(const DIEAbbrev &Abbrev) const;
    693 
    694   /// Recursively emit Dwarf DIE tree.
    695   void emitDwarfDIE(const DIE &Die) const;
    696 
    697   //===------------------------------------------------------------------===//
    698   // Inline Asm Support
    699   //===------------------------------------------------------------------===//
    700 
    701   // These are hooks that targets can override to implement inline asm
    702   // support.  These should probably be moved out of AsmPrinter someday.
    703 
    704   /// Print information related to the specified machine instr that is
    705   /// independent of the operand, and may be independent of the instr itself.
    706   /// This can be useful for portably encoding the comment character or other
    707   /// bits of target-specific knowledge into the asmstrings.  The syntax used is
    708   /// ${:comment}.  Targets can override this to add support for their own
    709   /// strange codes.
    710   virtual void PrintSpecial(const MachineInstr *MI, raw_ostream &OS,
    711                             const char *Code) const;
    712 
    713   /// Print the MachineOperand as a symbol. Targets with complex handling of
    714   /// symbol references should override the base implementation.
    715   virtual void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &OS);
    716 
    717   /// Print the specified operand of MI, an INLINEASM instruction, using the
    718   /// specified assembler variant.  Targets should override this to format as
    719   /// appropriate.  This method can return true if the operand is erroneous.
    720   virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
    721                                const char *ExtraCode, raw_ostream &OS);
    722 
    723   /// Print the specified operand of MI, an INLINEASM instruction, using the
    724   /// specified assembler variant as an address. Targets should override this to
    725   /// format as appropriate.  This method can return true if the operand is
    726   /// erroneous.
    727   virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
    728                                      const char *ExtraCode, raw_ostream &OS);
    729 
    730   /// Let the target do anything it needs to do before emitting inlineasm.
    731   /// \p StartInfo - the subtarget info before parsing inline asm
    732   virtual void emitInlineAsmStart() const;
    733 
    734   /// Let the target do anything it needs to do after emitting inlineasm.
    735   /// This callback can be used restore the original mode in case the
    736   /// inlineasm contains directives to switch modes.
    737   /// \p StartInfo - the original subtarget info before inline asm
    738   /// \p EndInfo   - the final subtarget info after parsing the inline asm,
    739   ///                or NULL if the value is unknown.
    740   virtual void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
    741                                 const MCSubtargetInfo *EndInfo) const;
    742 
    743   /// This emits visibility information about symbol, if this is supported by
    744   /// the target.
    745   void emitVisibility(MCSymbol *Sym, unsigned Visibility,
    746                       bool IsDefinition = true) const;
    747 
    748   /// This emits linkage information about \p GVSym based on \p GV, if this is
    749   /// supported by the target.
    750   virtual void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const;
    751 
    752   /// Return the alignment for the specified \p GV.
    753   static Align getGVAlignment(const GlobalObject *GV, const DataLayout &DL,
    754                               Align InAlign = Align(1));
    755 
    756 private:
    757   /// Private state for PrintSpecial()
    758   // Assign a unique ID to this machine instruction.
    759   mutable const MachineInstr *LastMI = nullptr;
    760   mutable unsigned LastFn = 0;
    761   mutable unsigned Counter = ~0U;
    762 
    763   /// This method emits the header for the current function.
    764   virtual void emitFunctionHeader();
    765 
    766   /// This method emits a comment next to header for the current function.
    767   virtual void emitFunctionHeaderComment();
    768 
    769   /// Emit a blob of inline asm to the output streamer.
    770   void
    771   emitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
    772                 const MCTargetOptions &MCOptions,
    773                 const MDNode *LocMDNode = nullptr,
    774                 InlineAsm::AsmDialect AsmDialect = InlineAsm::AD_ATT) const;
    775 
    776   /// This method formats and emits the specified machine instruction that is an
    777   /// inline asm.
    778   void emitInlineAsm(const MachineInstr *MI) const;
    779 
    780   /// Add inline assembly info to the diagnostics machinery, so we can
    781   /// emit file and position info. Returns SrcMgr memory buffer position.
    782   unsigned addInlineAsmDiagBuffer(StringRef AsmStr,
    783                                   const MDNode *LocMDNode) const;
    784 
    785   //===------------------------------------------------------------------===//
    786   // Internal Implementation Details
    787   //===------------------------------------------------------------------===//
    788 
    789   void emitJumpTableEntry(const MachineJumpTableInfo *MJTI,
    790                           const MachineBasicBlock *MBB, unsigned uid) const;
    791   void emitLLVMUsedList(const ConstantArray *InitList);
    792   /// Emit llvm.ident metadata in an '.ident' directive.
    793   void emitModuleIdents(Module &M);
    794   /// Emit bytes for llvm.commandline metadata.
    795   void emitModuleCommandLines(Module &M);
    796 
    797   GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy &S);
    798   /// Emit GlobalAlias or GlobalIFunc.
    799   void emitGlobalIndirectSymbol(Module &M, const GlobalIndirectSymbol &GIS);
    800 
    801   /// This method decides whether the specified basic block requires a label.
    802   bool shouldEmitLabelForBasicBlock(const MachineBasicBlock &MBB) const;
    803 };
    804 
    805 } // end namespace llvm
    806 
    807 #endif // LLVM_CODEGEN_ASMPRINTER_H
    808