<div dir="rtl"><div dir="ltr">Thanks!</div><div dir="ltr"><br></div></div><div class="gmail_extra"><div dir="ltr"><br><div class="gmail_quote">2015-09-02 2:21 GMT+03:00 David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 .8ex;border-left:1px #ccc solid;border-right:1px #ccc solid;padding-left:1ex;padding-right:1ex"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Tue, Sep 1, 2015 at 3:48 PM, Yaron Keren <span dir="ltr"><<a href="mailto:yaron.keren@gmail.com" target="_blank">yaron.keren@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="rtl"><div dir="ltr">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?</div></div></blockquote><div><br></div></span><div>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!</div><div><div class="h5">















<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="rtl"><div dir="ltr"><br></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote"><div dir="ltr">2015-09-01 19:19 GMT+03:00 David Majnemer via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span>:</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: majnemer<br>
Date: Tue Sep  1 11:19:03 2015<br>
New Revision: 246554<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=246554&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=246554&view=rev</a><br>
Log:<br>
[MC] Allow MCObjectWriter's output stream to be swapped out<br>
<br>
There are occasions where it is useful to consider the entirety of the<br>
contents of a section.  For example, compressed debug info needs the<br>
entire section available before it can compress it and write it out.<br>
The compressed debug info scenario was previously implemented by<br>
mirroring the implementation of writeSectionData in the ELFObjectWriter.<br>
<br>
Instead, allow the output stream to be swapped on demand.  This lets<br>
callers redirect the output stream to a more convenient location before<br>
it hits the object file.<br>
<br>
No functionality change is intended.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D12509" rel="noreferrer" target="_blank">http://reviews.llvm.org/D12509</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/MC/MCObjectWriter.h<br>
    llvm/trunk/lib/MC/ELFObjectWriter.cpp<br>
    llvm/trunk/lib/MC/MachObjectWriter.cpp<br>
    llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCObjectWriter.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectWriter.h?rev=246554&r1=246553&r2=246554&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectWriter.h?rev=246554&r1=246553&r2=246554&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCObjectWriter.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCObjectWriter.h Tue Sep  1 11:19:03 2015<br>
@@ -40,14 +40,14 @@ class MCObjectWriter {<br>
   MCObjectWriter(const MCObjectWriter &) = delete;<br>
   void operator=(const MCObjectWriter &) = delete;<br>
<br>
-protected:<br>
-  raw_pwrite_stream &OS;<br>
+  raw_pwrite_stream *OS;<br>
<br>
+protected:<br>
   unsigned IsLittleEndian : 1;<br>
<br>
 protected: // Can only create subclasses.<br>
   MCObjectWriter(raw_pwrite_stream &OS, bool IsLittleEndian)<br>
-      : OS(OS), IsLittleEndian(IsLittleEndian) {}<br>
+      : OS(&OS), IsLittleEndian(IsLittleEndian) {}<br>
<br>
 public:<br>
   virtual ~MCObjectWriter();<br>
@@ -57,7 +57,8 @@ public:<br>
<br>
   bool isLittleEndian() const { return IsLittleEndian; }<br>
<br>
-  raw_ostream &getStream() { return OS; }<br>
+  raw_pwrite_stream &getStream() { return *OS; }<br>
+  void setStream(raw_pwrite_stream &NewOS) { OS = &NewOS; }<br>
<br>
   /// \name High-Level API<br>
   /// @{<br>
@@ -113,30 +114,30 @@ public:<br>
   /// \name Binary Output<br>
   /// @{<br>
<br>
-  void write8(uint8_t Value) { OS << char(Value); }<br>
+  void write8(uint8_t Value) { *OS << char(Value); }<br>
<br>
   void writeLE16(uint16_t Value) {<br>
-    support::endian::Writer<support::little>(OS).write(Value);<br>
+    support::endian::Writer<support::little>(*OS).write(Value);<br>
   }<br>
<br>
   void writeLE32(uint32_t Value) {<br>
-    support::endian::Writer<support::little>(OS).write(Value);<br>
+    support::endian::Writer<support::little>(*OS).write(Value);<br>
   }<br>
<br>
   void writeLE64(uint64_t Value) {<br>
-    support::endian::Writer<support::little>(OS).write(Value);<br>
+    support::endian::Writer<support::little>(*OS).write(Value);<br>
   }<br>
<br>
   void writeBE16(uint16_t Value) {<br>
-    support::endian::Writer<support::big>(OS).write(Value);<br>
+    support::endian::Writer<support::big>(*OS).write(Value);<br>
   }<br>
<br>
   void writeBE32(uint32_t Value) {<br>
-    support::endian::Writer<support::big>(OS).write(Value);<br>
+    support::endian::Writer<support::big>(*OS).write(Value);<br>
   }<br>
<br>
   void writeBE64(uint64_t Value) {<br>
-    support::endian::Writer<support::big>(OS).write(Value);<br>
+    support::endian::Writer<support::big>(*OS).write(Value);<br>
   }<br>
<br>
   void write16(uint16_t Value) {<br>
@@ -164,9 +165,9 @@ public:<br>
     const char Zeros[16] = {0};<br>
<br>
     for (unsigned i = 0, e = N / 16; i != e; ++i)<br>
-      OS << StringRef(Zeros, 16);<br>
+      *OS << StringRef(Zeros, 16);<br>
<br>
-    OS << StringRef(Zeros, N % 16);<br>
+    *OS << StringRef(Zeros, N % 16);<br>
   }<br>
<br>
   void writeBytes(const SmallVectorImpl<char> &ByteVec,<br>
@@ -180,7 +181,7 @@ public:<br>
     assert(<br>
         (ZeroFillSize == 0 || Str.size() <= ZeroFillSize) &&<br>
         "data size greater than fill size, unexpected large write will occur");<br>
-    OS << Str;<br>
+    *OS << Str;<br>
     if (ZeroFillSize)<br>
       WriteZeros(ZeroFillSize - Str.size());<br>
   }<br>
<br>
Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Tue Sep  1 11:19:03 2015<br>
@@ -157,9 +157,9 @@ class ELFObjectWriter : public MCObjectW<br>
<br>
     template <typename T> void write(T Val) {<br>
       if (IsLittleEndian)<br>
-        support::endian::Writer<support::little>(OS).write(Val);<br>
+        support::endian::Writer<support::little>(getStream()).write(Val);<br>
       else<br>
-        support::endian::Writer<support::big>(OS).write(Val);<br>
+        support::endian::Writer<support::big>(getStream()).write(Val);<br>
     }<br>
<br>
     void writeHeader(const MCAssembler &Asm);<br>
@@ -232,7 +232,7 @@ class ELFObjectWriter : public MCObjectW<br>
 }<br>
<br>
 void ELFObjectWriter::align(unsigned Alignment) {<br>
-  uint64_t Padding = OffsetToAlignment(OS.tell(), Alignment);<br>
+  uint64_t Padding = OffsetToAlignment(getStream().tell(), Alignment);<br>
   WriteZeros(Padding);<br>
 }<br>
<br>
@@ -764,7 +764,7 @@ void ELFObjectWriter::computeSymbolTable<br>
   SymbolTableIndex = addToSectionTable(SymtabSection);<br>
<br>
   align(SymtabSection->getAlignment());<br>
-  uint64_t SecStart = OS.tell();<br>
+  uint64_t SecStart = getStream().tell();<br>
<br>
   // The first entry is the undefined symbol entry.<br>
   Writer.writeSymbol(0, 0, 0, 0, 0, 0, false);<br>
@@ -911,7 +911,7 @@ void ELFObjectWriter::computeSymbolTable<br>
     assert(MSD.Symbol->getBinding() != ELF::STB_LOCAL);<br>
   }<br>
<br>
-  uint64_t SecEnd = OS.tell();<br>
+  uint64_t SecEnd = getStream().tell();<br>
   SectionOffsets[SymtabSection] = std::make_pair(SecStart, SecEnd);<br>
<br>
   ArrayRef<uint32_t> ShndxIndexes = Writer.getShndxIndexes();<br>
@@ -921,12 +921,12 @@ void ELFObjectWriter::computeSymbolTable<br>
   }<br>
   assert(SymtabShndxSectionIndex != 0);<br>
<br>
-  SecStart = OS.tell();<br>
+  SecStart = getStream().tell();<br>
   const MCSectionELF *SymtabShndxSection =<br>
       SectionTable[SymtabShndxSectionIndex - 1];<br>
   for (uint32_t Index : ShndxIndexes)<br>
     write(Index);<br>
-  SecEnd = OS.tell();<br>
+  SecEnd = getStream().tell();<br>
   SectionOffsets[SymtabShndxSection] = std::make_pair(SecStart, SecEnd);<br>
 }<br>
<br>
@@ -957,31 +957,6 @@ ELFObjectWriter::createRelocationSection<br>
   return RelaSection;<br>
 }<br>
<br>
-static SmallVector<char, 128><br>
-getUncompressedData(const MCAsmLayout &Layout,<br>
-                    const MCSection::FragmentListType &Fragments) {<br>
-  SmallVector<char, 128> UncompressedData;<br>
-  for (const MCFragment &F : Fragments) {<br>
-    const SmallVectorImpl<char> *Contents;<br>
-    switch (F.getKind()) {<br>
-    case MCFragment::FT_Data:<br>
-      Contents = &cast<MCDataFragment>(F).getContents();<br>
-      break;<br>
-    case MCFragment::FT_Dwarf:<br>
-      Contents = &cast<MCDwarfLineAddrFragment>(F).getContents();<br>
-      break;<br>
-    case MCFragment::FT_DwarfFrame:<br>
-      Contents = &cast<MCDwarfCallFrameFragment>(F).getContents();<br>
-      break;<br>
-    default:<br>
-      llvm_unreachable(<br>
-          "Not expecting any other fragment types in a debug_* section");<br>
-    }<br>
-    UncompressedData.append(Contents->begin(), Contents->end());<br>
-  }<br>
-  return UncompressedData;<br>
-}<br>
-<br>
 // Include the debug info compression header:<br>
 // "ZLIB" followed by 8 bytes representing the uncompressed size of the section,<br>
 // useful for consumers to preallocate a buffer to decompress into.<br>
@@ -1016,27 +991,29 @@ void ELFObjectWriter::writeSectionData(c<br>
     return;<br>
   }<br>
<br>
-  // Gather the uncompressed data from all the fragments.<br>
-  const MCSection::FragmentListType &Fragments = Section.getFragmentList();<br>
-  SmallVector<char, 128> UncompressedData =<br>
-      getUncompressedData(Layout, Fragments);<br>
+  SmallVector<char, 128> UncompressedData;<br>
+  raw_svector_ostream VecOS(UncompressedData);<br>
+  raw_pwrite_stream &OldStream = getStream();<br>
+  setStream(VecOS);<br>
+  Asm.writeSectionData(&Section, Layout);<br>
+  setStream(OldStream);<br>
<br>
   SmallVector<char, 128> CompressedContents;<br>
   zlib::Status Success = zlib::compress(<br>
       StringRef(UncompressedData.data(), UncompressedData.size()),<br>
       CompressedContents);<br>
   if (Success != zlib::StatusOK) {<br>
-    Asm.writeSectionData(&Section, Layout);<br>
+    getStream() << UncompressedData;<br>
     return;<br>
   }<br>
<br>
   if (!prependCompressionHeader(UncompressedData.size(), CompressedContents)) {<br>
-    Asm.writeSectionData(&Section, Layout);<br>
+    getStream() << UncompressedData;<br>
     return;<br>
   }<br>
   Asm.getContext().renameELFSection(&Section,<br>
                                     (".z" + SectionName.drop_front(1)).str());<br>
-  OS << CompressedContents;<br>
+  getStream() << CompressedContents;<br>
 }<br>
<br>
 void ELFObjectWriter::WriteSecHdrEntry(uint32_t Name, uint32_t Type,<br>
@@ -1100,7 +1077,7 @@ void ELFObjectWriter::writeRelocations(c<br>
<br>
 const MCSectionELF *ELFObjectWriter::createStringTable(MCContext &Ctx) {<br>
   const MCSectionELF *StrtabSection = SectionTable[StringTableIndex - 1];<br>
-  OS << StrTabBuilder.data();<br>
+  getStream() << StrTabBuilder.data();<br>
   return StrtabSection;<br>
 }<br>
<br>
@@ -1209,12 +1186,12 @@ void ELFObjectWriter::writeObject(MCAsse<br>
     align(Section.getAlignment());<br>
<br>
     // Remember the offset into the file for this section.<br>
-    uint64_t SecStart = OS.tell();<br>
+    uint64_t SecStart = getStream().tell();<br>
<br>
     const MCSymbolELF *SignatureSymbol = Section.getGroup();<br>
     writeSectionData(Asm, Section, Layout);<br>
<br>
-    uint64_t SecEnd = OS.tell();<br>
+    uint64_t SecEnd = getStream().tell();<br>
     SectionOffsets[&Section] = std::make_pair(SecStart, SecEnd);<br>
<br>
     MCSectionELF *RelSection = createRelocationSection(Ctx, Section);<br>
@@ -1246,7 +1223,7 @@ void ELFObjectWriter::writeObject(MCAsse<br>
     align(Group->getAlignment());<br>
<br>
     // Remember the offset into the file for this section.<br>
-    uint64_t SecStart = OS.tell();<br>
+    uint64_t SecStart = getStream().tell();<br>
<br>
     const MCSymbol *SignatureSymbol = Group->getGroup();<br>
     assert(SignatureSymbol);<br>
@@ -1256,7 +1233,7 @@ void ELFObjectWriter::writeObject(MCAsse<br>
       write(SecIndex);<br>
     }<br>
<br>
-    uint64_t SecEnd = OS.tell();<br>
+    uint64_t SecEnd = getStream().tell();<br>
     SectionOffsets[Group] = std::make_pair(SecStart, SecEnd);<br>
   }<br>
<br>
@@ -1267,25 +1244,25 @@ void ELFObjectWriter::writeObject(MCAsse<br>
     align(RelSection->getAlignment());<br>
<br>
     // Remember the offset into the file for this section.<br>
-    uint64_t SecStart = OS.tell();<br>
+    uint64_t SecStart = getStream().tell();<br>
<br>
     writeRelocations(Asm, *RelSection->getAssociatedSection());<br>
<br>
-    uint64_t SecEnd = OS.tell();<br>
+    uint64_t SecEnd = getStream().tell();<br>
     SectionOffsets[RelSection] = std::make_pair(SecStart, SecEnd);<br>
   }<br>
<br>
   {<br>
-    uint64_t SecStart = OS.tell();<br>
+    uint64_t SecStart = getStream().tell();<br>
     const MCSectionELF *Sec = createStringTable(Ctx);<br>
-    uint64_t SecEnd = OS.tell();<br>
+    uint64_t SecEnd = getStream().tell();<br>
     SectionOffsets[Sec] = std::make_pair(SecStart, SecEnd);<br>
   }<br>
<br>
   uint64_t NaturalAlignment = is64Bit() ? 8 : 4;<br>
   align(NaturalAlignment);<br>
<br>
-  const unsigned SectionHeaderOffset = OS.tell();<br>
+  const unsigned SectionHeaderOffset = getStream().tell();<br>
<br>
   // ... then the section header table ...<br>
   writeSectionHeader(Layout, SectionIndexMap, SectionOffsets);<br>
@@ -1301,19 +1278,19 @@ void ELFObjectWriter::writeObject(MCAsse<br>
     uint64_t Val = SectionHeaderOffset;<br>
     if (sys::IsLittleEndianHost != IsLittleEndian)<br>
       sys::swapByteOrder(Val);<br>
-    OS.pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),<br>
-              offsetof(ELF::Elf64_Ehdr, e_shoff));<br>
+    getStream().pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),<br>
+                       offsetof(ELF::Elf64_Ehdr, e_shoff));<br>
     NumSectionsOffset = offsetof(ELF::Elf64_Ehdr, e_shnum);<br>
   } else {<br>
     uint32_t Val = SectionHeaderOffset;<br>
     if (sys::IsLittleEndianHost != IsLittleEndian)<br>
       sys::swapByteOrder(Val);<br>
-    OS.pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),<br>
-              offsetof(ELF::Elf32_Ehdr, e_shoff));<br>
+    getStream().pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),<br>
+                       offsetof(ELF::Elf32_Ehdr, e_shoff));<br>
     NumSectionsOffset = offsetof(ELF::Elf32_Ehdr, e_shnum);<br>
   }<br>
-  OS.pwrite(reinterpret_cast<char *>(&NumSections), sizeof(NumSections),<br>
-            NumSectionsOffset);<br>
+  getStream().pwrite(reinterpret_cast<char *>(&NumSections),<br>
+                     sizeof(NumSections), NumSectionsOffset);<br>
 }<br>
<br>
 bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(<br>
<br>
Modified: llvm/trunk/lib/MC/MachObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MachObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MachObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/MC/MachObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/MC/MachObjectWriter.cpp Tue Sep  1 11:19:03 2015<br>
@@ -129,7 +129,7 @@ void MachObjectWriter::writeHeader(MachO<br>
   // struct mach_header (28 bytes) or<br>
   // struct mach_header_64 (32 bytes)<br>
<br>
-  uint64_t Start = OS.tell();<br>
+  uint64_t Start = getStream().tell();<br>
   (void) Start;<br>
<br>
   write32(is64Bit() ? MachO::MH_MAGIC_64 : MachO::MH_MAGIC);<br>
@@ -144,8 +144,9 @@ void MachObjectWriter::writeHeader(MachO<br>
   if (is64Bit())<br>
     write32(0); // reserved<br>
<br>
-  assert(OS.tell() - Start ==<br>
-         (is64Bit()?sizeof(MachO::mach_header_64): sizeof(MachO::mach_header)));<br>
+  assert(<br>
+      getStream().tell() - Start ==<br>
+      (is64Bit() ? sizeof(MachO::mach_header_64) : sizeof(MachO::mach_header)));<br>
 }<br>
<br>
 /// writeSegmentLoadCommand - Write a segment load command.<br>
@@ -159,7 +160,7 @@ void MachObjectWriter::writeSegmentLoadC<br>
   // struct segment_command (56 bytes) or<br>
   // struct segment_command_64 (72 bytes)<br>
<br>
-  uint64_t Start = OS.tell();<br>
+  uint64_t Start = getStream().tell();<br>
   (void) Start;<br>
<br>
   unsigned SegmentLoadCommandSize =<br>
@@ -190,7 +191,7 @@ void MachObjectWriter::writeSegmentLoadC<br>
   write32(NumSections);<br>
   write32(0); // flags<br>
<br>
-  assert(OS.tell() - Start == SegmentLoadCommandSize);<br>
+  assert(getStream().tell() - Start == SegmentLoadCommandSize);<br>
 }<br>
<br>
 void MachObjectWriter::writeSection(const MCAsmLayout &Layout,<br>
@@ -210,7 +211,7 @@ void MachObjectWriter::writeSection(cons<br>
   // struct section (68 bytes) or<br>
   // struct section_64 (80 bytes)<br>
<br>
-  uint64_t Start = OS.tell();<br>
+  uint64_t Start = getStream().tell();<br>
   (void) Start;<br>
<br>
   writeBytes(Section.getSectionName(), 16);<br>
@@ -234,8 +235,8 @@ void MachObjectWriter::writeSection(cons<br>
   if (is64Bit())<br>
     write32(0); // reserved3<br>
<br>
-  assert(OS.tell() - Start == (is64Bit() ? sizeof(MachO::section_64) :<br>
-                               sizeof(MachO::section)));<br>
+  assert(getStream().tell() - Start ==<br>
+         (is64Bit() ? sizeof(MachO::section_64) : sizeof(MachO::section)));<br>
 }<br>
<br>
 void MachObjectWriter::writeSymtabLoadCommand(uint32_t SymbolOffset,<br>
@@ -244,7 +245,7 @@ void MachObjectWriter::writeSymtabLoadCo<br>
                                               uint32_t StringTableSize) {<br>
   // struct symtab_command (24 bytes)<br>
<br>
-  uint64_t Start = OS.tell();<br>
+  uint64_t Start = getStream().tell();<br>
   (void) Start;<br>
<br>
   write32(MachO::LC_SYMTAB);<br>
@@ -254,7 +255,7 @@ void MachObjectWriter::writeSymtabLoadCo<br>
   write32(StringTableOffset);<br>
   write32(StringTableSize);<br>
<br>
-  assert(OS.tell() - Start == sizeof(MachO::symtab_command));<br>
+  assert(getStream().tell() - Start == sizeof(MachO::symtab_command));<br>
 }<br>
<br>
 void MachObjectWriter::writeDysymtabLoadCommand(uint32_t FirstLocalSymbol,<br>
@@ -267,7 +268,7 @@ void MachObjectWriter::writeDysymtabLoad<br>
                                                 uint32_t NumIndirectSymbols) {<br>
   // struct dysymtab_command (80 bytes)<br>
<br>
-  uint64_t Start = OS.tell();<br>
+  uint64_t Start = getStream().tell();<br>
   (void) Start;<br>
<br>
   write32(MachO::LC_DYSYMTAB);<br>
@@ -291,7 +292,7 @@ void MachObjectWriter::writeDysymtabLoad<br>
   write32(0); // locreloff<br>
   write32(0); // nlocrel<br>
<br>
-  assert(OS.tell() - Start == sizeof(MachO::dysymtab_command));<br>
+  assert(getStream().tell() - Start == sizeof(MachO::dysymtab_command));<br>
 }<br>
<br>
 MachObjectWriter::MachSymbolData *<br>
@@ -387,7 +388,7 @@ void MachObjectWriter::writeNlist(MachSy<br>
 void MachObjectWriter::writeLinkeditLoadCommand(uint32_t Type,<br>
                                                 uint32_t DataOffset,<br>
                                                 uint32_t DataSize) {<br>
-  uint64_t Start = OS.tell();<br>
+  uint64_t Start = getStream().tell();<br>
   (void) Start;<br>
<br>
   write32(Type);<br>
@@ -395,7 +396,7 @@ void MachObjectWriter::writeLinkeditLoad<br>
   write32(DataOffset);<br>
   write32(DataSize);<br>
<br>
-  assert(OS.tell() - Start == sizeof(MachO::linkedit_data_command));<br>
+  assert(getStream().tell() - Start == sizeof(MachO::linkedit_data_command));<br>
 }<br>
<br>
 static unsigned ComputeLinkerOptionsLoadCommandSize(<br>
@@ -411,7 +412,7 @@ void MachObjectWriter::writeLinkerOption<br>
   const std::vector<std::string> &Options)<br>
 {<br>
   unsigned Size = ComputeLinkerOptionsLoadCommandSize(Options, is64Bit());<br>
-  uint64_t Start = OS.tell();<br>
+  uint64_t Start = getStream().tell();<br>
   (void) Start;<br>
<br>
   write32(MachO::LC_LINKER_OPTION);<br>
@@ -427,7 +428,7 @@ void MachObjectWriter::writeLinkerOption<br>
   // Pad to a multiple of the pointer size.<br>
   writeBytes("", OffsetToAlignment(BytesWritten, is64Bit() ? 8 : 4));<br>
<br>
-  assert(OS.tell() - Start == Size);<br>
+  assert(getStream().tell() - Start == Size);<br>
 }<br>
<br>
 void MachObjectWriter::recordRelocation(MCAssembler &Asm,<br>
@@ -906,12 +907,12 @@ void MachObjectWriter::writeObject(MCAss<br>
   // Write out the loh commands, if there is one.<br>
   if (LOHSize) {<br>
 #ifndef NDEBUG<br>
-    unsigned Start = OS.tell();<br>
+    unsigned Start = getStream().tell();<br>
 #endif<br>
     Asm.getLOHContainer().emit(*this, Layout);<br>
     // Pad to a multiple of the pointer size.<br>
     writeBytes("", OffsetToAlignment(LOHRawSize, is64Bit() ? 8 : 4));<br>
-    assert(OS.tell() - Start == LOHSize);<br>
+    assert(getStream().tell() - Start == LOHSize);<br>
   }<br>
<br>
   // Write the symbol table data, if used.<br>
@@ -947,7 +948,7 @@ void MachObjectWriter::writeObject(MCAss<br>
         writeNlist(Entry, Layout);<br>
<br>
     // Write the string table.<br>
-    OS << StringTable.data();<br>
+    getStream() << StringTable.data();<br>
   }<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=246554&r1=246553&r2=246554&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Tue Sep  1 11:19:03 2015<br>
@@ -1037,10 +1037,11 @@ void WinCOFFObjectWriter::writeObject(MC<br>
         continue;<br>
<br>
       if ((*i)->Header.PointerToRawData != 0) {<br>
-        assert(OS.tell() <= (*i)->Header.PointerToRawData &&<br>
+        assert(getStream().tell() <= (*i)->Header.PointerToRawData &&<br>
                "Section::PointerToRawData is insane!");<br>
<br>
-        unsigned SectionDataPadding = (*i)->Header.PointerToRawData - OS.tell();<br>
+        unsigned SectionDataPadding =<br>
+            (*i)->Header.PointerToRawData - getStream().tell();<br>
         assert(SectionDataPadding < 4 &&<br>
                "Should only need at most three bytes of padding!");<br>
<br>
@@ -1050,7 +1051,7 @@ void WinCOFFObjectWriter::writeObject(MC<br>
       }<br>
<br>
       if ((*i)->Relocations.size() > 0) {<br>
-        assert(OS.tell() == (*i)->Header.PointerToRelocations &&<br>
+        assert(getStream().tell() == (*i)->Header.PointerToRelocations &&<br>
                "Section::PointerToRelocations is insane!");<br>
<br>
         if ((*i)->Relocations.size() >= 0xffff) {<br>
@@ -1071,14 +1072,14 @@ void WinCOFFObjectWriter::writeObject(MC<br>
     }<br>
   }<br>
<br>
-  assert(OS.tell() == Header.PointerToSymbolTable &&<br>
+  assert(getStream().tell() == Header.PointerToSymbolTable &&<br>
          "Header::PointerToSymbolTable is insane!");<br>
<br>
   for (auto &Symbol : Symbols)<br>
     if (Symbol->getIndex() != -1)<br>
       WriteSymbol(*Symbol);<br>
<br>
-  OS.write(Strings.data().data(), Strings.data().size());<br>
+  getStream().write(Strings.data().data(), Strings.data().size());<br>
 }<br>
<br>
 MCWinCOFFObjectTargetWriter::MCWinCOFFObjectTargetWriter(unsigned Machine_)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div></div></div><br></div></blockquote></div></div></div>