1a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar//===- lib/MC/MCAsmStreamer.cpp - Text Assembly Output --------------------===// 2a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar// 3a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar// The LLVM Compiler Infrastructure 4a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar// 5a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar// This file is distributed under the University of Illinois Open Source 6a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar// License. See LICENSE.TXT for details. 7a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar// 8a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar//===----------------------------------------------------------------------===// 9a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 10a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar#include "llvm/MC/MCStreamer.h" 11dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/STLExtras.h" 12ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/ADT/SmallString.h" 13d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/StringExtras.h" 14d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Twine.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCAsmBackend.h" 168c2eebe4074ef218b30d94358f6b2e45c079605cDaniel Dunbar#include "llvm/MC/MCAsmInfo.h" 174a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar#include "llvm/MC/MCCodeEmitter.h" 18a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar#include "llvm/MC/MCContext.h" 198c2eebe4074ef218b30d94358f6b2e45c079605cDaniel Dunbar#include "llvm/MC/MCExpr.h" 202761fc427082215c2affcc9d8db8491400bc9e5dDaniel Dunbar#include "llvm/MC/MCFixupKindInfo.h" 21abde2982e3c660398ff5a8e5f7ac3d1467b83062Daniel Dunbar#include "llvm/MC/MCInst.h" 2290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner#include "llvm/MC/MCInstPrinter.h" 23bfe3686aee881cb7599c42fc96afc44ff9bcf356Evan Cheng#include "llvm/MC/MCObjectFileInfo.h" 240e6a052331f674dd70e28af41f654a7874405eabEvan Cheng#include "llvm/MC/MCRegisterInfo.h" 25e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng#include "llvm/MC/MCSectionCOFF.h" 26f9bdeddb96043559c61f176f8077e3b91a0c544fChris Lattner#include "llvm/MC/MCSectionMachO.h" 27a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar#include "llvm/MC/MCSymbol.h" 285e195a4c8d8cd4498ab7e0aa16a3b6f273daf457Rafael Espindola#include "llvm/Support/CommandLine.h" 29c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 304a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar#include "llvm/Support/Format.h" 3186e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner#include "llvm/Support/FormattedStream.h" 32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/MathExtras.h" 33a11c3e25015a62c817e60ec4f955a7f3f3bb6c67Rafael Espindola#include "llvm/Support/Path.h" 34476b242fe7a61e5f9ac6214b0bc5c680d24f152eNick Lewycky#include <cctype> 35a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbarusing namespace llvm; 36a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 37a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbarnamespace { 38a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 392c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarclass MCAsmStreamer final : public MCStreamer { 402c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar std::unique_ptr<formatted_raw_ostream> OSOwner; 4186e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner formatted_raw_ostream &OS; 4299cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling const MCAsmInfo *MAI; 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MCInstPrinter> InstPrinter; 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MCCodeEmitter> Emitter; 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MCAsmBackend> AsmBackend; 4600545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 4786e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner SmallString<128> CommentToEmit; 48d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner raw_svector_ostream CommentStream; 499dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar 509dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar unsigned IsVerboseAsm : 1; 519dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar unsigned ShowInst : 1; 5244d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky unsigned UseDwarfDirectory : 1; 539dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar 546e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola void EmitRegisterName(int64_t Register); 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override; 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override; 576e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola 5846a947d8c191e5c218e736330c9d4d59ac4bcab3Chris Lattnerpublic: 592c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar MCAsmStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os, 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isVerboseAsm, bool useDwarfDirectory, 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCInstPrinter *printer, MCCodeEmitter *emitter, 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCAsmBackend *asmbackend, bool showInst) 632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar : MCStreamer(Context), OSOwner(std::move(os)), OS(*OSOwner), 642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar MAI(Context.getAsmInfo()), InstPrinter(printer), Emitter(emitter), 652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar AsmBackend(asmbackend), CommentStream(CommentToEmit), 662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar IsVerboseAsm(isVerboseAsm), ShowInst(showInst), 672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar UseDwarfDirectory(useDwarfDirectory) { 685d672cfab096390690a1a5f33b0057c4cf252c55Chris Lattner if (InstPrinter && IsVerboseAsm) 695d672cfab096390690a1a5f33b0057c4cf252c55Chris Lattner InstPrinter->setCommentStream(CommentStream); 705d672cfab096390690a1a5f33b0057c4cf252c55Chris Lattner } 71a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 7286e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner inline void EmitEOL() { 73d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner // If we don't have any comments, just emit a \n. 74d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner if (!IsVerboseAsm) { 7586e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner OS << '\n'; 7686e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner return; 7786e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner } 7886e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner EmitCommentsAndEOL(); 7986e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner } 8086e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner void EmitCommentsAndEOL(); 8156591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner 8256591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner /// isVerboseAsm - Return true if this streamer supports verbose assembly at 8356591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner /// all. 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isVerboseAsm() const override { return IsVerboseAsm; } 8500545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 8691bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// hasRawTextSupport - We support EmitRawText. 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasRawTextSupport() const override { return true; } 886b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 89d32c7cfa248f685e6e3064c0958dc2f0c31a4df6Chris Lattner /// AddComment - Add a comment that can be emitted to the generated .s 9086e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// file if applicable as a QoI issue to make the output of the compiler 9186e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// more readable. This only affects the MCAsmStreamer, and only when 9286e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner /// verbose assembly output is enabled. 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void AddComment(const Twine &T) override; 946b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 956b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar /// AddEncodingComment - Add a comment showing the encoding of an instruction. 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void AddEncodingComment(const MCInst &Inst, const MCSubtargetInfo &); 976b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 98d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner /// GetCommentOS - Return a raw_ostream that comments can be written to. 99d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner /// Unlike AddComment, you are required to terminate comments with \n if you 100d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner /// use this method. 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &GetCommentOS() override { 102d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner if (!IsVerboseAsm) 103d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner return nulls(); // Discard comments unless in verbose asm mode. 104d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner return CommentStream; 105d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner } 1066b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void emitRawComment(const Twine &T, bool TabPrefix = true) override; 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1090fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner /// AddBlankLine - Emit a blank line to a .s file to pretty it up. 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void AddBlankLine() override { 1110fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner EmitEOL(); 1120fd90fd8d1c2143a763dee509c66a5b3c74088b1Chris Lattner } 1136b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 11446a947d8c191e5c218e736330c9d4d59ac4bcab3Chris Lattner /// @name MCStreamer Interface 11546a947d8c191e5c218e736330c9d4d59ac4bcab3Chris Lattner /// @{ 116a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ChangeSection(const MCSection *Section, 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Subsection) override; 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override; 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitLabel(MCSymbol *Symbol) override; 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitAssemblerFlag(MCAssemblerFlag Flag) override; 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitLinkerOptions(ArrayRef<std::string> Options) override; 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitDataRegion(MCDataRegionType Kind) override; 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor, 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Update) override; 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitThumbFunc(MCSymbol *Func) override; 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override; 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void BeginCOFFSymbolDef(const MCSymbol *Symbol) override; 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCOFFSymbolStorageClass(int StorageClass) override; 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCOFFSymbolType(int Type) override; 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EndCOFFSymbolDef() override; 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCOFFSectionIndex(MCSymbol const *Symbol) override; 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCOFFSecRel32(MCSymbol const *Symbol) override; 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) override; 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned ByteAlignment) override; 14495cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderby 1459eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. 1469eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// 1479eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// @param Symbol - The common symbol to emit. 1489eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner /// @param Size - The size of the common symbol. 149a00b80b04c5edb08639c1c6b32e9231fd8b066f7Dmitri Gribenko /// @param ByteAlignment - The alignment of the common symbol in bytes. 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned ByteAlignment) override; 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = nullptr, 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Size = 0, unsigned ByteAlignment = 0) override; 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitTBSSSymbol (const MCSection *Section, MCSymbol *Symbol, 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Size, unsigned ByteAlignment = 0) override; 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitBytes(StringRef Data) override; 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void EmitValueImpl(const MCExpr *Value, unsigned Size, 162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const SMLoc &Loc = SMLoc()) override; 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitIntValue(uint64_t Value, unsigned Size) override; 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitULEB128Value(const MCExpr *Value) override; 16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitSLEB128Value(const MCExpr *Value) override; 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitGPRel64Value(const MCExpr *Value) override; 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitGPRel32Value(const MCExpr *Value) override; 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitFill(uint64_t NumBytes, uint8_t FillValue) override; 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned ValueSize = 1, 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned MaxBytesToEmit = 0) override; 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCodeAlignment(unsigned ByteAlignment, 18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned MaxBytesToEmit = 0) override; 18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool EmitValueToOffset(const MCExpr *Offset, 18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned char Value = 0) override; 18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitFileDirective(StringRef Filename) override; 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Filename, 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned CUID = 0) override; 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, 19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Column, unsigned Flags, 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Isa, unsigned Discriminator, 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef FileName) override; 19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override; 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitIdent(StringRef IdentString) override; 19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFISections(bool EH, bool Debug) override; 19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIDefCfa(int64_t Register, int64_t Offset) override; 19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIDefCfaOffset(int64_t Offset) override; 20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIDefCfaRegister(int64_t Register) override; 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIOffset(int64_t Register, int64_t Offset) override; 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) override; 20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) override; 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIRememberState() override; 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIRestoreState() override; 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFISameValue(int64_t Register) override; 20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIRelOffset(int64_t Register, int64_t Offset) override; 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIAdjustCfaOffset(int64_t Adjustment) override; 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFISignalFrame() override; 21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIUndefined(int64_t Register) override; 21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIRegister(int64_t Register1, int64_t Register2) override; 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitCFIWindowSave() override; 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 214c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFIStartProc(const MCSymbol *Symbol) override; 215c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFIEndProc() override; 216c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFIStartChained() override; 217c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFIEndChained() override; 218c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFIPushReg(unsigned Register) override; 219c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFISetFrame(unsigned Register, unsigned Offset) override; 220c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFIAllocStack(unsigned Size) override; 221c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFISaveReg(unsigned Register, unsigned Offset) override; 222c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFISaveXMM(unsigned Register, unsigned Offset) override; 223c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFIPushFrame(bool Code) override; 224c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinCFIEndProlog() override; 225c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 226c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except) override; 227c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void EmitWinEHHandlerData() override; 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitBundleAlignMode(unsigned AlignPow2) override; 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitBundleLock(bool AlignToEnd) override; 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitBundleUnlock() override; 2344766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 235bd4ec84d154bdd3f19b07de1076a06c16f7ebce8Jim Grosbach /// EmitRawText - If this file is backed by an assembly streamer, this dumps 23691bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// the specified string in the output .s file. This capability is 23791bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner /// indicated by the hasRawTextSupport() predicate. 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void EmitRawTextImpl(StringRef String) override; 23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void FinishImpl() override; 24146a947d8c191e5c218e736330c9d4d59ac4bcab3Chris Lattner}; 24284a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 24346a947d8c191e5c218e736330c9d4d59ac4bcab3Chris Lattner} // end anonymous namespace. 244a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 245d32c7cfa248f685e6e3064c0958dc2f0c31a4df6Chris Lattner/// AddComment - Add a comment that can be emitted to the generated .s 24686e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner/// file if applicable as a QoI issue to make the output of the compiler 24786e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner/// more readable. This only affects the MCAsmStreamer, and only when 24886e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner/// verbose assembly output is enabled. 249d32c7cfa248f685e6e3064c0958dc2f0c31a4df6Chris Lattnervoid MCAsmStreamer::AddComment(const Twine &T) { 25086e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner if (!IsVerboseAsm) return; 25100545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 252d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner // Make sure that CommentStream is flushed. 253d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner CommentStream.flush(); 25400545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 25586e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner T.toVector(CommentToEmit); 256d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner // Each comment goes on its own line. 257d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner CommentToEmit.push_back('\n'); 25800545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 25914ca177beba15e86ca410c9f6fc7f48ba245dba6Chris Lattner // Tell the comment stream that the vector changed underneath it. 26014ca177beba15e86ca410c9f6fc7f48ba245dba6Chris Lattner CommentStream.resync(); 26186e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner} 26286e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner 26386e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattnervoid MCAsmStreamer::EmitCommentsAndEOL() { 264d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner if (CommentToEmit.empty() && CommentStream.GetNumBytesInBuffer() == 0) { 265d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner OS << '\n'; 266d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner return; 267d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner } 26800545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 269d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner CommentStream.flush(); 2704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar StringRef Comments = CommentToEmit; 27100545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 272d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner assert(Comments.back() == '\n' && 273d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner "Comment array not newline terminated"); 274d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner do { 27586e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner // Emit a line of comments. 27699cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS.PadToColumn(MAI->getCommentColumn()); 27786e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner size_t Position = Comments.find('\n'); 27899cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS << MAI->getCommentString() << ' ' << Comments.substr(0, Position) <<'\n'; 27900545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 28086e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner Comments = Comments.substr(Position+1); 281d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner } while (!Comments.empty()); 28200545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 28314ca177beba15e86ca410c9f6fc7f48ba245dba6Chris Lattner CommentToEmit.clear(); 28414ca177beba15e86ca410c9f6fc7f48ba245dba6Chris Lattner // Tell the comment stream that the vector changed underneath it. 28514ca177beba15e86ca410c9f6fc7f48ba245dba6Chris Lattner CommentStream.resync(); 28686e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner} 28786e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner 288304f6a48b1232bdad8b2c0dff7c08d677826ef86Daniel Dunbarstatic inline int64_t truncateToSize(int64_t Value, unsigned Bytes) { 289304f6a48b1232bdad8b2c0dff7c08d677826ef86Daniel Dunbar assert(Bytes && "Invalid size!"); 290304f6a48b1232bdad8b2c0dff7c08d677826ef86Daniel Dunbar return Value & ((uint64_t) (int64_t) -1 >> (64 - Bytes * 8)); 291304f6a48b1232bdad8b2c0dff7c08d677826ef86Daniel Dunbar} 292304f6a48b1232bdad8b2c0dff7c08d677826ef86Daniel Dunbar 29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCAsmStreamer::emitRawComment(const Twine &T, bool TabPrefix) { 29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (TabPrefix) 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << '\t'; 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << MAI->getCommentString() << T; 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitEOL(); 29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 300df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbournevoid MCAsmStreamer::ChangeSection(const MCSection *Section, 301df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne const MCExpr *Subsection) { 3026c2f9e14fdf14d8c1c687c6bd9918183fa7f8a7fChris Lattner assert(Section && "Cannot switch to a null section!"); 30399cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling Section->PrintSwitchToSection(*MAI, OS, Subsection); 304a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar} 305a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 306a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbarvoid MCAsmStreamer::EmitLabel(MCSymbol *Symbol) { 3078906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); 308ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola MCStreamer::EmitLabel(Symbol); 30971d259bc4be4f5c7a8a30c6be8da105074ff805aDaniel Dunbar 31099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS << *Symbol << MAI->getLabelSuffix(); 3117d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 312a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar} 313a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCAsmStreamer::EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) { 31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef str = MCLOHIdToName(Kind); 31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef NDEBUG 31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int NbArgs = MCLOHIdToNbArgs(Kind); 31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(NbArgs != -1 && ((size_t)NbArgs) == Args.size() && "Malformed LOH!"); 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(str != "" && "Invalid LOH name"); 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << "\t" << MCLOHDirectiveName() << " " << str << "\t"; 32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool IsFirst = true; 32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (MCLOHArgs::const_iterator It = Args.begin(), EndIt = Args.end(); 32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines It != EndIt; ++It) { 32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!IsFirst) 32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << ", "; 32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IsFirst = false; 33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << **It; 33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitEOL(); 33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 335a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattnervoid MCAsmStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) { 336f96db468fcf62d671cda99b68b6cfd3f2dc0b839Kevin Enderby switch (Flag) { 337afd1cc25786f68ca56a63d29ea2bd297990e9f81Jason W Kim case MCAF_SyntaxUnified: OS << "\t.syntax unified"; break; 338a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner case MCAF_SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break; 33999cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling case MCAF_Code16: OS << '\t'<< MAI->getCode16Directive();break; 34099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling case MCAF_Code32: OS << '\t'<< MAI->getCode32Directive();break; 34199cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling case MCAF_Code64: OS << '\t'<< MAI->getCode64Directive();break; 342f96db468fcf62d671cda99b68b6cfd3f2dc0b839Kevin Enderby } 3437d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 344a5c783280f83df5c60a8ed9e32c61b05a11048e3Kevin Enderby} 345a5c783280f83df5c60a8ed9e32c61b05a11048e3Kevin Enderby 346cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbarvoid MCAsmStreamer::EmitLinkerOptions(ArrayRef<std::string> Options) { 347cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar assert(!Options.empty() && "At least one option is required!"); 348cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar OS << "\t.linker_option \"" << Options[0] << '"'; 349cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar for (ArrayRef<std::string>::iterator it = Options.begin() + 1, 350cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar ie = Options.end(); it != ie; ++it) { 351cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar OS << ", " << '"' << *it << '"'; 352cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar } 3536d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar OS << "\n"; 354cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar} 355cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar 3563e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbachvoid MCAsmStreamer::EmitDataRegion(MCDataRegionType Kind) { 35799cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (!MAI->doesSupportDataRegionDirectives()) 3583e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach return; 3593e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach switch (Kind) { 3603e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach case MCDR_DataRegion: OS << "\t.data_region"; break; 3613e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach case MCDR_DataRegionJT8: OS << "\t.data_region jt8"; break; 3623e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach case MCDR_DataRegionJT16: OS << "\t.data_region jt16"; break; 3633e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach case MCDR_DataRegionJT32: OS << "\t.data_region jt32"; break; 3643e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach case MCDR_DataRegionEnd: OS << "\t.end_data_region"; break; 3653e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach } 3663e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach EmitEOL(); 3673e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach} 3683e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach 36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCAsmStreamer::EmitVersionMin(MCVersionMinType Kind, unsigned Major, 37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Minor, unsigned Update) { 37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (Kind) { 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCVM_IOSVersionMin: OS << "\t.ios_version_min"; break; 37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case MCVM_OSXVersionMin: OS << "\t.macosx_version_min"; break; 37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << " " << Major << ", " << Minor; 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Update) 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << ", " << Update; 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitEOL(); 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 381ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbachvoid MCAsmStreamer::EmitThumbFunc(MCSymbol *Func) { 382ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach // This needs to emit to a temporary string to get properly quoted 383ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach // MCSymbols when they have spaces in them. 384ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach OS << "\t.thumb_func"; 3856469540adf63d94a876c2b623cb4ca70479647f7Rafael Espindola // Only Mach-O hasSubsectionsViaSymbols() 38699cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (MAI->hasSubsectionsViaSymbols()) 387ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach OS << '\t' << *Func; 388ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach EmitEOL(); 389ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach} 390ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach 391821e3334ed3390d931f497300e6a5f1dc21bcfb3Daniel Dunbarvoid MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { 3927d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner OS << *Symbol << " = " << *Value; 3937d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 394fffff915d53361fc575621c5e04ae7df99dd3fabDaniel Dunbar 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCStreamer::EmitAssignment(Symbol, Value); 396a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar} 397a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 398484291c27319668ad99cb87def000254357736fbRafael Espindolavoid MCAsmStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { 399484291c27319668ad99cb87def000254357736fbRafael Espindola OS << ".weakref " << *Alias << ", " << *Symbol; 400484291c27319668ad99cb87def000254357736fbRafael Espindola EmitEOL(); 401484291c27319668ad99cb87def000254357736fbRafael Espindola} 402484291c27319668ad99cb87def000254357736fbRafael Espindola 4031c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasoolbool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, 404a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner MCSymbolAttr Attribute) { 405a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar switch (Attribute) { 406858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper case MCSA_Invalid: llvm_unreachable("Invalid symbol attribute"); 407ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeFunction: /// .type _foo, STT_FUNC # aka @function 408ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeIndFunction: /// .type _foo, STT_GNU_IFUNC 409ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeObject: /// .type _foo, STT_OBJECT # aka @object 410ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeTLS: /// .type _foo, STT_TLS # aka @tls_object 411ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeCommon: /// .type _foo, STT_COMMON # aka @common 412ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeNoType: /// .type _foo, STT_NOTYPE # aka @notype 413e9c0ff2a76508922b3f3ec07484ba579d4c51d95Rafael Espindola case MCSA_ELF_TypeGnuUniqueObject: /// .type _foo, @gnu_unique_object 4141c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool if (!MAI->hasDotTypeDotSizeDirective()) 4151c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return false; // Symbol attribute not supported 416523d70ec1f8daa67bb8a9fe8f7b6b3d076a26c99Dan Gohman OS << "\t.type\t" << *Symbol << ',' 41799cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling << ((MAI->getCommentString()[0] != '@') ? '@' : '%'); 418ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner switch (Attribute) { 4191c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool default: return false; 420ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeFunction: OS << "function"; break; 421ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeIndFunction: OS << "gnu_indirect_function"; break; 422ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeObject: OS << "object"; break; 423ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeTLS: OS << "tls_object"; break; 424ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeCommon: OS << "common"; break; 425ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_ELF_TypeNoType: OS << "no_type"; break; 426e9c0ff2a76508922b3f3ec07484ba579d4c51d95Rafael Espindola case MCSA_ELF_TypeGnuUniqueObject: OS << "gnu_unique_object"; break; 427ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner } 428ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner EmitEOL(); 4291c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return true; 430ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner case MCSA_Global: // .globl/.global 43199cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS << MAI->getGlobalDirective(); 432ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner break; 43361abd7b395d0bbebd8cc44c870b02609abef6976Chris Lattner case MCSA_Hidden: OS << "\t.hidden\t"; break; 43461abd7b395d0bbebd8cc44c870b02609abef6976Chris Lattner case MCSA_IndirectSymbol: OS << "\t.indirect_symbol\t"; break; 43561abd7b395d0bbebd8cc44c870b02609abef6976Chris Lattner case MCSA_Internal: OS << "\t.internal\t"; break; 43661abd7b395d0bbebd8cc44c870b02609abef6976Chris Lattner case MCSA_LazyReference: OS << "\t.lazy_reference\t"; break; 43761abd7b395d0bbebd8cc44c870b02609abef6976Chris Lattner case MCSA_Local: OS << "\t.local\t"; break; 438ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case MCSA_NoDeadStrip: 439ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!MAI->hasNoDeadStrip()) 440ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return false; 441ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines OS << "\t.no_dead_strip\t"; 442ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines break; 443e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby case MCSA_SymbolResolver: OS << "\t.symbol_resolver\t"; break; 444277abc8172a19b287e9b6ea0969bc113d7ac48e4Rafael Espindola case MCSA_PrivateExtern: 445277abc8172a19b287e9b6ea0969bc113d7ac48e4Rafael Espindola OS << "\t.private_extern\t"; 446277abc8172a19b287e9b6ea0969bc113d7ac48e4Rafael Espindola break; 44761abd7b395d0bbebd8cc44c870b02609abef6976Chris Lattner case MCSA_Protected: OS << "\t.protected\t"; break; 44861abd7b395d0bbebd8cc44c870b02609abef6976Chris Lattner case MCSA_Reference: OS << "\t.reference\t"; break; 449ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case MCSA_Weak: OS << MAI->getWeakDirective(); break; 450277abc8172a19b287e9b6ea0969bc113d7ac48e4Rafael Espindola case MCSA_WeakDefinition: 451277abc8172a19b287e9b6ea0969bc113d7ac48e4Rafael Espindola OS << "\t.weak_definition\t"; 452277abc8172a19b287e9b6ea0969bc113d7ac48e4Rafael Espindola break; 453a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner // .weak_reference 45499cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling case MCSA_WeakReference: OS << MAI->getWeakRefDirective(); break; 455f59cac5ed36360b4c462781051f996b3499d7e0fKevin Enderby case MCSA_WeakDefAutoPrivate: OS << "\t.weak_def_can_be_hidden\t"; break; 456a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar } 457a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 4587d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner OS << *Symbol; 4597d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 4601c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool 4611c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return true; 462a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar} 463a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 46495cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderbyvoid MCAsmStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { 4657d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner OS << ".desc" << ' ' << *Symbol << ',' << DescValue; 4667d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 46795cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderby} 46895cf30c444707634bbd950f13405b6c8bcfe496bKevin Enderby 469b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattnervoid MCAsmStreamer::BeginCOFFSymbolDef(const MCSymbol *Symbol) { 470b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner OS << "\t.def\t " << *Symbol << ';'; 471b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner EmitEOL(); 472b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner} 473b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner 474b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattnervoid MCAsmStreamer::EmitCOFFSymbolStorageClass (int StorageClass) { 475b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner OS << "\t.scl\t" << StorageClass << ';'; 476b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner EmitEOL(); 477b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner} 478b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner 479b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattnervoid MCAsmStreamer::EmitCOFFSymbolType (int Type) { 480b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner OS << "\t.type\t" << Type << ';'; 481b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner EmitEOL(); 482b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner} 483b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner 484b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattnervoid MCAsmStreamer::EndCOFFSymbolDef() { 485b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner OS << "\t.endef"; 486b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner EmitEOL(); 487b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner} 488b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner 48936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCAsmStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) { 49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << "\t.secidx\t" << *Symbol; 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitEOL(); 49236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 49336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4948f7d12ccfd8feb258bdf4e582592bc00beacc7c6Rafael Espindolavoid MCAsmStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { 49536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << "\t.secrel32\t" << *Symbol; 4968f7d12ccfd8feb258bdf4e582592bc00beacc7c6Rafael Espindola EmitEOL(); 4978f7d12ccfd8feb258bdf4e582592bc00beacc7c6Rafael Espindola} 4988f7d12ccfd8feb258bdf4e582592bc00beacc7c6Rafael Espindola 49999328add833807f12a4950c7de29fb2a5df04703Chris Lattnervoid MCAsmStreamer::EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) { 50099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling assert(MAI->hasDotTypeDotSizeDirective()); 50199328add833807f12a4950c7de29fb2a5df04703Chris Lattner OS << "\t.size\t" << *Symbol << ", " << *Value << '\n'; 50299328add833807f12a4950c7de29fb2a5df04703Chris Lattner} 50399328add833807f12a4950c7de29fb2a5df04703Chris Lattner 5049eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattnervoid MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 5057092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar unsigned ByteAlignment) { 506eb46def978a60fd705cca3037feff5573122b404Richard Mitton // Common symbols do not belong to any actual section. 507dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AssignSection(Symbol, nullptr); 5085cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 5099eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner OS << "\t.comm\t" << *Symbol << ',' << Size; 5106559d7688e24e204af273a1e1252639320a7b309Chris Lattner if (ByteAlignment != 0) { 51199cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (MAI->getCOMMDirectiveAlignmentIsInBytes()) 5124ed5438f4882c9fe779b1a8ff546877889b222dfChris Lattner OS << ',' << ByteAlignment; 5134ed5438f4882c9fe779b1a8ff546877889b222dfChris Lattner else 5144ed5438f4882c9fe779b1a8ff546877889b222dfChris Lattner OS << ',' << Log2_32(ByteAlignment); 5154ed5438f4882c9fe779b1a8ff546877889b222dfChris Lattner } 5167d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 5174e4db7adfc9858a8f77f841c7467bc6fcbb8110eChris Lattner} 5184e4db7adfc9858a8f77f841c7467bc6fcbb8110eChris Lattner 5199eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner/// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. 5209eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner/// 5219eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner/// @param Symbol - The common symbol to emit. 5229eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner/// @param Size - The size of the common symbol. 52336a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramervoid MCAsmStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 52436a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer unsigned ByteAlign) { 525eb46def978a60fd705cca3037feff5573122b404Richard Mitton // Common symbols do not belong to any actual section. 526dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AssignSection(Symbol, nullptr); 5275cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 5289eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner OS << "\t.lcomm\t" << *Symbol << ',' << Size; 52936a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer if (ByteAlign > 1) { 53099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling switch (MAI->getLCOMMDirectiveAlignmentType()) { 531a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer case LCOMM::NoAlignment: 532a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer llvm_unreachable("alignment not supported on .lcomm!"); 533a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer case LCOMM::ByteAlignment: 53439646d96e76aea5d20bffb386233a0dbb5932a21Benjamin Kramer OS << ',' << ByteAlign; 535a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer break; 536a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer case LCOMM::Log2Alignment: 53739646d96e76aea5d20bffb386233a0dbb5932a21Benjamin Kramer assert(isPowerOf2_32(ByteAlign) && "alignment must be a power of 2"); 53839646d96e76aea5d20bffb386233a0dbb5932a21Benjamin Kramer OS << ',' << Log2_32(ByteAlign); 539a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer break; 54039646d96e76aea5d20bffb386233a0dbb5932a21Benjamin Kramer } 54136a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer } 5429eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner EmitEOL(); 5439eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner} 5449eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner 5458751b94ffbd9c49df8949a37f78d6bd0be87b256Daniel Dunbarvoid MCAsmStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol, 546c90a1fcf9f44858b20e0f5f7e0b98049aec7a1e0Evan Cheng uint64_t Size, unsigned ByteAlignment) { 5475cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton if (Symbol) 5485cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton AssignSection(Symbol, Section); 5495cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 550011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar // Note: a .zerofill directive does not switch sections. 55193b6db3de934a3cfca5586df25184fef4a54c500Chris Lattner OS << ".zerofill "; 55200545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 55393b6db3de934a3cfca5586df25184fef4a54c500Chris Lattner // This is a mach-o specific directive. 554ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner const MCSectionMachO *MOSection = ((const MCSectionMachO*)Section); 55512de0df59fdab799d8d1432fcfd9190829d7f292Daniel Dunbar OS << MOSection->getSegmentName() << "," << MOSection->getSectionName(); 55600545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 557dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Symbol) { 55810b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattner OS << ',' << *Symbol << ',' << Size; 5597092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar if (ByteAlignment != 0) 5607092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar OS << ',' << Log2_32(ByteAlignment); 5619be3fee2bdc3126fb87e4e1b31935905f4bcc4d0Chris Lattner } 5627d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 5639be3fee2bdc3126fb87e4e1b31935905f4bcc4d0Chris Lattner} 5649be3fee2bdc3126fb87e4e1b31935905f4bcc4d0Chris Lattner 565d04d98d24fe5c82c7e69b711cd989ef96980fb8eEric Christopher// .tbss sym, size, align 566d04d98d24fe5c82c7e69b711cd989ef96980fb8eEric Christopher// This depends that the symbol has already been mangled from the original, 567d04d98d24fe5c82c7e69b711cd989ef96980fb8eEric Christopher// e.g. _a. 5684d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christophervoid MCAsmStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 5694d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christopher uint64_t Size, unsigned ByteAlignment) { 5705cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton AssignSection(Symbol, Section); 5715cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 572dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(Symbol && "Symbol shouldn't be NULL!"); 5734d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christopher // Instead of using the Section we'll just use the shortcut. 5744d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christopher // This is a mach-o specific directive and section. 575d04d98d24fe5c82c7e69b711cd989ef96980fb8eEric Christopher OS << ".tbss " << *Symbol << ", " << Size; 57600545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 5774d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christopher // Output align if we have it. We default to 1 so don't bother printing 5784d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christopher // that. 5794d01cbe93b0e1a349b5c2881f1b319963f9e0504Eric Christopher if (ByteAlignment > 1) OS << ", " << Log2_32(ByteAlignment); 58000545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 581482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher EmitEOL(); 582482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher} 583482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher 58412e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattnerstatic inline char toOctal(int X) { return (X&7)+'0'; } 58512e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner 586a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattnerstatic void PrintQuotedString(StringRef Data, raw_ostream &OS) { 587a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << '"'; 58800545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 589a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner for (unsigned i = 0, e = Data.size(); i != e; ++i) { 590a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner unsigned char C = Data[i]; 591a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner if (C == '"' || C == '\\') { 592a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << '\\' << (char)C; 593a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner continue; 594a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner } 59500545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 596a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner if (isprint((unsigned char)C)) { 597a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << (char)C; 598a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner continue; 599a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner } 60000545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 601a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner switch (C) { 602a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner case '\b': OS << "\\b"; break; 603a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner case '\f': OS << "\\f"; break; 604a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner case '\n': OS << "\\n"; break; 605a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner case '\r': OS << "\\r"; break; 606a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner case '\t': OS << "\\t"; break; 607a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner default: 608a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << '\\'; 609a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << toOctal(C >> 6); 610a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << toOctal(C >> 3); 611a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << toOctal(C >> 0); 612a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner break; 613a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner } 614a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner } 61500545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 616a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << '"'; 617a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner} 618a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner 619a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner 620a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindolavoid MCAsmStreamer::EmitBytes(StringRef Data) { 621df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne assert(getCurrentSection().first && 622df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne "Cannot emit contents before setting section!"); 62312e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner if (Data.empty()) return; 62400545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 62512e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner if (Data.size() == 1) { 626a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola OS << MAI->getData8bitsDirective(); 62712e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner OS << (unsigned)(unsigned char)Data[0]; 6287d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 62912e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner return; 6307d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner } 63112e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner 63212e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner // If the data ends with 0 and the target supports .asciz, use it, otherwise 63312e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner // use .ascii 63499cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (MAI->getAscizDirective() && Data.back() == 0) { 63599cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS << MAI->getAscizDirective(); 63612e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner Data = Data.substr(0, Data.size()-1); 63712e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner } else { 63899cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS << MAI->getAsciiDirective(); 63912e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner } 64012e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner 641a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner PrintQuotedString(Data, OS); 64212e555c36ce11c39ce15cd0b27bf7b02a068beb2Chris Lattner EmitEOL(); 643a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar} 644a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 645a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindolavoid MCAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size) { 646a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola EmitValue(MCConstantExpr::Create(Value, getContext()), Size); 6472df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola} 6482df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola 649dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, 650dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const SMLoc &Loc) { 65136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Size <= 8 && "Invalid size"); 652df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne assert(getCurrentSection().first && 653df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne "Cannot emit contents before setting section!"); 654dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *Directive = nullptr; 65532ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner switch (Size) { 65632ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner default: break; 657a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola case 1: Directive = MAI->getData8bitsDirective(); break; 658a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola case 2: Directive = MAI->getData16bitsDirective(); break; 659a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola case 4: Directive = MAI->getData32bitsDirective(); break; 66036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case 8: Directive = MAI->getData64bitsDirective(); break; 66136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 66236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 66336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!Directive) { 664ec0b428398c5fb91fdce5d3d003ab0e4b75b5d6aRafael Espindola int64_t IntValue; 665ec0b428398c5fb91fdce5d3d003ab0e4b75b5d6aRafael Espindola if (!Value->EvaluateAsAbsolute(IntValue)) 666ec0b428398c5fb91fdce5d3d003ab0e4b75b5d6aRafael Espindola report_fatal_error("Don't know how to emit this value."); 66736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 66836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // We couldn't handle the requested integer size so we fallback by breaking 66936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // the request down into several, smaller, integers. Since sizes greater 67036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // than eight are invalid and size equivalent to eight should have been 67136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handled earlier, we use four bytes as our largest piece of granularity. 67236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool IsLittleEndian = MAI->isLittleEndian(); 67336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (unsigned Emitted = 0; Emitted != Size;) { 67436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Remaining = Size - Emitted; 67536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // The size of our partial emission must be a power of two less than 67636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // eight. 67736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned EmissionSize = PowerOf2Floor(Remaining); 67836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (EmissionSize > 4) 67936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmissionSize = 4; 68036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Calculate the byte offset of our partial emission taking into account 68136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // the endianness of the target. 68236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned ByteOffset = 68336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IsLittleEndian ? Emitted : (Remaining - EmissionSize); 68436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t ValueToEmit = IntValue >> (ByteOffset * 8); 68536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // We truncate our partial emission to fit within the bounds of the 68636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // emission domain. This produces nicer output and silences potential 68736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // truncation warnings when round tripping through another assembler. 688ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines uint64_t Shift = 64 - EmissionSize * 8; 689ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(Shift < static_cast<uint64_t>( 690ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines std::numeric_limits<unsigned long long>::digits) && 691ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines "undefined behavior"); 692ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ValueToEmit &= ~0ULL >> Shift; 69336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitIntValue(ValueToEmit, EmissionSize); 69436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Emitted += EmissionSize; 6955eaa54e210256a939f15e918303197916c992aeeChris Lattner } 6965eaa54e210256a939f15e918303197916c992aeeChris Lattner return; 69732ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner } 69800545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 69932ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner assert(Directive && "Invalid size for machine code value!"); 700718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner OS << Directive << *Value; 70186e2211d0a496f470ea1d320161c8dc43593c5c6Chris Lattner EmitEOL(); 702a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar} 703a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 704e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindolavoid MCAsmStreamer::EmitULEB128Value(const MCExpr *Value) { 705a4b23ffced8cc7ac2d856f0bd1e4b8b2a12f18e5Rafael Espindola int64_t IntValue; 706a4b23ffced8cc7ac2d856f0bd1e4b8b2a12f18e5Rafael Espindola if (Value->EvaluateAsAbsolute(IntValue)) { 707e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindola EmitULEB128IntValue(IntValue); 708a4b23ffced8cc7ac2d856f0bd1e4b8b2a12f18e5Rafael Espindola return; 709a4b23ffced8cc7ac2d856f0bd1e4b8b2a12f18e5Rafael Espindola } 710738734501635a15d8ed2d1c8d52962ed5f319bd3Rafael Espindola OS << ".uleb128 " << *Value; 7113ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola EmitEOL(); 7123ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola} 7133ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 714e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindolavoid MCAsmStreamer::EmitSLEB128Value(const MCExpr *Value) { 715a4b23ffced8cc7ac2d856f0bd1e4b8b2a12f18e5Rafael Espindola int64_t IntValue; 716a4b23ffced8cc7ac2d856f0bd1e4b8b2a12f18e5Rafael Espindola if (Value->EvaluateAsAbsolute(IntValue)) { 717e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindola EmitSLEB128IntValue(IntValue); 718a4b23ffced8cc7ac2d856f0bd1e4b8b2a12f18e5Rafael Espindola return; 719a4b23ffced8cc7ac2d856f0bd1e4b8b2a12f18e5Rafael Espindola } 720738734501635a15d8ed2d1c8d52962ed5f319bd3Rafael Espindola OS << ".sleb128 " << *Value; 7213ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola EmitEOL(); 7223ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola} 7233ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 7246c2cf8b1fbcf70fd9db6fe44032c1ceaa2299760Akira Hatanakavoid MCAsmStreamer::EmitGPRel64Value(const MCExpr *Value) { 725dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(MAI->getGPRel64Directive() != nullptr); 72699cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS << MAI->getGPRel64Directive() << *Value; 7276c2cf8b1fbcf70fd9db6fe44032c1ceaa2299760Akira Hatanaka EmitEOL(); 7286c2cf8b1fbcf70fd9db6fe44032c1ceaa2299760Akira Hatanaka} 7296c2cf8b1fbcf70fd9db6fe44032c1ceaa2299760Akira Hatanaka 730718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattnervoid MCAsmStreamer::EmitGPRel32Value(const MCExpr *Value) { 731dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(MAI->getGPRel32Directive() != nullptr); 73299cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS << MAI->getGPRel32Directive() << *Value; 733718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner EmitEOL(); 734718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner} 735718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner 736718fb59801320b8cb22363d115b5fc5ec40dc1f5Chris Lattner 7376113b3d32396168f8f390343d426baa9f64e9009Chris Lattner/// EmitFill - Emit NumBytes bytes worth of the value specified by 7386113b3d32396168f8f390343d426baa9f64e9009Chris Lattner/// FillValue. This implements directives such as '.space'. 739a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindolavoid MCAsmStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) { 7408a6d7ac88f8b0f37c8c1f134efb39a0725394719Chris Lattner if (NumBytes == 0) return; 74100545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 742a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola if (const char *ZeroDirective = MAI->getZeroDirective()) { 743a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola OS << ZeroDirective << NumBytes; 744a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola if (FillValue != 0) 745a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola OS << ',' << (int)FillValue; 746a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola EmitEOL(); 747a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola return; 748a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola } 749aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner 750aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner // Emit a byte at a time. 751a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola MCStreamer::EmitFill(NumBytes, FillValue); 7526113b3d32396168f8f390343d426baa9f64e9009Chris Lattner} 7536113b3d32396168f8f390343d426baa9f64e9009Chris Lattner 75484a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbarvoid MCAsmStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value, 75584a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar unsigned ValueSize, 75684a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar unsigned MaxBytesToEmit) { 757663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner // Some assemblers don't support non-power of two alignments, so we always 758663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner // emit alignments as a power of two if possible. 759663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner if (isPowerOf2_32(ByteAlignment)) { 7606e579c67272afdbca273ad6e6e93c5f6c0f10eebChris Lattner switch (ValueSize) { 76136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: 76236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm_unreachable("Invalid size for machine code value!"); 76336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case 1: 76436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << "\t.align\t"; 76536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 76636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case 2: 76736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << ".p2alignw "; 76836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 76936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case 4: 77036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << ".p2alignl "; 77136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 77236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case 8: 77336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm_unreachable("Unsupported alignment size!"); 7746e579c67272afdbca273ad6e6e93c5f6c0f10eebChris Lattner } 77500545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 77699cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (MAI->getAlignmentIsInBytes()) 777663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner OS << ByteAlignment; 778663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner else 779663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner OS << Log2_32(ByteAlignment); 780663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner 781663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner if (Value || MaxBytesToEmit) { 782579531c61b1bef44bf2d05dc334b5e7eba86397cChris Lattner OS << ", 0x"; 783579531c61b1bef44bf2d05dc334b5e7eba86397cChris Lattner OS.write_hex(truncateToSize(Value, ValueSize)); 78484a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 78500545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach if (MaxBytesToEmit) 786663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner OS << ", " << MaxBytesToEmit; 787663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner } 7887d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 789663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner return; 790663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner } 79100545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach 792663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner // Non-power of two alignment. This is not widely supported by assemblers. 79333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner // FIXME: Parameterize this based on MAI. 79484a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar switch (ValueSize) { 795663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner default: llvm_unreachable("Invalid size for machine code value!"); 796663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner case 1: OS << ".balign"; break; 797663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner case 2: OS << ".balignw"; break; 798663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner case 4: OS << ".balignl"; break; 799663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner case 8: llvm_unreachable("Unsupported alignment size!"); 80084a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar } 80184a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 802663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner OS << ' ' << ByteAlignment; 803304f6a48b1232bdad8b2c0dff7c08d677826ef86Daniel Dunbar OS << ", " << truncateToSize(Value, ValueSize); 80400545e1cd50073ed8a3af98070a16b50f3c3401cJim Grosbach if (MaxBytesToEmit) 80584a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar OS << ", " << MaxBytesToEmit; 8067d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 80784a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar} 80884a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 8096e72048add2a6464e038121c6c275da37528aa0aKevin Enderbyvoid MCAsmStreamer::EmitCodeAlignment(unsigned ByteAlignment, 8106e72048add2a6464e038121c6c275da37528aa0aKevin Enderby unsigned MaxBytesToEmit) { 811ec167fd98779a5d93d98c01b000d17b8b3896affChris Lattner // Emit with a text fill value. 81299cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling EmitValueToAlignment(ByteAlignment, MAI->getTextAlignFillValue(), 813ec167fd98779a5d93d98c01b000d17b8b3896affChris Lattner 1, MaxBytesToEmit); 8146e72048add2a6464e038121c6c275da37528aa0aKevin Enderby} 8156e72048add2a6464e038121c6c275da37528aa0aKevin Enderby 816ebd4c05c3cbd61215366d4d16f1c1a2e57e7156dJim Grosbachbool MCAsmStreamer::EmitValueToOffset(const MCExpr *Offset, 81784a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar unsigned char Value) { 81884a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar // FIXME: Verify that Offset is associated with the current section. 8197d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner OS << ".org " << *Offset << ", " << (unsigned) Value; 8207d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 821ebd4c05c3cbd61215366d4d16f1c1a2e57e7156dJim Grosbach return false; 82284a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar} 82384a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 824a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner 825a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattnervoid MCAsmStreamer::EmitFileDirective(StringRef Filename) { 82699cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling assert(MAI->hasSingleParameterDotFile()); 827a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner OS << "\t.file\t"; 828a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner PrintQuotedString(Filename, OS); 829a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner EmitEOL(); 830a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner} 831a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner 83236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, 83336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Directory, 83436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Filename, 83536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned CUID) { 83636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(CUID == 0); 83736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 83836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID); 83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned NumFiles = Table.getMCDwarfFiles().size(); 84036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FileNo = Table.getFile(Directory, Filename, FileNo); 84136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (FileNo == 0) 84236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return 0; 84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (NumFiles == Table.getMCDwarfFiles().size()) 84436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return FileNo; 84536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 84636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallString<128> FullPathName; 84736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 84844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky if (!UseDwarfDirectory && !Directory.empty()) { 84944d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky if (sys::path::is_absolute(Filename)) 85036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Directory = ""; 85136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else { 85236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FullPathName = Directory; 85336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines sys::path::append(FullPathName, Filename); 85436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Directory = ""; 85536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Filename = FullPathName; 85636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 85744d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky } 85844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky 85936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << "\t.file\t" << FileNo << ' '; 86036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!Directory.empty()) { 86136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintQuotedString(Directory, OS); 86236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << ' '; 863195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola } 86436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintQuotedString(Filename, OS); 86536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitEOL(); 86636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 86736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return FileNo; 868af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola} 869af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola 870af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindolavoid MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, 871af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola unsigned Column, unsigned Flags, 872af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola unsigned Isa, 8733f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel unsigned Discriminator, 8743f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel StringRef FileName) { 875af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola OS << "\t.loc\t" << FileNo << " " << Line << " " << Column; 876af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola if (Flags & DWARF2_FLAG_BASIC_BLOCK) 877af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola OS << " basic_block"; 878af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola if (Flags & DWARF2_FLAG_PROLOGUE_END) 879af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola OS << " prologue_end"; 880af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola if (Flags & DWARF2_FLAG_EPILOGUE_BEGIN) 881af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola OS << " epilogue_begin"; 882af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola 883af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola unsigned OldFlags = getContext().getCurrentDwarfLoc().getFlags(); 884af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola if ((Flags & DWARF2_FLAG_IS_STMT) != (OldFlags & DWARF2_FLAG_IS_STMT)) { 885af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola OS << " is_stmt "; 886af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola 887af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola if (Flags & DWARF2_FLAG_IS_STMT) 888af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola OS << "1"; 889af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola else 890af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola OS << "0"; 891af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola } 892af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola 893af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola if (Isa) 89436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << " isa " << Isa; 895af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola if (Discriminator) 89636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << " discriminator " << Discriminator; 8973f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel 8983f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel if (IsVerboseAsm) { 89999cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS.PadToColumn(MAI->getCommentColumn()); 90099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling OS << MAI->getCommentString() << ' ' << FileName << ':' 9013f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel << Line << ':' << Column; 9023f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel } 903af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola EmitEOL(); 904ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines this->MCStreamer::EmitDwarfLocDirective(FileNo, Line, Column, Flags, 905ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Isa, Discriminator, FileName); 906a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner} 907a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner 90836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(unsigned CUID) { 90936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Always use the zeroth line table, since asm syntax only supports one line 91036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // table for now. 91136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MCStreamer::getDwarfLineTableSymbol(0); 91236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 91336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 914c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCAsmStreamer::EmitIdent(StringRef IdentString) { 915c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola assert(MAI->hasIdentDirective() && ".ident directive not supported"); 916c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola OS << "\t.ident\t"; 917c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola PrintQuotedString(IdentString, OS); 918c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola EmitEOL(); 919c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola} 920c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola 921713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindolavoid MCAsmStreamer::EmitCFISections(bool EH, bool Debug) { 922713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola MCStreamer::EmitCFISections(EH, Debug); 923713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola OS << "\t.cfi_sections "; 924713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola if (EH) { 925713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola OS << ".eh_frame"; 926713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola if (Debug) 927713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola OS << ", .debug_frame"; 928713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola } else if (Debug) { 929713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola OS << ".debug_frame"; 930713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola } 931713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola 932713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola EmitEOL(); 933713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola} 934713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola 935547be2699c547b79a7735858a64921d8ccf180f7Rafael Espindolavoid MCAsmStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { 936c6585202cafd95fbe6e51d878071668b9df96e90Anton Korobeynikov OS << "\t.cfi_startproc"; 93736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Frame.IsSimple) 93836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << " simple"; 939cdfecc8759941c2996214070478d30084b79d463Rafael Espindola EmitEOL(); 940cdfecc8759941c2996214070478d30084b79d463Rafael Espindola} 941cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 9421fe9737eb49ecb80fbb547f0e16e10a726cd53cfRafael Espindolavoid MCAsmStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) { 943c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitCFIEndProcImpl(Frame); 944c6585202cafd95fbe6e51d878071668b9df96e90Anton Korobeynikov OS << "\t.cfi_endproc"; 945cdfecc8759941c2996214070478d30084b79d463Rafael Espindola EmitEOL(); 946066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola} 947cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 9486e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindolavoid MCAsmStreamer::EmitRegisterName(int64_t Register) { 94999cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (InstPrinter && !MAI->useDwarfRegNumForCFI()) { 95099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling const MCRegisterInfo *MRI = getContext().getRegisterInfo(); 95199cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling unsigned LLVMRegister = MRI->getLLVMRegNum(Register, true); 952cde4ce411b1ace4a80ea1dd38df97e8508aed0c9Rafael Espindola InstPrinter->printRegName(OS, LLVMRegister); 9536e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola } else { 9546e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << Register; 9556e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola } 9566e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola} 9576e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola 958066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) { 9597f46b08082b08ac0760ffeca6670bf85910b305bRafael Espindola MCStreamer::EmitCFIDefCfa(Register, Offset); 9606e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << "\t.cfi_def_cfa "; 9616e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola EmitRegisterName(Register); 9626e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << ", " << Offset; 9637f46b08082b08ac0760ffeca6670bf85910b305bRafael Espindola EmitEOL(); 964cdfecc8759941c2996214070478d30084b79d463Rafael Espindola} 965cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 966066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIDefCfaOffset(int64_t Offset) { 967066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFIDefCfaOffset(Offset); 968c6585202cafd95fbe6e51d878071668b9df96e90Anton Korobeynikov OS << "\t.cfi_def_cfa_offset " << Offset; 969cdfecc8759941c2996214070478d30084b79d463Rafael Espindola EmitEOL(); 970cdfecc8759941c2996214070478d30084b79d463Rafael Espindola} 971cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 972066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIDefCfaRegister(int64_t Register) { 973066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFIDefCfaRegister(Register); 9746e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << "\t.cfi_def_cfa_register "; 9756e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola EmitRegisterName(Register); 976cdfecc8759941c2996214070478d30084b79d463Rafael Espindola EmitEOL(); 977cdfecc8759941c2996214070478d30084b79d463Rafael Espindola} 978cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 979066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) { 980066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola this->MCStreamer::EmitCFIOffset(Register, Offset); 9816e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << "\t.cfi_offset "; 9826e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola EmitRegisterName(Register); 9836e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << ", " << Offset; 984cdfecc8759941c2996214070478d30084b79d463Rafael Espindola EmitEOL(); 985cdfecc8759941c2996214070478d30084b79d463Rafael Espindola} 986cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 987066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIPersonality(const MCSymbol *Sym, 9883a83c40ab61d5ca624f2bbadd70237c6adbdb304Rafael Espindola unsigned Encoding) { 989066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFIPersonality(Sym, Encoding); 990c6585202cafd95fbe6e51d878071668b9df96e90Anton Korobeynikov OS << "\t.cfi_personality " << Encoding << ", " << *Sym; 991cdfecc8759941c2996214070478d30084b79d463Rafael Espindola EmitEOL(); 992cdfecc8759941c2996214070478d30084b79d463Rafael Espindola} 993cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 994066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) { 995066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFILsda(Sym, Encoding); 996c6585202cafd95fbe6e51d878071668b9df96e90Anton Korobeynikov OS << "\t.cfi_lsda " << Encoding << ", " << *Sym; 997cdfecc8759941c2996214070478d30084b79d463Rafael Espindola EmitEOL(); 998066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola} 999cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 1000066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIRememberState() { 1001066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFIRememberState(); 1002066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola OS << "\t.cfi_remember_state"; 1003066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola EmitEOL(); 1004066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola} 1005066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola 1006066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIRestoreState() { 1007066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFIRestoreState(); 1008066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola OS << "\t.cfi_restore_state"; 1009066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola EmitEOL(); 1010066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola} 1011066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola 1012066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFISameValue(int64_t Register) { 1013066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFISameValue(Register); 10146e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << "\t.cfi_same_value "; 10156e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola EmitRegisterName(Register); 1016066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola EmitEOL(); 1017066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola} 1018066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola 1019066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) { 1020066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFIRelOffset(Register, Offset); 10216e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << "\t.cfi_rel_offset "; 10226e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola EmitRegisterName(Register); 10236e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola OS << ", " << Offset; 1024066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola EmitEOL(); 1025066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola} 1026066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola 1027066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolavoid MCAsmStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) { 1028066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola MCStreamer::EmitCFIAdjustCfaOffset(Adjustment); 1029066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola OS << "\t.cfi_adjust_cfa_offset " << Adjustment; 1030066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola EmitEOL(); 1031cdfecc8759941c2996214070478d30084b79d463Rafael Espindola} 1032cdfecc8759941c2996214070478d30084b79d463Rafael Espindola 103316d7d437e03ce87fdaef7971919302920d54a966Rafael Espindolavoid MCAsmStreamer::EmitCFISignalFrame() { 103416d7d437e03ce87fdaef7971919302920d54a966Rafael Espindola MCStreamer::EmitCFISignalFrame(); 1035feba19309de49f03f29bb6fcc3496e640efe6d92Eric Christopher OS << "\t.cfi_signal_frame"; 103616d7d437e03ce87fdaef7971919302920d54a966Rafael Espindola EmitEOL(); 103716d7d437e03ce87fdaef7971919302920d54a966Rafael Espindola} 103816d7d437e03ce87fdaef7971919302920d54a966Rafael Espindola 1039c8fec7e21f5c24303eab8a8592f3b8faff347d86Rafael Espindolavoid MCAsmStreamer::EmitCFIUndefined(int64_t Register) { 1040c8fec7e21f5c24303eab8a8592f3b8faff347d86Rafael Espindola MCStreamer::EmitCFIUndefined(Register); 1041c8fec7e21f5c24303eab8a8592f3b8faff347d86Rafael Espindola OS << "\t.cfi_undefined " << Register; 1042c8fec7e21f5c24303eab8a8592f3b8faff347d86Rafael Espindola EmitEOL(); 1043c8fec7e21f5c24303eab8a8592f3b8faff347d86Rafael Espindola} 1044c8fec7e21f5c24303eab8a8592f3b8faff347d86Rafael Espindola 1045f4f14f68f6078ea6681ee27b5bf42719d7db3441Rafael Espindolavoid MCAsmStreamer::EmitCFIRegister(int64_t Register1, int64_t Register2) { 1046f4f14f68f6078ea6681ee27b5bf42719d7db3441Rafael Espindola MCStreamer::EmitCFIRegister(Register1, Register2); 1047f4f14f68f6078ea6681ee27b5bf42719d7db3441Rafael Espindola OS << "\t.cfi_register " << Register1 << ", " << Register2; 1048f4f14f68f6078ea6681ee27b5bf42719d7db3441Rafael Espindola EmitEOL(); 1049f4f14f68f6078ea6681ee27b5bf42719d7db3441Rafael Espindola} 1050f4f14f68f6078ea6681ee27b5bf42719d7db3441Rafael Espindola 105183ba58e5f0a5afbb23d7d2092d817accded4455aVenkatraman Govindarajuvoid MCAsmStreamer::EmitCFIWindowSave() { 105283ba58e5f0a5afbb23d7d2092d817accded4455aVenkatraman Govindaraju MCStreamer::EmitCFIWindowSave(); 105383ba58e5f0a5afbb23d7d2092d817accded4455aVenkatraman Govindaraju OS << "\t.cfi_window_save"; 105483ba58e5f0a5afbb23d7d2092d817accded4455aVenkatraman Govindaraju EmitEOL(); 105583ba58e5f0a5afbb23d7d2092d817accded4455aVenkatraman Govindaraju} 105683ba58e5f0a5afbb23d7d2092d817accded4455aVenkatraman Govindaraju 1057c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFIStartProc(const MCSymbol *Symbol) { 1058c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFIStartProc(Symbol); 1059cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1060440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << ".seh_proc " << *Symbol; 10610e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis EmitEOL(); 10620e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis} 10630e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis 1064c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFIEndProc() { 1065c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFIEndProc(); 1066cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1067440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << "\t.seh_endproc"; 10680e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis EmitEOL(); 10690e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis} 10700e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis 1071c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFIStartChained() { 1072c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFIStartChained(); 1073cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1074440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << "\t.seh_startchained"; 1075f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis EmitEOL(); 1076f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis} 1077f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis 1078c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFIEndChained() { 1079c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFIEndChained(); 1080cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1081440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << "\t.seh_endchained"; 1082f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis EmitEOL(); 1083f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis} 1084f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis 1085c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, 1086c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool Except) { 1087c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinEHHandler(Sym, Unwind, Except); 1088cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1089440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << "\t.seh_handler " << *Sym; 1090440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis if (Unwind) 1091440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << ", @unwind"; 1092440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis if (Except) 1093440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << ", @except"; 1094f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis EmitEOL(); 1095f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis} 1096f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis 1097c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinEHHandlerData() { 1098c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinEHHandlerData(); 1099cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1100410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis // Switch sections. Don't call SwitchSection directly, because that will 1101410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis // cause the section switch to be visible in the emitted assembly. 1102410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis // We only do this so the section switch that terminates the handler 1103410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis // data block is visible. 110437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines WinEH::FrameInfo *CurFrame = getCurrentWinFrameInfo(); 110537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (const MCSection *XData = WinEH::UnwindEmitter::getXDataSection( 110637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurFrame->Function, getContext())) 110737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SwitchSectionNoChange(XData); 1108410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis 1109440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << "\t.seh_handlerdata"; 1110f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis EmitEOL(); 1111f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis} 1112f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis 1113c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFIPushReg(unsigned Register) { 1114c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFIPushReg(Register); 1115cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1116c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines OS << "\t.seh_pushreg " << Register; 11170e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis EmitEOL(); 11180e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis} 11190e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis 1120c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFISetFrame(unsigned Register, unsigned Offset) { 1121c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFISetFrame(Register, Offset); 1122cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1123c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines OS << "\t.seh_setframe " << Register << ", " << Offset; 11240e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis EmitEOL(); 11250e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis} 11260e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis 1127c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFIAllocStack(unsigned Size) { 1128c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFIAllocStack(Size); 1129cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1130440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << "\t.seh_stackalloc " << Size; 11310e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis EmitEOL(); 11320e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis} 11330e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis 1134c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFISaveReg(unsigned Register, unsigned Offset) { 1135c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFISaveReg(Register, Offset); 1136cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1137c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines OS << "\t.seh_savereg " << Register << ", " << Offset; 1138440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis EmitEOL(); 1139440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis} 1140440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis 1141c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFISaveXMM(unsigned Register, unsigned Offset) { 1142c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFISaveXMM(Register, Offset); 1143cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1144c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines OS << "\t.seh_savexmm " << Register << ", " << Offset; 11450e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis EmitEOL(); 11460e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis} 11470e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis 1148c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFIPushFrame(bool Code) { 1149c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFIPushFrame(Code); 1150cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1151440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << "\t.seh_pushframe"; 11520e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis if (Code) 1153440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << " @code"; 11540e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis EmitEOL(); 11550e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis} 11560e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis 1157c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCAsmStreamer::EmitWinCFIEndProlog(void) { 1158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MCStreamer::EmitWinCFIEndProlog(); 1159cde87e2377bd3853d1485db27b295616066d020dCharles Davis 1160440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis OS << "\t.seh_endprologue"; 11610e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis EmitEOL(); 11620e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis} 11630e30f02f44185b43d279b7b3ef8b3356f2b5c7cbCharles Davis 116436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCAsmStreamer::AddEncodingComment(const MCInst &Inst, 116536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) { 11666b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar raw_ostream &OS = GetCommentOS(); 11676b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar SmallString<256> Code; 11686b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar SmallVector<MCFixup, 4> Fixups; 11696b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar raw_svector_ostream VecOS(Code); 117036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Emitter->EncodeInstruction(Inst, VecOS, Fixups, STI); 11716b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar VecOS.flush(); 1172a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner 11736b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar // If we are showing fixups, create symbolic markers in the encoded 11746b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar // representation. We do this by making a per-bit map to the fixup item index, 11756b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar // then trying to display it as nicely as possible. 11765532cf44a012149ce3afce43dbd0651b4d87a505Daniel Dunbar SmallVector<uint8_t, 64> FixupMap; 11775532cf44a012149ce3afce43dbd0651b4d87a505Daniel Dunbar FixupMap.resize(Code.size() * 8); 11786b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar for (unsigned i = 0, e = Code.size() * 8; i != e; ++i) 11796b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar FixupMap[i] = 0; 11806b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 11816b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar for (unsigned i = 0, e = Fixups.size(); i != e; ++i) { 11826b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar MCFixup &F = Fixups[i]; 11832761fc427082215c2affcc9d8db8491400bc9e5dDaniel Dunbar const MCFixupKindInfo &Info = AsmBackend->getFixupKindInfo(F.getKind()); 11846b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar for (unsigned j = 0; j != Info.TargetSize; ++j) { 11856b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar unsigned Index = F.getOffset() * 8 + Info.TargetOffset + j; 11866b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar assert(Index < Code.size() * 8 && "Invalid offset in fixup!"); 11876b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar FixupMap[Index] = 1 + i; 11886b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } 11896b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } 11906b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 11915c2eef6aed2ad1d716c1e393cb36e164d169ae2cEvan Cheng // FIXME: Note the fixup comments for Thumb2 are completely bogus since the 11928fbbd1c03df9cb6844ce5ffaa24a0adf6e434a2cEvan Cheng // high order halfword of a 32-bit Thumb2 instruction is emitted first. 11936b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar OS << "encoding: ["; 11946b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar for (unsigned i = 0, e = Code.size(); i != e; ++i) { 11956b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar if (i) 11966b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar OS << ','; 11976b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 11986b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar // See if all bits are the same map entry. 11996b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar uint8_t MapEntry = FixupMap[i * 8 + 0]; 12006b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar for (unsigned j = 1; j != 8; ++j) { 12016b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar if (FixupMap[i * 8 + j] == MapEntry) 12026b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar continue; 12036b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 12046b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar MapEntry = uint8_t(~0U); 12056b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar break; 12066b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } 12076b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 12086b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar if (MapEntry != uint8_t(~0U)) { 12096b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar if (MapEntry == 0) { 12106b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar OS << format("0x%02x", uint8_t(Code[i])); 12116b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } else { 121282caf1a867852010ae70dee04989609e25e72856Evan Cheng if (Code[i]) { 12138fbbd1c03df9cb6844ce5ffaa24a0adf6e434a2cEvan Cheng // FIXME: Some of the 8 bits require fix up. 121482caf1a867852010ae70dee04989609e25e72856Evan Cheng OS << format("0x%02x", uint8_t(Code[i])) << '\'' 121582caf1a867852010ae70dee04989609e25e72856Evan Cheng << char('A' + MapEntry - 1) << '\''; 121682caf1a867852010ae70dee04989609e25e72856Evan Cheng } else 121782caf1a867852010ae70dee04989609e25e72856Evan Cheng OS << char('A' + MapEntry - 1); 12186b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } 12196b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } else { 12206b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar // Otherwise, write out in binary. 12216b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar OS << "0b"; 122295c3e48f9557adb6064d580684bb14cacec2f826Jay Foad for (unsigned j = 8; j--;) { 12236b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar unsigned Bit = (Code[i] >> j) & 1; 1224d645151ac680ae9d6b9c032b3de903d5ae5a22acNAKAMURA Takumi 12253170a3bc04deadfc0a4de5ff3cba7680be548f29Chris Lattner unsigned FixupBit; 122699cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (MAI->isLittleEndian()) 12273170a3bc04deadfc0a4de5ff3cba7680be548f29Chris Lattner FixupBit = i * 8 + j; 12283170a3bc04deadfc0a4de5ff3cba7680be548f29Chris Lattner else 12293170a3bc04deadfc0a4de5ff3cba7680be548f29Chris Lattner FixupBit = i * 8 + (7-j); 1230d645151ac680ae9d6b9c032b3de903d5ae5a22acNAKAMURA Takumi 123195c3e48f9557adb6064d580684bb14cacec2f826Jay Foad if (uint8_t MapEntry = FixupMap[FixupBit]) { 123295c3e48f9557adb6064d580684bb14cacec2f826Jay Foad assert(Bit == 0 && "Encoder wrote into fixed up bit!"); 123395c3e48f9557adb6064d580684bb14cacec2f826Jay Foad OS << char('A' + MapEntry - 1); 12346b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } else 12356b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar OS << Bit; 12366b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } 12376b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } 12386b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } 12396b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar OS << "]\n"; 12406b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 12416b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar for (unsigned i = 0, e = Fixups.size(); i != e; ++i) { 12426b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar MCFixup &F = Fixups[i]; 12432761fc427082215c2affcc9d8db8491400bc9e5dDaniel Dunbar const MCFixupKindInfo &Info = AsmBackend->getFixupKindInfo(F.getKind()); 12446b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar OS << " fixup " << char('A' + i) << " - " << "offset: " << F.getOffset() 12455d5a1e13a129e18ee6031fe6354acd2ab4d39f37Daniel Dunbar << ", value: " << *F.getValue() << ", kind: " << Info.Name << "\n"; 12466b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar } 12476b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar} 12486b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 124936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCAsmStreamer::EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) { 1250df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne assert(getCurrentSection().first && 1251df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne "Cannot emit contents before setting section!"); 12526b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 12536b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar // Show the encoding in a comment if we have a code emitter. 12546b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar if (Emitter) 125536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AddEncodingComment(Inst, STI); 12566b71653c82f86626f64356c308d7356a17b05834Daniel Dunbar 125730d9a644d5b09bcf95b8b05ec559c778566265c3Chris Lattner // Show the MCInst if enabled. 1258c9adb8c61e5dacdb340509ff6090cada1f4b591cDaniel Dunbar if (ShowInst) { 1259ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Inst.dump_pretty(GetCommentOS(), InstPrinter.get(), "\n "); 1260c9adb8c61e5dacdb340509ff6090cada1f4b591cDaniel Dunbar GetCommentOS() << "\n"; 1261c9adb8c61e5dacdb340509ff6090cada1f4b591cDaniel Dunbar } 1262c9adb8c61e5dacdb340509ff6090cada1f4b591cDaniel Dunbar 126367c076cf59d14fc96feb5c915447f8ea79cf8325Daniel Dunbar // If we have an AsmPrinter, use that to print, otherwise print the MCInst. 12649dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar if (InstPrinter) 12652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar InstPrinter->printInst(&Inst, OS, "", STI); 12669dee8e3009408fd08c656558397a8ac8604139baDaniel Dunbar else 1267ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Inst.print(OS); 12687d1e49c98332ff336bd6a6837855c8cdb1b36e97Chris Lattner EmitEOL(); 1269a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar} 1270a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar 12714766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCAsmStreamer::EmitBundleAlignMode(unsigned AlignPow2) { 12724766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky OS << "\t.bundle_align_mode " << AlignPow2; 12734766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky EmitEOL(); 12744766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 12754766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 12766c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Benderskyvoid MCAsmStreamer::EmitBundleLock(bool AlignToEnd) { 12774766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky OS << "\t.bundle_lock"; 12786c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky if (AlignToEnd) 12796c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky OS << " align_to_end"; 12804766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky EmitEOL(); 12814766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 12824766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 12834766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCAsmStreamer::EmitBundleUnlock() { 12844766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky OS << "\t.bundle_unlock"; 12854766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky EmitEOL(); 12864766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 12874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 1288bd4ec84d154bdd3f19b07de1076a06c16f7ebce8Jim Grosbach/// EmitRawText - If this file is backed by an assembly streamer, this dumps 128991bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner/// the specified string in the output .s file. This capability is 129091bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner/// indicated by the hasRawTextSupport() predicate. 12915759c3a02902026a27a0d1bc24a5bad85f52bd71David Blaikievoid MCAsmStreamer::EmitRawTextImpl(StringRef String) { 1292d5928dcd78ec03a64f61b7a93be219d97eda1f5cChris Lattner if (!String.empty() && String.back() == '\n') 1293d5928dcd78ec03a64f61b7a93be219d97eda1f5cChris Lattner String = String.substr(0, String.size()-1); 129491bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner OS << String; 1295d5928dcd78ec03a64f61b7a93be219d97eda1f5cChris Lattner EmitEOL(); 129691bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner} 129791bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner 129899b4237c1647156f0e1d3d7e03efdab23ed79778Rafael Espindolavoid MCAsmStreamer::FinishImpl() { 129994c2e85bea1ab1b837a4c055ccc83d5cd32dd027Kevin Enderby // If we are generating dwarf for assembly source files dump out the sections. 130094c2e85bea1ab1b837a4c055ccc83d5cd32dd027Kevin Enderby if (getContext().getGenDwarfForAssembly()) 130136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCGenDwarfInfo::Emit(this); 130236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 130336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Emit the label for the line table, if requested - since the rest of the 130436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // line table will be defined by .loc/.file directives, and not emitted 130536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // directly, the label is the only work required here. 130636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines auto &Tables = getContext().getMCDwarfLineTables(); 130736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!Tables.empty()) { 130836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Tables.size() == 1 && "asm output only supports one line table"); 130936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (auto *Label = Tables.begin()->second.getLabel()) { 131036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SwitchSection(getContext().getObjectFileInfo()->getDwarfLineSection()); 131136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitLabel(Label); 131236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 131336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 131436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 131536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 131686e2211d0a496f470ea1d320161c8dc43593c5c6Chris LattnerMCStreamer *llvm::createAsmStreamer(MCContext &Context, 13172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar std::unique_ptr<formatted_raw_ostream> OS, 1318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isVerboseAsm, bool useDwarfDirectory, 1319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCInstPrinter *IP, MCCodeEmitter *CE, 1320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCAsmBackend *MAB, bool ShowInst) { 13212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return new MCAsmStreamer(Context, std::move(OS), isVerboseAsm, 13222c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar useDwarfDirectory, IP, CE, MAB, ShowInst); 1323a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar} 1324