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