[lld] r187460 - [PECOFF] Emit BSS section.
Rui Ueyama
ruiu at google.com
Tue Jul 30 16:03:53 PDT 2013
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.
On Tue, Jul 30, 2013 at 3:56 PM, Rui Ueyama <ruiu at google.com> wrote:
> Author: ruiu
> Date: Tue Jul 30 17:56:46 2013
> New Revision: 187460
>
> URL: http://llvm.org/viewvc/llvm-project?rev=187460&view=rev
> Log:
> [PECOFF] Emit BSS section.
>
> Added:
> lld/trunk/test/pecoff/Inputs/bss.asm
> lld/trunk/test/pecoff/Inputs/bss.obj
> lld/trunk/test/pecoff/bss-section.test
> Modified:
> lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
> lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
>
> Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=187460&r1=187459&r2=187460&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Tue Jul 30 17:56:46
> 2013
> @@ -205,14 +205,33 @@ private:
> return a->Value < b->Value;
> }));
>
> - ArrayRef<uint8_t> secData;
> StringRef sectionName;
> - if (error_code ec = _obj->getSectionContents(section, secData))
> - return ec;
> if (error_code ec = _obj->getSectionName(section, sectionName))
> return ec;
> uint64_t ordinal = -1;
>
> + // BSS section does not have contents. If this is the BSS section,
> create
> + // COFFBSSAtom instead of COFFDefinedAtom.
> + if (section->Characteristics &
> + llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) {
> + for (auto si = symbols.begin(), se = symbols.end(); si != se; ++si)
> {
> + const coff_symbol *sym = *si;
> + uint32_t size = (si + 1 == se)
> + ? section->SizeOfRawData - sym->Value
> + : si[1]->Value - sym->Value;
> + auto *atom = new (_alloc) COFFBSSAtom(
> + *this, _symbolName[sym], sym, section, size, sectionName,
> + ++ordinal);
> + atoms.push_back(atom);
> + _symbolAtom[sym] = atom;
> + }
> + return error_code::success();
> + }
> +
> + ArrayRef<uint8_t> secData;
> + if (error_code ec = _obj->getSectionContents(section, secData))
> + return ec;
> +
> // We do not support debug information yet. We could keep data in
> ".debug$S"
> // section in the resultant binary by copying as opaque bytes, but it
> would
> // make the binary hard to debug because of extraneous data. So we'll
> skip
>
> Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=187460&r1=187459&r2=187460&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Tue Jul 30 17:56:46
> 2013
> @@ -432,7 +432,7 @@ public:
>
> virtual uint32_t getVirtualAddress() { return
> _sectionHeader.VirtualAddress; }
>
> - const llvm::object::coff_section &getSectionHeader() {
> + virtual llvm::object::coff_section &getSectionHeader() {
> // Fix up section size before returning it. VirtualSize should be the
> size
> // of the actual content, and SizeOfRawData should be aligned to the
> section
> // alignment.
> @@ -444,7 +444,7 @@ public:
> void appendAtom(const DefinedAtom *atom) {
> auto *layout = new (_alloc) AtomLayout(atom, _size, _size);
> _atomLayouts.push_back(layout);
> - _size += atom->rawContent().size();
> + _size += atom->size();
> }
>
> static bool classof(const Chunk *c) { return c->getKind() ==
> kindSection; }
> @@ -578,6 +578,35 @@ private:
> llvm::COFF::IMAGE_SCN_MEM_WRITE;
> };
>
> +// \brief A DataSectionChunk represents a .data section.
> +class BssSectionChunk : public SectionChunk {
> +public:
> + // BSS section does not have contents, so write should be no-op.
> + virtual void write(uint8_t *fileBuffer) {}
> +
> + virtual llvm::object::coff_section &getSectionHeader() {
> + llvm::object::coff_section §ionHeader =
> + SectionChunk::getSectionHeader();
> + sectionHeader.VirtualSize = 0;
> + sectionHeader.PointerToRawData = 0;
> + return sectionHeader;
> + }
> +
> + BssSectionChunk(const File &linkedFile)
> + : SectionChunk(".bss", characteristics) {
> + buildContents(linkedFile, [](const DefinedAtom *atom) {
> + return atom->contentType() == DefinedAtom::typeZeroFill;
> + });
> + }
> +
> +private:
> + // When loaded into memory, bss section should be readable and writable.
> + static const uint32_t characteristics =
> + llvm::COFF::IMAGE_SCN_MEM_READ |
> + llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
> + llvm::COFF::IMAGE_SCN_MEM_WRITE;
> +};
> +
> /// A BaseRelocAtom represents a base relocation block in ".reloc"
> section.
> class BaseRelocAtom : public coff::COFFLinkerInternalAtom {
> public:
> @@ -701,6 +730,7 @@ public:
> auto *text = new TextSectionChunk(linkedFile);
> auto *rdata = new RDataSectionChunk(linkedFile);
> auto *data = new DataSectionChunk(linkedFile);
> + auto *bss = new BssSectionChunk(linkedFile);
> BaseRelocChunk *baseReloc = nullptr;
> if (_PECOFFTargetInfo.getBaseRelocationEnabled())
> baseReloc = new BaseRelocChunk(linkedFile);
> @@ -718,6 +748,8 @@ public:
> addSectionChunk(rdata, sectionTable);
> if (data->size())
> addSectionChunk(data, sectionTable);
> + if (bss->size())
> + addSectionChunk(bss, sectionTable);
>
> // Now that we know the addresses of all defined atoms that needs to
> be
> // relocated. So we can create the ".reloc" section which contains
> all the
> @@ -745,6 +777,7 @@ public:
> peHeader->setBaseOfData(data->getVirtualAddress());
> }
> peHeader->setSizeOfInitializedData(rdata->size() + data->size());
> + peHeader->setSizeOfUninitializedData(bss->size());
> peHeader->setNumberOfSections(_numSections);
> peHeader->setSizeOfImage(_imageSizeInMemory);
> }
>
> Added: lld/trunk/test/pecoff/Inputs/bss.asm
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/bss.asm?rev=187460&view=auto
>
> ==============================================================================
> --- lld/trunk/test/pecoff/Inputs/bss.asm (added)
> +++ lld/trunk/test/pecoff/Inputs/bss.asm Tue Jul 30 17:56:46 2013
> @@ -0,0 +1,20 @@
> +.586
> +.model flat, c
> +
> +extern ExitProcess at 4 : PROC
> +
> +_BSS SEGMENT
> + _x DD 064H DUP (?)
> + _y DD 064H DUP (?)
> +_BSS ENDS
> +
> +.code
> +start:
> + mov eax, 42
> + mov _x, eax
> + mov eax, _x
> + push eax
> + call ExitProcess at 4
> +end start
> +
> +end
>
> Added: lld/trunk/test/pecoff/Inputs/bss.obj
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/bss.obj?rev=187460&view=auto
>
> ==============================================================================
> 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
>
> Added: lld/trunk/test/pecoff/bss-section.test
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/bss-section.test?rev=187460&view=auto
>
> ==============================================================================
> --- lld/trunk/test/pecoff/bss-section.test (added)
> +++ lld/trunk/test/pecoff/bss-section.test Tue Jul 30 17:56:46 2013
> @@ -0,0 +1,20 @@
> +# RUN: lld -flavor link /out:%t /subsystem:console /force --
> %p/Inputs/bss.obj \
> +# RUN: && llvm-readobj -sections %t | FileCheck %s
> +
> +CHECK: Section {
> +CHECK: Number: 2
> +CHECK-NEXT: Name: .bss
> +CHECK-NEXT: VirtualSize: 0x0
> +CHECK-NEXT: VirtualAddress: 0x2000
> +CHECK-NEXT: RawDataSize: 1024
> +CHECK-NEXT: PointerToRawData: 0x0
> +CHECK-NEXT: PointerToRelocations: 0x0
> +CHECK-NEXT: PointerToLineNumbers: 0x0
> +CHECK-NEXT: RelocationCount: 0
> +CHECK-NEXT: LineNumberCount: 0
> +CHECK-NEXT: Characteristics [
> +CHECK-NEXT: IMAGE_SCN_CNT_UNINITIALIZED_DATA
> +CHECK-NEXT: IMAGE_SCN_MEM_READ
> +CHECK-NEXT: IMAGE_SCN_MEM_WRITE
> +CHECK-NEXT: ]
> +CHECK-NEXT: }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130730/71cdde02/attachment.html>
More information about the llvm-commits
mailing list