X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FMC%2FMCObjectWriter.h;h=63c833ac20d6d09543880af10238c7e37f2ad914;hb=73ef481b528e1ab0bd943e178d384a926b4cbad9;hp=2211673efc31e484355113b6996a23ce3803c86d;hpb=eafe465f2a0b9ff5c7cee07a555d7d8d099ec0b3;p=oota-llvm.git diff --git a/include/llvm/MC/MCObjectWriter.h b/include/llvm/MC/MCObjectWriter.h index 2211673efc3..63c833ac20d 100644 --- a/include/llvm/MC/MCObjectWriter.h +++ b/include/llvm/MC/MCObjectWriter.h @@ -40,14 +40,18 @@ class MCObjectWriter { MCObjectWriter(const MCObjectWriter &) = delete; void operator=(const MCObjectWriter &) = delete; -protected: - raw_pwrite_stream &OS; + raw_pwrite_stream *OS; +protected: unsigned IsLittleEndian : 1; protected: // Can only create subclasses. MCObjectWriter(raw_pwrite_stream &OS, bool IsLittleEndian) - : OS(OS), IsLittleEndian(IsLittleEndian) {} + : OS(&OS), IsLittleEndian(IsLittleEndian) {} + + unsigned getInitialOffset() { + return OS->tell(); + } public: virtual ~MCObjectWriter(); @@ -57,7 +61,8 @@ public: bool isLittleEndian() const { return IsLittleEndian; } - raw_ostream &getStream() { return OS; } + raw_pwrite_stream &getStream() { return *OS; } + void setStream(raw_pwrite_stream &NewOS) { OS = &NewOS; } /// \name High-Level API /// @{ @@ -91,6 +96,11 @@ public: const MCSymbolRefExpr *B, bool InSet) const; + virtual bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, + const MCSymbol &A, + const MCSymbol &B, + bool InSet) const; + virtual bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, @@ -113,30 +123,30 @@ public: /// \name Binary Output /// @{ - void write8(uint8_t Value) { OS << char(Value); } + void write8(uint8_t Value) { *OS << char(Value); } void writeLE16(uint16_t Value) { - support::endian::Writer(OS).write(Value); + support::endian::Writer(*OS).write(Value); } void writeLE32(uint32_t Value) { - support::endian::Writer(OS).write(Value); + support::endian::Writer(*OS).write(Value); } void writeLE64(uint64_t Value) { - support::endian::Writer(OS).write(Value); + support::endian::Writer(*OS).write(Value); } void writeBE16(uint16_t Value) { - support::endian::Writer(OS).write(Value); + support::endian::Writer(*OS).write(Value); } void writeBE32(uint32_t Value) { - support::endian::Writer(OS).write(Value); + support::endian::Writer(*OS).write(Value); } void writeBE64(uint64_t Value) { - support::endian::Writer(OS).write(Value); + support::endian::Writer(*OS).write(Value); } void write16(uint16_t Value) { @@ -164,9 +174,9 @@ public: const char Zeros[16] = {0}; for (unsigned i = 0, e = N / 16; i != e; ++i) - OS << StringRef(Zeros, 16); + *OS << StringRef(Zeros, 16); - OS << StringRef(Zeros, N % 16); + *OS << StringRef(Zeros, N % 16); } void writeBytes(const SmallVectorImpl &ByteVec, @@ -180,7 +190,7 @@ public: assert( (ZeroFillSize == 0 || Str.size() <= ZeroFillSize) && "data size greater than fill size, unexpected large write will occur"); - OS << Str; + *OS << Str; if (ZeroFillSize) WriteZeros(ZeroFillSize - Str.size()); }