1a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===-- llvm/CodeGen/AsmPrinter.h - AsmPrinter Framework --------*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 3a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// The LLVM Compiler Infrastructure 4a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 8a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===// 9a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 10563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// This file contains a class to be used as the base class for target specific 11563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// asm writers. This class primarily handles common functionality used by 12563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// all asm writers. 13a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 14a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===// 15a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 16a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#ifndef LLVM_CODEGEN_ASMPRINTER_H 17a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#define LLVM_CODEGEN_ASMPRINTER_H 18a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/MapVector.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/Twine.h" 21a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#include "llvm/CodeGen/MachineFunctionPass.h" 220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/InlineAsm.h" 231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 2450bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper#include "llvm/Support/ErrorHandling.h" 25a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 26a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnernamespace llvm { 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass AsmPrinterHandler; 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass BlockAddress; 29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass ByteStreamer; 30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass GCStrategy; 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass Constant; 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass ConstantArray; 334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass DIE; 344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass DIEAbbrev; 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass GCMetadataPrinter; 36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass GlobalValue; 37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass GlobalVariable; 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineBasicBlock; 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineFunction; 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineInstr; 41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineLocation; 42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineLoopInfo; 43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineLoop; 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineConstantPoolValue; 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineJumpTableInfo; 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineModuleInfo; 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCAsmInfo; 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCCFIInstruction; 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCContext; 50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass MCExpr; 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCInst; 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCSection; 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCStreamer; 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCSubtargetInfo; 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCSymbol; 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MDNode; 57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DwarfDebug; 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass Mangler; 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass TargetLoweringObjectFile; 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DataLayout; 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass TargetMachine; 62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// This class is intended to be used as a driving class for all asm writers. 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass AsmPrinter : public MachineFunctionPass { 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Target machine description. 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TargetMachine &TM; 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Target Asm Printer information. 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCAsmInfo *MAI; 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This is the context for the output file that we are streaming. This owns 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// all of the global MC-related objects for the generated translation unit. 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCContext &OutContext; 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This is the MCStreamer object for the file we are generating. This 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// contains the transient state for the current translation unit that we are 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// generating (such as the current section etc). 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCStreamer &OutStreamer; 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// The current machine function. 84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MachineFunction *MF; 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This is a pointer to the current MachineModuleInfo. 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineModuleInfo *MMI; 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Name-mangler for global names. 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Mangler *Mang; 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// The symbol for the current function. This is recalculated at the beginning 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// of each call to runOnMachineFunction(). 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *CurrentFnSym; 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// The symbol used to represent the start of the current function for the 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// purpose of calculating its size (e.g. using the .size directive). By 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// default, this is equal to CurrentFnSym. 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *CurrentFnSymForSize; 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 103ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// Map global GOT equivalent MCSymbols to GlobalVariables and keep track of 104ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// its number of uses by other globals. 105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines typedef std::pair<const GlobalVariable *, unsigned> GOTEquivUsePair; 1064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MapVector<const MCSymbol *, GOTEquivUsePair> GlobalGOTEquivs; 107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate: 1094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCSymbol *CurrentFnBegin; 1104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCSymbol *CurrentFnEnd; 1114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCSymbol *CurExceptionSym; 1124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // The garbage collection metadata printer table. 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void *GCMetadataPrinters; // Really a DenseMap. 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit comments in assembly output if this is true. 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool VerboseAsm; 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static char ID; 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// If VerboseAsm is set, a pointer to the loop info for this function. 122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineLoopInfo *LI; 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines struct HandlerInfo { 125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AsmPrinterHandler *Handler; 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *TimerName, *TimerGroupName; 127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines HandlerInfo(AsmPrinterHandler *Handler, const char *TimerName, 128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *TimerGroupName) 129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : Handler(Handler), TimerName(TimerName), 130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TimerGroupName(TimerGroupName) {} 131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines }; 132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// A vector of all debug/EH info emitters we should use. This vector 133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// maintains ownership of the emitters. 134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SmallVector<HandlerInfo, 1> Handlers; 135a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// If the target supports dwarf debug info, this pointer is non-null. 137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DwarfDebug *DD; 138dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov 139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprotected: 140ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines explicit AsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer); 141dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov 142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 1432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar ~AsmPrinter() override; 144dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov 145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DwarfDebug *getDwarfDebug() { return DD; } 146ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DwarfDebug *getDwarfDebug() const { return DD; } 147b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner 148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return true if assembly output should contain comments. 149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isVerbose() const { return VerboseAsm; } 151a432997745f668e85e45826106430f69238b1d1eRafael Espindola 152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return a unique ID for the current function. 153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getFunctionNumber() const; 155f46337004ab08076774932785679460ec3d3bb9aCharles Davis 1564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCSymbol *getFunctionBegin() const { return CurrentFnBegin; } 1574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCSymbol *getFunctionEnd() const { return CurrentFnEnd; } 1584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCSymbol *getCurExceptionSym(); 1594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return information about object file lowering. 161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const TargetLoweringObjectFile &getObjFileLowering() const; 162dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov 163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return information about data layout. 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const DataLayout &getDataLayout() const; 165dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov 166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return information about subtarget. 167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCSubtargetInfo &getSubtargetInfo() const; 168dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov 169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitToStreamer(MCStreamer &S, const MCInst &Inst); 17087370b8301fa39ee54bdcaae0618fd565e808466Devang Patel 171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the target triple string. 172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringRef getTargetTriple() const; 173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the current section we are emitting to. 175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCSection *getCurrentSection() const; 176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void getNameWithPrefix(SmallVectorImpl<char> &Name, 178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const GlobalValue *GV) const; 179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *getSymbol(const GlobalValue *GV) const; 181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // MachineFunctionPass Implementation. 184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Record analysis usage. 187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override; 189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Set up the AsmPrinter when we are working on a new module. If your pass 191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// overrides this, it must make sure to explicitly call this implementation. 192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool doInitialization(Module &M) override; 193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Shut down the asmprinter. If you override this in your pass, you must make 195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// sure to call it explicitly. 196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool doFinalization(Module &M) override; 197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit the specified function out to the OutStreamer. 199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool runOnMachineFunction(MachineFunction &MF) override { 200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SetupMachineFunction(MF); 201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EmitFunctionBody(); 202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return false; 203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Coarse grained IR lowering routines. 207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This should be called when a new MachineFunction is being processed from 210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// runOnMachineFunction. 211dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void SetupMachineFunction(MachineFunction &MF); 212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This method emits the body and trailer for a function. 214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitFunctionBody(); 215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitCFIInstruction(const MachineInstr &MI); 217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 218ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void emitFrameAlloc(const MachineInstr &MI); 219ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines enum CFIMoveType { CFI_M_None, CFI_M_EH, CFI_M_Debug }; 221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CFIMoveType needsCFIMoves(); 222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool needsSEHMoves(); 224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Print to the current output stream assembly representations of the 226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// constants in the constant pool MCP. This is used to print out constants 227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// which have been "spilled to memory" by the code generator. 228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitConstantPool(); 230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Print assembly representations of the jump tables used by the current 232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// function to the current output stream. 233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitJumpTableInfo(); 235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit the specified global variable to the .s file. 237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitGlobalVariable(const GlobalVariable *GV); 238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 239dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Check to see if the specified global is a special global used by LLVM. If 240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// so, emit it and return true, otherwise do nothing and return false. 241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool EmitSpecialLLVMGlobal(const GlobalVariable *GV); 242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit an alignment directive to the specified power of two boundary. For 244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// example, if you pass in 3 here, you will get an 8 byte alignment. If a 245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// global value is specified, and if that global has an explicit alignment 246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// requested, it will override the alignment request if required for 247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// correctness. 248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitAlignment(unsigned NumBits, const GlobalObject *GO = nullptr) const; 250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 251ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// Lower the specified LLVM Constant to an MCExpr. 252ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const MCExpr *lowerConstant(const Constant *CV); 253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Print a general LLVM constant to the .s file. 255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitGlobalConstant(const Constant *CV); 256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 257ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// \brief Unnamed constant global variables solely contaning a pointer to 258ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// another globals variable act like a global variable "proxy", or GOT 259ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// equivalents, i.e., it's only used to hold the address of the latter. One 260ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// optimization is to replace accesses to these proxies by using the GOT 261ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// entry for the final global instead. Hence, we select GOT equivalent 262ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// candidates among all the module global variables, avoid emitting them 263ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// unnecessarily and finally replace references to them by pc relative 264ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// accesses to GOT entries. 265ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void computeGlobalGOTEquivs(Module &M); 266ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 267ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// \brief Constant expressions using GOT equivalent globals may not be 268ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// eligible for PC relative GOT entry conversion, in such cases we need to 269ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// emit the proxies we previously omitted in EmitGlobalVariable. 270ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void emitGlobalGOTEquivs(); 271ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 273dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Overridable Hooks 274dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 275dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 276dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Targets can, or in the case of EmitInstruction, must implement these to 277dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // customize output. 278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This virtual method can be overridden by targets that want to emit 280dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// something at the start of their file. 281dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitStartOfAsmFile(Module &) {} 282dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 283dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This virtual method can be overridden by targets that want to emit 284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// something at the end of their file. 285dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitEndOfAsmFile(Module &) {} 286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Targets can override this to emit stuff before the first basic block in 288dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// the function. 289dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitFunctionBodyStart() {} 290dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Targets can override this to emit stuff after the last basic block in the 292dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// function. 293dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitFunctionBodyEnd() {} 294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 295ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// Targets can override this to emit stuff at the start of a basic block. 296ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// By default, this method prints the label for the specified 297ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// MachineBasicBlock, an alignment (if present) and a comment describing it 298ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// if appropriate. 299ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines virtual void EmitBasicBlockStart(const MachineBasicBlock &MBB) const; 300ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 30137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Targets can override this to emit stuff at the end of a basic block. 30237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines virtual void EmitBasicBlockEnd(const MachineBasicBlock &MBB) {} 30337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 304dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Targets should implement this to emit instructions. 305dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitInstruction(const MachineInstr *) { 306dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines llvm_unreachable("EmitInstruction not implemented"); 307dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 308dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the symbol for the specified constant pool entry. 310dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual MCSymbol *GetCPISymbol(unsigned CPID) const; 311dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 312dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitFunctionEntryLabel(); 313dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 314dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); 315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Targets can override this to change how global constants that are part of 317dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// a C++ static/global constructor list are emitted. 318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitXXStructor(const Constant *CV) { EmitGlobalConstant(CV); } 319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return true if the basic block has exactly one predecessor and the control 321dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// transfer mechanism between the predecessor and this block is a 322dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// fall-through. 323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual bool 324dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const; 325dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 326dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Targets can override this to customize the output of IMPLICIT_DEF 327dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// instructions in verbose mode. 328dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void emitImplicitDef(const MachineInstr *MI) const; 329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 330dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 331dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Symbol Lowering Routines. 332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 3344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCSymbol *createTempSymbol(const Twine &Name) const; 335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the MCSymbol for a private symbol with global value name as its 337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// base, with the specified suffix. 338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV, 339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringRef Suffix) const; 340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 341dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the MCSymbol for the specified ExternalSymbol. 342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *GetExternalSymbolSymbol(StringRef Sym) const; 343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 344dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the symbol for the specified jump table entry. 345dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *GetJTISymbol(unsigned JTID, bool isLinkerPrivate = false) const; 346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 347dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the symbol for the specified jump table .set 348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// FIXME: privatize to AsmPrinter. 349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *GetJTSetSymbol(unsigned UID, unsigned MBBID) const; 350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the MCSymbol used to satisfy BlockAddress uses of the specified 352dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// basic block. 353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const; 354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *GetBlockAddressSymbol(const BasicBlock *BB) const; 355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Emission Helper Routines. 358dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 359dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This is just convenient handler for printing offsets. 361dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void printOffset(int64_t Offset, raw_ostream &OS) const; 362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit a byte directive and value. 364dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitInt8(int Value) const; 366dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 367dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit a short directive and value. 368dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 369dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitInt16(int Value) const; 370dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 371dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit a long directive and value. 372dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitInt32(int Value) const; 374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit something like ".long Hi-Lo" where the size in bytes of the directive 376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// is specified by Size and Hi/Lo specify the labels. This implicitly uses 377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// .set if it is available. 378dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, 379dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned Size) const; 380dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit something like ".long Label+Offset" where the size in bytes of the 382dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// directive is specified by Size and Label specifies the label. This 383dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// implicitly uses .set if it is available. 384dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset, 385dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned Size, bool IsSectionRelative = false) const; 386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit something like ".long Label" where the size in bytes of the directive 388dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// is specified by Size and Label specifies the label. 389dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitLabelReference(const MCSymbol *Label, unsigned Size, 390dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool IsSectionRelative = false) const { 391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EmitLabelPlusOffset(Label, 0, Size, IsSectionRelative); 392dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 394dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Dwarf Emission Helper Routines 396dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 397dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit the specified signed leb128 value. 399dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitSLEB128(int64_t Value, const char *Desc = nullptr) const; 400dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 401dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit the specified unsigned leb128 value. 402dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitULEB128(uint64_t Value, const char *Desc = nullptr, 403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned PadTo = 0) const; 404dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 405dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit a .byte 42 directive for a DW_CFA_xxx value. 406dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitCFAByte(unsigned Val) const; 407dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 408dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit a .byte 42 directive that corresponds to an encoding. If verbose 409dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// assembly output is enabled, we output comments describing the encoding. 410dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Desc is a string saying what the encoding is specifying (e.g. "LSDA"). 411dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitEncodingByte(unsigned Val, const char *Desc = nullptr) const; 412dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 413dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Return the size of the encoding in bytes. 414dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned GetSizeOfEncodedValue(unsigned Encoding) const; 415dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 416dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit reference to a ttype global with a specified encoding. 417dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitTTypeReference(const GlobalValue *GV, unsigned Encoding) const; 418dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 419dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit the 4-byte offset of Label from the start of its section. This can 420dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// be done with a special directive if the target supports it (e.g. cygwin) 421dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// or by emitting it as an offset from a label at the start of the section. 4224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar void emitSectionOffset(const MCSymbol *Label) const; 423dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 424dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified. 4254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar virtual unsigned getISAEncoding() { return 0; } 426dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 42737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// EmitDwarfRegOp - Emit a dwarf register operation. 428ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines virtual void EmitDwarfRegOp(ByteStreamer &BS, 429ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const MachineLocation &MLoc) const; 430dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 431dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 432dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Dwarf Lowering Routines 433dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 434dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 435dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Emit frame instruction to describe the layout of the frame. 436dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitCFIInstruction(const MCCFIInstruction &Inst) const; 437dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar /// \brief Emit Dwarf abbreviation table. 4394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar void emitDwarfAbbrevs(const std::vector<DIEAbbrev *>& Abbrevs) const; 4404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 4414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar /// \brief Recursively emit Dwarf DIE tree. 4424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar void emitDwarfDIE(const DIE &Die) const; 4434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 444dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 445dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Inline Asm Support 446dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 447dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 448dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // These are hooks that targets can override to implement inline asm 449dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // support. These should probably be moved out of AsmPrinter someday. 450dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 451dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Print information related to the specified machine instr that is 452dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// independent of the operand, and may be independent of the instr itself. 453dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This can be useful for portably encoding the comment character or other 454dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// bits of target-specific knowledge into the asmstrings. The syntax used is 455dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// ${:comment}. Targets can override this to add support for their own 456dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// strange codes. 457dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void PrintSpecial(const MachineInstr *MI, raw_ostream &OS, 458dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *Code) const; 459dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 460dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Print the specified operand of MI, an INLINEASM instruction, using the 461dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// specified assembler variant. Targets should override this to format as 462dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// appropriate. This method can return true if the operand is erroneous. 463dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 464dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned AsmVariant, const char *ExtraCode, 465dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines raw_ostream &OS); 466dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 467dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Print the specified operand of MI, an INLINEASM instruction, using the 468dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// specified assembler variant as an address. Targets should override this to 469dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// format as appropriate. This method can return true if the operand is 470dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// erroneous. 471dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 472dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned AsmVariant, const char *ExtraCode, 473dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines raw_ostream &OS); 474dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 475ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// Let the target do anything it needs to do before emitting inlineasm. 476ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// \p StartInfo - the subtarget info before parsing inline asm 477ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines virtual void emitInlineAsmStart() const; 478ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 479dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Let the target do anything it needs to do after emitting inlineasm. 480dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This callback can be used restore the original mode in case the 481dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// inlineasm contains directives to switch modes. 482dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \p StartInfo - the original subtarget info before inline asm 483dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \p EndInfo - the final subtarget info after parsing the inline asm, 484dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// or NULL if the value is unknown. 485dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo, 486dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCSubtargetInfo *EndInfo) const; 487dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 488dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate: 489dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Private state for PrintSpecial() 490dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Assign a unique ID to this machine instruction. 491dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines mutable const MachineInstr *LastMI; 492dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines mutable unsigned LastFn; 493dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines mutable unsigned Counter; 4944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 4954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar /// This method emits the header for the current function. 4964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar void EmitFunctionHeader(); 497dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 498dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit a blob of inline asm to the output streamer. 499dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void 5004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar EmitInlineAsm(StringRef Str, const MCSubtargetInfo &STI, 5014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MDNode *LocMDNode = nullptr, 502dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines InlineAsm::AsmDialect AsmDialect = InlineAsm::AD_ATT) const; 503dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 504dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This method formats and emits the specified machine instruction that is an 505dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// inline asm. 506dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitInlineAsm(const MachineInstr *MI) const; 507dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 508dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 509dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Internal Implementation Details 510dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines //===------------------------------------------------------------------===// 511dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 512dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This emits visibility information about symbol, if this is suported by the 513dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// target. 514dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitVisibility(MCSymbol *Sym, unsigned Visibility, 515dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool IsDefinition = true) const; 516dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 517dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const; 518dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 519dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitJumpTableEntry(const MachineJumpTableInfo *MJTI, 520dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MachineBasicBlock *MBB, unsigned uid) const; 521dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitLLVMUsedList(const ConstantArray *InitList); 522dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Emit llvm.ident metadata in an '.ident' directive. 523dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitModuleIdents(Module &M); 524dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitXXStructorList(const Constant *List, bool isCtor); 525dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy &C); 526dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 527a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 528a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 529a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 530