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