MCStreamer.h revision c7ce3e4f42219003f30382be17d966cb2dfb4e71
125e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//===- MCStreamer.h - High-level Streaming Machine Code Output --*- C++ -*-===// 225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// 325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// The LLVM Compiler Infrastructure 425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// 525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// This file is distributed under the University of Illinois Open Source 625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// License. See LICENSE.TXT for details. 725e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// 825e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//===----------------------------------------------------------------------===// 9e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner// 10e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner// This file declares the MCStreamer class. 11e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner// 12e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner//===----------------------------------------------------------------------===// 1325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 1425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#ifndef LLVM_MC_MCSTREAMER_H 1525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#define LLVM_MC_MCSTREAMER_H 1625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 17255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/ArrayRef.h" 18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/SmallVector.h" 1977afbdce53aa740777486b0cc4e9df151ae65468Jack Carter#include "llvm/MC/MCAssembler.h" 20a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner#include "llvm/MC/MCDirectives.h" 2189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola#include "llvm/MC/MCDwarf.h" 220855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis#include "llvm/MC/MCWin64EH.h" 23255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/DataTypes.h" 24cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar#include <string> 2584a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 2625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbarnamespace llvm { 27baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCAsmBackend; 28baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCCodeEmitter; 29baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCContext; 30baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCExpr; 31baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCInst; 32baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCInstPrinter; 33baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCSection; 34320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass MCStreamer; 35baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCSymbol; 36baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass StringRef; 37baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass Twine; 38baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass raw_ostream; 39baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass formatted_raw_ostream; 40baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 41baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingtypedef std::pair<const MCSection *, const MCExpr *> MCSectionSubPair; 42baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 43320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// Target specific streamer interface. This is used so that targets can 44320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// implement support for target specific assembly directives. 45320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 46320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// If target foo wants to use this, it should implement 3 classes: 47320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// * FooTargetStreamer : public MCTargetStreamer 48320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// * FooTargetAsmSreamer : public FooTargetStreamer 49320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// * FooTargetELFStreamer : public FooTargetStreamer 50320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 51320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// FooTargetStreamer should have a pure virtual method for each directive. For 52320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// example, for a ".bar symbol_name" directive, it should have 53320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// virtual emitBar(const MCSymbol &Symbol) = 0; 54320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 55320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// The FooTargetAsmSreamer and FooTargetELFStreamer classes implement the 56320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// method. The assembly streamer just prints ".bar symbol_name". The object 57320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// streamer does whatever is needed to implement .bar in the object file. 58320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 59320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// In the assembly printer and parser the target streamer can be used by 60320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// calling getTargetStreamer and casting it to FooTargetStreamer: 61320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 62320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// MCTargetStreamer &TS = OutStreamer.getTargetStreamer(); 63320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// FooTargetStreamer &ATS = static_cast<FooTargetStreamer &>(TS); 64320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 65320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// The base classes FooTargetAsmSreamer and FooTargetELFStreamer should *never* 66320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// be treated differently. Callers should always talk to a FooTargetStreamer. 67320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass MCTargetStreamer { 68320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaprotected: 693353c592de08c4a7b7b282714b8044d7cfc4c6adBenjamin Kramer MCStreamer *Streamer; 70320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 71320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolapublic: 72320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual ~MCTargetStreamer(); 733353c592de08c4a7b7b282714b8044d7cfc4c6adBenjamin Kramer void setStreamer(MCStreamer *S) { Streamer = S; } 74320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola}; 75320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 76320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola// FIXME: declared here because it is used from 77320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola// lib/CodeGen/AsmPrinter/ARMException.cpp. 78320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass ARMTargetStreamer : public MCTargetStreamer { 79320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolapublic: 80320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitFnStart() = 0; 81320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitFnEnd() = 0; 82320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitCantUnwind() = 0; 83320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitPersonality(const MCSymbol *Personality) = 0; 84320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitHandlerData() = 0; 85320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitSetFP(unsigned FpReg, unsigned SpReg, 86320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola int64_t Offset = 0) = 0; 87320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitPad(int64_t Offset) = 0; 88320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitRegSave(const SmallVectorImpl<unsigned> &RegList, 89320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola bool isVector) = 0; 90320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola}; 91320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 92baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// MCStreamer - Streaming machine code generation interface. This interface 93baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// is intended to provide a programatic interface that is very similar to the 94baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// level that an assembler .s file provides. It has callbacks to emit bytes, 95baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// handle directives, etc. The implementation of this interface retains 96baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// state to know what the current section is etc. 97baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 98baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// There are multiple implementations of this interface: one for writing out 99baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// a .s file, and implementations that write out .o files of various formats. 100baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 101baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCStreamer { 102baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCContext &Context; 1033353c592de08c4a7b7b282714b8044d7cfc4c6adBenjamin Kramer OwningPtr<MCTargetStreamer> TargetStreamer; 10489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 105baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCStreamer(const MCStreamer &) LLVM_DELETED_FUNCTION; 106baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCStreamer &operator=(const MCStreamer &) LLVM_DELETED_FUNCTION; 107dda1bdc962a314bf4fca86f4cd4802ff6c55b172Bill Wendling 108baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool EmitEHFrame; 109baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool EmitDebugFrame; 11038ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis 111baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::vector<MCDwarfFrameInfo> FrameInfos; 112baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCDwarfFrameInfo *getCurrentFrameInfo(); 113baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSymbol *EmitCFICommon(); 114baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EnsureValidFrame(); 11538ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis 116baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::vector<MCWin64EHUnwindInfo *> W64UnwindInfos; 117baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo *CurrentW64UnwindInfo; 118baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame); 119baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EnsureValidW64UnwindInfo(); 12084a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 121baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSymbol *LastSymbol; 1227768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 1235cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton // SymbolOrdering - Tracks an index to represent the order 1245cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton // a symbol was emitted in. Zero means we did not emit that symbol. 1255cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton DenseMap<const MCSymbol *, unsigned> SymbolOrdering; 1265cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 127baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SectionStack - This is stack of current and previous section 128baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// values saved by PushSection. 129baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack; 1307768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 131baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool AutoInitSections; 132df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne 133baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingprotected: 134320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer); 135df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne 136baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A, 137baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *B); 1381674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer 139baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCExpr *ForceExpAbs(const MCExpr *Expr); 1400dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 141baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void RecordProcStart(MCDwarfFrameInfo &Frame); 142baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame); 143baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void RecordProcEnd(MCDwarfFrameInfo &Frame); 144baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame); 145da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling void EmitFrames(MCAsmBackend *MAB, bool usingCFI); 146410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis 147baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo *getCurrentW64UnwindInfo() { 148baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return CurrentW64UnwindInfo; 149baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 150baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitW64Tables(); 15107f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames 152baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingpublic: 153baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual ~MCStreamer(); 154baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 155baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// State management 156baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 157baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void reset(); 158baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 159baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCContext &getContext() const { return Context; } 160baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 161320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCTargetStreamer &getTargetStreamer() { 162320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola assert(TargetStreamer); 163320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola return *TargetStreamer; 164320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola } 165320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 166baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned getNumFrameInfos() { return FrameInfos.size(); } 167baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 168baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCDwarfFrameInfo &getFrameInfo(unsigned i) { return FrameInfos[i]; } 169baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 170baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ArrayRef<MCDwarfFrameInfo> getFrameInfos() const { return FrameInfos; } 171baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 172baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned getNumW64UnwindInfos() { return W64UnwindInfos.size(); } 173baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 174baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) { 175baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return *W64UnwindInfos[i]; 176baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 17707f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames 178da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling void generateCompactUnwindEncodings(MCAsmBackend *MAB); 179c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling 180baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Assembly File Formatting. 181baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 182baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 183baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// isVerboseAsm - Return true if this streamer supports verbose assembly 184baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// and if it is enabled. 185baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool isVerboseAsm() const { return false; } 186baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 187baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// hasRawTextSupport - Return true if this asm streamer supports emitting 188baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// unformatted text to the .s file with EmitRawText. 189baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool hasRawTextSupport() const { return false; } 190baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 191baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// AddComment - Add a comment that can be emitted to the generated .s 192baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// file if applicable as a QoI issue to make the output of the compiler 193baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// more readable. This only affects the MCAsmStreamer, and only when 194baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// verbose assembly output is enabled. 195baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 196baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// If the comment includes embedded \n's, they will each get the comment 197baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// prefix as appropriate. The added comment should not end with a \n. 198baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void AddComment(const Twine &T) {} 199baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 200baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// GetCommentOS - Return a raw_ostream that comments can be written to. 201baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Unlike AddComment, you are required to terminate comments with \n if you 202baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// use this method. 203baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual raw_ostream &GetCommentOS(); 204baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 205baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// AddBlankLine - Emit a blank line to a .s file to pretty it up. 206baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void AddBlankLine() {} 207baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 208baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 209baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 210baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Symbol & Section Management 211baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 212baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 213baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getCurrentSection - Return the current section that the streamer is 214baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitting code to. 215baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair getCurrentSection() const { 216baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (!SectionStack.empty()) 217baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return SectionStack.back().first; 218baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return MCSectionSubPair(); 219baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 220baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 221baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getPreviousSection - Return the previous section that the streamer is 222baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitting code to. 223baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair getPreviousSection() const { 224baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (!SectionStack.empty()) 225baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return SectionStack.back().second; 226baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return MCSectionSubPair(); 227baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 228baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 2295cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// GetSymbolOrder - Returns an index to represent the order 2305cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// a symbol was emitted in. (zero if we did not emit that symbol) 2315cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton unsigned GetSymbolOrder(const MCSymbol *Sym) const { 2325cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton return SymbolOrdering.lookup(Sym); 2335cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton } 2345cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 235baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// ChangeSection - Update streamer for a new active section. 236baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 237baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is called by PopSection and SwitchSection, if the current 238baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section changes. 239baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void ChangeSection(const MCSection *, const MCExpr *) = 0; 240baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 241baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// pushSection - Save the current and previous section on the 242baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section stack. 243baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void PushSection() { 244baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.push_back( 245baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::make_pair(getCurrentSection(), getPreviousSection())); 246baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 247baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 248baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// popSection - Restore the current and previous section from 249baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the section stack. Calls ChangeSection as needed. 250baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 251baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Returns false if the stack was empty. 252baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool PopSection() { 253baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (SectionStack.size() <= 1) 254baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return false; 255baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair oldSection = SectionStack.pop_back_val().first; 256baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 257baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 258baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (oldSection != curSection) 259baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ChangeSection(curSection.first, curSection.second); 260baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return true; 261baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 262baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 263baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool SubSection(const MCExpr *Subsection) { 264baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (SectionStack.empty()) 265baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return false; 266baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 267baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SwitchSection(SectionStack.back().first.first, Subsection); 268baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return true; 269baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 270baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 271baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SwitchSection - Set the current section where code is being emitted to 272baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @p Section. This is required to update CurSection. 273baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 274baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to assembler directives like .section, .text, etc. 275baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void SwitchSection(const MCSection *Section, const MCExpr *Subsection = 0) { 276baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling assert(Section && "Cannot switch to a null section!"); 277baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 278baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().second = curSection; 279baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (MCSectionSubPair(Section, Subsection) != curSection) { 280baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().first = MCSectionSubPair(Section, Subsection); 281baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ChangeSection(Section, Subsection); 282245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola } 283baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 284baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 285baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SwitchSectionNoChange - Set the current section where code is being 286baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted to @p Section. This is required to update CurSection. This 287baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// version does not call ChangeSection. 288baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void SwitchSectionNoChange(const MCSection *Section, 289baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCExpr *Subsection = 0) { 290baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling assert(Section && "Cannot switch to a null section!"); 291baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 292baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().second = curSection; 293baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (MCSectionSubPair(Section, Subsection) != curSection) 294baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().first = MCSectionSubPair(Section, Subsection); 295baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 296baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 297baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Initialize the streamer. 298baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void InitStreamer() { 299baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (AutoInitSections) 300baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling InitSections(); 301baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 302baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 303baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Tell this MCStreamer to call InitSections upon initialization. 304baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setAutoInitSections(bool AutoInitSections) { 305baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling this->AutoInitSections = AutoInitSections; 306baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 307baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 308baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// InitSections - Create the default sections and set the initial one. 309baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void InitSections() = 0; 310baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 311baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// InitToTextSection - Create a text section and switch the streamer to it. 312baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void InitToTextSection() = 0; 313baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 3145cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// AssignSection - Sets the symbol's section. 3155cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// 3165cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// Each emitted symbol will be tracked in the ordering table, 3175cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// so we can sort on them later. 3185cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton void AssignSection(MCSymbol *Symbol, const MCSection *Section); 3195cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 320baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLabel - Emit a label for @p Symbol into the current section. 321baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 322baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 323baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// foo: 324baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 325baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to emit. A given symbol should only be 326baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted as a label once, and symbols emitted as a label should never be 327baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// used in an assignment. 328baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLabel(MCSymbol *Symbol); 329245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 330baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDebugLabel(MCSymbol *Symbol); 33125e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 332baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol); 333baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 334baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAssemblerFlag - Note in the output the specified @p Flag. 335baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0; 33625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 337baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLinkerOptions - Emit the given list @p Options of strings as linker 338baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// options into the output. 339baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLinkerOptions(ArrayRef<std::string> Kind) {} 340baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 341baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDataRegion - Note in the output the specified region @p Kind. 342baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDataRegion(MCDataRegionType Kind) {} 343baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 344baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitThumbFunc - Note in the output that the specified @p Func is 345baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// a Thumb mode function (ARM target only). 346baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitThumbFunc(MCSymbol *Func) = 0; 347baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 348baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getOrCreateSymbolData - Get symbol data for given symbol. 349baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual MCSymbolData &getOrCreateSymbolData(MCSymbol *Symbol); 350baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 351baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAssignment - Emit an assignment of @p Value to @p Symbol. 352baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 353baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 354baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// symbol = value 355baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 356baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// The assignment generates no code, but has the side effect of binding the 357baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// value in the current context. For the assembly streamer, this prints the 358baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// binding into the .s file. 3591abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// 360baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol being assigned to. 361baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value for the symbol. 362baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) = 0; 363eb72dcaef7423069cf8f9e802fa8de64dc8f8f30Chris Lattner 364baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitWeakReference - Emit an weak reference from @p Alias to @p Symbol. 365baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 366baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 367baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .weakref alias, symbol 368baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 369baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Alias - The alias that is being created. 370baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol being aliased. 371baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) = 0; 372baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 373baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolAttribute - Add the given @p Attribute to @p Symbol. 374baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool EmitSymbolAttribute(MCSymbol *Symbol, 375baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSymbolAttr Attribute) = 0; 376baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 377baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolDesc - Set the @p DescValue for the @p Symbol. 378baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 379baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to have its n_desc field set. 380baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param DescValue - The value to set into the n_desc field. 381baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) = 0; 382baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 383baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// BeginCOFFSymbolDef - Start emitting COFF symbol definition 384baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 385baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to have its External & Type fields set. 386baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol) = 0; 387baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 388baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSymbolStorageClass - Emit the storage class of the symbol. 389baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 390baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param StorageClass - The storage class the symbol should have. 391baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCOFFSymbolStorageClass(int StorageClass) = 0; 392baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 393baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSymbolType - Emit the type of the symbol. 394baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 395baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Type - A COFF type identifier (see COFF::SymbolType in X86COFF.h) 396baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCOFFSymbolType(int Type) = 0; 397baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 398baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EndCOFFSymbolDef - Marks the end of the symbol definition. 399baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EndCOFFSymbolDef() = 0; 400baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 401baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSecRel32 - Emits a COFF section relative relocation. 402baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 403baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - Symbol the section relative realocation should point to. 404baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCOFFSecRel32(MCSymbol const *Symbol); 405baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 406baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitELFSize - Emit an ELF .size directive. 407baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 408baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 409baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .size symbol, expression 410baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 411baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) = 0; 412baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 413baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCommonSymbol - Emit a common symbol. 414baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 415baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The common symbol to emit. 416baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the common symbol. 417baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the symbol if 418baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// non-zero. This must be a power of 2. 419baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 420baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned ByteAlignment) = 0; 421baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 422baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. 423baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 424baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The common symbol to emit. 425baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the common symbol. 426baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the common symbol in bytes. 427baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 428baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned ByteAlignment) = 0; 429baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 430baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitZerofill - Emit the zerofill section and an optional symbol. 431baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 432baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Section - The zerofill section to create and or to put the symbol 433baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The zerofill symbol to emit, if non-NULL. 434baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the zerofill symbol. 435baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the zerofill symbol if 436baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// non-zero. This must be a power of 2 on some targets. 437baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, 438baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling uint64_t Size = 0, unsigned ByteAlignment = 0) = 0; 439baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 440baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitTBSSSymbol - Emit a thread local bss (.tbss) symbol. 441baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 442baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Section - The thread local common section. 443baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The thread local common symbol to emit. 444baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the symbol. 445baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the thread local common symbol 446baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// if non-zero. This must be a power of 2 on some targets. 447baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 448baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling uint64_t Size, unsigned ByteAlignment = 0) = 0; 449baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 450baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 451baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Generating Data 452baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 453baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 454baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitBytes - Emit the bytes in \p Data into the output. 455baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 456baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .byte, .ascii, 457baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// etc. 458baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitBytes(StringRef Data) = 0; 4596b2e257e74b2c8e2f93bb244e0c80cb73005b74aMatt Fleming 460baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValue - Emit the expression @p Value into the output as a native 461baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// integer of the given @p Size bytes. 462baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 463baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .word, .quad, 464baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// etc. 465abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar /// 466baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to emit. 467baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the integer (in bytes) to emit. This must 468baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// match a native machine width. 469baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitValueImpl(const MCExpr *Value, unsigned Size) = 0; 470baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 471baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitValue(const MCExpr *Value, unsigned Size); 472baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 473baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitIntValue - Special case of EmitValue that avoids the client having 474baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// to pass in a MCExpr for constant integers. 475baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitIntValue(uint64_t Value, unsigned Size); 476baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 477baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAbsValue - Emit the Value, but try to avoid relocations. On MachO 478baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// this is done by producing 479baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// foo = value 480baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .long foo 481baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitAbsValue(const MCExpr *Value, unsigned Size); 482baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 483baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitULEB128Value(const MCExpr *Value) = 0; 484baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 485baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitSLEB128Value(const MCExpr *Value) = 0; 486baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 487baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitULEB128Value - Special case of EmitULEB128Value that avoids the 488baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// client having to pass in a MCExpr for constant integers. 489baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitULEB128IntValue(uint64_t Value, unsigned Padding = 0); 490baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 491baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the 492baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// client having to pass in a MCExpr for constant integers. 493baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitSLEB128IntValue(int64_t Value); 494baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 495baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolValue - Special case of EmitValue that avoids the client 496baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// having to pass in a MCExpr for MCSymbols. 497baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitSymbolValue(const MCSymbol *Sym, unsigned Size); 498baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 499baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitGPRel64Value - Emit the expression @p Value into the output as a 500baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// gprel64 (64-bit GP relative) value. 501baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 502baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .gpdword on 503baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// targets that support them. 504baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitGPRel64Value(const MCExpr *Value); 505baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 506baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitGPRel32Value - Emit the expression @p Value into the output as a 507baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// gprel32 (32-bit GP relative) value. 508baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 509baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .gprel32 on 510baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// targets that support them. 511baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitGPRel32Value(const MCExpr *Value); 512baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 513baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitFill - Emit NumBytes bytes worth of the value specified by 514baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// FillValue. This implements directives such as '.space'. 515baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue); 516baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 517baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Emit NumBytes worth of zeros. 518baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This function properly handles data in virtual sections. 519baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitZeros(uint64_t NumBytes); 520baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 521baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValueToAlignment - Emit some number of copies of @p Value until 522baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the byte alignment @p ByteAlignment is reached. 523baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 524baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// If the number of bytes need to emit for the alignment is not a multiple 525baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// of @p ValueSize, then the contents of the emitted fill bytes is 526baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// undefined. 527baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 528baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This used to implement the .align assembler directive. 529baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 530baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment to reach. This must be a power of 531baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// two on some targets. 532baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to use when filling bytes. 533baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ValueSize - The size of the integer (in bytes) to emit for 534baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @p Value. This must match a native machine width. 535baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 536baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the alignment cannot be reached in this many bytes, no bytes are 537baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted. 538baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, 539baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned ValueSize = 1, 540baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned MaxBytesToEmit = 0) = 0; 541baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 542baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCodeAlignment - Emit nops until the byte alignment @p ByteAlignment 543baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// is reached. 544baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 545baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This used to align code where the alignment bytes may be executed. This 546baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// can emit different bytes for different sizes to optimize execution. 547baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 548baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment to reach. This must be a power of 549baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// two on some targets. 550baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 551baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the alignment cannot be reached in this many bytes, no bytes are 552baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted. 553baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCodeAlignment(unsigned ByteAlignment, 554baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned MaxBytesToEmit = 0) = 0; 555baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 556baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValueToOffset - Emit some number of copies of @p Value until the 557baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// byte offset @p Offset is reached. 558baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 559baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .org. 560baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 561baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Offset - The offset to reach. This may be an expression, but the 562baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// expression must be associated with the current section. 563baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to use when filling bytes. 564baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @return false on success, true if the offset was invalid. 565baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool EmitValueToOffset(const MCExpr *Offset, 566baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned char Value = 0) = 0; 567baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 568baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 569baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 570baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitFileDirective - Switch to a new logical file. This is used to 571baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// implement the '.file "foo.c"' assembler directive. 572baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitFileDirective(StringRef Filename) = 0; 573baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 574c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola /// Emit the "identifiers" directive. This implements the 575c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola /// '.ident "version foo"' assembler directive. 576c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola virtual void EmitIdent(StringRef IdentString) {} 577c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola 578baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDwarfFileDirective - Associate a filename with a specified logical 579baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// file number. This implements the DWARF2 '.file 4 "foo.c"' assembler 580baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// directive. 581baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, 582baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling StringRef Filename, unsigned CUID = 0); 583baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 584baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDwarfLocDirective - This implements the DWARF2 585baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // '.loc fileno lineno ...' assembler directive. 586baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, 587baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned Column, unsigned Flags, 588baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned Isa, unsigned Discriminator, 589baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling StringRef FileName); 590baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 591baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, 592baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *LastLabel, 593baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *Label, 594baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned PointerSize) = 0; 595baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 596baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, 597baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *Label) {} 598baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 599baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitDwarfSetLineAddr(int64_t LineDelta, const MCSymbol *Label, 600baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling int PointerSize); 601baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 602baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding); 603baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISections(bool EH, bool Debug); 604baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitCFIStartProc(); 605baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitCFIEndProc(); 606baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset); 607baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfaOffset(int64_t Offset); 608baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfaRegister(int64_t Register); 609baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIOffset(int64_t Register, int64_t Offset); 610baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding); 611baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding); 612baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRememberState(); 613baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRestoreState(); 614baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISameValue(int64_t Register); 615baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRestore(int64_t Register); 616baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset); 617baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment); 618baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIEscape(StringRef Values); 619baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISignalFrame(); 620baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIUndefined(int64_t Register); 621baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRegister(int64_t Register1, int64_t Register2); 62283ba58e5f0a5afbb23d7d2092d817accded4455aVenkatraman Govindaraju virtual void EmitCFIWindowSave(); 623baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 624baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHStartProc(const MCSymbol *Symbol); 625baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHEndProc(); 626baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHStartChained(); 627baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHEndChained(); 628baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, 629baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool Except); 630baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHHandlerData(); 631baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHPushReg(unsigned Register); 632baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHSetFrame(unsigned Register, unsigned Offset); 633baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHAllocStack(unsigned Size); 634baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHSaveReg(unsigned Register, unsigned Offset); 635baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHSaveXMM(unsigned Register, unsigned Offset); 636baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHPushFrame(bool Code); 637baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHEndProlog(); 638baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 639baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitInstruction - Emit the given @p Instruction into the current 640baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section. 641baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitInstruction(const MCInst &Inst) = 0; 642baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 643baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Set the bundle alignment mode from now on in the section. 644baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// The argument is the power of 2 to which the alignment is set. The 645baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// value 0 means turn the bundle alignment off. 646baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitBundleAlignMode(unsigned AlignPow2) = 0; 647baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 648baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief The following instructions are a bundle-locked group. 649baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 650baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \param AlignToEnd - If true, the bundle-locked group will be aligned to 651baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the end of a bundle. 652baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitBundleLock(bool AlignToEnd) = 0; 653baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 654baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Ends a bundle-locked group. 655baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitBundleUnlock() = 0; 656baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 657baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitRawText - If this file is backed by a assembly streamer, this dumps 658baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the specified string in the output .s file. This capability is 659baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// indicated by the hasRawTextSupport() predicate. By default this aborts. 660baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitRawText(StringRef String); 661baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitRawText(const Twine &String); 662baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 6635cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// Flush - Causes any cached state to be written out. 6645cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton virtual void Flush() {} 6655cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 666baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// FinishImpl - Streamer specific finalization. 667baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void FinishImpl() = 0; 668baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Finish - Finish emission of machine code. 669baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void Finish(); 670baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling}; 671baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 672baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createNullStreamer - Create a dummy machine code streamer, which does 673baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// nothing. This is useful for timing the assembler front end. 674baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createNullStreamer(MCContext &Ctx); 675baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 676baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createAsmStreamer - Create a machine code streamer which will print out 677baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// assembly for the native target, suitable for compiling with a native 678baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// assembler. 679baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 680baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param InstPrint - If given, the instruction printer to use. If not given 681baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// the MCInst representation will be printed. This method takes ownership of 682baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// InstPrint. 683baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 684baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param CE - If given, a code emitter to use to show the instruction 685baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// encoding inline with the assembly. This method takes ownership of \p CE. 686baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 687baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param TAB - If given, a target asm backend to use to show the fixup 688baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// information in conjunction with encoding information. This method takes 689baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// ownership of \p TAB. 690baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 691baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param ShowInst - Whether to show the MCInst representation inline with 692baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// the assembly. 693320296a4cfe414ce59f406b8a5ce15272f563103Rafael EspindolaMCStreamer *createAsmStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer, 694320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola formatted_raw_ostream &OS, bool isVerboseAsm, 695320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola bool useLoc, bool useCFI, bool useDwarfDirectory, 696baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCInstPrinter *InstPrint = 0, 697baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCCodeEmitter *CE = 0, MCAsmBackend *TAB = 0, 698baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool ShowInst = false); 699baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 700baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createMachOStreamer - Create a machine code streamer which will generate 701baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Mach-O format object files. 702baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 703baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Takes ownership of \p TAB and \p CE. 704baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createMachOStreamer(MCContext &Ctx, MCAsmBackend &TAB, 705baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling raw_ostream &OS, MCCodeEmitter *CE, 706baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool RelaxAll = false); 707baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 708baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createWinCOFFStreamer - Create a machine code streamer which will 709baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// generate Microsoft COFF format object files. 710baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 711baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Takes ownership of \p TAB and \p CE. 712baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createWinCOFFStreamer(MCContext &Ctx, MCAsmBackend &TAB, 713baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCCodeEmitter &CE, raw_ostream &OS, 714baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool RelaxAll = false); 715baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 716baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createELFStreamer - Create a machine code streamer which will generate 717baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// ELF format object files. 718320296a4cfe414ce59f406b8a5ce15272f563103Rafael EspindolaMCStreamer *createELFStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer, 719320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCAsmBackend &TAB, raw_ostream &OS, 720320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCCodeEmitter *CE, bool RelaxAll, 721baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool NoExecStack); 722baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 723baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createPureStreamer - Create a machine code streamer which will generate 724baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// "pure" MC object files, for use with MC-JIT and testing tools. 725baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 726baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Takes ownership of \p TAB and \p CE. 727baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createPureStreamer(MCContext &Ctx, MCAsmBackend &TAB, 728baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling raw_ostream &OS, MCCodeEmitter *CE); 729abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar 73025e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar} // end namespace llvm 73125e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 73225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#endif 733