[llvm] r246554 - [MC] Allow MCObjectWriter's output stream to be swapped out
Yaron Keren via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 1 23:56:28 PDT 2015
Thanks!
2015-09-02 2:21 GMT+03:00 David Majnemer <david.majnemer at gmail.com>:
>
>
> On Tue, Sep 1, 2015 at 3:48 PM, Yaron Keren <yaron.keren at gmail.com> wrote:
>
>> MCAssembler also has raw_ostream &OS and now it may diverge from
>> underlying MCObjectWriter &Writer mutable stream. Would it make sense for
>> MCAssembler to use Writer.getStream() instead of OS?
>>
>
> While this divergence could it happen, it would be pretty benign because
> it was only used in MCAssembler::Finish for the calculation of statics.
> Those stats are only used when we've finished writing the object file at
> which time the stream should rather reasonably point to the pre-swap
> location. However, I agree that it doesn't make much sense for it to have
> it's own stream in this brave new world. Fixed in r246604. Thanks!
>
>
>>
>>
>> 2015-09-01 19:19 GMT+03:00 David Majnemer via llvm-commits <
>> llvm-commits at lists.llvm.org>:
>>
>>> Author: majnemer
>>> Date: Tue Sep 1 11:19:03 2015
>>> New Revision: 246554
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=246554&view=rev
>>> Log:
>>> [MC] Allow MCObjectWriter's output stream to be swapped out
>>>
>>> There are occasions where it is useful to consider the entirety of the
>>> contents of a section. For example, compressed debug info needs the
>>> entire section available before it can compress it and write it out.
>>> The compressed debug info scenario was previously implemented by
>>> mirroring the implementation of writeSectionData in the ELFObjectWriter.
>>>
>>> Instead, allow the output stream to be swapped on demand. This lets
>>> callers redirect the output stream to a more convenient location before
>>> it hits the object file.
>>>
>>> No functionality change is intended.
>>>
>>> Differential Revision: http://reviews.llvm.org/D12509
>>>
>>> Modified:
>>> llvm/trunk/include/llvm/MC/MCObjectWriter.h
>>> llvm/trunk/lib/MC/ELFObjectWriter.cpp
>>> llvm/trunk/lib/MC/MachObjectWriter.cpp
>>> llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
>>>
>>> Modified: llvm/trunk/include/llvm/MC/MCObjectWriter.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectWriter.h?rev=246554&r1=246553&r2=246554&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/MC/MCObjectWriter.h (original)
>>> +++ llvm/trunk/include/llvm/MC/MCObjectWriter.h Tue Sep 1 11:19:03 2015
>>> @@ -40,14 +40,14 @@ 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) {}
>>>
>>> public:
>>> virtual ~MCObjectWriter();
>>> @@ -57,7 +57,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
>>> /// @{
>>> @@ -113,30 +114,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<support::little>(OS).write(Value);
>>> + support::endian::Writer<support::little>(*OS).write(Value);
>>> }
>>>
>>> void writeLE32(uint32_t Value) {
>>> - support::endian::Writer<support::little>(OS).write(Value);
>>> + support::endian::Writer<support::little>(*OS).write(Value);
>>> }
>>>
>>> void writeLE64(uint64_t Value) {
>>> - support::endian::Writer<support::little>(OS).write(Value);
>>> + support::endian::Writer<support::little>(*OS).write(Value);
>>> }
>>>
>>> void writeBE16(uint16_t Value) {
>>> - support::endian::Writer<support::big>(OS).write(Value);
>>> + support::endian::Writer<support::big>(*OS).write(Value);
>>> }
>>>
>>> void writeBE32(uint32_t Value) {
>>> - support::endian::Writer<support::big>(OS).write(Value);
>>> + support::endian::Writer<support::big>(*OS).write(Value);
>>> }
>>>
>>> void writeBE64(uint64_t Value) {
>>> - support::endian::Writer<support::big>(OS).write(Value);
>>> + support::endian::Writer<support::big>(*OS).write(Value);
>>> }
>>>
>>> void write16(uint16_t Value) {
>>> @@ -164,9 +165,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<char> &ByteVec,
>>> @@ -180,7 +181,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());
>>> }
>>>
>>> Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
>>> +++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Tue Sep 1 11:19:03 2015
>>> @@ -157,9 +157,9 @@ class ELFObjectWriter : public MCObjectW
>>>
>>> template <typename T> void write(T Val) {
>>> if (IsLittleEndian)
>>> - support::endian::Writer<support::little>(OS).write(Val);
>>> +
>>> support::endian::Writer<support::little>(getStream()).write(Val);
>>> else
>>> - support::endian::Writer<support::big>(OS).write(Val);
>>> + support::endian::Writer<support::big>(getStream()).write(Val);
>>> }
>>>
>>> void writeHeader(const MCAssembler &Asm);
>>> @@ -232,7 +232,7 @@ class ELFObjectWriter : public MCObjectW
>>> }
>>>
>>> void ELFObjectWriter::align(unsigned Alignment) {
>>> - uint64_t Padding = OffsetToAlignment(OS.tell(), Alignment);
>>> + uint64_t Padding = OffsetToAlignment(getStream().tell(), Alignment);
>>> WriteZeros(Padding);
>>> }
>>>
>>> @@ -764,7 +764,7 @@ void ELFObjectWriter::computeSymbolTable
>>> SymbolTableIndex = addToSectionTable(SymtabSection);
>>>
>>> align(SymtabSection->getAlignment());
>>> - uint64_t SecStart = OS.tell();
>>> + uint64_t SecStart = getStream().tell();
>>>
>>> // The first entry is the undefined symbol entry.
>>> Writer.writeSymbol(0, 0, 0, 0, 0, 0, false);
>>> @@ -911,7 +911,7 @@ void ELFObjectWriter::computeSymbolTable
>>> assert(MSD.Symbol->getBinding() != ELF::STB_LOCAL);
>>> }
>>>
>>> - uint64_t SecEnd = OS.tell();
>>> + uint64_t SecEnd = getStream().tell();
>>> SectionOffsets[SymtabSection] = std::make_pair(SecStart, SecEnd);
>>>
>>> ArrayRef<uint32_t> ShndxIndexes = Writer.getShndxIndexes();
>>> @@ -921,12 +921,12 @@ void ELFObjectWriter::computeSymbolTable
>>> }
>>> assert(SymtabShndxSectionIndex != 0);
>>>
>>> - SecStart = OS.tell();
>>> + SecStart = getStream().tell();
>>> const MCSectionELF *SymtabShndxSection =
>>> SectionTable[SymtabShndxSectionIndex - 1];
>>> for (uint32_t Index : ShndxIndexes)
>>> write(Index);
>>> - SecEnd = OS.tell();
>>> + SecEnd = getStream().tell();
>>> SectionOffsets[SymtabShndxSection] = std::make_pair(SecStart, SecEnd);
>>> }
>>>
>>> @@ -957,31 +957,6 @@ ELFObjectWriter::createRelocationSection
>>> return RelaSection;
>>> }
>>>
>>> -static SmallVector<char, 128>
>>> -getUncompressedData(const MCAsmLayout &Layout,
>>> - const MCSection::FragmentListType &Fragments) {
>>> - SmallVector<char, 128> UncompressedData;
>>> - for (const MCFragment &F : Fragments) {
>>> - const SmallVectorImpl<char> *Contents;
>>> - switch (F.getKind()) {
>>> - case MCFragment::FT_Data:
>>> - Contents = &cast<MCDataFragment>(F).getContents();
>>> - break;
>>> - case MCFragment::FT_Dwarf:
>>> - Contents = &cast<MCDwarfLineAddrFragment>(F).getContents();
>>> - break;
>>> - case MCFragment::FT_DwarfFrame:
>>> - Contents = &cast<MCDwarfCallFrameFragment>(F).getContents();
>>> - break;
>>> - default:
>>> - llvm_unreachable(
>>> - "Not expecting any other fragment types in a debug_*
>>> section");
>>> - }
>>> - UncompressedData.append(Contents->begin(), Contents->end());
>>> - }
>>> - return UncompressedData;
>>> -}
>>> -
>>> // Include the debug info compression header:
>>> // "ZLIB" followed by 8 bytes representing the uncompressed size of the
>>> section,
>>> // useful for consumers to preallocate a buffer to decompress into.
>>> @@ -1016,27 +991,29 @@ void ELFObjectWriter::writeSectionData(c
>>> return;
>>> }
>>>
>>> - // Gather the uncompressed data from all the fragments.
>>> - const MCSection::FragmentListType &Fragments =
>>> Section.getFragmentList();
>>> - SmallVector<char, 128> UncompressedData =
>>> - getUncompressedData(Layout, Fragments);
>>> + SmallVector<char, 128> UncompressedData;
>>> + raw_svector_ostream VecOS(UncompressedData);
>>> + raw_pwrite_stream &OldStream = getStream();
>>> + setStream(VecOS);
>>> + Asm.writeSectionData(&Section, Layout);
>>> + setStream(OldStream);
>>>
>>> SmallVector<char, 128> CompressedContents;
>>> zlib::Status Success = zlib::compress(
>>> StringRef(UncompressedData.data(), UncompressedData.size()),
>>> CompressedContents);
>>> if (Success != zlib::StatusOK) {
>>> - Asm.writeSectionData(&Section, Layout);
>>> + getStream() << UncompressedData;
>>> return;
>>> }
>>>
>>> if (!prependCompressionHeader(UncompressedData.size(),
>>> CompressedContents)) {
>>> - Asm.writeSectionData(&Section, Layout);
>>> + getStream() << UncompressedData;
>>> return;
>>> }
>>> Asm.getContext().renameELFSection(&Section,
>>> (".z" +
>>> SectionName.drop_front(1)).str());
>>> - OS << CompressedContents;
>>> + getStream() << CompressedContents;
>>> }
>>>
>>> void ELFObjectWriter::WriteSecHdrEntry(uint32_t Name, uint32_t Type,
>>> @@ -1100,7 +1077,7 @@ void ELFObjectWriter::writeRelocations(c
>>>
>>> const MCSectionELF *ELFObjectWriter::createStringTable(MCContext &Ctx) {
>>> const MCSectionELF *StrtabSection = SectionTable[StringTableIndex -
>>> 1];
>>> - OS << StrTabBuilder.data();
>>> + getStream() << StrTabBuilder.data();
>>> return StrtabSection;
>>> }
>>>
>>> @@ -1209,12 +1186,12 @@ void ELFObjectWriter::writeObject(MCAsse
>>> align(Section.getAlignment());
>>>
>>> // Remember the offset into the file for this section.
>>> - uint64_t SecStart = OS.tell();
>>> + uint64_t SecStart = getStream().tell();
>>>
>>> const MCSymbolELF *SignatureSymbol = Section.getGroup();
>>> writeSectionData(Asm, Section, Layout);
>>>
>>> - uint64_t SecEnd = OS.tell();
>>> + uint64_t SecEnd = getStream().tell();
>>> SectionOffsets[&Section] = std::make_pair(SecStart, SecEnd);
>>>
>>> MCSectionELF *RelSection = createRelocationSection(Ctx, Section);
>>> @@ -1246,7 +1223,7 @@ void ELFObjectWriter::writeObject(MCAsse
>>> align(Group->getAlignment());
>>>
>>> // Remember the offset into the file for this section.
>>> - uint64_t SecStart = OS.tell();
>>> + uint64_t SecStart = getStream().tell();
>>>
>>> const MCSymbol *SignatureSymbol = Group->getGroup();
>>> assert(SignatureSymbol);
>>> @@ -1256,7 +1233,7 @@ void ELFObjectWriter::writeObject(MCAsse
>>> write(SecIndex);
>>> }
>>>
>>> - uint64_t SecEnd = OS.tell();
>>> + uint64_t SecEnd = getStream().tell();
>>> SectionOffsets[Group] = std::make_pair(SecStart, SecEnd);
>>> }
>>>
>>> @@ -1267,25 +1244,25 @@ void ELFObjectWriter::writeObject(MCAsse
>>> align(RelSection->getAlignment());
>>>
>>> // Remember the offset into the file for this section.
>>> - uint64_t SecStart = OS.tell();
>>> + uint64_t SecStart = getStream().tell();
>>>
>>> writeRelocations(Asm, *RelSection->getAssociatedSection());
>>>
>>> - uint64_t SecEnd = OS.tell();
>>> + uint64_t SecEnd = getStream().tell();
>>> SectionOffsets[RelSection] = std::make_pair(SecStart, SecEnd);
>>> }
>>>
>>> {
>>> - uint64_t SecStart = OS.tell();
>>> + uint64_t SecStart = getStream().tell();
>>> const MCSectionELF *Sec = createStringTable(Ctx);
>>> - uint64_t SecEnd = OS.tell();
>>> + uint64_t SecEnd = getStream().tell();
>>> SectionOffsets[Sec] = std::make_pair(SecStart, SecEnd);
>>> }
>>>
>>> uint64_t NaturalAlignment = is64Bit() ? 8 : 4;
>>> align(NaturalAlignment);
>>>
>>> - const unsigned SectionHeaderOffset = OS.tell();
>>> + const unsigned SectionHeaderOffset = getStream().tell();
>>>
>>> // ... then the section header table ...
>>> writeSectionHeader(Layout, SectionIndexMap, SectionOffsets);
>>> @@ -1301,19 +1278,19 @@ void ELFObjectWriter::writeObject(MCAsse
>>> uint64_t Val = SectionHeaderOffset;
>>> if (sys::IsLittleEndianHost != IsLittleEndian)
>>> sys::swapByteOrder(Val);
>>> - OS.pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),
>>> - offsetof(ELF::Elf64_Ehdr, e_shoff));
>>> + getStream().pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),
>>> + offsetof(ELF::Elf64_Ehdr, e_shoff));
>>> NumSectionsOffset = offsetof(ELF::Elf64_Ehdr, e_shnum);
>>> } else {
>>> uint32_t Val = SectionHeaderOffset;
>>> if (sys::IsLittleEndianHost != IsLittleEndian)
>>> sys::swapByteOrder(Val);
>>> - OS.pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),
>>> - offsetof(ELF::Elf32_Ehdr, e_shoff));
>>> + getStream().pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),
>>> + offsetof(ELF::Elf32_Ehdr, e_shoff));
>>> NumSectionsOffset = offsetof(ELF::Elf32_Ehdr, e_shnum);
>>> }
>>> - OS.pwrite(reinterpret_cast<char *>(&NumSections), sizeof(NumSections),
>>> - NumSectionsOffset);
>>> + getStream().pwrite(reinterpret_cast<char *>(&NumSections),
>>> + sizeof(NumSections), NumSectionsOffset);
>>> }
>>>
>>> bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
>>>
>>> Modified: llvm/trunk/lib/MC/MachObjectWriter.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MachObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/MC/MachObjectWriter.cpp (original)
>>> +++ llvm/trunk/lib/MC/MachObjectWriter.cpp Tue Sep 1 11:19:03 2015
>>> @@ -129,7 +129,7 @@ void MachObjectWriter::writeHeader(MachO
>>> // struct mach_header (28 bytes) or
>>> // struct mach_header_64 (32 bytes)
>>>
>>> - uint64_t Start = OS.tell();
>>> + uint64_t Start = getStream().tell();
>>> (void) Start;
>>>
>>> write32(is64Bit() ? MachO::MH_MAGIC_64 : MachO::MH_MAGIC);
>>> @@ -144,8 +144,9 @@ void MachObjectWriter::writeHeader(MachO
>>> if (is64Bit())
>>> write32(0); // reserved
>>>
>>> - assert(OS.tell() - Start ==
>>> - (is64Bit()?sizeof(MachO::mach_header_64):
>>> sizeof(MachO::mach_header)));
>>> + assert(
>>> + getStream().tell() - Start ==
>>> + (is64Bit() ? sizeof(MachO::mach_header_64) :
>>> sizeof(MachO::mach_header)));
>>> }
>>>
>>> /// writeSegmentLoadCommand - Write a segment load command.
>>> @@ -159,7 +160,7 @@ void MachObjectWriter::writeSegmentLoadC
>>> // struct segment_command (56 bytes) or
>>> // struct segment_command_64 (72 bytes)
>>>
>>> - uint64_t Start = OS.tell();
>>> + uint64_t Start = getStream().tell();
>>> (void) Start;
>>>
>>> unsigned SegmentLoadCommandSize =
>>> @@ -190,7 +191,7 @@ void MachObjectWriter::writeSegmentLoadC
>>> write32(NumSections);
>>> write32(0); // flags
>>>
>>> - assert(OS.tell() - Start == SegmentLoadCommandSize);
>>> + assert(getStream().tell() - Start == SegmentLoadCommandSize);
>>> }
>>>
>>> void MachObjectWriter::writeSection(const MCAsmLayout &Layout,
>>> @@ -210,7 +211,7 @@ void MachObjectWriter::writeSection(cons
>>> // struct section (68 bytes) or
>>> // struct section_64 (80 bytes)
>>>
>>> - uint64_t Start = OS.tell();
>>> + uint64_t Start = getStream().tell();
>>> (void) Start;
>>>
>>> writeBytes(Section.getSectionName(), 16);
>>> @@ -234,8 +235,8 @@ void MachObjectWriter::writeSection(cons
>>> if (is64Bit())
>>> write32(0); // reserved3
>>>
>>> - assert(OS.tell() - Start == (is64Bit() ? sizeof(MachO::section_64) :
>>> - sizeof(MachO::section)));
>>> + assert(getStream().tell() - Start ==
>>> + (is64Bit() ? sizeof(MachO::section_64) :
>>> sizeof(MachO::section)));
>>> }
>>>
>>> void MachObjectWriter::writeSymtabLoadCommand(uint32_t SymbolOffset,
>>> @@ -244,7 +245,7 @@ void MachObjectWriter::writeSymtabLoadCo
>>> uint32_t StringTableSize)
>>> {
>>> // struct symtab_command (24 bytes)
>>>
>>> - uint64_t Start = OS.tell();
>>> + uint64_t Start = getStream().tell();
>>> (void) Start;
>>>
>>> write32(MachO::LC_SYMTAB);
>>> @@ -254,7 +255,7 @@ void MachObjectWriter::writeSymtabLoadCo
>>> write32(StringTableOffset);
>>> write32(StringTableSize);
>>>
>>> - assert(OS.tell() - Start == sizeof(MachO::symtab_command));
>>> + assert(getStream().tell() - Start == sizeof(MachO::symtab_command));
>>> }
>>>
>>> void MachObjectWriter::writeDysymtabLoadCommand(uint32_t
>>> FirstLocalSymbol,
>>> @@ -267,7 +268,7 @@ void MachObjectWriter::writeDysymtabLoad
>>> uint32_t
>>> NumIndirectSymbols) {
>>> // struct dysymtab_command (80 bytes)
>>>
>>> - uint64_t Start = OS.tell();
>>> + uint64_t Start = getStream().tell();
>>> (void) Start;
>>>
>>> write32(MachO::LC_DYSYMTAB);
>>> @@ -291,7 +292,7 @@ void MachObjectWriter::writeDysymtabLoad
>>> write32(0); // locreloff
>>> write32(0); // nlocrel
>>>
>>> - assert(OS.tell() - Start == sizeof(MachO::dysymtab_command));
>>> + assert(getStream().tell() - Start == sizeof(MachO::dysymtab_command));
>>> }
>>>
>>> MachObjectWriter::MachSymbolData *
>>> @@ -387,7 +388,7 @@ void MachObjectWriter::writeNlist(MachSy
>>> void MachObjectWriter::writeLinkeditLoadCommand(uint32_t Type,
>>> uint32_t DataOffset,
>>> uint32_t DataSize) {
>>> - uint64_t Start = OS.tell();
>>> + uint64_t Start = getStream().tell();
>>> (void) Start;
>>>
>>> write32(Type);
>>> @@ -395,7 +396,7 @@ void MachObjectWriter::writeLinkeditLoad
>>> write32(DataOffset);
>>> write32(DataSize);
>>>
>>> - assert(OS.tell() - Start == sizeof(MachO::linkedit_data_command));
>>> + assert(getStream().tell() - Start ==
>>> sizeof(MachO::linkedit_data_command));
>>> }
>>>
>>> static unsigned ComputeLinkerOptionsLoadCommandSize(
>>> @@ -411,7 +412,7 @@ void MachObjectWriter::writeLinkerOption
>>> const std::vector<std::string> &Options)
>>> {
>>> unsigned Size = ComputeLinkerOptionsLoadCommandSize(Options,
>>> is64Bit());
>>> - uint64_t Start = OS.tell();
>>> + uint64_t Start = getStream().tell();
>>> (void) Start;
>>>
>>> write32(MachO::LC_LINKER_OPTION);
>>> @@ -427,7 +428,7 @@ void MachObjectWriter::writeLinkerOption
>>> // Pad to a multiple of the pointer size.
>>> writeBytes("", OffsetToAlignment(BytesWritten, is64Bit() ? 8 : 4));
>>>
>>> - assert(OS.tell() - Start == Size);
>>> + assert(getStream().tell() - Start == Size);
>>> }
>>>
>>> void MachObjectWriter::recordRelocation(MCAssembler &Asm,
>>> @@ -906,12 +907,12 @@ void MachObjectWriter::writeObject(MCAss
>>> // Write out the loh commands, if there is one.
>>> if (LOHSize) {
>>> #ifndef NDEBUG
>>> - unsigned Start = OS.tell();
>>> + unsigned Start = getStream().tell();
>>> #endif
>>> Asm.getLOHContainer().emit(*this, Layout);
>>> // Pad to a multiple of the pointer size.
>>> writeBytes("", OffsetToAlignment(LOHRawSize, is64Bit() ? 8 : 4));
>>> - assert(OS.tell() - Start == LOHSize);
>>> + assert(getStream().tell() - Start == LOHSize);
>>> }
>>>
>>> // Write the symbol table data, if used.
>>> @@ -947,7 +948,7 @@ void MachObjectWriter::writeObject(MCAss
>>> writeNlist(Entry, Layout);
>>>
>>> // Write the string table.
>>> - OS << StringTable.data();
>>> + getStream() << StringTable.data();
>>> }
>>> }
>>>
>>>
>>> Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original)
>>> +++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Tue Sep 1 11:19:03 2015
>>> @@ -1037,10 +1037,11 @@ void WinCOFFObjectWriter::writeObject(MC
>>> continue;
>>>
>>> if ((*i)->Header.PointerToRawData != 0) {
>>> - assert(OS.tell() <= (*i)->Header.PointerToRawData &&
>>> + assert(getStream().tell() <= (*i)->Header.PointerToRawData &&
>>> "Section::PointerToRawData is insane!");
>>>
>>> - unsigned SectionDataPadding = (*i)->Header.PointerToRawData -
>>> OS.tell();
>>> + unsigned SectionDataPadding =
>>> + (*i)->Header.PointerToRawData - getStream().tell();
>>> assert(SectionDataPadding < 4 &&
>>> "Should only need at most three bytes of padding!");
>>>
>>> @@ -1050,7 +1051,7 @@ void WinCOFFObjectWriter::writeObject(MC
>>> }
>>>
>>> if ((*i)->Relocations.size() > 0) {
>>> - assert(OS.tell() == (*i)->Header.PointerToRelocations &&
>>> + assert(getStream().tell() == (*i)->Header.PointerToRelocations
>>> &&
>>> "Section::PointerToRelocations is insane!");
>>>
>>> if ((*i)->Relocations.size() >= 0xffff) {
>>> @@ -1071,14 +1072,14 @@ void WinCOFFObjectWriter::writeObject(MC
>>> }
>>> }
>>>
>>> - assert(OS.tell() == Header.PointerToSymbolTable &&
>>> + assert(getStream().tell() == Header.PointerToSymbolTable &&
>>> "Header::PointerToSymbolTable is insane!");
>>>
>>> for (auto &Symbol : Symbols)
>>> if (Symbol->getIndex() != -1)
>>> WriteSymbol(*Symbol);
>>>
>>> - OS.write(Strings.data().data(), Strings.data().size());
>>> + getStream().write(Strings.data().data(), Strings.data().size());
>>> }
>>>
>>> MCWinCOFFObjectTargetWriter::MCWinCOFFObjectTargetWriter(unsigned
>>> Machine_)
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150902/c33dfcef/attachment.html>
More information about the llvm-commits
mailing list