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