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" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCLinkerOptimizationHint.h" 230855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis#include "llvm/MC/MCWin64EH.h" 24255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/DataTypes.h" 25cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar#include <string> 2684a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 2725e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbarnamespace llvm { 28baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCAsmBackend; 29baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCCodeEmitter; 30baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCContext; 31baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCExpr; 32baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCInst; 33baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCInstPrinter; 34baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCSection; 35320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass MCStreamer; 36baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCSymbol; 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCSymbolRefExpr; 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCSubtargetInfo; 39baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass StringRef; 40baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass Twine; 41baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass raw_ostream; 42baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass formatted_raw_ostream; 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass AssemblerConstantPools; 44baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 45baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingtypedef std::pair<const MCSection *, const MCExpr *> MCSectionSubPair; 46baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 47320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// Target specific streamer interface. This is used so that targets can 48320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// implement support for target specific assembly directives. 49320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 50320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// If target foo wants to use this, it should implement 3 classes: 51320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// * FooTargetStreamer : public MCTargetStreamer 52320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// * FooTargetAsmSreamer : public FooTargetStreamer 53320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// * FooTargetELFStreamer : public FooTargetStreamer 54320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 55320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// FooTargetStreamer should have a pure virtual method for each directive. For 56320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// example, for a ".bar symbol_name" directive, it should have 57320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// virtual emitBar(const MCSymbol &Symbol) = 0; 58320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 59320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// The FooTargetAsmSreamer and FooTargetELFStreamer classes implement the 60320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// method. The assembly streamer just prints ".bar symbol_name". The object 61320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// streamer does whatever is needed to implement .bar in the object file. 62320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 63320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// In the assembly printer and parser the target streamer can be used by 64320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// calling getTargetStreamer and casting it to FooTargetStreamer: 65320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 66320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// MCTargetStreamer &TS = OutStreamer.getTargetStreamer(); 67320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// FooTargetStreamer &ATS = static_cast<FooTargetStreamer &>(TS); 68320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// 69320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// The base classes FooTargetAsmSreamer and FooTargetELFStreamer should *never* 70320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola/// be treated differently. Callers should always talk to a FooTargetStreamer. 71320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass MCTargetStreamer { 72320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaprotected: 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCStreamer &Streamer; 74320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 75320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolapublic: 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCTargetStreamer(MCStreamer &S); 77320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual ~MCTargetStreamer(); 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCStreamer &getStreamer() { return Streamer; } 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Allow a target to add behavior to the EmitLabel of MCStreamer. 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitLabel(MCSymbol *Symbol); 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Allow a target to add behavior to the emitAssignment of MCStreamer. 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value); 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void finish(); 87320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola}; 88320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass AArch64TargetStreamer : public MCTargetStreamer { 90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinespublic: 91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AArch64TargetStreamer(MCStreamer &S); 92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ~AArch64TargetStreamer(); 93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void finish() override; 96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Callback used to implement the ldr= pseudo. 98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Add a new entry to the constant pool for the current section and return an 99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// MCExpr that can be used to refer to the constant pool location. 100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const MCExpr *addConstantPoolEntry(const MCExpr *); 101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Callback used to implemnt the .ltorg directive. 103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Emit contents of constant pool for the current section. 104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void emitCurrentConstantPool(); 105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesprivate: 107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::unique_ptr<AssemblerConstantPools> ConstantPools; 108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}; 109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 110320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola// FIXME: declared here because it is used from 111320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola// lib/CodeGen/AsmPrinter/ARMException.cpp. 112320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass ARMTargetStreamer : public MCTargetStreamer { 113320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolapublic: 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ARMTargetStreamer(MCStreamer &S); 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ~ARMTargetStreamer(); 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitFnStart(); 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitFnEnd(); 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitCantUnwind(); 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitPersonality(const MCSymbol *Personality); 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitPersonalityIndex(unsigned Index); 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitHandlerData(); 123320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitSetFP(unsigned FpReg, unsigned SpReg, 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t Offset = 0); 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitMovSP(unsigned Reg, int64_t Offset = 0); 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitPad(int64_t Offset); 127320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola virtual void emitRegSave(const SmallVectorImpl<unsigned> &RegList, 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isVector); 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitUnwindRaw(int64_t StackOffset, 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<uint8_t> &Opcodes); 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void switchVendor(StringRef Vendor); 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitAttribute(unsigned Attribute, unsigned Value); 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitTextAttribute(unsigned Attribute, StringRef String); 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef StringValue = ""); 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitFPU(unsigned FPU); 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitArch(unsigned Arch); 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitObjectArch(unsigned Arch); 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void finishAttributeSection(); 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitInst(uint32_t Inst, char Suffix = '\0'); 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE); 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value); 146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void finish() override; 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Callback used to implement the ldr= pseudo. 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Add a new entry to the constant pool for the current section and return an 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// MCExpr that can be used to refer to the constant pool location. 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *addConstantPoolEntry(const MCExpr *); 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Callback used to implemnt the .ltorg directive. 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Emit contents of constant pool for the current section. 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void emitCurrentConstantPool(); 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate: 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<AssemblerConstantPools> ConstantPools; 160320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola}; 161320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 162baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// MCStreamer - Streaming machine code generation interface. This interface 163baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// is intended to provide a programatic interface that is very similar to the 164baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// level that an assembler .s file provides. It has callbacks to emit bytes, 165baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// handle directives, etc. The implementation of this interface retains 166baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// state to know what the current section is etc. 167baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 168baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// There are multiple implementations of this interface: one for writing out 169baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// a .s file, and implementations that write out .o files of various formats. 170baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 171baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass MCStreamer { 172baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCContext &Context; 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MCTargetStreamer> TargetStreamer; 17489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 175baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCStreamer(const MCStreamer &) LLVM_DELETED_FUNCTION; 176baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCStreamer &operator=(const MCStreamer &) LLVM_DELETED_FUNCTION; 177dda1bdc962a314bf4fca86f4cd4802ff6c55b172Bill Wendling 178baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::vector<MCDwarfFrameInfo> FrameInfos; 179baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCDwarfFrameInfo *getCurrentFrameInfo(); 180baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSymbol *EmitCFICommon(); 181baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EnsureValidFrame(); 18238ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis 183baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::vector<MCWin64EHUnwindInfo *> W64UnwindInfos; 184baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo *CurrentW64UnwindInfo; 185baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame); 186baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EnsureValidW64UnwindInfo(); 18784a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 1885cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton // SymbolOrdering - Tracks an index to represent the order 1895cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton // a symbol was emitted in. Zero means we did not emit that symbol. 1905cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton DenseMap<const MCSymbol *, unsigned> SymbolOrdering; 1915cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 192baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SectionStack - This is stack of current and previous section 193baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// values saved by PushSection. 194baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack; 1957768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 196baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingprotected: 19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCStreamer(MCContext &Ctx); 198df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne 199baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A, 200baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCSymbol *B); 2011674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer 202baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCExpr *ForceExpAbs(const MCExpr *Expr); 2030dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 204baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame); 205baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame); 206410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis 207baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo *getCurrentW64UnwindInfo() { 208baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return CurrentW64UnwindInfo; 209baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 210baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitW64Tables(); 21107f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames 2125759c3a02902026a27a0d1bc24a5bad85f52bd71David Blaikie virtual void EmitRawTextImpl(StringRef String); 2135759c3a02902026a27a0d1bc24a5bad85f52bd71David Blaikie 214baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingpublic: 215baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual ~MCStreamer(); 216baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void visitUsedExpr(const MCExpr &Expr); 218cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void visitUsedSymbol(const MCSymbol &Sym); 219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setTargetStreamer(MCTargetStreamer *TS) { 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetStreamer.reset(TS); 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 224baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// State management 225baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 226baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void reset(); 227baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 228baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCContext &getContext() const { return Context; } 229baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCTargetStreamer *getTargetStreamer() { 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TargetStreamer.get(); 232320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola } 233320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 234baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned getNumFrameInfos() { return FrameInfos.size(); } 235baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 236baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const MCDwarfFrameInfo &getFrameInfo(unsigned i) { return FrameInfos[i]; } 237baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 238baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ArrayRef<MCDwarfFrameInfo> getFrameInfos() const { return FrameInfos; } 239baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 240baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned getNumW64UnwindInfos() { return W64UnwindInfos.size(); } 241baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 242baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) { 243baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return *W64UnwindInfos[i]; 244baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 24507f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames 246cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ArrayRef<MCWin64EHUnwindInfo *> getW64UnwindInfos() const { 247cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return W64UnwindInfos; 248cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 249cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 250da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling void generateCompactUnwindEncodings(MCAsmBackend *MAB); 251c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling 252baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Assembly File Formatting. 253baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 254baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 255baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// isVerboseAsm - Return true if this streamer supports verbose assembly 256baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// and if it is enabled. 257baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool isVerboseAsm() const { return false; } 258baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 259baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// hasRawTextSupport - Return true if this asm streamer supports emitting 260baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// unformatted text to the .s file with EmitRawText. 261baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool hasRawTextSupport() const { return false; } 262baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Is the integrated assembler required for this streamer to function 26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// correctly? 26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual bool isIntegratedAssemblerRequired() const { return false; } 26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 267baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// AddComment - Add a comment that can be emitted to the generated .s 268baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// file if applicable as a QoI issue to make the output of the compiler 269baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// more readable. This only affects the MCAsmStreamer, and only when 270baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// verbose assembly output is enabled. 271baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 272baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// If the comment includes embedded \n's, they will each get the comment 273baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// prefix as appropriate. The added comment should not end with a \n. 274baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void AddComment(const Twine &T) {} 275baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 276baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// GetCommentOS - Return a raw_ostream that comments can be written to. 277baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Unlike AddComment, you are required to terminate comments with \n if you 278baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// use this method. 279baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual raw_ostream &GetCommentOS(); 280baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Print T and prefix it with the comment string (normally #) and optionally 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// a tab. This prints the comment immediately, not at the end of the 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// current line. It is basically a safe version of EmitRawText: since it 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// only prints comments, the object streamer ignores it instead of asserting. 28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitRawComment(const Twine &T, bool TabPrefix = true); 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 287baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// AddBlankLine - Emit a blank line to a .s file to pretty it up. 288baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void AddBlankLine() {} 289baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 290baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 291baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 292baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Symbol & Section Management 293baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 294baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 295baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getCurrentSection - Return the current section that the streamer is 296baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitting code to. 297baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair getCurrentSection() const { 298baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (!SectionStack.empty()) 299baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return SectionStack.back().first; 300baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return MCSectionSubPair(); 301baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 302baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 303baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getPreviousSection - Return the previous section that the streamer is 304baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitting code to. 305baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair getPreviousSection() const { 306baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (!SectionStack.empty()) 307baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return SectionStack.back().second; 308baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return MCSectionSubPair(); 309baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 310baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 3115cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// GetSymbolOrder - Returns an index to represent the order 3125cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// a symbol was emitted in. (zero if we did not emit that symbol) 3135cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton unsigned GetSymbolOrder(const MCSymbol *Sym) const { 3145cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton return SymbolOrdering.lookup(Sym); 3155cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton } 3165cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 317baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// ChangeSection - Update streamer for a new active section. 318baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 319baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is called by PopSection and SwitchSection, if the current 320baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section changes. 321cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void ChangeSection(const MCSection *, const MCExpr *); 322baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 323baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// pushSection - Save the current and previous section on the 324baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section stack. 325baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void PushSection() { 326baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.push_back( 327baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::make_pair(getCurrentSection(), getPreviousSection())); 328baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 329baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 330baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// popSection - Restore the current and previous section from 331baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the section stack. Calls ChangeSection as needed. 332baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 333baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Returns false if the stack was empty. 334baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool PopSection() { 335baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (SectionStack.size() <= 1) 336baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return false; 337baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair oldSection = SectionStack.pop_back_val().first; 338baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 339baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 340baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (oldSection != curSection) 341baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ChangeSection(curSection.first, curSection.second); 342baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return true; 343baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 344baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 345baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool SubSection(const MCExpr *Subsection) { 346baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (SectionStack.empty()) 347baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return false; 348baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 349baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SwitchSection(SectionStack.back().first.first, Subsection); 350baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return true; 351baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 352baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 353baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SwitchSection - Set the current section where code is being emitted to 354baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @p Section. This is required to update CurSection. 355baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 356baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to assembler directives like .section, .text, etc. 357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void SwitchSection(const MCSection *Section, 358dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCExpr *Subsection = nullptr) { 359baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling assert(Section && "Cannot switch to a null section!"); 360baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 361baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().second = curSection; 362baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (MCSectionSubPair(Section, Subsection) != curSection) { 363baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().first = MCSectionSubPair(Section, Subsection); 364baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ChangeSection(Section, Subsection); 365245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola } 366baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 367baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 368baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// SwitchSectionNoChange - Set the current section where code is being 369baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted to @p Section. This is required to update CurSection. This 370baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// version does not call ChangeSection. 371baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void SwitchSectionNoChange(const MCSection *Section, 372dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCExpr *Subsection = nullptr) { 373baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling assert(Section && "Cannot switch to a null section!"); 374baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSectionSubPair curSection = SectionStack.back().first; 375baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().second = curSection; 376baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling if (MCSectionSubPair(Section, Subsection) != curSection) 377baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling SectionStack.back().first = MCSectionSubPair(Section, Subsection); 378baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 379baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Create the default sections and set the initial one. 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void InitSections(); 382baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 3835cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// AssignSection - Sets the symbol's section. 3845cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// 3855cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// Each emitted symbol will be tracked in the ordering table, 3865cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// so we can sort on them later. 3875cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton void AssignSection(MCSymbol *Symbol, const MCSection *Section); 3885cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 389baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLabel - Emit a label for @p Symbol into the current section. 390baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 391baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 392baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// foo: 393baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 394baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to emit. A given symbol should only be 395baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted as a label once, and symbols emitted as a label should never be 396baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// used in an assignment. 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: These emission are non-const because we mutate the symbol to 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // add the section we're emitting it to later. 399baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLabel(MCSymbol *Symbol); 400245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 401baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol); 402baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 403baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAssemblerFlag - Note in the output the specified @p Flag. 404cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitAssemblerFlag(MCAssemblerFlag Flag); 40525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 406baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLinkerOptions - Emit the given list @p Options of strings as linker 407baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// options into the output. 408baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLinkerOptions(ArrayRef<std::string> Kind) {} 409baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 410baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDataRegion - Note in the output the specified region @p Kind. 411baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDataRegion(MCDataRegionType Kind) {} 412baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// EmitVersionMin - Specify the MachO minimum deployment target version. 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void EmitVersionMin(MCVersionMinType, unsigned Major, unsigned Minor, 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Update) {} 41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 417baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitThumbFunc - Note in the output that the specified @p Func is 418baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// a Thumb mode function (ARM target only). 419cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitThumbFunc(MCSymbol *Func); 420baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 421baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAssignment - Emit an assignment of @p Value to @p Symbol. 422baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 423baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 424baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// symbol = value 425baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 426baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// The assignment generates no code, but has the side effect of binding the 427baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// value in the current context. For the assembly streamer, this prints the 428baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// binding into the .s file. 4291abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// 430baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol being assigned to. 431baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value for the symbol. 43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value); 433eb72dcaef7423069cf8f9e802fa8de64dc8f8f30Chris Lattner 434baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitWeakReference - Emit an weak reference from @p Alias to @p Symbol. 435baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 436baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 437baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .weakref alias, symbol 438baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 439baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Alias - The alias that is being created. 440baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol being aliased. 441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); 442baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 443baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolAttribute - Add the given @p Attribute to @p Symbol. 444baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool EmitSymbolAttribute(MCSymbol *Symbol, 445baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling MCSymbolAttr Attribute) = 0; 446baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 447baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolDesc - Set the @p DescValue for the @p Symbol. 448baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 449baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to have its n_desc field set. 450baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param DescValue - The value to set into the n_desc field. 451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); 452baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 453baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// BeginCOFFSymbolDef - Start emitting COFF symbol definition 454baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 455baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The symbol to have its External & Type fields set. 456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol); 457baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 458baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSymbolStorageClass - Emit the storage class of the symbol. 459baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 460baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param StorageClass - The storage class the symbol should have. 461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitCOFFSymbolStorageClass(int StorageClass); 462baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 463baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSymbolType - Emit the type of the symbol. 464baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 465baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Type - A COFF type identifier (see COFF::SymbolType in X86COFF.h) 466cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitCOFFSymbolType(int Type); 467baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 468baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EndCOFFSymbolDef - Marks the end of the symbol definition. 469cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EndCOFFSymbolDef(); 470baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// EmitCOFFSectionIndex - Emits a COFF section index. 47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// 47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @param Symbol - Symbol the section number relocation should point to. 47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void EmitCOFFSectionIndex(MCSymbol const *Symbol); 47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 476baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCOFFSecRel32 - Emits a COFF section relative relocation. 477baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 47836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @param Symbol - Symbol the section relative relocation should point to. 479baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCOFFSecRel32(MCSymbol const *Symbol); 480baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 481baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitELFSize - Emit an ELF .size directive. 482baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 483baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This corresponds to an assembler statement such as: 484baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .size symbol, expression 485baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 486cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value); 487baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 48836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// \brief Emit a Linker Optimization Hint (LOH) directive. 48936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// \param Args - Arguments of the LOH. 49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) {} 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 492baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCommonSymbol - Emit a common symbol. 493baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 494baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The common symbol to emit. 495baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the common symbol. 496baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the symbol if 497baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// non-zero. This must be a power of 2. 498baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 499baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned ByteAlignment) = 0; 500baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 501baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. 502baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 503baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The common symbol to emit. 504baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the common symbol. 505baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the common symbol in bytes. 506baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 507cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned ByteAlignment); 508baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 509baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitZerofill - Emit the zerofill section and an optional symbol. 510baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 511baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Section - The zerofill section to create and or to put the symbol 512baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The zerofill symbol to emit, if non-NULL. 513baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the zerofill symbol. 514baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the zerofill symbol if 515baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// non-zero. This must be a power of 2 on some targets. 516dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitZerofill(const MCSection *Section, 517dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *Symbol = nullptr, uint64_t Size = 0, 518dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned ByteAlignment = 0) = 0; 519baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 520baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitTBSSSymbol - Emit a thread local bss (.tbss) symbol. 521baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 522baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Section - The thread local common section. 523baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Symbol - The thread local common symbol to emit. 524baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the symbol. 525baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment of the thread local common symbol 526baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// if non-zero. This must be a power of 2 on some targets. 527baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 528cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uint64_t Size, unsigned ByteAlignment = 0); 529baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 530baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 531baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @name Generating Data 532baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @{ 533baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 534baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitBytes - Emit the bytes in \p Data into the output. 535baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 536baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .byte, .ascii, 537baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// etc. 538cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitBytes(StringRef Data); 5396b2e257e74b2c8e2f93bb244e0c80cb73005b74aMatt Fleming 540baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValue - Emit the expression @p Value into the output as a native 541baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// integer of the given @p Size bytes. 542baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 543baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .word, .quad, 544baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// etc. 545abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar /// 546baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to emit. 547baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Size - The size of the integer (in bytes) to emit. This must 548baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// match a native machine width. 549dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// @param Loc - The location of the expression for error reporting. 550dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual void EmitValueImpl(const MCExpr *Value, unsigned Size, 551cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const SMLoc &Loc = SMLoc()); 552baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 553dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitValue(const MCExpr *Value, unsigned Size, 554dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const SMLoc &Loc = SMLoc()); 555baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 556baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitIntValue - Special case of EmitValue that avoids the client having 557baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// to pass in a MCExpr for constant integers. 558baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitIntValue(uint64_t Value, unsigned Size); 559baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 560baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitAbsValue - Emit the Value, but try to avoid relocations. On MachO 561baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// this is done by producing 562baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// foo = value 563baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// .long foo 564baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitAbsValue(const MCExpr *Value, unsigned Size); 565baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 566cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitULEB128Value(const MCExpr *Value); 567baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 568cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitSLEB128Value(const MCExpr *Value); 569baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 570baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitULEB128Value - Special case of EmitULEB128Value that avoids the 571baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// client having to pass in a MCExpr for constant integers. 572baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitULEB128IntValue(uint64_t Value, unsigned Padding = 0); 573baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 574baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the 575baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// client having to pass in a MCExpr for constant integers. 576baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitSLEB128IntValue(int64_t Value); 577baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 578baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitSymbolValue - Special case of EmitValue that avoids the client 579baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// having to pass in a MCExpr for MCSymbols. 580baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitSymbolValue(const MCSymbol *Sym, unsigned Size); 581baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 582baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitGPRel64Value - Emit the expression @p Value into the output as a 583baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// gprel64 (64-bit GP relative) value. 584baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 585baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .gpdword on 586baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// targets that support them. 587baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitGPRel64Value(const MCExpr *Value); 588baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 589baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitGPRel32Value - Emit the expression @p Value into the output as a 590baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// gprel32 (32-bit GP relative) value. 591baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 592baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .gprel32 on 593baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// targets that support them. 594baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitGPRel32Value(const MCExpr *Value); 595baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 596baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitFill - Emit NumBytes bytes worth of the value specified by 597baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// FillValue. This implements directives such as '.space'. 598baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue); 599baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 600baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Emit NumBytes worth of zeros. 601baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This function properly handles data in virtual sections. 602baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitZeros(uint64_t NumBytes); 603baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 604baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValueToAlignment - Emit some number of copies of @p Value until 605baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the byte alignment @p ByteAlignment is reached. 606baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 607baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// If the number of bytes need to emit for the alignment is not a multiple 608baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// of @p ValueSize, then the contents of the emitted fill bytes is 609baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// undefined. 610baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 611baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This used to implement the .align assembler directive. 612baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 613baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment to reach. This must be a power of 614baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// two on some targets. 615baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to use when filling bytes. 616baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ValueSize - The size of the integer (in bytes) to emit for 617baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @p Value. This must match a native machine width. 618baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 619baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the alignment cannot be reached in this many bytes, no bytes are 620baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted. 621baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, 622baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned ValueSize = 1, 623cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned MaxBytesToEmit = 0); 624baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 625baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitCodeAlignment - Emit nops until the byte alignment @p ByteAlignment 626baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// is reached. 627baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 628baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This used to align code where the alignment bytes may be executed. This 629baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// can emit different bytes for different sizes to optimize execution. 630baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 631baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param ByteAlignment - The alignment to reach. This must be a power of 632baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// two on some targets. 633baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 634baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the alignment cannot be reached in this many bytes, no bytes are 635baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// emitted. 636baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCodeAlignment(unsigned ByteAlignment, 637cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned MaxBytesToEmit = 0); 638baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 639baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitValueToOffset - Emit some number of copies of @p Value until the 640baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// byte offset @p Offset is reached. 641baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 642baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// This is used to implement assembler directives such as .org. 643baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 644baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Offset - The offset to reach. This may be an expression, but the 645baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// expression must be associated with the current section. 646baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @param Value - The value to use when filling bytes. 647baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @return false on success, true if the offset was invalid. 648baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual bool EmitValueToOffset(const MCExpr *Offset, 649cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned char Value = 0); 650baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 651baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// @} 652baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 653baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitFileDirective - Switch to a new logical file. This is used to 654baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// implement the '.file "foo.c"' assembler directive. 655cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitFileDirective(StringRef Filename); 656baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 657c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola /// Emit the "identifiers" directive. This implements the 658c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola /// '.ident "version foo"' assembler directive. 659c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola virtual void EmitIdent(StringRef IdentString) {} 660c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola 661baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDwarfFileDirective - Associate a filename with a specified logical 662baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// file number. This implements the DWARF2 '.file 4 "foo.c"' assembler 663baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// directive. 66436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, 66536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Filename, 66636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned CUID = 0); 667baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 668baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitDwarfLocDirective - This implements the DWARF2 669baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // '.loc fileno lineno ...' assembler directive. 670baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, 671baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned Column, unsigned Flags, 672baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned Isa, unsigned Discriminator, 673baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling StringRef FileName); 674baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 67536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID); 67636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 677baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitDwarfSetLineAddr(int64_t LineDelta, const MCSymbol *Label, 678baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling int PointerSize); 679baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 680baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding); 681baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISections(bool EH, bool Debug); 68236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIStartProc(bool IsSimple); 683baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitCFIEndProc(); 684baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset); 685baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfaOffset(int64_t Offset); 686baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIDefCfaRegister(int64_t Register); 687baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIOffset(int64_t Register, int64_t Offset); 688baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding); 689baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding); 690baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRememberState(); 691baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRestoreState(); 692baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISameValue(int64_t Register); 693baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRestore(int64_t Register); 694baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset); 695baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment); 696baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIEscape(StringRef Values); 697baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFISignalFrame(); 698baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIUndefined(int64_t Register); 699baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling virtual void EmitCFIRegister(int64_t Register1, int64_t Register2); 70083ba58e5f0a5afbb23d7d2092d817accded4455aVenkatraman Govindaraju virtual void EmitCFIWindowSave(); 701baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 702cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFIStartProc(const MCSymbol *Symbol); 703cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFIEndProc(); 704cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFIStartChained(); 705cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFIEndChained(); 706cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFIPushReg(unsigned Register); 707cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFISetFrame(unsigned Register, unsigned Offset); 708cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFIAllocStack(unsigned Size); 709cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFISaveReg(unsigned Register, unsigned Offset); 710cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFISaveXMM(unsigned Register, unsigned Offset); 711cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFIPushFrame(bool Code); 712cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinCFIEndProlog(); 713cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 714cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except); 715cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitWinEHHandlerData(); 716baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 717baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitInstruction - Emit the given @p Instruction into the current 718baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// section. 719cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI); 720baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 721baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Set the bundle alignment mode from now on in the section. 722baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// The argument is the power of 2 to which the alignment is set. The 723baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// value 0 means turn the bundle alignment off. 724cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitBundleAlignMode(unsigned AlignPow2); 725baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 726baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief The following instructions are a bundle-locked group. 727baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 728baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \param AlignToEnd - If true, the bundle-locked group will be aligned to 729baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the end of a bundle. 730cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitBundleLock(bool AlignToEnd); 731baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 732baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// \brief Ends a bundle-locked group. 733cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void EmitBundleUnlock(); 734baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 735baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// EmitRawText - If this file is backed by a assembly streamer, this dumps 736baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the specified string in the output .s file. This capability is 737baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// indicated by the hasRawTextSupport() predicate. By default this aborts. 738baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void EmitRawText(const Twine &String); 739baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 7405cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// Flush - Causes any cached state to be written out. 7415cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton virtual void Flush() {} 7425cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 743baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// FinishImpl - Streamer specific finalization. 744cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void FinishImpl(); 745baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Finish - Finish emission of machine code. 746baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void Finish(); 747cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 748cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual bool mayHaveInstructions() const { return true; } 749baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling}; 750baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 751baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createNullStreamer - Create a dummy machine code streamer, which does 752baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// nothing. This is useful for timing the assembler front end. 753baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createNullStreamer(MCContext &Ctx); 754baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 755baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createAsmStreamer - Create a machine code streamer which will print out 756baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// assembly for the native target, suitable for compiling with a native 757baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// assembler. 758baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 759baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param InstPrint - If given, the instruction printer to use. If not given 760baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// the MCInst representation will be printed. This method takes ownership of 761baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// InstPrint. 762baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 763baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param CE - If given, a code emitter to use to show the instruction 764baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// encoding inline with the assembly. This method takes ownership of \p CE. 765baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 766baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param TAB - If given, a target asm backend to use to show the fixup 767baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// information in conjunction with encoding information. This method takes 768baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// ownership of \p TAB. 769baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 770baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// \param ShowInst - Whether to show the MCInst representation inline with 771baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// the assembly. 77236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 773dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isVerboseAsm, bool useDwarfDirectory, 774dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCInstPrinter *InstPrint, MCCodeEmitter *CE, 775dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCAsmBackend *TAB, bool ShowInst); 776baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 777baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createMachOStreamer - Create a machine code streamer which will generate 778baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Mach-O format object files. 779baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// 780baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// Takes ownership of \p TAB and \p CE. 781baaefaf828beb3527a3554af99505822fd4dfabfBill WendlingMCStreamer *createMachOStreamer(MCContext &Ctx, MCAsmBackend &TAB, 782baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling raw_ostream &OS, MCCodeEmitter *CE, 78336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool RelaxAll = false, 78436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool LabelSections = false); 785baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 786baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// createELFStreamer - Create a machine code streamer which will generate 787baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// ELF format object files. 78836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCStreamer *createELFStreamer(MCContext &Ctx, MCAsmBackend &TAB, 78936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &OS, MCCodeEmitter *CE, bool RelaxAll, 790baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool NoExecStack); 791baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 79225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar} // end namespace llvm 79325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 79425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#endif 795