MCStreamer.h revision 0855bc5b973320052c87bdcc2fa17b9711edc3de
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 177768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola#include "llvm/ADT/SmallVector.h" 181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 19a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner#include "llvm/MC/MCDirectives.h" 2089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola#include "llvm/MC/MCDwarf.h" 210855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis#include "llvm/MC/MCWin64EH.h" 2284a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 2325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbarnamespace llvm { 244a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar class MCAsmInfo; 254a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar class MCCodeEmitter; 2625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar class MCContext; 27821e3334ed3390d931f497300e6a5f1dc21bcfb3Daniel Dunbar class MCExpr; 2825e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar class MCInst; 2990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner class MCInstPrinter; 3025e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar class MCSection; 3125e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar class MCSymbol; 329a7e2ccf574368b60455f8c8975030475a1f3ce0Daniel Dunbar class StringRef; 33b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner class TargetAsmBackend; 34195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola class TargetLoweringObjectFile; 3586e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner class Twine; 3625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar class raw_ostream; 3786e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner class formatted_raw_ostream; 3825e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 39e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner /// MCStreamer - Streaming machine code generation interface. This interface 40e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner /// is intended to provide a programatic interface that is very similar to the 41e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner /// level that an assembler .s file provides. It has callbacks to emit bytes, 427092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar /// handle directives, etc. The implementation of this interface retains 43e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner /// state to know what the current section is etc. 44e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner /// 45e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner /// There are multiple implementations of this interface: one for writing out 46e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner /// a .s file, and implementations that write out .o files of various formats. 47e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner /// 4825e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar class MCStreamer { 4925e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar MCContext &Context; 5025e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 5125e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar MCStreamer(const MCStreamer&); // DO NOT IMPLEMENT 5225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar MCStreamer &operator=(const MCStreamer&); // DO NOT IMPLEMENT 5325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 54f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola bool EmitEHFrame; 55f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola bool EmitDebugFrame; 56f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola 57d7c8ccae8e48dce3ab7c3e9b4d8a309998c47961Rafael Espindola std::vector<MCDwarfFrameInfo> FrameInfos; 58d7c8ccae8e48dce3ab7c3e9b4d8a309998c47961Rafael Espindola MCDwarfFrameInfo *getCurrentFrameInfo(); 59d7c8ccae8e48dce3ab7c3e9b4d8a309998c47961Rafael Espindola void EnsureValidFrame(); 60d7c8ccae8e48dce3ab7c3e9b4d8a309998c47961Rafael Espindola 610855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis std::vector<MCWin64EHUnwindInfo> W64UnwindInfos; 620855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis MCWin64EHUnwindInfo *getCurrentW64UnwindInfo(); 630855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis void EnsureValidW64UnwindInfo(); 640855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis 65ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola const MCSymbol* LastNonPrivate; 66ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola 677d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger /// SectionStack - This is stack of current and previous section 687d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger /// values saved by PushSection. 697d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger SmallVector<std::pair<const MCSection *, 707d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger const MCSection *>, 4> SectionStack; 717092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar 727768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola protected: 737768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola MCStreamer(MCContext &Ctx); 74a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola 75a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A, 76a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola const MCSymbol *B); 77a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola 78a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola const MCExpr *ForceExpAbs(MCStreamer *Streamer, MCContext &Context, 79a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola const MCExpr* Expr); 801674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer 81c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola void EmitFrames(bool usingCFI); 82c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola 83381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar public: 8425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar virtual ~MCStreamer(); 8525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 8625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar MCContext &getContext() const { return Context; } 8725e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 8889b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola unsigned getNumFrameInfos() { 8989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola return FrameInfos.size(); 9089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola } 9189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 9289b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola const MCDwarfFrameInfo &getFrameInfo(unsigned i) { 9389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola return FrameInfos[i]; 9489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola } 9589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 960fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner /// @name Assembly File Formatting. 970fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner /// @{ 980dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 9991bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// isVerboseAsm - Return true if this streamer supports verbose assembly 10091bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// and if it is enabled. 10156591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner virtual bool isVerboseAsm() const { return false; } 1020dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 10391bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// hasRawTextSupport - Return true if this asm streamer supports emitting 10491bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// unformatted text to the .s file with EmitRawText. 10591bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner virtual bool hasRawTextSupport() const { return false; } 1060fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner 107d32c7cfa248f685e6e3064c0958dc2f0c31a4df6Chris Lattner /// AddComment - Add a comment that can be emitted to the generated .s 10886e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// file if applicable as a QoI issue to make the output of the compiler 10986e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// more readable. This only affects the MCAsmStreamer, and only when 11086e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// verbose assembly output is enabled. 11186e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// 11286e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// If the comment includes embedded \n's, they will each get the comment 11386e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// prefix as appropriate. The added comment should not end with a \n. 114d32c7cfa248f685e6e3064c0958dc2f0c31a4df6Chris Lattner virtual void AddComment(const Twine &T) {} 1150dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 116d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner /// GetCommentOS - Return a raw_ostream that comments can be written to. 117d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner /// Unlike AddComment, you are required to terminate comments with \n if you 118d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner /// use this method. 119d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner virtual raw_ostream &GetCommentOS(); 1200dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 1210fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner /// AddBlankLine - Emit a blank line to a .s file to pretty it up. 1220fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner virtual void AddBlankLine() {} 1230dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 1240fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner /// @} 1250dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 12684a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @name Symbol & Section Management 12784a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @{ 1280dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 1296a4824c466bbfbcbe7dc4d95ec1e23a14ec73d87Dan Gohman /// getCurrentSection - Return the current section that the streamer is 1307092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar /// emitting code to. 1317768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola const MCSection *getCurrentSection() const { 1327d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger if (!SectionStack.empty()) 1337d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger return SectionStack.back().first; 1347768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola return NULL; 1357768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola } 13684a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 1371674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer /// getPreviousSection - Return the previous section that the streamer is 1381674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer /// emitting code to. 1397768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola const MCSection *getPreviousSection() const { 1407d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger if (!SectionStack.empty()) 1417d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger return SectionStack.back().second; 1427768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola return NULL; 1437768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola } 1447768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 1457768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// ChangeSection - Update streamer for a new active section. 1467768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// 1477768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// This is called by PopSection and SwitchSection, if the current 1487768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// section changes. 1497768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola virtual void ChangeSection(const MCSection *) = 0; 1507768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 1517768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// pushSection - Save the current and previous section on the 1527768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// section stack. 1537768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola void PushSection() { 1547d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger SectionStack.push_back(std::make_pair(getCurrentSection(), 1557d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger getPreviousSection())); 1567768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola } 1577768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 1587768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// popSection - Restore the current and previous section from 1597768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// the section stack. Calls ChangeSection as needed. 1607768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// 1617768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// Returns false if the stack was empty. 1627768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola bool PopSection() { 1637d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger if (SectionStack.size() <= 1) 1647768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola return false; 1657d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger const MCSection *oldSection = SectionStack.pop_back_val().first; 1667d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger const MCSection *curSection = SectionStack.back().first; 1677768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola 1687768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola if (oldSection != curSection) 1697768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola ChangeSection(curSection); 1707768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola return true; 1717768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola } 1721674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer 173381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// SwitchSection - Set the current section where code is being emitted to 174fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// @p Section. This is required to update CurSection. 175381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 176381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// This corresponds to assembler directives like .section, .text, etc. 1777768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola void SwitchSection(const MCSection *Section) { 1787768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola assert(Section && "Cannot switch to a null section!"); 1797d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger const MCSection *curSection = SectionStack.back().first; 1807d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger SectionStack.back().second = curSection; 1817768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola if (Section != curSection) { 1827d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger SectionStack.back().first = Section; 1837768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola ChangeSection(Section); 1847768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola } 1857768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola } 1860dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 187d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola /// InitSections - Create the default sections and set the initial one. 188d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola virtual void InitSections() = 0; 189d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola 190fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitLabel - Emit a label for @p Symbol into the current section. 191381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 192381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// This corresponds to an assembler statement such as: 193381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// foo: 194381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 195381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// @param Symbol - The symbol to emit. A given symbol should only be 196381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// emitted as a label once, and symbols emitted as a label should never be 197381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// used in an assignment. 198ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola virtual void EmitLabel(MCSymbol *Symbol); 199381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar 2008bca4106dfc2945723251db10e340183f3e372ddRafael Espindola virtual void EmitEHSymAttributes(const MCSymbol *Symbol, 2018bca4106dfc2945723251db10e340183f3e372ddRafael Espindola MCSymbol *EHSymbol); 2028bca4106dfc2945723251db10e340183f3e372ddRafael Espindola 203fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitAssemblerFlag - Note in the output the specified @p Flag 204a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0; 205a5c783280f83df5c60a8ed9e32c61b05a11048e3Kevin Enderby 206ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach /// EmitThumbFunc - Note in the output that the specified @p Func is 207ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach /// a Thumb mode function (ARM target only). 208ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach virtual void EmitThumbFunc(MCSymbol *Func) = 0; 209ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach 210fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitAssignment - Emit an assignment of @p Value to @p Symbol. 211381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 212381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// This corresponds to an assembler statement such as: 213381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// symbol = value 214381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 215381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// The assignment generates no code, but has the side effect of binding the 216381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// value in the current context. For the assembly streamer, this prints the 217381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// binding into the .s file. 218381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 219381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// @param Symbol - The symbol being assigned to. 220381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// @param Value - The value for the symbol. 221821e3334ed3390d931f497300e6a5f1dc21bcfb3Daniel Dunbar virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) = 0; 22225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 223484291c27319668ad99cb87def000254357736fbRafael Espindola /// EmitWeakReference - Emit an weak reference from @p Alias to @p Symbol. 224484291c27319668ad99cb87def000254357736fbRafael Espindola /// 225484291c27319668ad99cb87def000254357736fbRafael Espindola /// This corresponds to an assembler statement such as: 226484291c27319668ad99cb87def000254357736fbRafael Espindola /// .weakref alias, symbol 227484291c27319668ad99cb87def000254357736fbRafael Espindola /// 228484291c27319668ad99cb87def000254357736fbRafael Espindola /// @param Alias - The alias that is being created. 229484291c27319668ad99cb87def000254357736fbRafael Espindola /// @param Symbol - The symbol being aliased. 230484291c27319668ad99cb87def000254357736fbRafael Espindola virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) = 0; 231484291c27319668ad99cb87def000254357736fbRafael Espindola 232fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitSymbolAttribute - Add the given @p Attribute to @p Symbol. 233a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar virtual void EmitSymbolAttribute(MCSymbol *Symbol, 234a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner MCSymbolAttr Attribute) = 0; 23525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 236fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitSymbolDesc - Set the @p DescValue for the @p Symbol. 23795cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderby /// 23895cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderby /// @param Symbol - The symbol to have its n_desc field set. 23995cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderby /// @param DescValue - The value to set into the n_desc field. 24095cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderby virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) = 0; 24195cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderby 242b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// BeginCOFFSymbolDef - Start emitting COFF symbol definition 243b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// 244b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// @param Symbol - The symbol to have its External & Type fields set. 245b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol) = 0; 246b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner 247b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// EmitCOFFSymbolStorageClass - Emit the storage class of the symbol. 248b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// 249b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// @param StorageClass - The storage class the symbol should have. 250b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner virtual void EmitCOFFSymbolStorageClass(int StorageClass) = 0; 251b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner 252b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// EmitCOFFSymbolType - Emit the type of the symbol. 253b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// 254b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// @param Type - A COFF type identifier (see COFF::SymbolType in X86COFF.h) 255b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner virtual void EmitCOFFSymbolType(int Type) = 0; 256b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner 257b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner /// EndCOFFSymbolDef - Marks the end of the symbol definition. 258b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner virtual void EndCOFFSymbolDef() = 0; 259b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner 26099328add833807f12a4950c7de29fb2a5df04703Chris Lattner /// EmitELFSize - Emit an ELF .size directive. 26199328add833807f12a4950c7de29fb2a5df04703Chris Lattner /// 26299328add833807f12a4950c7de29fb2a5df04703Chris Lattner /// This corresponds to an assembler statement such as: 26399328add833807f12a4950c7de29fb2a5df04703Chris Lattner /// .size symbol, expression 26499328add833807f12a4950c7de29fb2a5df04703Chris Lattner /// 26599328add833807f12a4950c7de29fb2a5df04703Chris Lattner virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) = 0; 2660dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 2679eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// EmitCommonSymbol - Emit a common symbol. 2684e4db7adfc9858a8f77f841c7467bc6fcbb8110eChris Lattner /// 2694e4db7adfc9858a8f77f841c7467bc6fcbb8110eChris Lattner /// @param Symbol - The common symbol to emit. 2704e4db7adfc9858a8f77f841c7467bc6fcbb8110eChris Lattner /// @param Size - The size of the common symbol. 2717092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar /// @param ByteAlignment - The alignment of the symbol if 2729eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// non-zero. This must be a power of 2. 2739eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 2747092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar unsigned ByteAlignment) = 0; 2754e4db7adfc9858a8f77f841c7467bc6fcbb8110eChris Lattner 2769eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. 2779eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// 2789eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// @param Symbol - The common symbol to emit. 2799eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// @param Size - The size of the common symbol. 2809eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size) = 0; 2810dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 2820df4a80e2063424929bbfaa61dd7973062218ad4Eric Christopher /// EmitZerofill - Emit the zerofill section and an optional symbol. 2839be3fee2bdc3126fb87e4e1b31935905f4bcc4d0Chris Lattner /// 2849be3fee2bdc3126fb87e4e1b31935905f4bcc4d0Chris Lattner /// @param Section - The zerofill section to create and or to put the symbol 2859be3fee2bdc3126fb87e4e1b31935905f4bcc4d0Chris Lattner /// @param Symbol - The zerofill symbol to emit, if non-NULL. 2869be3fee2bdc3126fb87e4e1b31935905f4bcc4d0Chris Lattner /// @param Size - The size of the zerofill symbol. 2877092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar /// @param ByteAlignment - The alignment of the zerofill symbol if 2887092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar /// non-zero. This must be a power of 2 on some targets. 2898751b94ffbd9c49df8949a37f78d6bd0be87b256Daniel Dunbar virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, 2907092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar unsigned Size = 0,unsigned ByteAlignment = 0) = 0; 2919be3fee2bdc3126fb87e4e1b31935905f4bcc4d0Chris Lattner 292482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher /// EmitTBSSSymbol - Emit a thread local bss (.tbss) symbol. 293482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher /// 2944d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christopher /// @param Section - The thread local common section. 295482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher /// @param Symbol - The thread local common symbol to emit. 296482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher /// @param Size - The size of the symbol. 297482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher /// @param ByteAlignment - The alignment of the thread local common symbol 298482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher /// if non-zero. This must be a power of 2 on some targets. 2994d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christopher virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 3000dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach uint64_t Size, unsigned ByteAlignment = 0) = 0; 301ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis 30284a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @} 30384a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @name Generating Data 30484a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @{ 30584a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 3067092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar /// EmitBytes - Emit the bytes in \arg Data into the output. 307381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 308381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// This is used to implement assembler directives such as .byte, .ascii, 309381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// etc. 310aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner virtual void EmitBytes(StringRef Data, unsigned AddrSpace) = 0; 311381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar 312fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitValue - Emit the expression @p Value into the output as a native 313fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// integer of the given @p Size bytes. 314381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 315381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// This is used to implement assembler directives such as .word, .quad, 316381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// etc. 317381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// 318381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// @param Value - The value to emit. 319381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// @param Size - The size of the integer (in bytes) to emit. This must 320381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// match a native machine width. 32189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola virtual void EmitValueImpl(const MCExpr *Value, unsigned Size, 322debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola unsigned AddrSpace) = 0; 32389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 32489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola void EmitValue(const MCExpr *Value, unsigned Size, unsigned AddrSpace = 0); 32589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 32632ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner /// EmitIntValue - Special case of EmitValue that avoids the client having 32732ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner /// to pass in a MCExpr for constant integers. 3282df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola virtual void EmitIntValue(uint64_t Value, unsigned Size, 3292df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola unsigned AddrSpace = 0); 3300dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 3310bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindola /// EmitAbsValue - Emit the Value, but try to avoid relocations. On MachO 3320bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindola /// this is done by producing 3330bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindola /// foo = value 3340bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindola /// .long foo 3350bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindola void EmitAbsValue(const MCExpr *Value, unsigned Size, 3360bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindola unsigned AddrSpace = 0); 3373bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 338e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindola virtual void EmitULEB128Value(const MCExpr *Value) = 0; 3393ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 340e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindola virtual void EmitSLEB128Value(const MCExpr *Value) = 0; 3413ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 3423ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// EmitULEB128Value - Special case of EmitULEB128Value that avoids the 3433ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// client having to pass in a MCExpr for constant integers. 34471e7f9210d87fa29202d851c43b5e91bbbd2fa51Rafael Espindola void EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace = 0); 3453ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 3463ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the 3473ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// client having to pass in a MCExpr for constant integers. 34871e7f9210d87fa29202d851c43b5e91bbbd2fa51Rafael Espindola void EmitSLEB128IntValue(int64_t Value, unsigned AddrSpace = 0); 3493bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 3506cde3e6e993126df756e3be5b9ef43540b904644Chris Lattner /// EmitSymbolValue - Special case of EmitValue that avoids the client 3516cde3e6e993126df756e3be5b9ef43540b904644Chris Lattner /// having to pass in a MCExpr for MCSymbols. 352175ccab75f3a355285cf4533c201cbcecfd5928dRafael Espindola void EmitSymbolValue(const MCSymbol *Sym, unsigned Size, 353175ccab75f3a355285cf4533c201cbcecfd5928dRafael Espindola unsigned AddrSpace = 0); 3540dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 355fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitGPRel32Value - Emit the expression @p Value into the output as a 356718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner /// gprel32 (32-bit GP relative) value. 357718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner /// 358718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner /// This is used to implement assembler directives such as .gprel32 on 359718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner /// targets that support them. 3603e03211625bba5bbb70a193c140ebf4dd8388bb7Rafael Espindola virtual void EmitGPRel32Value(const MCExpr *Value); 3610dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 362ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner /// EmitFill - Emit NumBytes bytes worth of the value specified by 363ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner /// FillValue. This implements directives such as '.space'. 364aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue, 365aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner unsigned AddrSpace); 3660dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 3676449abfbc86310edbbe0b5ffb3fad5c14301307fChris Lattner /// EmitZeros - Emit NumBytes worth of zeros. This is a convenience 3686449abfbc86310edbbe0b5ffb3fad5c14301307fChris Lattner /// function that just wraps EmitFill. 3696449abfbc86310edbbe0b5ffb3fad5c14301307fChris Lattner void EmitZeros(uint64_t NumBytes, unsigned AddrSpace) { 3706449abfbc86310edbbe0b5ffb3fad5c14301307fChris Lattner EmitFill(NumBytes, 0, AddrSpace); 3716449abfbc86310edbbe0b5ffb3fad5c14301307fChris Lattner } 3726449abfbc86310edbbe0b5ffb3fad5c14301307fChris Lattner 3730dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 374fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitValueToAlignment - Emit some number of copies of @p Value until 375fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// the byte alignment @p ByteAlignment is reached. 37684a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// 37784a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// If the number of bytes need to emit for the alignment is not a multiple 378fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// of @p ValueSize, then the contents of the emitted fill bytes is 37984a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// undefined. 38084a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// 38184a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// This used to implement the .align assembler directive. 38284a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// 38384a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @param ByteAlignment - The alignment to reach. This must be a power of 384c29dfa786a23c9ff0827ce4a56b5b178e4087aaaDaniel Dunbar /// two on some targets. 38584a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @param Value - The value to use when filling bytes. 386fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// @param ValueSize - The size of the integer (in bytes) to emit for 387fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// @p Value. This must match a native machine width. 38884a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 38984a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// the alignment cannot be reached in this many bytes, no bytes are 39084a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// emitted. 39184a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, 39284a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar unsigned ValueSize = 1, 39384a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar unsigned MaxBytesToEmit = 0) = 0; 3946e72048add2a6464e038121c6c275da37528aa0aKevin Enderby 3956e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// EmitCodeAlignment - Emit nops until the byte alignment @p ByteAlignment 3966e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// is reached. 3976e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// 3986e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// This used to align code where the alignment bytes may be executed. This 3996e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// can emit different bytes for different sizes to optimize execution. 4006e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// 4016e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// @param ByteAlignment - The alignment to reach. This must be a power of 4026e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// two on some targets. 4036e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// @param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 4046e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// the alignment cannot be reached in this many bytes, no bytes are 4056e72048add2a6464e038121c6c275da37528aa0aKevin Enderby /// emitted. 4066e72048add2a6464e038121c6c275da37528aa0aKevin Enderby virtual void EmitCodeAlignment(unsigned ByteAlignment, 4076e72048add2a6464e038121c6c275da37528aa0aKevin Enderby unsigned MaxBytesToEmit = 0) = 0; 40884a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 409fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitValueToOffset - Emit some number of copies of @p Value until the 410fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// byte offset @p Offset is reached. 41184a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// 41284a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// This is used to implement assembler directives such as .org. 41384a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// 4144a1fadaf5207e46d19c64e5773ff8d9e65e607d7Daniel Dunbar /// @param Offset - The offset to reach. This may be an expression, but the 41584a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// expression must be associated with the current section. 41684a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @param Value - The value to use when filling bytes. 417821e3334ed3390d931f497300e6a5f1dc21bcfb3Daniel Dunbar virtual void EmitValueToOffset(const MCExpr *Offset, 41884a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar unsigned char Value = 0) = 0; 4190dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 42084a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar /// @} 4210dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 422a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner /// EmitFileDirective - Switch to a new logical file. This is used to 423a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner /// implement the '.file "foo.c"' assembler directive. 424a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner virtual void EmitFileDirective(StringRef Filename) = 0; 4250dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 426a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner /// EmitDwarfFileDirective - Associate a filename with a specified logical 427a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner /// file number. This implements the DWARF2 '.file 4 "foo.c"' assembler 428a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner /// directive. 429af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola virtual bool EmitDwarfFileDirective(unsigned FileNo,StringRef Filename); 430af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola 431af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola /// EmitDwarfLocDirective - This implements the DWARF2 432af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola // '.loc fileno lineno ...' assembler directive. 433af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, 434af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola unsigned Column, unsigned Flags, 435af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola unsigned Isa, 4363f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel unsigned Discriminator, 4373f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel StringRef FileName); 43884a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 43932a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, 44032a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola const MCSymbol *LastLabel, 44132a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola const MCSymbol *Label) = 0; 44232a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola 443245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, 444245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola const MCSymbol *Label) { 445245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola } 446245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 44732a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola void EmitDwarfSetLineAddr(int64_t LineDelta, const MCSymbol *Label, 44832a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola int PointerSize); 44932a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola 450f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola virtual void EmitCFISections(bool EH, bool Debug); 451066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIStartProc(); 452066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIEndProc(); 453066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset); 454066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIDefCfaOffset(int64_t Offset); 455066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIDefCfaRegister(int64_t Register); 456066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIOffset(int64_t Register, int64_t Offset); 457066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding); 458066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding); 459066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIRememberState(); 460066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIRestoreState(); 461066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFISameValue(int64_t Register); 462066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset); 463066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment); 464cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 4659c77398d1c89f615735d304cd7eda3c3e9b1504fCharles Davis virtual void EmitWin64EHStartProc(MCSymbol *Symbol, MCSymbol *EHandler = 0); 4669c77398d1c89f615735d304cd7eda3c3e9b1504fCharles Davis virtual void EmitWin64EHEndProc(); 467f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis virtual void EmitWin64EHStartChained(); 468f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis virtual void EmitWin64EHEndChained(); 469f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis virtual void EmitWin64EHUnwindOnly(); 470f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis virtual void EmitWin64EHLsda(const MCSymbol *Sym, int64_t Size); 471ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis virtual void EmitWin64EHPushReg(int64_t Register); 472ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis virtual void EmitWin64EHSetFrame(int64_t Register, int64_t Offset); 473ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis virtual void EmitWin64EHAllocStack(int64_t Size); 474ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis virtual void EmitWin64EHSaveReg(int64_t Register, int64_t Offset); 475ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis virtual void EmitWin64EHPushFrame(bool Code); 4769c77398d1c89f615735d304cd7eda3c3e9b1504fCharles Davis virtual void EmitWin64EHEndProlog(); 477ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis 478fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// EmitInstruction - Emit the given @p Instruction into the current 479381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// section. 48025e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar virtual void EmitInstruction(const MCInst &Inst) = 0; 481ba1da8a7b10b8a7df04f3ca47ca36ad18adad80eDaniel Dunbar 48291bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// EmitRawText - If this file is backed by a assembly streamer, this dumps 48391bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// the specified string in the output .s file. This capability is 48491bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// indicated by the hasRawTextSupport() predicate. By default this aborts. 48591bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner virtual void EmitRawText(StringRef String); 48658bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner void EmitRawText(const Twine &String); 4870dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach 488b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov /// ARM-related methods. 489b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov /// FIXME: Eventually we should have some "target MC streamer" and move 490b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov /// these methods there. 491b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov virtual void EmitFnStart(); 492b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov virtual void EmitFnEnd(); 493b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov virtual void EmitCantUnwind(); 494b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov virtual void EmitPersonality(const MCSymbol *Personality); 495b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov virtual void EmitHandlerData(); 49657caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov virtual void EmitSetFP(unsigned FpReg, unsigned SpReg, int64_t Offset = 0); 49757caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov virtual void EmitPad(int64_t Offset); 49857caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov virtual void EmitRegSave(const SmallVectorImpl<unsigned> &RegList, 49957caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov bool isVector); 500b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov 5014b1000d117f1b7cc5411bc251d141fe182a4ae1cDan Gohman /// Finish - Finish emission of machine code. 502ba1da8a7b10b8a7df04f3ca47ca36ad18adad80eDaniel Dunbar virtual void Finish() = 0; 50325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar }; 50425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 505011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar /// createNullStreamer - Create a dummy machine code streamer, which does 506011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar /// nothing. This is useful for timing the assembler front end. 507011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar MCStreamer *createNullStreamer(MCContext &Ctx); 508011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar 509381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// createAsmStreamer - Create a machine code streamer which will print out 510381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// assembly for the native target, suitable for compiling with a native 511381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// assembler. 5129dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar /// 5139dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar /// \param InstPrint - If given, the instruction printer to use. If not given 5144c42a6de9f5456cc1b28f2d37db589f580f2adc7Chris Lattner /// the MCInst representation will be printed. This method takes ownership of 5154c42a6de9f5456cc1b28f2d37db589f580f2adc7Chris Lattner /// InstPrint. 5169dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar /// 5179dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar /// \param CE - If given, a code emitter to use to show the instruction 5181abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// encoding inline with the assembly. This method takes ownership of \arg CE. 5199dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar /// 520745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar /// \param TAB - If given, a target asm backend to use to show the fixup 521745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar /// information in conjunction with encoding information. This method takes 522745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar /// ownership of \arg TAB. 523745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar /// 5249dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar /// \param ShowInst - Whether to show the MCInst representation inline with 5259dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar /// the assembly. 52686e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 52789b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool isVerboseAsm, 52889b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool useLoc, 529f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useCFI, 53090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner MCInstPrinter *InstPrint = 0, 5319dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar MCCodeEmitter *CE = 0, 532745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar TargetAsmBackend *TAB = 0, 5335532cf44a012149ce3afce43dbd0651b4d87a505Daniel Dunbar bool ShowInst = false); 534381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar 535d86e6ac9892ee61742d85f9f14f1179216d2e47bDan Gohman /// createMachOStreamer - Create a machine code streamer which will generate 536381e92c66a98ee766ea53039b0cd8ce3bde7be2dDaniel Dunbar /// Mach-O format object files. 5371abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// 5381abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// Takes ownership of \arg TAB and \arg CE. 5391f3e445184e5ca2aa4295c2a77f2a4e0b957fea1Daniel Dunbar MCStreamer *createMachOStreamer(MCContext &Ctx, TargetAsmBackend &TAB, 540ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar raw_ostream &OS, MCCodeEmitter *CE, 541ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar bool RelaxAll = false); 54225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 543eb72dcaef7423069cf8f9e802fa8de64dc8f8f30Chris Lattner /// createWinCOFFStreamer - Create a machine code streamer which will 544eb72dcaef7423069cf8f9e802fa8de64dc8f8f30Chris Lattner /// generate Microsoft COFF format object files. 5451abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// 5461abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// Takes ownership of \arg TAB and \arg CE. 547eb72dcaef7423069cf8f9e802fa8de64dc8f8f30Chris Lattner MCStreamer *createWinCOFFStreamer(MCContext &Ctx, 548eb72dcaef7423069cf8f9e802fa8de64dc8f8f30Chris Lattner TargetAsmBackend &TAB, 549e2195d8b357d7081edb5eb09d1d6e9d7b4bfc308Michael J. Spencer MCCodeEmitter &CE, raw_ostream &OS, 550e2195d8b357d7081edb5eb09d1d6e9d7b4bfc308Michael J. Spencer bool RelaxAll = false); 551eb72dcaef7423069cf8f9e802fa8de64dc8f8f30Chris Lattner 5526b2e257e74b2c8e2f93bb244e0c80cb73005b74aMatt Fleming /// createELFStreamer - Create a machine code streamer which will generate 5536b2e257e74b2c8e2f93bb244e0c80cb73005b74aMatt Fleming /// ELF format object files. 5546b2e257e74b2c8e2f93bb244e0c80cb73005b74aMatt Fleming MCStreamer *createELFStreamer(MCContext &Ctx, TargetAsmBackend &TAB, 5556b2e257e74b2c8e2f93bb244e0c80cb73005b74aMatt Fleming raw_ostream &OS, MCCodeEmitter *CE, 55696aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola bool RelaxAll, bool NoExecStack); 5576b2e257e74b2c8e2f93bb244e0c80cb73005b74aMatt Fleming 558fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar /// createLoggingStreamer - Create a machine code streamer which just logs the 559fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar /// API calls and then dispatches to another streamer. 560fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar /// 561fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar /// The new streamer takes ownership of the \arg Child. 562fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar MCStreamer *createLoggingStreamer(MCStreamer *Child, raw_ostream &OS); 563fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar 564abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar /// createPureStreamer - Create a machine code streamer which will generate 565abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar /// "pure" MC object files, for use with MC-JIT and testing tools. 566abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar /// 567abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar /// Takes ownership of \arg TAB and \arg CE. 568abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar MCStreamer *createPureStreamer(MCContext &Ctx, TargetAsmBackend &TAB, 569abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar raw_ostream &OS, MCCodeEmitter *CE); 570abc756216dbace87826398f8fa1e8e57e401cc86Daniel Dunbar 57125e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar} // end namespace llvm 57225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 57325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#endif 574