MCStreamer.cpp revision 484291c27319668ad99cb87def000254357736fb
1//===- lib/MC/MCStreamer.cpp - Streaming Machine Code Output --------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "llvm/MC/MCStreamer.h" 11#include "llvm/MC/MCExpr.h" 12#include "llvm/MC/MCObjectWriter.h" 13#include "llvm/Support/ErrorHandling.h" 14#include "llvm/Support/raw_ostream.h" 15#include "llvm/ADT/SmallString.h" 16#include "llvm/ADT/Twine.h" 17#include <cstdlib> 18using namespace llvm; 19 20MCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), CurSection(0), 21 PrevSection(0) { 22} 23 24MCStreamer::~MCStreamer() { 25} 26 27raw_ostream &MCStreamer::GetCommentOS() { 28 // By default, discard comments. 29 return nulls(); 30} 31 32 33/// EmitIntValue - Special case of EmitValue that avoids the client having to 34/// pass in a MCExpr for constant integers. 35void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size, 36 unsigned AddrSpace) { 37 EmitValue(MCConstantExpr::Create(Value, getContext()), Size, AddrSpace); 38} 39 40// EmitULEB128Value - Special case of EmitValue that emits a ULEB128 of the 41// Value as the sequence of ULEB128 encoded bytes. 42void MCStreamer::EmitULEB128Value(uint64_t Value, unsigned AddrSpace) { 43 SmallString<32> Tmp; 44 raw_svector_ostream OS(Tmp); 45 MCObjectWriter::EncodeULEB128(Value, OS); 46 EmitBytes(OS.str(), AddrSpace); 47} 48 49// EmitSLEB128Value - Special case of EmitValue that emits a SLEB128 of the 50// Value as the sequence of ULEB128 encoded bytes. 51void MCStreamer::EmitSLEB128Value(int64_t Value, unsigned AddrSpace) { 52 SmallString<32> Tmp; 53 raw_svector_ostream OS(Tmp); 54 MCObjectWriter::EncodeSLEB128(Value, OS); 55 EmitBytes(OS.str(), AddrSpace); 56} 57 58void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size, 59 unsigned AddrSpace) { 60 EmitValue(MCSymbolRefExpr::Create(Sym, getContext()), Size, AddrSpace); 61} 62 63/// EmitFill - Emit NumBytes bytes worth of the value specified by 64/// FillValue. This implements directives such as '.space'. 65void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue, 66 unsigned AddrSpace) { 67 const MCExpr *E = MCConstantExpr::Create(FillValue, getContext()); 68 for (uint64_t i = 0, e = NumBytes; i != e; ++i) 69 EmitValue(E, 1, AddrSpace); 70} 71 72/// EmitRawText - If this file is backed by an assembly streamer, this dumps 73/// the specified string in the output .s file. This capability is 74/// indicated by the hasRawTextSupport() predicate. 75void MCStreamer::EmitRawText(StringRef String) { 76 errs() << "EmitRawText called on an MCStreamer that doesn't support it, " 77 " something must not be fully mc'ized\n"; 78 abort(); 79} 80 81void MCStreamer::EmitRawText(const Twine &T) { 82 SmallString<128> Str; 83 T.toVector(Str); 84 EmitRawText(Str.str()); 85} 86