| Daniel Dunbar | a11af53 | 2009-06-24 01:03:06 +0000 | [diff] [blame] | 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" | 
| Chris Lattner | ddf6bdd | 2010-01-19 18:45:47 +0000 | [diff] [blame] | 11 | #include "llvm/MC/MCExpr.h" | 
| Chris Lattner | d79d9dc | 2010-01-22 19:17:48 +0000 | [diff] [blame] | 12 | #include "llvm/Support/raw_ostream.h" | 
| Chris Lattner | 58bc4dd | 2010-04-03 22:12:35 +0000 | [diff] [blame] | 13 | #include "llvm/ADT/SmallString.h" | 
|  | 14 | #include "llvm/ADT/Twine.h" | 
| Chris Lattner | 3580dea | 2010-04-03 21:48:59 +0000 | [diff] [blame] | 15 | #include <cstdlib> | 
| Daniel Dunbar | a11af53 | 2009-06-24 01:03:06 +0000 | [diff] [blame] | 16 | using namespace llvm; | 
|  | 17 |  | 
| Benjamin Kramer | 1674b0b | 2010-09-02 18:53:37 +0000 | [diff] [blame^] | 18 | MCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), CurSection(0), | 
|  | 19 | PrevSection(0) { | 
| Daniel Dunbar | a11af53 | 2009-06-24 01:03:06 +0000 | [diff] [blame] | 20 | } | 
|  | 21 |  | 
|  | 22 | MCStreamer::~MCStreamer() { | 
|  | 23 | } | 
| Chris Lattner | ddf6bdd | 2010-01-19 18:45:47 +0000 | [diff] [blame] | 24 |  | 
| Chris Lattner | d79d9dc | 2010-01-22 19:17:48 +0000 | [diff] [blame] | 25 | raw_ostream &MCStreamer::GetCommentOS() { | 
|  | 26 | // By default, discard comments. | 
|  | 27 | return nulls(); | 
|  | 28 | } | 
|  | 29 |  | 
|  | 30 |  | 
| Chris Lattner | 32ae3fe | 2010-01-19 22:03:38 +0000 | [diff] [blame] | 31 | /// EmitIntValue - Special case of EmitValue that avoids the client having to | 
|  | 32 | /// pass in a MCExpr for constant integers. | 
|  | 33 | void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size, | 
|  | 34 | unsigned AddrSpace) { | 
|  | 35 | EmitValue(MCConstantExpr::Create(Value, getContext()), Size, AddrSpace); | 
|  | 36 | } | 
|  | 37 |  | 
| Chris Lattner | 6cde3e6 | 2010-03-09 00:39:24 +0000 | [diff] [blame] | 38 | void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size, | 
|  | 39 | unsigned AddrSpace) { | 
|  | 40 | EmitValue(MCSymbolRefExpr::Create(Sym, getContext()), Size, AddrSpace); | 
|  | 41 | } | 
|  | 42 |  | 
| Chris Lattner | ddf6bdd | 2010-01-19 18:45:47 +0000 | [diff] [blame] | 43 | /// EmitFill - Emit NumBytes bytes worth of the value specified by | 
|  | 44 | /// FillValue.  This implements directives such as '.space'. | 
| Chris Lattner | aaec205 | 2010-01-19 19:46:13 +0000 | [diff] [blame] | 45 | void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue, | 
|  | 46 | unsigned AddrSpace) { | 
| Chris Lattner | ddf6bdd | 2010-01-19 18:45:47 +0000 | [diff] [blame] | 47 | const MCExpr *E = MCConstantExpr::Create(FillValue, getContext()); | 
|  | 48 | for (uint64_t i = 0, e = NumBytes; i != e; ++i) | 
| Chris Lattner | aaec205 | 2010-01-19 19:46:13 +0000 | [diff] [blame] | 49 | EmitValue(E, 1, AddrSpace); | 
| Chris Lattner | ddf6bdd | 2010-01-19 18:45:47 +0000 | [diff] [blame] | 50 | } | 
| Chris Lattner | 91bead7 | 2010-04-03 21:35:55 +0000 | [diff] [blame] | 51 |  | 
| Matt Fleming | ab3b365 | 2010-05-20 19:45:09 +0000 | [diff] [blame] | 52 | /// EmitRawText - If this file is backed by an assembly streamer, this dumps | 
| Chris Lattner | 91bead7 | 2010-04-03 21:35:55 +0000 | [diff] [blame] | 53 | /// the specified string in the output .s file.  This capability is | 
|  | 54 | /// indicated by the hasRawTextSupport() predicate. | 
|  | 55 | void MCStreamer::EmitRawText(StringRef String) { | 
|  | 56 | errs() << "EmitRawText called on an MCStreamer that doesn't support it, " | 
|  | 57 | " something must not be fully mc'ized\n"; | 
|  | 58 | abort(); | 
|  | 59 | } | 
| Chris Lattner | 58bc4dd | 2010-04-03 22:12:35 +0000 | [diff] [blame] | 60 |  | 
|  | 61 | void MCStreamer::EmitRawText(const Twine &T) { | 
|  | 62 | SmallString<128> Str; | 
|  | 63 | T.toVector(Str); | 
|  | 64 | EmitRawText(Str.str()); | 
|  | 65 | } |