MCStreamer.cpp revision 1be0e271a07925b928ba89848934f1ea6f1854e2
1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com//===- lib/MC/MCStreamer.cpp - Streaming Machine Code Output --------------===//
2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com//
3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com//                     The LLVM Compiler Infrastructure
4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com//
5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// This file is distributed under the University of Illinois Open Source
6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// License. See LICENSE.TXT for details.
7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com//
8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com//===----------------------------------------------------------------------===//
9902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
10902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "llvm/MC/MCAsmInfo.h"
11902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "llvm/MC/MCContext.h"
12902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "llvm/MC/MCStreamer.h"
13902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "llvm/MC/MCExpr.h"
14902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "llvm/MC/MCObjectWriter.h"
152a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org#include "llvm/MC/MCSymbol.h"
16902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "llvm/Support/ErrorHandling.h"
178a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#include "llvm/Support/raw_ostream.h"
1897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com#include "llvm/ADT/SmallString.h"
19902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "llvm/ADT/Twine.h"
2032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com#include <cstdlib>
2132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.comusing namespace llvm;
2286681b37bd20204e47a492119b345c01d00bc939fmalita@google.com
23902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comMCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), EmitEHFrame(true),
2480a4a60f96c33ccd850f9b0eb4b69ab08c198196chudy@google.com                                         EmitDebugFrame(false),
25f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com                                         CurrentW64UnwindInfo(0) {
26902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  const MCSection *section = NULL;
27768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org  SectionStack.push_back(std::make_pair(section, section));
28768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org}
29768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
3057f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.orgMCStreamer::~MCStreamer() {
31902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  for (unsigned i = 0; i < getNumW64UnwindInfos(); ++i)
32902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    delete W64UnwindInfos[i];
33f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com}
34f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
35f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.comconst MCExpr *MCStreamer::BuildSymbolDiff(MCContext &Context,
3657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                                          const MCSymbol *A,
3757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                                          const MCSymbol *B) {
3857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
3957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  const MCExpr *ARef =
4057f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    MCSymbolRefExpr::Create(A, Variant, Context);
412a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  const MCExpr *BRef =
422a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    MCSymbolRefExpr::Create(B, Variant, Context);
4357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  const MCExpr *AddrDelta =
44f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    MCBinaryExpr::Create(MCBinaryExpr::Sub, ARef, BRef, Context);
45f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com  return AddrDelta;
4632bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com}
4732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
48f84ad8f7fc0194389a8099da2c5e8fff9f092890skia.committer@gmail.comconst MCExpr *MCStreamer::ForceExpAbs(const MCExpr* Expr) {
4932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com  if (Context.getAsmInfo().hasAggressiveSymbolFolding() ||
5032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com      isa<MCSymbolRefExpr>(Expr))
51902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return Expr;
52902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
53902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  MCSymbol *ABS = Context.CreateTempSymbol();
54902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  EmitAssignment(ABS, Expr);
55902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  return MCSymbolRefExpr::Create(ABS, Context);
56902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
57902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
58902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comraw_ostream &MCStreamer::GetCommentOS() {
59902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  // By default, discard comments.
60902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  return nulls();
610b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com}
620b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com
630b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.comvoid MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta,
64a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com                                      const MCSymbol *Label, int PointerSize) {
65a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  // emit the sequence to set the address
66a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  EmitIntValue(dwarf::DW_LNS_extended_op, 1);
67a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  EmitULEB128IntValue(PointerSize + 1);
68a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  EmitIntValue(dwarf::DW_LNE_set_address, 1);
69a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  EmitSymbolValue(Label, PointerSize);
70a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com
71a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  // emit the sequence for the LineDelta (from 1) and a zero address delta.
72a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  MCDwarfLineAddr::Emit(this, LineDelta, 0);
73a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com}
74a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com
75a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com/// EmitIntValue - Special case of EmitValue that avoids the client having to
76a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com/// pass in a MCExpr for constant integers.
77a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.comvoid MCStreamer::EmitIntValue(uint64_t Value, unsigned Size,
780b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com                              unsigned AddrSpace) {
790b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com  assert(Size <= 8 && "Invalid size");
80830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com  assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
81902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com         "Invalid size");
82902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  char buf[8];
8350c84da68b17647371a81593402e897d639989e4robertphillips@google.com  const bool isLittleEndian = Context.getAsmInfo().isLittleEndian();
8450c84da68b17647371a81593402e897d639989e4robertphillips@google.com  for (unsigned i = 0; i != Size; ++i) {
8550c84da68b17647371a81593402e897d639989e4robertphillips@google.com    unsigned index = isLittleEndian ? i : (Size - i - 1);
8650c84da68b17647371a81593402e897d639989e4robertphillips@google.com    buf[i] = uint8_t(Value >> (index * 8));
8750c84da68b17647371a81593402e897d639989e4robertphillips@google.com  }
8850c84da68b17647371a81593402e897d639989e4robertphillips@google.com  EmitBytes(StringRef(buf, Size), AddrSpace);
89902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
90902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
91902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/// EmitULEB128Value - Special case of EmitULEB128Value that avoids the
92902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/// client having to pass in a MCExpr for constant integers.
93902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace) {
94902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  SmallString<32> Tmp;
9550c84da68b17647371a81593402e897d639989e4robertphillips@google.com  raw_svector_ostream OSE(Tmp);
9650c84da68b17647371a81593402e897d639989e4robertphillips@google.com  MCObjectWriter::EncodeULEB128(Value, OSE);
9750c84da68b17647371a81593402e897d639989e4robertphillips@google.com  EmitBytes(OSE.str(), AddrSpace);
9850c84da68b17647371a81593402e897d639989e4robertphillips@google.com}
9950c84da68b17647371a81593402e897d639989e4robertphillips@google.com
10050c84da68b17647371a81593402e897d639989e4robertphillips@google.com/// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the
10150c84da68b17647371a81593402e897d639989e4robertphillips@google.com/// client having to pass in a MCExpr for constant integers.
102902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid MCStreamer::EmitSLEB128IntValue(int64_t Value, unsigned AddrSpace) {
103902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  SmallString<32> Tmp;
104902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  raw_svector_ostream OSE(Tmp);
10597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com  MCObjectWriter::EncodeSLEB128(Value, OSE);
106902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  EmitBytes(OSE.str(), AddrSpace);
107902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
1087e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
1097e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid MCStreamer::EmitAbsValue(const MCExpr *Value, unsigned Size,
1107e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com                              unsigned AddrSpace) {
1117e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com  const MCExpr *ABS = ForceExpAbs(Value);
1127e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com  EmitValue(ABS, Size, AddrSpace);
1137e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com}
114902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
115902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
1164469938e92d779dff05e745559e67907bbf21e78reed@google.comvoid MCStreamer::EmitValue(const MCExpr *Value, unsigned Size,
1178a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com                           unsigned AddrSpace) {
1182e71f1619d9a2c51c1292e618f42a56ad2da1de8skia.committer@gmail.com  EmitValueImpl(Value, Size, AddrSpace);
119febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com}
120febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com
121febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.comvoid MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size,
122febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com                                  unsigned AddrSpace) {
123febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com  EmitValueImpl(MCSymbolRefExpr::Create(Sym, getContext()), Size,
124902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                AddrSpace);
125902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
126902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
127902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid MCStreamer::EmitGPRel32Value(const MCExpr *Value) {
1288a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com  report_fatal_error("unsupported directive in streamer");
129902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
130902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
13157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org/// EmitFill - Emit NumBytes bytes worth of the value specified by
13257f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org/// FillValue.  This implements directives such as '.space'.
13357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.orgvoid MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue,
13457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                          unsigned AddrSpace) {
13557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  const MCExpr *E = MCConstantExpr::Create(FillValue, getContext());
136f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com  for (uint64_t i = 0, e = NumBytes; i != e; ++i)
137f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com    EmitValue(E, 1, AddrSpace);
1380d4fe14a41bd04535310f8b2edee9e30191fdd79commit-bot@chromium.org}
13967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com
140f14143226acf209615c4dd841aa6632aff112ab3chudy@google.combool MCStreamer::EmitDwarfFileDirective(unsigned FileNo,
141f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com                                        StringRef Filename) {
142902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  return getContext().GetDwarfFile(Filename, FileNo) == 0;
143902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
144902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
145902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
146902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                                       unsigned Column, unsigned Flags,
147902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                                       unsigned Isa,
148b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com                                       unsigned Discriminator,
149b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com                                       StringRef FileName) {
150b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com  getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
151b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com                                  Discriminator);
152b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com}
153e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com
154e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.comMCDwarfFrameInfo *MCStreamer::getCurrentFrameInfo() {
155830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com  if (FrameInfos.empty())
156830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    return NULL;
1572a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  return &FrameInfos.back();
1582a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
159902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
160902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid MCStreamer::EnsureValidFrame() {
161902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
162902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  if (!CurFrame || CurFrame->End)
163902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    report_fatal_error("No open frame");
164902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
165902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
166902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid MCStreamer::EmitEHSymAttributes(const MCSymbol *Symbol,
167902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                                     MCSymbol *EHSymbol) {
1687112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com}
169eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org
170eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.orgvoid MCStreamer::EmitLabel(MCSymbol *Symbol) {
171902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
172902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  assert(getCurrentSection() && "Cannot emit before setting section!");
173902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  Symbol->setSection(*getCurrentSection());
174902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
175902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix();
176902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  if (!Symbol->getName().startswith(Prefix))
177902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    LastNonPrivate = Symbol;
178902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
179902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
1800a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid MCStreamer::EmitCFISections(bool EH, bool Debug) {
1810a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com  assert(EH || Debug);
1820a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com  EmitEHFrame = EH;
1830a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com  EmitDebugFrame = Debug;
1840a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com}
1850a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com
18667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.comvoid MCStreamer::EmitCFIStartProc() {
18767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
188902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  if (CurFrame && !CurFrame->End)
189902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    report_fatal_error("Starting a frame before finishing the previous one!");
1907ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com  MCDwarfFrameInfo Frame;
1917ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com  Frame.Begin = getContext().CreateTempSymbol();
192902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  Frame.Function = LastNonPrivate;
193902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  EmitLabel(Frame.Begin);
194902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  FrameInfos.push_back(Frame);
195902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
196902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
1977ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid MCStreamer::EmitCFIEndProc() {
1987ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com  EnsureValidFrame();
19967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
20067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  CurFrame->End = getContext().CreateTempSymbol();
201902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  EmitLabel(CurFrame->End);
202902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
203902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
204902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid MCStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {
20567baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  EnsureValidFrame();
20667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
20767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  MCSymbol *Label = getContext().CreateTempSymbol();
208902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  EmitLabel(Label);
209902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  MachineLocation Dest(MachineLocation::VirtualFP);
2103b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com  MachineLocation Source(Register, -Offset);
2113b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com  MCCFIInstruction Instruction(Label, Dest, Source);
2123b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com  CurFrame->Instructions.push_back(Instruction);
2138f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com}
2145c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org
2155c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.orgvoid MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
216370a89980b2d38a6d01903b484bf404d6c48b496skia.committer@gmail.com  EnsureValidFrame();
217370a89980b2d38a6d01903b484bf404d6c48b496skia.committer@gmail.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
2188f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MCSymbol *Label = getContext().CreateTempSymbol();
2195c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org  EmitLabel(Label);
2208f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MachineLocation Dest(MachineLocation::VirtualFP);
2218f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MachineLocation Source(MachineLocation::VirtualFP, -Offset);
222370a89980b2d38a6d01903b484bf404d6c48b496skia.committer@gmail.com  MCCFIInstruction Instruction(Label, Dest, Source);
223370a89980b2d38a6d01903b484bf404d6c48b496skia.committer@gmail.com  CurFrame->Instructions.push_back(Instruction);
2248f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com}
2258f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com
2268f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid MCStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
2278f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  EnsureValidFrame();
2288f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
2298f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MCSymbol *Label = getContext().CreateTempSymbol();
2308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  EmitLabel(Label);
2318f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MachineLocation Dest(MachineLocation::VirtualFP);
2328f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MachineLocation Source(MachineLocation::VirtualFP, Adjustment);
2338f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MCCFIInstruction Instruction(MCCFIInstruction::RelMove, Label, Dest, Source);
2348f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  CurFrame->Instructions.push_back(Instruction);
235ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org}
236e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org
237e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid MCStreamer::EmitCFIDefCfaRegister(int64_t Register) {
238e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org  EnsureValidFrame();
239e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
24044c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org  MCSymbol *Label = getContext().CreateTempSymbol();
24144c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org  EmitLabel(Label);
24244c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org  MachineLocation Dest(Register);
243ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org  MachineLocation Source(MachineLocation::VirtualFP);
244e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com  MCCFIInstruction Instruction(Label, Dest, Source);
245e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com  CurFrame->Instructions.push_back(Instruction);
246e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com}
247e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com
248e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid MCStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {
249e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com  EnsureValidFrame();
250e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
251e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com  MCSymbol *Label = getContext().CreateTempSymbol();
252210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org  EmitLabel(Label);
253210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org  MachineLocation Dest(Register, Offset);
254ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org  MachineLocation Source(Register, Offset);
2558f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  MCCFIInstruction Instruction(Label, Dest, Source);
2568f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com  CurFrame->Instructions.push_back(Instruction);
2578f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com}
2588f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com
2598f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid MCStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {
2601643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org  EnsureValidFrame();
261768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
262902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  MCSymbol *Label = getContext().CreateTempSymbol();
26367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  EmitLabel(Label);
26457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  MachineLocation Dest(Register, Offset);
265b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com  MachineLocation Source(Register, Offset);
2661735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org  MCCFIInstruction Instruction(MCCFIInstruction::RelMove, Label, Dest, Source);
2677e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com  CurFrame->Instructions.push_back(Instruction);
268768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org}
269830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com
270e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.comvoid MCStreamer::EmitCFIPersonality(const MCSymbol *Sym,
271a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com                                    unsigned Encoding) {
272a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  EnsureValidFrame();
27332bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
2742a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  CurFrame->Personality = Sym;
2752a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  CurFrame->PersonalityEncoding = Encoding;
2762a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
2772a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
278f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.comvoid MCStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
279f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com  EnsureValidFrame();
280902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
28132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com  CurFrame->Lsda = Sym;
28232bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com  CurFrame->LsdaEncoding = Encoding;
28332bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com}
284902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
2850699e02101405623ad47f225729ed2521b2a0501tomhudson@google.comvoid MCStreamer::EmitCFIRememberState() {
2860699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  EnsureValidFrame();
2870699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
2880699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  MCSymbol *Label = getContext().CreateTempSymbol();
2890699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  EmitLabel(Label);
2900699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  MCCFIInstruction Instruction(MCCFIInstruction::Remember, Label);
2910699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  CurFrame->Instructions.push_back(Instruction);
292ade9a3485e78d471f5f0902e9e50a2ec74c88e76skia.committer@gmail.com}
2931643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org
2941643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.orgvoid MCStreamer::EmitCFIRestoreState() {
2951643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org  // FIXME: Error if there is no matching cfi_remember_state.
2961643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org  EnsureValidFrame();
2971643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
298ade9a3485e78d471f5f0902e9e50a2ec74c88e76skia.committer@gmail.com  MCSymbol *Label = getContext().CreateTempSymbol();
2991643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org  EmitLabel(Label);
3001643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org  MCCFIInstruction Instruction(MCCFIInstruction::Restore, Label);
3011643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org  CurFrame->Instructions.push_back(Instruction);
3021643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org}
3031643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org
3040699e02101405623ad47f225729ed2521b2a0501tomhudson@google.comvoid MCStreamer::EmitCFISameValue(int64_t Register) {
305902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  EnsureValidFrame();
306902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
307902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  MCSymbol *Label = getContext().CreateTempSymbol();
308902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  EmitLabel(Label);
309830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com  MCCFIInstruction Instruction(MCCFIInstruction::SameValue, Label, Register);
310830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com  CurFrame->Instructions.push_back(Instruction);
311830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com}
312830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com
313830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.comvoid MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
314830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com  W64UnwindInfos.push_back(Frame);
3153b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com  CurrentW64UnwindInfo = W64UnwindInfos.back();
31657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org}
31757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org
31857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.orgvoid MCStreamer::EnsureValidW64UnwindInfo() {
31957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
32057f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  if (!CurFrame || CurFrame->End)
32157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    report_fatal_error("No open Win64 EH frame function!");
32257f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org}
3232a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
3242a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid MCStreamer::EmitWin64EHStartProc(const MCSymbol *Symbol) {
3252a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
3262a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  if (CurFrame && !CurFrame->End)
3272a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    report_fatal_error("Starting a function before ending the previous one!");
3282a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  MCWin64EHUnwindInfo *Frame = new MCWin64EHUnwindInfo;
3292a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  Frame->Begin = getContext().CreateTempSymbol();
3302a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  Frame->Function = Symbol;
3312a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  EmitLabel(Frame->Begin);
3322a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org  setCurrentW64UnwindInfo(Frame);
3333b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com}
334902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
335902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid MCStreamer::EmitWin64EHEndProc() {
336902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  EnsureValidW64UnwindInfo();
337  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
338  if (CurFrame->ChainedParent)
339    report_fatal_error("Not all chained regions terminated!");
340  CurFrame->End = getContext().CreateTempSymbol();
341  EmitLabel(CurFrame->End);
342}
343
344void MCStreamer::EmitWin64EHStartChained() {
345  EnsureValidW64UnwindInfo();
346  MCWin64EHUnwindInfo *Frame = new MCWin64EHUnwindInfo;
347  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
348  Frame->Begin = getContext().CreateTempSymbol();
349  Frame->Function = CurFrame->Function;
350  Frame->ChainedParent = CurFrame;
351  EmitLabel(Frame->Begin);
352  setCurrentW64UnwindInfo(Frame);
353}
354
355void MCStreamer::EmitWin64EHEndChained() {
356  EnsureValidW64UnwindInfo();
357  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
358  if (!CurFrame->ChainedParent)
359    report_fatal_error("End of a chained region outside a chained region!");
360  CurFrame->End = getContext().CreateTempSymbol();
361  EmitLabel(CurFrame->End);
362  CurrentW64UnwindInfo = CurFrame->ChainedParent;
363}
364
365void MCStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
366                                    bool Except) {
367  EnsureValidW64UnwindInfo();
368  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
369  if (CurFrame->ChainedParent)
370    report_fatal_error("Chained unwind areas can't have handlers!");
371  CurFrame->ExceptionHandler = Sym;
372  if (!Except && !Unwind)
373    report_fatal_error("Don't know what kind of handler this is!");
374  if (Unwind)
375    CurFrame->HandlesUnwind = true;
376  if (Except)
377    CurFrame->HandlesExceptions = true;
378}
379
380void MCStreamer::EmitWin64EHHandlerData() {
381  EnsureValidW64UnwindInfo();
382  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
383  if (CurFrame->ChainedParent)
384    report_fatal_error("Chained unwind areas can't have handlers!");
385}
386
387void MCStreamer::EmitWin64EHPushReg(unsigned Register) {
388  EnsureValidW64UnwindInfo();
389  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
390  MCSymbol *Label = getContext().CreateTempSymbol();
391  MCWin64EHInstruction Inst(Win64EH::UOP_PushNonVol, Label, Register);
392  EmitLabel(Label);
393  CurFrame->Instructions.push_back(Inst);
394}
395
396void MCStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) {
397  EnsureValidW64UnwindInfo();
398  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
399  if (CurFrame->LastFrameInst >= 0)
400    report_fatal_error("Frame register and offset already specified!");
401  if (Offset & 0x0F)
402    report_fatal_error("Misaligned frame pointer offset!");
403  MCWin64EHInstruction Inst(Win64EH::UOP_SetFPReg, NULL, Register, Offset);
404  CurFrame->LastFrameInst = CurFrame->Instructions.size();
405  CurFrame->Instructions.push_back(Inst);
406}
407
408void MCStreamer::EmitWin64EHAllocStack(unsigned Size) {
409  EnsureValidW64UnwindInfo();
410  if (Size & 7)
411    report_fatal_error("Misaligned stack allocation!");
412  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
413  MCSymbol *Label = getContext().CreateTempSymbol();
414  MCWin64EHInstruction Inst(Label, Size);
415  EmitLabel(Label);
416  CurFrame->Instructions.push_back(Inst);
417}
418
419void MCStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) {
420  EnsureValidW64UnwindInfo();
421  if (Offset & 7)
422    report_fatal_error("Misaligned saved register offset!");
423  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
424  MCSymbol *Label = getContext().CreateTempSymbol();
425  MCWin64EHInstruction Inst(
426     Offset > 512*1024-8 ? Win64EH::UOP_SaveNonVolBig : Win64EH::UOP_SaveNonVol,
427                            Label, Register, Offset);
428  EmitLabel(Label);
429  CurFrame->Instructions.push_back(Inst);
430}
431
432void MCStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) {
433  EnsureValidW64UnwindInfo();
434  if (Offset & 0x0F)
435    report_fatal_error("Misaligned saved vector register offset!");
436  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
437  MCSymbol *Label = getContext().CreateTempSymbol();
438  MCWin64EHInstruction Inst(
439    Offset > 512*1024-16 ? Win64EH::UOP_SaveXMM128Big : Win64EH::UOP_SaveXMM128,
440                            Label, Register, Offset);
441  EmitLabel(Label);
442  CurFrame->Instructions.push_back(Inst);
443}
444
445void MCStreamer::EmitWin64EHPushFrame(bool Code) {
446  EnsureValidW64UnwindInfo();
447  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
448  if (CurFrame->Instructions.size() > 0)
449    report_fatal_error("If present, PushMachFrame must be the first UOP");
450  MCSymbol *Label = getContext().CreateTempSymbol();
451  MCWin64EHInstruction Inst(Win64EH::UOP_PushMachFrame, Label, Code);
452  EmitLabel(Label);
453  CurFrame->Instructions.push_back(Inst);
454}
455
456void MCStreamer::EmitWin64EHEndProlog() {
457  EnsureValidW64UnwindInfo();
458  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
459  CurFrame->PrologEnd = getContext().CreateTempSymbol();
460  EmitLabel(CurFrame->PrologEnd);
461}
462
463void MCStreamer::EmitFnStart() {
464  errs() << "Not implemented yet\n";
465  abort();
466}
467
468void MCStreamer::EmitFnEnd() {
469  errs() << "Not implemented yet\n";
470  abort();
471}
472
473void MCStreamer::EmitCantUnwind() {
474  errs() << "Not implemented yet\n";
475  abort();
476}
477
478void MCStreamer::EmitHandlerData() {
479  errs() << "Not implemented yet\n";
480  abort();
481}
482
483void MCStreamer::EmitPersonality(const MCSymbol *Personality) {
484  errs() << "Not implemented yet\n";
485  abort();
486}
487
488void MCStreamer::EmitSetFP(unsigned FpReg, unsigned SpReg, int64_t Offset) {
489  errs() << "Not implemented yet\n";
490  abort();
491}
492
493void MCStreamer::EmitPad(int64_t Offset) {
494  errs() << "Not implemented yet\n";
495  abort();
496}
497
498void MCStreamer::EmitRegSave(const SmallVectorImpl<unsigned> &RegList, bool) {
499  errs() << "Not implemented yet\n";
500  abort();
501}
502
503/// EmitRawText - If this file is backed by an assembly streamer, this dumps
504/// the specified string in the output .s file.  This capability is
505/// indicated by the hasRawTextSupport() predicate.
506void MCStreamer::EmitRawText(StringRef String) {
507  errs() << "EmitRawText called on an MCStreamer that doesn't support it, "
508  " something must not be fully mc'ized\n";
509  abort();
510}
511
512void MCStreamer::EmitRawText(const Twine &T) {
513  SmallString<128> Str;
514  T.toVector(Str);
515  EmitRawText(Str.str());
516}
517
518void MCStreamer::EmitFrames(bool usingCFI) {
519  if (!getNumFrameInfos())
520    return;
521
522  if (EmitEHFrame)
523    MCDwarfFrameEmitter::Emit(*this, usingCFI, true);
524
525  if (EmitDebugFrame)
526    MCDwarfFrameEmitter::Emit(*this, usingCFI, false);
527}
528
529void MCStreamer::EmitW64Tables() {
530  if (!getNumW64UnwindInfos())
531    return;
532
533  MCWin64EHUnwindEmitter::Emit(*this);
534}
535