MCStreamer.cpp revision 3ff57094a7d176a759ddb1e1668489d89064f56c
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 EmitULEB128Value that avoids the 41/// client having to pass in a MCExpr for constant integers. 42void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace) { 43 EmitULEB128Value(MCConstantExpr::Create(Value, getContext()), AddrSpace); 44} 45 46/// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the 47/// client having to pass in a MCExpr for constant integers. 48void MCStreamer::EmitSLEB128IntValue(int64_t Value, unsigned AddrSpace) { 49 EmitSLEB128Value(MCConstantExpr::Create(Value, getContext()), AddrSpace); 50} 51 52void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size, 53 unsigned AddrSpace) { 54 EmitValue(MCSymbolRefExpr::Create(Sym, getContext()), Size, AddrSpace); 55} 56 57/// EmitFill - Emit NumBytes bytes worth of the value specified by 58/// FillValue. This implements directives such as '.space'. 59void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue, 60 unsigned AddrSpace) { 61 const MCExpr *E = MCConstantExpr::Create(FillValue, getContext()); 62 for (uint64_t i = 0, e = NumBytes; i != e; ++i) 63 EmitValue(E, 1, AddrSpace); 64} 65 66/// EmitRawText - If this file is backed by an assembly streamer, this dumps 67/// the specified string in the output .s file. This capability is 68/// indicated by the hasRawTextSupport() predicate. 69void MCStreamer::EmitRawText(StringRef String) { 70 errs() << "EmitRawText called on an MCStreamer that doesn't support it, " 71 " something must not be fully mc'ized\n"; 72 abort(); 73} 74 75void MCStreamer::EmitRawText(const Twine &T) { 76 SmallString<128> Str; 77 T.toVector(Str); 78 EmitRawText(Str.str()); 79} 80