MCStreamer.cpp revision 32a006e606742b1c5401e49607e33717bb5441f0
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/MCContext.h" 11#include "llvm/MC/MCStreamer.h" 12#include "llvm/MC/MCExpr.h" 13#include "llvm/MC/MCObjectWriter.h" 14#include "llvm/Support/ErrorHandling.h" 15#include "llvm/Support/raw_ostream.h" 16#include "llvm/ADT/SmallString.h" 17#include "llvm/ADT/Twine.h" 18#include <cstdlib> 19using namespace llvm; 20 21MCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), CurSection(0), 22 PrevSection(0) { 23} 24 25MCStreamer::~MCStreamer() { 26} 27 28raw_ostream &MCStreamer::GetCommentOS() { 29 // By default, discard comments. 30 return nulls(); 31} 32 33void MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta, 34 const MCSymbol *Label, int PointerSize) { 35 // emit the sequence to set the address 36 EmitIntValue(dwarf::DW_LNS_extended_op, 1); 37 EmitULEB128IntValue(PointerSize + 1); 38 EmitIntValue(dwarf::DW_LNE_set_address, 1); 39 EmitSymbolValue(Label, PointerSize); 40 41 // emit the sequence for the LineDelta (from 1) and a zero address delta. 42 MCDwarfLineAddr::Emit(this, LineDelta, 0); 43} 44 45/// EmitIntValue - Special case of EmitValue that avoids the client having to 46/// pass in a MCExpr for constant integers. 47void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size, 48 unsigned AddrSpace) { 49 EmitValue(MCConstantExpr::Create(Value, getContext()), Size, AddrSpace); 50} 51 52/// EmitULEB128Value - Special case of EmitULEB128Value that avoids the 53/// client having to pass in a MCExpr for constant integers. 54void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace) { 55 EmitULEB128Value(MCConstantExpr::Create(Value, getContext()), AddrSpace); 56} 57 58/// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the 59/// client having to pass in a MCExpr for constant integers. 60void MCStreamer::EmitSLEB128IntValue(int64_t Value, unsigned AddrSpace) { 61 EmitSLEB128Value(MCConstantExpr::Create(Value, getContext()), AddrSpace); 62} 63 64void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size, 65 unsigned AddrSpace) { 66 EmitValue(MCSymbolRefExpr::Create(Sym, getContext()), Size, AddrSpace); 67} 68 69void MCStreamer::EmitGPRel32Value(const MCExpr *Value) { 70 report_fatal_error("unsupported directive in streamer"); 71} 72 73/// EmitFill - Emit NumBytes bytes worth of the value specified by 74/// FillValue. This implements directives such as '.space'. 75void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue, 76 unsigned AddrSpace) { 77 const MCExpr *E = MCConstantExpr::Create(FillValue, getContext()); 78 for (uint64_t i = 0, e = NumBytes; i != e; ++i) 79 EmitValue(E, 1, AddrSpace); 80} 81 82bool MCStreamer::EmitDwarfFileDirective(unsigned FileNo, 83 StringRef Filename) { 84 return getContext().GetDwarfFile(Filename, FileNo) == 0; 85} 86 87void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, 88 unsigned Column, unsigned Flags, 89 unsigned Isa, 90 unsigned Discriminator) { 91 getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa, 92 Discriminator); 93} 94 95bool MCStreamer::EmitCFIStartProc() { 96 return false; 97} 98 99bool MCStreamer::EmitCFIEndProc() { 100 return false; 101} 102 103bool MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) { 104 return false; 105} 106 107bool MCStreamer::EmitCFIDefCfaRegister(int64_t Register) { 108 return false; 109} 110 111bool MCStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) { 112 return false; 113} 114 115bool MCStreamer::EmitCFIPersonality(const MCSymbol *Sym) { 116 return false; 117} 118 119bool MCStreamer::EmitCFILsda(const MCSymbol *Sym) { 120 return false; 121} 122 123/// EmitRawText - If this file is backed by an assembly streamer, this dumps 124/// the specified string in the output .s file. This capability is 125/// indicated by the hasRawTextSupport() predicate. 126void MCStreamer::EmitRawText(StringRef String) { 127 errs() << "EmitRawText called on an MCStreamer that doesn't support it, " 128 " something must not be fully mc'ized\n"; 129 abort(); 130} 131 132void MCStreamer::EmitRawText(const Twine &T) { 133 SmallString<128> Str; 134 T.toVector(Str); 135 EmitRawText(Str.str()); 136} 137