1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===- lib/MC/MCStreamer.cpp - Streaming Machine Code Output --------------===//
2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                     The LLVM Compiler Infrastructure
4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is distributed under the University of Illinois Open Source
6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// License. See LICENSE.TXT for details.
7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===//
9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCAsmInfo.h"
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCContext.h"
12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/MC/MCStreamer.h"
13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/MC/MCExpr.h"
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCObjectWriter.h"
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSymbol.h"
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ErrorHandling.h"
17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Support/raw_ostream.h"
18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/ADT/SmallString.h"
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/StringExtras.h"
20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/ADT/Twine.h"
21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include <cstdlib>
22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm;
23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), EmitEHFrame(true),
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                         EmitDebugFrame(false),
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                         CurrentW64UnwindInfo(0),
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                         LastSymbol(0),
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                         UniqueCodeBeginSuffix(0),
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                         UniqueDataBeginSuffix(0) {
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCSection *section = NULL;
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SectionStack.push_back(std::make_pair(section, section));
32894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
34894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanMCStreamer::~MCStreamer() {
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (unsigned i = 0; i < getNumW64UnwindInfos(); ++i)
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    delete W64UnwindInfos[i];
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCExpr *MCStreamer::BuildSymbolDiff(MCContext &Context,
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                          const MCSymbol *A,
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                          const MCSymbol *B) {
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCExpr *ARef =
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSymbolRefExpr::Create(A, Variant, Context);
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCExpr *BRef =
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSymbolRefExpr::Create(B, Variant, Context);
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCExpr *AddrDelta =
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCBinaryExpr::Create(MCBinaryExpr::Sub, ARef, BRef, Context);
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return AddrDelta;
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCExpr *MCStreamer::ForceExpAbs(const MCExpr* Expr) {
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Context.getAsmInfo().hasAggressiveSymbolFolding() ||
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      isa<MCSymbolRefExpr>(Expr))
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return Expr;
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *ABS = Context.CreateTempSymbol();
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitAssignment(ABS, Expr);
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return MCSymbolRefExpr::Create(ABS, Context);
60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanraw_ostream &MCStreamer::GetCommentOS() {
63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // By default, discard comments.
64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return nulls();
65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta,
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                      const MCSymbol *Label, int PointerSize) {
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // emit the sequence to set the address
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitIntValue(dwarf::DW_LNS_extended_op, 1);
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitULEB128IntValue(PointerSize + 1);
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitIntValue(dwarf::DW_LNE_set_address, 1);
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitSymbolValue(Label, PointerSize);
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // emit the sequence for the LineDelta (from 1) and a zero address delta.
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfLineAddr::Emit(this, LineDelta, 0);
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// EmitIntValue - Special case of EmitValue that avoids the client having to
80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// pass in a MCExpr for constant integers.
81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid MCStreamer::EmitIntValue(uint64_t Value, unsigned Size,
82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                              unsigned AddrSpace) {
8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(Size <= 8 && "Invalid size");
8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman         "Invalid size");
8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  char buf[8];
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const bool isLittleEndian = Context.getAsmInfo().isLittleEndian();
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (unsigned i = 0; i != Size; ++i) {
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned index = isLittleEndian ? i : (Size - i - 1);
9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    buf[i] = uint8_t(Value >> (index * 8));
9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitBytes(StringRef(buf, Size), AddrSpace);
9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// EmitULEB128Value - Special case of EmitULEB128Value that avoids the
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// client having to pass in a MCExpr for constant integers.
9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace) {
9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallString<32> Tmp;
9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  raw_svector_ostream OSE(Tmp);
10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCObjectWriter::EncodeULEB128(Value, OSE);
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitBytes(OSE.str(), AddrSpace);
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the
10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// client having to pass in a MCExpr for constant integers.
10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitSLEB128IntValue(int64_t Value, unsigned AddrSpace) {
10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallString<32> Tmp;
10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  raw_svector_ostream OSE(Tmp);
10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCObjectWriter::EncodeSLEB128(Value, OSE);
11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitBytes(OSE.str(), AddrSpace);
11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitAbsValue(const MCExpr *Value, unsigned Size,
11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                              unsigned AddrSpace) {
11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCExpr *ABS = ForceExpAbs(Value);
11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitValue(ABS, Size, AddrSpace);
11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitValue(const MCExpr *Value, unsigned Size,
12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           unsigned AddrSpace) {
12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitValueImpl(Value, Size, AddrSpace);
123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size,
12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                  unsigned AddrSpace) {
12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitValueImpl(MCSymbolRefExpr::Create(Sym, getContext()), Size,
12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                AddrSpace);
12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitGPRel32Value(const MCExpr *Value) {
13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  report_fatal_error("unsupported directive in streamer");
133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// EmitFill - Emit NumBytes bytes worth of the value specified by
136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// FillValue.  This implements directives such as '.space'.
137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue,
138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                          unsigned AddrSpace) {
139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const MCExpr *E = MCConstantExpr::Create(FillValue, getContext());
140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (uint64_t i = 0, e = NumBytes; i != e; ++i)
141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    EmitValue(E, 1, AddrSpace);
142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool MCStreamer::EmitDwarfFileDirective(unsigned FileNo,
14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                        StringRef Filename) {
14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return getContext().GetDwarfFile(Filename, FileNo) == 0;
14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                       unsigned Column, unsigned Flags,
15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                       unsigned Isa,
15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                       unsigned Discriminator,
15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                       StringRef FileName) {
15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                  Discriminator);
15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCDwarfFrameInfo *MCStreamer::getCurrentFrameInfo() {
15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (FrameInfos.empty())
16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return NULL;
16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return &FrameInfos.back();
16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EnsureValidFrame() {
16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!CurFrame || CurFrame->End)
16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("No open frame");
16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitEHSymAttributes(const MCSymbol *Symbol,
17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                     MCSymbol *EHSymbol) {
17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitLabel(MCSymbol *Symbol) {
17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(getCurrentSection() && "Cannot emit before setting section!");
17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Symbol->setSection(*getCurrentSection());
17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  LastSymbol = Symbol;
17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitDataRegion() {
18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RegionIndicator == Data) return;
18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCContext &Context = getContext();
18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCAsmInfo &MAI = Context.getAsmInfo();
18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!MAI.getSupportsDataRegions()) return;
18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Generate a unique symbol name.
18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *NewSym = Context.GetOrCreateSymbol(
19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Twine(MAI.getDataBeginLabelName()) +
19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        utostr(UniqueDataBeginSuffix++));
19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(NewSym);
19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  RegionIndicator = Data;
19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCodeRegion() {
19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RegionIndicator == Code) return;
19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCContext &Context = getContext();
20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCAsmInfo &MAI = Context.getAsmInfo();
20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!MAI.getSupportsDataRegions()) return;
20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Generate a unique symbol name.
20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *NewSym = Context.GetOrCreateSymbol(
20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Twine(MAI.getCodeBeginLabelName()) +
20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        utostr(UniqueCodeBeginSuffix++));
20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(NewSym);
20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  RegionIndicator = Code;
21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitJumpTable8Region() {
21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RegionIndicator == JumpTable8) return;
21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCContext &Context = getContext();
21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCAsmInfo &MAI = Context.getAsmInfo();
21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!MAI.getSupportsDataRegions()) return;
21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Generate a unique symbol name.
22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *NewSym = Context.GetOrCreateSymbol(
22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Twine(MAI.getJumpTable8BeginLabelName()) +
22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        utostr(UniqueDataBeginSuffix++));
22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(NewSym);
22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  RegionIndicator = JumpTable8;
22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitJumpTable16Region() {
23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RegionIndicator == JumpTable16) return;
23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCContext &Context = getContext();
23319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCAsmInfo &MAI = Context.getAsmInfo();
23419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!MAI.getSupportsDataRegions()) return;
23519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
23619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Generate a unique symbol name.
23719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *NewSym = Context.GetOrCreateSymbol(
23819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Twine(MAI.getJumpTable16BeginLabelName()) +
23919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        utostr(UniqueDataBeginSuffix++));
24019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(NewSym);
24119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
24219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  RegionIndicator = JumpTable16;
24319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
24419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
24519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
24619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitJumpTable32Region() {
24719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RegionIndicator == JumpTable32) return;
24819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
24919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCContext &Context = getContext();
25019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCAsmInfo &MAI = Context.getAsmInfo();
25119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!MAI.getSupportsDataRegions()) return;
25219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
25319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Generate a unique symbol name.
25419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *NewSym = Context.GetOrCreateSymbol(
25519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Twine(MAI.getJumpTable32BeginLabelName()) +
25619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        utostr(UniqueDataBeginSuffix++));
25719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(NewSym);
25819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
25919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  RegionIndicator = JumpTable32;
26019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
26119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
26219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding) {
26319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
26419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
26519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->CompactUnwindEncoding = CompactUnwindEncoding;
26619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
26719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
26819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFISections(bool EH, bool Debug) {
26919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(EH || Debug);
27019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitEHFrame = EH;
27119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitDebugFrame = Debug;
27219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
27319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
27419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIStartProc() {
27519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
27619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CurFrame && !CurFrame->End)
27719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Starting a frame before finishing the previous one!");
27819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
27919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo Frame;
28019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Frame.Function = LastSymbol;
28119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
28219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If the function is externally visible, we need to create a local
28319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // symbol to avoid relocations.
28419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix();
28519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (LastSymbol && LastSymbol->getName().startswith(Prefix)) {
28619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Frame.Begin = LastSymbol;
28719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else {
28819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Frame.Begin = getContext().CreateTempSymbol();
28919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitLabel(Frame.Begin);
29019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
29119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
29219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  FrameInfos.push_back(Frame);
29319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  RegionIndicator = Code;
29419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
29519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
29619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIEndProc() {
29719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
29819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
29919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->End = getContext().CreateTempSymbol();
30019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(CurFrame->End);
30119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
30219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
30319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {
30419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
30519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
30619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
30719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Dest(MachineLocation::VirtualFP);
30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Source(Register, -Offset);
31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(Label, Dest, Source);
31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
31219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
31319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
31419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
31519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
31619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
31719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
31819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
31919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Dest(MachineLocation::VirtualFP);
32019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Source(MachineLocation::VirtualFP, -Offset);
32119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(Label, Dest, Source);
32219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
32319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
32419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
32519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
32619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
32719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
32819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
32919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
33019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Dest(MachineLocation::VirtualFP);
33119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Source(MachineLocation::VirtualFP, Adjustment);
33219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(MCCFIInstruction::RelMove, Label, Dest, Source);
33319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
33419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
33519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
33619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIDefCfaRegister(int64_t Register) {
33719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
33819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
33919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
34019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
34119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Dest(Register);
34219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Source(MachineLocation::VirtualFP);
34319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(Label, Dest, Source);
34419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
34519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
34619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
34719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {
34819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
34919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
35019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
35119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
35219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Dest(Register, Offset);
35319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Source(Register, Offset);
35419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(Label, Dest, Source);
35519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
35619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
35719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
35819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {
35919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
36019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
36119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
36219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
36319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Dest(Register, Offset);
36419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineLocation Source(Register, Offset);
36519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(MCCFIInstruction::RelMove, Label, Dest, Source);
36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
36819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
36919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIPersonality(const MCSymbol *Sym,
37019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                    unsigned Encoding) {
37119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
37219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
37319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Personality = Sym;
37419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->PersonalityEncoding = Encoding;
37519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
37619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
37719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
37819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
37919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
38019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Lsda = Sym;
38119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->LsdaEncoding = Encoding;
38219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
38319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
38419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIRememberState() {
38519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
38619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
38719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
38819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
38919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(MCCFIInstruction::Remember, Label);
39019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
39119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
39219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
39319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFIRestoreState() {
39419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // FIXME: Error if there is no matching cfi_remember_state.
39519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
39619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
39719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
39819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
39919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(MCCFIInstruction::Restore, Label);
40019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
40119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
40219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
40319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCFISameValue(int64_t Register) {
40419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidFrame();
40519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
40619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
40719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
40819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCCFIInstruction Instruction(MCCFIInstruction::SameValue, Label, Register);
40919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Instruction);
41019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
41119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
41219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
41319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  W64UnwindInfos.push_back(Frame);
41419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurrentW64UnwindInfo = W64UnwindInfos.back();
41519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
41619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
41719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EnsureValidW64UnwindInfo() {
41819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
41919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!CurFrame || CurFrame->End)
42019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("No open Win64 EH frame function!");
42119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
42219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
42319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHStartProc(const MCSymbol *Symbol) {
42419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
42519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CurFrame && !CurFrame->End)
42619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Starting a function before ending the previous one!");
42719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *Frame = new MCWin64EHUnwindInfo;
42819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Frame->Begin = getContext().CreateTempSymbol();
42919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Frame->Function = Symbol;
43019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Frame->Begin);
43119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  setCurrentW64UnwindInfo(Frame);
43219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
43319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
43419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHEndProc() {
43519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
43619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
43719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CurFrame->ChainedParent)
43819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Not all chained regions terminated!");
43919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->End = getContext().CreateTempSymbol();
44019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(CurFrame->End);
44119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
44219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
44319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHStartChained() {
44419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
44519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *Frame = new MCWin64EHUnwindInfo;
44619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
44719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Frame->Begin = getContext().CreateTempSymbol();
44819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Frame->Function = CurFrame->Function;
44919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Frame->ChainedParent = CurFrame;
45019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Frame->Begin);
45119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  setCurrentW64UnwindInfo(Frame);
45219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
45319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
45419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHEndChained() {
45519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
45619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
45719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!CurFrame->ChainedParent)
45819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("End of a chained region outside a chained region!");
45919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->End = getContext().CreateTempSymbol();
46019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(CurFrame->End);
46119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurrentW64UnwindInfo = CurFrame->ChainedParent;
46219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
46319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
46419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
46519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                    bool Except) {
46619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
46719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
46819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CurFrame->ChainedParent)
46919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Chained unwind areas can't have handlers!");
47019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->ExceptionHandler = Sym;
47119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!Except && !Unwind)
47219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Don't know what kind of handler this is!");
47319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Unwind)
47419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CurFrame->HandlesUnwind = true;
47519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Except)
47619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CurFrame->HandlesExceptions = true;
47719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
47819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
47919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHHandlerData() {
48019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
48119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
48219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CurFrame->ChainedParent)
48319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Chained unwind areas can't have handlers!");
48419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
48519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
48619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHPushReg(unsigned Register) {
48719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
48819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
48919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
49019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHInstruction Inst(Win64EH::UOP_PushNonVol, Label, Register);
49119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
49219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Inst);
49319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
49419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
49519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) {
49619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
49719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
49819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CurFrame->LastFrameInst >= 0)
49919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Frame register and offset already specified!");
50019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Offset & 0x0F)
50119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Misaligned frame pointer offset!");
50219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHInstruction Inst(Win64EH::UOP_SetFPReg, NULL, Register, Offset);
50319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->LastFrameInst = CurFrame->Instructions.size();
50419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Inst);
50519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
50619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
50719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHAllocStack(unsigned Size) {
50819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
50919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Size & 7)
51019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Misaligned stack allocation!");
51119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
51219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
51319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHInstruction Inst(Label, Size);
51419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
51519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Inst);
51619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
51719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
51819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) {
51919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
52019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Offset & 7)
52119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Misaligned saved register offset!");
52219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
52319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
52419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHInstruction Inst(
52519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman     Offset > 512*1024-8 ? Win64EH::UOP_SaveNonVolBig : Win64EH::UOP_SaveNonVol,
52619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                            Label, Register, Offset);
52719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
52819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Inst);
52919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
53019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
53119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) {
53219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
53319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Offset & 0x0F)
53419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Misaligned saved vector register offset!");
53519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
53619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
53719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHInstruction Inst(
53819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Offset > 512*1024-16 ? Win64EH::UOP_SaveXMM128Big : Win64EH::UOP_SaveXMM128,
53919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                            Label, Register, Offset);
54019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
54119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Inst);
54219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
54319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
54419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHPushFrame(bool Code) {
54519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
54619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
54719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CurFrame->Instructions.size() > 0)
54819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("If present, PushMachFrame must be the first UOP");
54919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().CreateTempSymbol();
55019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHInstruction Inst(Win64EH::UOP_PushMachFrame, Label, Code);
55119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(Label);
55219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->Instructions.push_back(Inst);
55319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
55419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
55519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitWin64EHEndProlog() {
55619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EnsureValidW64UnwindInfo();
55719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
55819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CurFrame->PrologEnd = getContext().CreateTempSymbol();
55919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitLabel(CurFrame->PrologEnd);
56019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
56119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
56219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitFnStart() {
56319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  errs() << "Not implemented yet\n";
56419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  abort();
56519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
56619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
56719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitFnEnd() {
56819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  errs() << "Not implemented yet\n";
56919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  abort();
57019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
57119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
57219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitCantUnwind() {
57319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  errs() << "Not implemented yet\n";
57419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  abort();
57519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
57619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
57719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitHandlerData() {
57819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  errs() << "Not implemented yet\n";
57919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  abort();
58019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
58119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
58219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitPersonality(const MCSymbol *Personality) {
58319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  errs() << "Not implemented yet\n";
58419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  abort();
58519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
58619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
58719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitSetFP(unsigned FpReg, unsigned SpReg, int64_t Offset) {
58819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  errs() << "Not implemented yet\n";
58919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  abort();
59019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
59119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
59219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitPad(int64_t Offset) {
59319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  errs() << "Not implemented yet\n";
59419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  abort();
59519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
59619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
59719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitRegSave(const SmallVectorImpl<unsigned> &RegList, bool) {
59819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  errs() << "Not implemented yet\n";
59919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  abort();
60019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
60119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// EmitRawText - If this file is backed by an assembly streamer, this dumps
603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// the specified string in the output .s file.  This capability is
604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// indicated by the hasRawTextSupport() predicate.
605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid MCStreamer::EmitRawText(StringRef String) {
606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  errs() << "EmitRawText called on an MCStreamer that doesn't support it, "
607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  " something must not be fully mc'ized\n";
608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  abort();
609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid MCStreamer::EmitRawText(const Twine &T) {
612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  SmallString<128> Str;
613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T.toVector(Str);
614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  EmitRawText(Str.str());
615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
61619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
61719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitFrames(bool usingCFI) {
61819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!getNumFrameInfos())
61919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return;
62019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
62119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (EmitEHFrame)
62219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCDwarfFrameEmitter::Emit(*this, usingCFI, true);
62319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
62419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (EmitDebugFrame)
62519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCDwarfFrameEmitter::Emit(*this, usingCFI, false);
62619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
62719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
62819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCStreamer::EmitW64Tables() {
62919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!getNumW64UnwindInfos())
63019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return;
63119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
63219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCWin64EHUnwindEmitter::Emit(*this);
63319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
634