<div dir="ltr">I tried to use obj2yaml on bss.obj to avoid checking in the binary file, but for some reason the resulting object file converted back with yaml2obj failed to link. I guess the tools are not powerful enough to handle the BSS section and drop some information in the round-trip conversion. I'll take a look when I have time.</div>

<div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jul 30, 2013 at 3:56 PM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Author: ruiu<br>
Date: Tue Jul 30 17:56:46 2013<br>
New Revision: 187460<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=187460&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=187460&view=rev</a><br>
Log:<br>
[PECOFF] Emit BSS section.<br>
<br>
Added:<br>
    lld/trunk/test/pecoff/Inputs/bss.asm<br>
    lld/trunk/test/pecoff/Inputs/bss.obj<br>
    lld/trunk/test/pecoff/bss-section.test<br>
Modified:<br>
    lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp<br>
    lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=187460&r1=187459&r2=187460&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=187460&r1=187459&r2=187460&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Tue Jul 30 17:56:46 2013<br>
@@ -205,14 +205,33 @@ private:<br>
       return a->Value < b->Value;<br>
     }));<br>
<br>
-    ArrayRef<uint8_t> secData;<br>
     StringRef sectionName;<br>
-    if (error_code ec = _obj->getSectionContents(section, secData))<br>
-      return ec;<br>
     if (error_code ec = _obj->getSectionName(section, sectionName))<br>
       return ec;<br>
     uint64_t ordinal = -1;<br>
<br>
+    // BSS section does not have contents. If this is the BSS section, create<br>
+    // COFFBSSAtom instead of COFFDefinedAtom.<br>
+    if (section->Characteristics &<br>
+        llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) {<br>
+      for (auto si = symbols.begin(), se = symbols.end(); si != se; ++si) {<br>
+        const coff_symbol *sym = *si;<br>
+        uint32_t size = (si + 1 == se)<br>
+            ? section->SizeOfRawData - sym->Value<br>
+            : si[1]->Value - sym->Value;<br>
+        auto *atom = new (_alloc) COFFBSSAtom(<br>
+            *this, _symbolName[sym], sym, section, size, sectionName,<br>
+            ++ordinal);<br>
+        atoms.push_back(atom);<br>
+        _symbolAtom[sym] = atom;<br>
+      }<br>
+      return error_code::success();<br>
+    }<br>
+<br>
+    ArrayRef<uint8_t> secData;<br>
+    if (error_code ec = _obj->getSectionContents(section, secData))<br>
+      return ec;<br>
+<br>
     // We do not support debug information yet. We could keep data in ".debug$S"<br>
     // section in the resultant binary by copying as opaque bytes, but it would<br>
     // make the binary hard to debug because of extraneous data. So we'll skip<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=187460&r1=187459&r2=187460&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=187460&r1=187459&r2=187460&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Tue Jul 30 17:56:46 2013<br>
@@ -432,7 +432,7 @@ public:<br>
<br>
   virtual uint32_t getVirtualAddress() { return _sectionHeader.VirtualAddress; }<br>
<br>
-  const llvm::object::coff_section &getSectionHeader() {<br>
+  virtual llvm::object::coff_section &getSectionHeader() {<br>
     // Fix up section size before returning it. VirtualSize should be the size<br>
     // of the actual content, and SizeOfRawData should be aligned to the section<br>
     // alignment.<br>
@@ -444,7 +444,7 @@ public:<br>
   void appendAtom(const DefinedAtom *atom) {<br>
     auto *layout = new (_alloc) AtomLayout(atom, _size, _size);<br>
     _atomLayouts.push_back(layout);<br>
-    _size += atom->rawContent().size();<br>
+    _size += atom->size();<br>
   }<br>
<br>
   static bool classof(const Chunk *c) { return c->getKind() == kindSection; }<br>
@@ -578,6 +578,35 @@ private:<br>
       llvm::COFF::IMAGE_SCN_MEM_WRITE;<br>
 };<br>
<br>
+// \brief A DataSectionChunk represents a .data section.<br>
+class BssSectionChunk : public SectionChunk {<br>
+public:<br>
+  // BSS section does not have contents, so write should be no-op.<br>
+  virtual void write(uint8_t *fileBuffer) {}<br>
+<br>
+  virtual llvm::object::coff_section &getSectionHeader() {<br>
+    llvm::object::coff_section &sectionHeader =<br>
+        SectionChunk::getSectionHeader();<br>
+    sectionHeader.VirtualSize = 0;<br>
+    sectionHeader.PointerToRawData = 0;<br>
+    return sectionHeader;<br>
+  }<br>
+<br>
+  BssSectionChunk(const File &linkedFile)<br>
+      : SectionChunk(".bss", characteristics) {<br>
+    buildContents(linkedFile, [](const DefinedAtom *atom) {<br>
+      return atom->contentType() == DefinedAtom::typeZeroFill;<br>
+    });<br>
+  }<br>
+<br>
+private:<br>
+  // When loaded into memory, bss section should be readable and writable.<br>
+  static const uint32_t characteristics =<br>
+      llvm::COFF::IMAGE_SCN_MEM_READ |<br>
+      llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |<br>
+      llvm::COFF::IMAGE_SCN_MEM_WRITE;<br>
+};<br>
+<br>
 /// A BaseRelocAtom represents a base relocation block in ".reloc" section.<br>
 class BaseRelocAtom : public coff::COFFLinkerInternalAtom {<br>
 public:<br>
@@ -701,6 +730,7 @@ public:<br>
     auto *text = new TextSectionChunk(linkedFile);<br>
     auto *rdata = new RDataSectionChunk(linkedFile);<br>
     auto *data = new DataSectionChunk(linkedFile);<br>
+    auto *bss = new BssSectionChunk(linkedFile);<br>
     BaseRelocChunk *baseReloc = nullptr;<br>
     if (_PECOFFTargetInfo.getBaseRelocationEnabled())<br>
       baseReloc = new BaseRelocChunk(linkedFile);<br>
@@ -718,6 +748,8 @@ public:<br>
       addSectionChunk(rdata, sectionTable);<br>
     if (data->size())<br>
       addSectionChunk(data, sectionTable);<br>
+    if (bss->size())<br>
+      addSectionChunk(bss, sectionTable);<br>
<br>
     // Now that we know the addresses of all defined atoms that needs to be<br>
     // relocated. So we can create the ".reloc" section which contains all the<br>
@@ -745,6 +777,7 @@ public:<br>
       peHeader->setBaseOfData(data->getVirtualAddress());<br>
     }<br>
     peHeader->setSizeOfInitializedData(rdata->size() + data->size());<br>
+    peHeader->setSizeOfUninitializedData(bss->size());<br>
     peHeader->setNumberOfSections(_numSections);<br>
     peHeader->setSizeOfImage(_imageSizeInMemory);<br>
   }<br>
<br>
Added: lld/trunk/test/pecoff/Inputs/bss.asm<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/bss.asm?rev=187460&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/bss.asm?rev=187460&view=auto</a><br>


==============================================================================<br>
--- lld/trunk/test/pecoff/Inputs/bss.asm (added)<br>
+++ lld/trunk/test/pecoff/Inputs/bss.asm Tue Jul 30 17:56:46 2013<br>
@@ -0,0 +1,20 @@<br>
+.586<br>
+.model flat, c<br>
+<br>
+extern ExitProcess@4 : PROC<br>
+<br>
+_BSS   SEGMENT<br>
+       _x      DD      064H DUP (?)<br>
+       _y      DD      064H DUP (?)<br>
+_BSS   ENDS<br>
+<br>
+.code<br>
+start:<br>
+       mov eax, 42<br>
+       mov _x, eax<br>
+       mov eax, _x<br>
+       push eax<br>
+       call ExitProcess@4<br>
+end start<br>
+<br>
+end<br>
<br>
Added: lld/trunk/test/pecoff/Inputs/bss.obj<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/bss.obj?rev=187460&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/bss.obj?rev=187460&view=auto</a><br>


==============================================================================<br>
Binary files lld/trunk/test/pecoff/Inputs/bss.obj (added) and lld/trunk/test/pecoff/Inputs/bss.obj Tue Jul 30 17:56:46 2013 differ<br>
<br>
Added: lld/trunk/test/pecoff/bss-section.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/bss-section.test?rev=187460&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/bss-section.test?rev=187460&view=auto</a><br>


==============================================================================<br>
--- lld/trunk/test/pecoff/bss-section.test (added)<br>
+++ lld/trunk/test/pecoff/bss-section.test Tue Jul 30 17:56:46 2013<br>
@@ -0,0 +1,20 @@<br>
+# RUN: lld -flavor link /out:%t /subsystem:console /force -- %p/Inputs/bss.obj \<br>
+# RUN:    && llvm-readobj -sections %t | FileCheck %s<br>
+<br>
+CHECK:       Section {<br>
+CHECK:         Number: 2<br>
+CHECK-NEXT:    Name: .bss<br>
+CHECK-NEXT:    VirtualSize: 0x0<br>
+CHECK-NEXT:    VirtualAddress: 0x2000<br>
+CHECK-NEXT:    RawDataSize: 1024<br>
+CHECK-NEXT:    PointerToRawData: 0x0<br>
+CHECK-NEXT:    PointerToRelocations: 0x0<br>
+CHECK-NEXT:    PointerToLineNumbers: 0x0<br>
+CHECK-NEXT:    RelocationCount: 0<br>
+CHECK-NEXT:    LineNumberCount: 0<br>
+CHECK-NEXT:    Characteristics [<br>
+CHECK-NEXT:      IMAGE_SCN_CNT_UNINITIALIZED_DATA<br>
+CHECK-NEXT:      IMAGE_SCN_MEM_READ<br>
+CHECK-NEXT:      IMAGE_SCN_MEM_WRITE<br>
+CHECK-NEXT:    ]<br>
+CHECK-NEXT:  }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>