MCStreamer.h revision c3cee57f7d20f69a84fd88464ed8cf050e63c7ad
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; 34baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCSymbol; 35baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass StringRef; 36baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass Twine; 37baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass raw_ostream; 38baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass formatted_raw_ostream; 39baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 40baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingtypedef std::pair<const MCSection *, const MCExpr *> MCSectionSubPair; 41baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 42baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// MCStreamer - Streaming machine code generation interface. This interface 43baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// is intended to provide a programatic interface that is very similar to the 44baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// level that an assembler .s file provides. It has callbacks to emit bytes, 45baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// handle directives, etc. The implementation of this interface retains 46baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// state to know what the current section is etc. 47baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 48baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// There are multiple implementations of this interface: one for writing out 49baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// a .s file, and implementations that write out .o files of various formats. 50baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 51baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCStreamer { 52baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingpublic: 53baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling enum StreamerKind { 54baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_AsmStreamer, 55baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_NullStreamer, 56baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_RecordStreamer, 57baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 58baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // MCObjectStreamer subclasses. 59baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_ELFStreamer, 60baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_ARMELFStreamer, 61baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_MachOStreamer, 62baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_PureStreamer, 63baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_MipsELFStreamer, 64baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SK_WinCOFFStreamer 65baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling }; 6689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 67baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingprivate: 68baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const StreamerKind Kind; 69baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCContext &Context; 7089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 71baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCStreamer(const MCStreamer &) LLVM_DELETED_FUNCTION; 72baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCStreamer &operator=(const MCStreamer &) LLVM_DELETED_FUNCTION; 73dda1bdc962a314bf4fca86f4cd4802ff6c55b172Bill Wendling 74baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool EmitEHFrame; 75baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool EmitDebugFrame; 7638ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis 77baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::vector<MCDwarfFrameInfo> FrameInfos; 78baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCDwarfFrameInfo *getCurrentFrameInfo(); 79baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSymbol *EmitCFICommon(); 80baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EnsureValidFrame(); 8138ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis 82baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::vector<MCWin64EHUnwindInfo *> W64UnwindInfos; 83baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo *CurrentW64UnwindInfo; 84baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame); 85baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EnsureValidW64UnwindInfo(); 8684a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 87baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSymbol *LastSymbol; 887768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 89baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SectionStack - This is stack of current and previous section 90baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// values saved by PushSection. 91baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack; 927768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 93baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool AutoInitSections; 94df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne 95baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingprotected: 96baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCStreamer(StreamerKind Kind, MCContext &Ctx); 97df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne 98baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A, 99baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *B); 1001674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer 101baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCExpr *ForceExpAbs(const MCExpr *Expr); 1020dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 103baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void RecordProcStart(MCDwarfFrameInfo &Frame); 104baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame); 105baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void RecordProcEnd(MCDwarfFrameInfo &Frame); 106baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame); 107baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitFrames(bool usingCFI); 108410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis 109baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo *getCurrentW64UnwindInfo() { 110baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return CurrentW64UnwindInfo; 111baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 112baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitW64Tables(); 11307f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames 114baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingpublic: 115baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual ~MCStreamer(); 116baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 117baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling StreamerKind getKind() const { return Kind; } 118baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 119baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// State management 120baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 121baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void reset(); 122baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 123baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCContext &getContext() const { return Context; } 124baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 125baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned getNumFrameInfos() { return FrameInfos.size(); } 126baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 127baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCDwarfFrameInfo &getFrameInfo(unsigned i) { return FrameInfos[i]; } 128baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 129baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ArrayRef<MCDwarfFrameInfo> getFrameInfos() const { return FrameInfos; } 130baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 131baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned getNumW64UnwindInfos() { return W64UnwindInfos.size(); } 132baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 133baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) { 134baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return *W64UnwindInfos[i]; 135baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 13607f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames 137c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling void generateCompactUnwindEncodings(MCAsmBackend &MAB); 138c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling 139baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Assembly File Formatting. 140baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 141baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 142baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// isVerboseAsm - Return true if this streamer supports verbose assembly 143baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// and if it is enabled. 144baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool isVerboseAsm() const { return false; } 145baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 146baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// hasRawTextSupport - Return true if this asm streamer supports emitting 147baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// unformatted text to the .s file with EmitRawText. 148baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool hasRawTextSupport() const { return false; } 149baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 150baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// AddComment - Add a comment that can be emitted to the generated .s 151baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// file if applicable as a QoI issue to make the output of the compiler 152baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// more readable. This only affects the MCAsmStreamer, and only when 153baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// verbose assembly output is enabled. 154baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 155baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// If the comment includes embedded \n's, they will each get the comment 156baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// prefix as appropriate. The added comment should not end with a \n. 157baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void AddComment(const Twine &T) {} 158baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 159baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// GetCommentOS - Return a raw_ostream that comments can be written to. 160baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Unlike AddComment, you are required to terminate comments with \n if you 161baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// use this method. 162baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual raw_ostream &GetCommentOS(); 163baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 164baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// AddBlankLine - Emit a blank line to a .s file to pretty it up. 165baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void AddBlankLine() {} 166baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 167baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 168baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 169baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Symbol & Section Management 170baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 171baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 172baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getCurrentSection - Return the current section that the streamer is 173baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitting code to. 174baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair getCurrentSection() const { 175baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (!SectionStack.empty()) 176baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return SectionStack.back().first; 177baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return MCSectionSubPair(); 178baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 179baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 180baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getPreviousSection - Return the previous section that the streamer is 181baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitting code to. 182baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair getPreviousSection() const { 183baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (!SectionStack.empty()) 184baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return SectionStack.back().second; 185baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return MCSectionSubPair(); 186baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 187baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 188baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// ChangeSection - Update streamer for a new active section. 189baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 190baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is called by PopSection and SwitchSection, if the current 191baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section changes. 192baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void ChangeSection(const MCSection *, const MCExpr *) = 0; 193baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 194baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// pushSection - Save the current and previous section on the 195baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section stack. 196baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void PushSection() { 197baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.push_back( 198baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::make_pair(getCurrentSection(), getPreviousSection())); 199baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 200baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 201baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// popSection - Restore the current and previous section from 202baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the section stack. Calls ChangeSection as needed. 203baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 204baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Returns false if the stack was empty. 205baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool PopSection() { 206baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (SectionStack.size() <= 1) 207baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return false; 208baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair oldSection = SectionStack.pop_back_val().first; 209baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 210baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 211baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (oldSection != curSection) 212baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ChangeSection(curSection.first, curSection.second); 213baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return true; 214baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 215baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 216baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool SubSection(const MCExpr *Subsection) { 217baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (SectionStack.empty()) 218baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return false; 219baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 220baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SwitchSection(SectionStack.back().first.first, Subsection); 221baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return true; 222baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 223baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 224baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SwitchSection - Set the current section where code is being emitted to 225baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @p Section. This is required to update CurSection. 226baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 227baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to assembler directives like .section, .text, etc. 228baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void SwitchSection(const MCSection *Section, const MCExpr *Subsection = 0) { 229baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling assert(Section && "Cannot switch to a null section!"); 230baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 231baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().second = curSection; 232baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (MCSectionSubPair(Section, Subsection) != curSection) { 233baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().first = MCSectionSubPair(Section, Subsection); 234baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ChangeSection(Section, Subsection); 235245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola } 236baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 237baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 238baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SwitchSectionNoChange - Set the current section where code is being 239baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted to @p Section. This is required to update CurSection. This 240baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// version does not call ChangeSection. 241baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void SwitchSectionNoChange(const MCSection *Section, 242baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCExpr *Subsection = 0) { 243baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling assert(Section && "Cannot switch to a null section!"); 244baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 245baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().second = curSection; 246baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (MCSectionSubPair(Section, Subsection) != curSection) 247baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().first = MCSectionSubPair(Section, Subsection); 248baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 249baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 250baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Initialize the streamer. 251baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void InitStreamer() { 252baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (AutoInitSections) 253baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling InitSections(); 254baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 255baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 256baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Tell this MCStreamer to call InitSections upon initialization. 257baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setAutoInitSections(bool AutoInitSections) { 258baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling this->AutoInitSections = AutoInitSections; 259baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 260baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 261baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// InitSections - Create the default sections and set the initial one. 262baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void InitSections() = 0; 263baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 264baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// InitToTextSection - Create a text section and switch the streamer to it. 265baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void InitToTextSection() = 0; 266baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 267baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLabel - Emit a label for @p Symbol into the current section. 268baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 269baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 270baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// foo: 271baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 272baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to emit. A given symbol should only be 273baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted as a label once, and symbols emitted as a label should never be 274baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// used in an assignment. 275baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLabel(MCSymbol *Symbol); 276245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 277baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDebugLabel(MCSymbol *Symbol); 27825e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 279baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol); 280baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 281baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAssemblerFlag - Note in the output the specified @p Flag. 282baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0; 28325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 284baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLinkerOptions - Emit the given list @p Options of strings as linker 285baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// options into the output. 286baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLinkerOptions(ArrayRef<std::string> Kind) {} 287baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 288baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDataRegion - Note in the output the specified region @p Kind. 289baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDataRegion(MCDataRegionType Kind) {} 290baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 291baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitThumbFunc - Note in the output that the specified @p Func is 292baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// a Thumb mode function (ARM target only). 293baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitThumbFunc(MCSymbol *Func) = 0; 294baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 295baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getOrCreateSymbolData - Get symbol data for given symbol. 296baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual MCSymbolData &getOrCreateSymbolData(MCSymbol *Symbol); 297baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 298baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAssignment - Emit an assignment of @p Value to @p Symbol. 299baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 300baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 301baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// symbol = value 302baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 303baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// The assignment generates no code, but has the side effect of binding the 304baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// value in the current context. For the assembly streamer, this prints the 305baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// binding into the .s file. 3061abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// 307baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol being assigned to. 308baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value for the symbol. 309baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) = 0; 310eb72dcaef7423069cf8f9e802fa8de64dc8f8f30Chris Lattner 311baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitWeakReference - Emit an weak reference from @p Alias to @p Symbol. 312baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 313baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 314baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .weakref alias, symbol 315baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 316baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Alias - The alias that is being created. 317baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol being aliased. 318baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) = 0; 319baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 320baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolAttribute - Add the given @p Attribute to @p Symbol. 321baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool EmitSymbolAttribute(MCSymbol *Symbol, 322baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSymbolAttr Attribute) = 0; 323baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 324baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolDesc - Set the @p DescValue for the @p Symbol. 325baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 326baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to have its n_desc field set. 327baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param DescValue - The value to set into the n_desc field. 328baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) = 0; 329baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 330baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// BeginCOFFSymbolDef - Start emitting COFF symbol definition 331baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 332baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to have its External & Type fields set. 333baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol) = 0; 334baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 335baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSymbolStorageClass - Emit the storage class of the symbol. 336baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 337baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param StorageClass - The storage class the symbol should have. 338baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCOFFSymbolStorageClass(int StorageClass) = 0; 339baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 340baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSymbolType - Emit the type of the symbol. 341baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 342baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Type - A COFF type identifier (see COFF::SymbolType in X86COFF.h) 343baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCOFFSymbolType(int Type) = 0; 344baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 345baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EndCOFFSymbolDef - Marks the end of the symbol definition. 346baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EndCOFFSymbolDef() = 0; 347baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 348baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSecRel32 - Emits a COFF section relative relocation. 349baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 350baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - Symbol the section relative realocation should point to. 351baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCOFFSecRel32(MCSymbol const *Symbol); 352baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 353baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitELFSize - Emit an ELF .size directive. 354baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 355baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 356baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .size symbol, expression 357baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 358baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) = 0; 359baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 360baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCommonSymbol - Emit a common symbol. 361baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 362baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The common symbol to emit. 363baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the common symbol. 364baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the symbol if 365baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// non-zero. This must be a power of 2. 366baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 367baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned ByteAlignment) = 0; 368baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 369baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. 370baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 371baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The common symbol to emit. 372baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the common symbol. 373baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the common symbol in bytes. 374baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 375baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned ByteAlignment) = 0; 376baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 377baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitZerofill - Emit the zerofill section and an optional symbol. 378baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 379baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Section - The zerofill section to create and or to put the symbol 380baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The zerofill symbol to emit, if non-NULL. 381baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the zerofill symbol. 382baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the zerofill symbol if 383baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// non-zero. This must be a power of 2 on some targets. 384baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, 385baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling uint64_t Size = 0, unsigned ByteAlignment = 0) = 0; 386baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 387baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitTBSSSymbol - Emit a thread local bss (.tbss) symbol. 388baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 389baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Section - The thread local common section. 390baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The thread local common symbol to emit. 391baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the symbol. 392baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the thread local common symbol 393baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// if non-zero. This must be a power of 2 on some targets. 394baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 395baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling uint64_t Size, unsigned ByteAlignment = 0) = 0; 396baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 397baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 398baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Generating Data 399baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 400baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 401baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitBytes - Emit the bytes in \p Data into the output. 402baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 403baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .byte, .ascii, 404baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// etc. 405baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitBytes(StringRef Data) = 0; 4066b2e257e74b2c8e2f93bb244e0c80cb73005b74aMatt Fleming 407baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValue - Emit the expression @p Value into the output as a native 408baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// integer of the given @p Size bytes. 409baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 410baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .word, .quad, 411baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// etc. 412abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar /// 413baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to emit. 414baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the integer (in bytes) to emit. This must 415baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// match a native machine width. 416baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitValueImpl(const MCExpr *Value, unsigned Size) = 0; 417baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 418baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitValue(const MCExpr *Value, unsigned Size); 419baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 420baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitIntValue - Special case of EmitValue that avoids the client having 421baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// to pass in a MCExpr for constant integers. 422baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitIntValue(uint64_t Value, unsigned Size); 423baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 424baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAbsValue - Emit the Value, but try to avoid relocations. On MachO 425baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// this is done by producing 426baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// foo = value 427baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .long foo 428baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitAbsValue(const MCExpr *Value, unsigned Size); 429baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 430baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitULEB128Value(const MCExpr *Value) = 0; 431baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 432baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitSLEB128Value(const MCExpr *Value) = 0; 433baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 434baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitULEB128Value - Special case of EmitULEB128Value that avoids the 435baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// client having to pass in a MCExpr for constant integers. 436baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitULEB128IntValue(uint64_t Value, unsigned Padding = 0); 437baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 438baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the 439baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// client having to pass in a MCExpr for constant integers. 440baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitSLEB128IntValue(int64_t Value); 441baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 442baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolValue - Special case of EmitValue that avoids the client 443baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// having to pass in a MCExpr for MCSymbols. 444baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitSymbolValue(const MCSymbol *Sym, unsigned Size); 445baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 446baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitGPRel64Value - Emit the expression @p Value into the output as a 447baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// gprel64 (64-bit GP relative) value. 448baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 449baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .gpdword on 450baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// targets that support them. 451baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitGPRel64Value(const MCExpr *Value); 452baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 453baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitGPRel32Value - Emit the expression @p Value into the output as a 454baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// gprel32 (32-bit GP relative) value. 455baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 456baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .gprel32 on 457baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// targets that support them. 458baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitGPRel32Value(const MCExpr *Value); 459baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 460baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitFill - Emit NumBytes bytes worth of the value specified by 461baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// FillValue. This implements directives such as '.space'. 462baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue); 463baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 464baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Emit NumBytes worth of zeros. 465baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This function properly handles data in virtual sections. 466baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitZeros(uint64_t NumBytes); 467baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 468baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValueToAlignment - Emit some number of copies of @p Value until 469baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the byte alignment @p ByteAlignment is reached. 470baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 471baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// If the number of bytes need to emit for the alignment is not a multiple 472baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// of @p ValueSize, then the contents of the emitted fill bytes is 473baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// undefined. 474baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 475baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This used to implement the .align assembler directive. 476baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 477baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment to reach. This must be a power of 478baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// two on some targets. 479baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to use when filling bytes. 480baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ValueSize - The size of the integer (in bytes) to emit for 481baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @p Value. This must match a native machine width. 482baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 483baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the alignment cannot be reached in this many bytes, no bytes are 484baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted. 485baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, 486baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned ValueSize = 1, 487baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned MaxBytesToEmit = 0) = 0; 488baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 489baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCodeAlignment - Emit nops until the byte alignment @p ByteAlignment 490baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// is reached. 491baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 492baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This used to align code where the alignment bytes may be executed. This 493baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// can emit different bytes for different sizes to optimize execution. 494baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 495baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment to reach. This must be a power of 496baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// two on some targets. 497baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 498baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the alignment cannot be reached in this many bytes, no bytes are 499baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted. 500baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCodeAlignment(unsigned ByteAlignment, 501baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned MaxBytesToEmit = 0) = 0; 502baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 503baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValueToOffset - Emit some number of copies of @p Value until the 504baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// byte offset @p Offset is reached. 505baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 506baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .org. 507baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 508baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Offset - The offset to reach. This may be an expression, but the 509baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// expression must be associated with the current section. 510baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to use when filling bytes. 511baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @return false on success, true if the offset was invalid. 512baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool EmitValueToOffset(const MCExpr *Offset, 513baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned char Value = 0) = 0; 514baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 515baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 516baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 517baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitFileDirective - Switch to a new logical file. This is used to 518baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// implement the '.file "foo.c"' assembler directive. 519baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitFileDirective(StringRef Filename) = 0; 520baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 521baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDwarfFileDirective - Associate a filename with a specified logical 522baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// file number. This implements the DWARF2 '.file 4 "foo.c"' assembler 523baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// directive. 524baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, 525baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling StringRef Filename, unsigned CUID = 0); 526baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 527baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDwarfLocDirective - This implements the DWARF2 528baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // '.loc fileno lineno ...' assembler directive. 529baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, 530baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned Column, unsigned Flags, 531baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned Isa, unsigned Discriminator, 532baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling StringRef FileName); 533baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 534baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, 535baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *LastLabel, 536baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *Label, 537baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned PointerSize) = 0; 538baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 539baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, 540baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *Label) {} 541baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 542baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitDwarfSetLineAddr(int64_t LineDelta, const MCSymbol *Label, 543baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling int PointerSize); 544baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 545baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding); 546baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISections(bool EH, bool Debug); 547baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitCFIStartProc(); 548baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitCFIEndProc(); 549baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset); 550baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfaOffset(int64_t Offset); 551baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfaRegister(int64_t Register); 552baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIOffset(int64_t Register, int64_t Offset); 553baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding); 554baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding); 555baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRememberState(); 556baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRestoreState(); 557baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISameValue(int64_t Register); 558baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRestore(int64_t Register); 559baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset); 560baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment); 561baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIEscape(StringRef Values); 562baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISignalFrame(); 563baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIUndefined(int64_t Register); 564baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRegister(int64_t Register1, int64_t Register2); 565baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 566baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHStartProc(const MCSymbol *Symbol); 567baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHEndProc(); 568baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHStartChained(); 569baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHEndChained(); 570baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, 571baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool Except); 572baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHHandlerData(); 573baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHPushReg(unsigned Register); 574baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHSetFrame(unsigned Register, unsigned Offset); 575baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHAllocStack(unsigned Size); 576baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHSaveReg(unsigned Register, unsigned Offset); 577baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHSaveXMM(unsigned Register, unsigned Offset); 578baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHPushFrame(bool Code); 579baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitWin64EHEndProlog(); 580baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 581baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitInstruction - Emit the given @p Instruction into the current 582baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section. 583baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitInstruction(const MCInst &Inst) = 0; 584baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 585baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Set the bundle alignment mode from now on in the section. 586baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// The argument is the power of 2 to which the alignment is set. The 587baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// value 0 means turn the bundle alignment off. 588baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitBundleAlignMode(unsigned AlignPow2) = 0; 589baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 590baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief The following instructions are a bundle-locked group. 591baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 592baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \param AlignToEnd - If true, the bundle-locked group will be aligned to 593baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the end of a bundle. 594baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitBundleLock(bool AlignToEnd) = 0; 595baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 596baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Ends a bundle-locked group. 597baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitBundleUnlock() = 0; 598baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 599baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitRawText - If this file is backed by a assembly streamer, this dumps 600baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the specified string in the output .s file. This capability is 601baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// indicated by the hasRawTextSupport() predicate. By default this aborts. 602baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitRawText(StringRef String); 603baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitRawText(const Twine &String); 604baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 605baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// ARM-related methods. 606baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// FIXME: Eventually we should have some "target MC streamer" and move 607baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// these methods there. 608baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitFnStart(); 609baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitFnEnd(); 610baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCantUnwind(); 611baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitPersonality(const MCSymbol *Personality); 612baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitHandlerData(); 613baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitSetFP(unsigned FpReg, unsigned SpReg, int64_t Offset = 0); 614baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitPad(int64_t Offset); 615baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitRegSave(const SmallVectorImpl<unsigned> &RegList, 616baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool isVector); 617baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 618baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// PPC-related methods. 619baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// FIXME: Eventually replace it with some "target MC streamer" and move 620baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// these methods there. 621baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitTCEntry(const MCSymbol &S); 622baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 623baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// FinishImpl - Streamer specific finalization. 624baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void FinishImpl() = 0; 625baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Finish - Finish emission of machine code. 626baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void Finish(); 627baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling}; 628baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 629baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createNullStreamer - Create a dummy machine code streamer, which does 630baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// nothing. This is useful for timing the assembler front end. 631baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createNullStreamer(MCContext &Ctx); 632baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 633baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createAsmStreamer - Create a machine code streamer which will print out 634baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// assembly for the native target, suitable for compiling with a native 635baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// assembler. 636baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 637baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param InstPrint - If given, the instruction printer to use. If not given 638baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// the MCInst representation will be printed. This method takes ownership of 639baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// InstPrint. 640baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 641baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param CE - If given, a code emitter to use to show the instruction 642baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// encoding inline with the assembly. This method takes ownership of \p CE. 643baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 644baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param TAB - If given, a target asm backend to use to show the fixup 645baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// information in conjunction with encoding information. This method takes 646baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// ownership of \p TAB. 647baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 648baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param ShowInst - Whether to show the MCInst representation inline with 649baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// the assembly. 650baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 651baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool isVerboseAsm, bool useLoc, bool useCFI, 652baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool useDwarfDirectory, 653baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCInstPrinter *InstPrint = 0, 654baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCCodeEmitter *CE = 0, MCAsmBackend *TAB = 0, 655baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool ShowInst = false); 656baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 657baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createMachOStreamer - Create a machine code streamer which will generate 658baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Mach-O format object files. 659baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 660baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Takes ownership of \p TAB and \p CE. 661baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createMachOStreamer(MCContext &Ctx, MCAsmBackend &TAB, 662baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling raw_ostream &OS, MCCodeEmitter *CE, 663baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool RelaxAll = false); 664baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 665baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createWinCOFFStreamer - Create a machine code streamer which will 666baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// generate Microsoft COFF format object files. 667baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 668baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Takes ownership of \p TAB and \p CE. 669baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createWinCOFFStreamer(MCContext &Ctx, MCAsmBackend &TAB, 670baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCCodeEmitter &CE, raw_ostream &OS, 671baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool RelaxAll = false); 672baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 673baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createELFStreamer - Create a machine code streamer which will generate 674baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// ELF format object files. 675baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createELFStreamer(MCContext &Ctx, MCAsmBackend &TAB, 676baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling raw_ostream &OS, MCCodeEmitter *CE, bool RelaxAll, 677baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool NoExecStack); 678baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 679baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createPureStreamer - Create a machine code streamer which will generate 680baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// "pure" MC object files, for use with MC-JIT and testing tools. 681baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 682baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Takes ownership of \p TAB and \p CE. 683baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createPureStreamer(MCContext &Ctx, MCAsmBackend &TAB, 684baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling raw_ostream &OS, MCCodeEmitter *CE); 685abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar 68625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar} // end namespace llvm 68725e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 68825e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#endif 689