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