[lld] r195797 - [PECOFF] Add a generic section writer.

Rui Ueyama ruiu at google.com
Tue Nov 26 16:55:45 PST 2013


Author: ruiu
Date: Tue Nov 26 18:55:45 2013
New Revision: 195797

URL: http://llvm.org/viewvc/llvm-project?rev=195797&view=rev
Log:
[PECOFF] Add a generic section writer.

Instead of having multiple SectionChunks for each section (.text, .data,
.rdata and .bss), we could have one chunk writer that can emit any sections.
This patch does that -- removing all section-sepcific chunk writers and
replace them with one "generic" writer.

This change should simplify the code because it eliminates similar-but-
slightly-different classes.

It also fixes an issue in the previous design. Before this patch, we could
emit only limited set of sections (i.e. .text, .data, .rdata and .bss). With
this patch, we can emit any sections.

Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
    lld/trunk/test/pecoff/alignment.test
    lld/trunk/test/pecoff/base-reloc.test
    lld/trunk/test/pecoff/bss-section.test
    lld/trunk/test/pecoff/common-symbol.test
    lld/trunk/test/pecoff/hello.test
    lld/trunk/test/pecoff/importlib.test
    lld/trunk/test/pecoff/lib.test
    lld/trunk/test/pecoff/multi.test
    lld/trunk/test/pecoff/reloc.test
    lld/trunk/test/pecoff/trivial.test

Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Tue Nov 26 18:55:45 2013
@@ -239,14 +239,9 @@ protected:
 /// in memory) and 8 byte entry data size.
 class DataDirectoryChunk : public AtomChunk {
 public:
-  DataDirectoryChunk(const File &linkedFile) : AtomChunk(kindDataDirectory) {
-    // Find the data directory atom.
-    for (const DefinedAtom *atom : linkedFile.defined()) {
-      if (atom->contentType() == DefinedAtom::typeDataDirectoryEntry) {
-        _atomLayouts.push_back(new (_alloc) AtomLayout(atom, 0, 0));
-        return;
-      }
-    }
+  DataDirectoryChunk(const DefinedAtom *atom) : AtomChunk(kindDataDirectory) {
+    if (atom)
+      _atomLayouts.push_back(new (_alloc) AtomLayout(atom, 0, 0));
   }
 
   virtual uint64_t size() const {
@@ -308,107 +303,63 @@ protected:
 
   void buildContents(const File &linkedFile,
                      bool (*isEligible)(const DefinedAtom *));
+  const uint32_t _characteristics;
+
+  llvm::object::coff_section _sectionHeader;
 
 private:
   llvm::object::coff_section
   createSectionHeader(StringRef sectionName, uint32_t characteristics) const;
 
-  llvm::object::coff_section _sectionHeader;
   mutable llvm::BumpPtrAllocator _alloc;
 };
 
-// \brief A TextSectionChunk represents a .text section.
-class TextSectionChunk : public SectionChunk {
+// \brief A GenericSectionChunk represents various sections such as .text or
+// .data.
+class GenericSectionChunk : public SectionChunk {
 public:
   virtual void write(uint8_t *fileBuffer);
 
-  TextSectionChunk(const File &linkedFile)
-      : SectionChunk(".text", characteristics) {
-    buildContents(linkedFile, [](const DefinedAtom *atom) {
-      return atom->contentType() == DefinedAtom::typeCode;
-    });
+  GenericSectionChunk(StringRef name,
+                      const std::vector<const DefinedAtom *> &atoms)
+      : SectionChunk(name, getCharacteristics(name, atoms)) {
+    for (auto *a : atoms)
+      appendAtom(a);
+    _sectionHeader.VirtualSize = _size;
+    _sectionHeader.SizeOfRawData = size();
   }
 
 private:
-  // When loaded into memory, text section should be readable and executable.
-  static const uint32_t characteristics =
-      llvm::COFF::IMAGE_SCN_CNT_CODE | llvm::COFF::IMAGE_SCN_MEM_EXECUTE |
-      llvm::COFF::IMAGE_SCN_MEM_READ;
-};
-
-// \brief A RDataSectionChunk represents a .rdata section.
-class RDataSectionChunk : public SectionChunk {
-public:
-  RDataSectionChunk(const File &linkedFile)
-      : SectionChunk(".rdata", characteristics) {
-    buildContents(linkedFile, [](const DefinedAtom *atom) {
-      return (atom->contentType() == DefinedAtom::typeData &&
-              atom->permissions() == DefinedAtom::permR__);
-    });
-  }
-
-private:
-  // When loaded into memory, rdata section should be readable.
-  static const uint32_t characteristics =
-      llvm::COFF::IMAGE_SCN_MEM_READ |
-      llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA;
-};
-
-// \brief A DataSectionChunk represents a .data section.
-class DataSectionChunk : public SectionChunk {
-public:
-  DataSectionChunk(const File &linkedFile)
-      : SectionChunk(".data", characteristics) {
-    buildContents(linkedFile, [](const DefinedAtom *atom) {
-      return (atom->contentType() == DefinedAtom::typeData &&
-              atom->permissions() == DefinedAtom::permRW_);
-    });
+  uint32_t getCharacteristics(StringRef name,
+                              const std::vector<const DefinedAtom *> &atoms) {
+    const uint32_t code = llvm::COFF::IMAGE_SCN_CNT_CODE;
+    const uint32_t execute = llvm::COFF::IMAGE_SCN_MEM_EXECUTE;
+    const uint32_t read = llvm::COFF::IMAGE_SCN_MEM_READ;
+    const uint32_t write = llvm::COFF::IMAGE_SCN_MEM_WRITE;
+    const uint32_t data = llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA;
+    const uint32_t bss = llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
+    if (name == ".text")
+      return code | execute | read;
+    if (name == ".data")
+      return data | read | write;
+    if (name == ".rdata")
+      return data | read;
+    if (name == ".bss")
+      return bss | read | write;
+    assert(atoms.size() > 0);
+    switch (atoms[0]->permissions()) {
+    case DefinedAtom::permR__:
+      return data | read;
+    case DefinedAtom::permRW_:
+      return data | read | write;
+    case DefinedAtom::permR_X:
+      return code | execute | read;
+    case DefinedAtom::permRWX:
+      return code | execute | read | write;
+    default:
+      llvm_unreachable("Unsupported permission");
+    }
   }
-
-private:
-  // When loaded into memory, data section should be readable and writable.
-  static const uint32_t characteristics =
-      llvm::COFF::IMAGE_SCN_MEM_READ |
-      llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
-      llvm::COFF::IMAGE_SCN_MEM_WRITE;
-};
-
-// \brief A BSSSectionChunk represents a .bss section.
-//
-// Seems link.exe does not emit .bss section but instead merges it with .data
-// section. In COFF, if the size of the section in the header is greater than
-// the size of the actual data on disk, the section on memory is zero-padded.
-// That's why .bss can be merge with .data just by appending it at the end of
-// the section.
-//
-// The executable with .bss is also valid and easier to understand. So we chose
-// to create .bss in LLD.
-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 &sectionHeader =
-        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.
@@ -666,11 +617,16 @@ void DataDirectoryChunk::write(uint8_t *
 }
 
 llvm::object::coff_section &SectionChunk::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.
-  _sectionHeader.VirtualSize = _size;
-  _sectionHeader.SizeOfRawData = size();
+  if (_characteristics & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) {
+    _sectionHeader.VirtualSize = 0;
+    _sectionHeader.PointerToRawData = 0;
+  } else {
+    // 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.
+    _sectionHeader.VirtualSize = _size;
+    _sectionHeader.SizeOfRawData = size();
+  }
   return _sectionHeader;
 }
 
@@ -690,7 +646,7 @@ void SectionChunk::appendAtom(const Defi
 }
 
 SectionChunk::SectionChunk(StringRef sectionName, uint32_t characteristics)
-    : AtomChunk(kindSection),
+    : AtomChunk(kindSection), _characteristics(characteristics),
       _sectionHeader(createSectionHeader(sectionName, characteristics)) {
   // The section should be aligned to disk sector.
   _align = SECTOR_SIZE;
@@ -741,16 +697,20 @@ SectionChunk::createSectionHeader(String
   return header;
 }
 
-void TextSectionChunk::write(uint8_t *fileBuffer) {
+void GenericSectionChunk::write(uint8_t *fileBuffer) {
   if (_atomLayouts.empty())
     return;
-  // Fill the section with INT 3 (0xCC) rather than NUL, so that the
-  // disassembler will not interpret a garbage between atoms as the beginning
-  // of multi-byte machine code. This does not change the behavior of
-  // resulting binary but help debugging.
-  uint8_t *start = fileBuffer + _atomLayouts.front()->_fileOffset;
-  uint8_t *end = fileBuffer + _atomLayouts.back()->_fileOffset;
-  memset(start, 0xCC, end - start);
+  if (_characteristics & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)
+    return;
+  if (_characteristics & llvm::COFF::IMAGE_SCN_CNT_CODE) {
+    // Fill the section with INT 3 (0xCC) rather than NUL, so that the
+    // disassembler will not interpret a garbage between atoms as the beginning
+    // of multi-byte machine code. This does not change the behavior of
+    // resulting binary but help debugging.
+    uint8_t *start = fileBuffer + _atomLayouts.front()->_fileOffset;
+    uint8_t *end = fileBuffer + _atomLayouts.back()->_fileOffset;
+    memset(start, 0xCC, end - start);
+  }
   SectionChunk::write(fileBuffer);
 }
 
@@ -861,7 +821,7 @@ private:
   void addChunk(Chunk *chunk);
   void addSectionChunk(SectionChunk *chunk, SectionHeaderTableChunk *table);
   void setImageSizeOnDisk();
-  void setAddressOfEntryPoint(TextSectionChunk *text, PEHeaderChunk *peHeader);
+  void setAddressOfEntryPoint(SectionChunk *text, PEHeaderChunk *peHeader);
   uint64_t calcSectionSize(llvm::COFF::SectionCharacteristics sectionType);
 
   uint64_t calcSizeOfInitializedData() {
@@ -894,36 +854,87 @@ private:
   std::map<const Atom *, uint64_t> atomRva;
 };
 
+StringRef customSectionName(const DefinedAtom *atom) {
+  assert(atom->sectionChoice() == DefinedAtom::sectionCustomRequired);
+  StringRef s = atom->customSectionName();
+  size_t pos = s.find('$');
+  return (pos == StringRef::npos) ? s : s.substr(0, pos);
+}
+
+StringRef chooseSectionByContent(const DefinedAtom *atom) {
+  switch (atom->contentType()) {
+  case DefinedAtom::typeCode:
+    return ".text";
+  case DefinedAtom::typeZeroFill:
+    return ".bss";
+  case DefinedAtom::typeData:
+    if (atom->permissions() == DefinedAtom::permR__)
+      return ".rdata";
+    if (atom->permissions() == DefinedAtom::permRW_)
+      return ".data";
+    break;
+  default:
+    break;
+  }
+  llvm::errs() << "Atom: contentType=" << atom->contentType()
+               << " permission=" << atom->permissions() << "\n";
+  llvm_unreachable("Failed to choose section based on content");
+}
+
+typedef std::map<StringRef, std::vector<const DefinedAtom *> > AtomVectorMap;
+
+void groupAtoms(const File &file, AtomVectorMap &result,
+                const DefinedAtom *&datadir) {
+  for (const DefinedAtom *atom : file.defined()) {
+    if (atom->sectionChoice() == DefinedAtom::sectionCustomRequired) {
+      result[customSectionName(atom)].push_back(atom);
+      continue;
+    }
+    if (atom->sectionChoice() == DefinedAtom::sectionBasedOnContent) {
+      if (atom->contentType() == DefinedAtom::typeDataDirectoryEntry) {
+        datadir = atom;
+      } else {
+        result[chooseSectionByContent(atom)].push_back(atom);
+      }
+      continue;
+    }
+    llvm_unreachable("Unknown section choice");
+  }
+}
+
 // Create all chunks that consist of the output file.
 void ExecutableWriter::build(const File &linkedFile) {
+  AtomVectorMap atoms;
+  const DefinedAtom *dataDirAtom = nullptr;
+  groupAtoms(linkedFile, atoms, dataDirAtom);
+
   // Create file chunks and add them to the list.
   auto *dosStub = new DOSStubChunk(_PECOFFLinkingContext);
   auto *peHeader = new PEHeaderChunk(_PECOFFLinkingContext);
-  auto *dataDirectory = new DataDirectoryChunk(linkedFile);
+  auto *dataDirectory = new DataDirectoryChunk(dataDirAtom);
   auto *sectionTable = new SectionHeaderTableChunk();
-  auto *text = new TextSectionChunk(linkedFile);
-  auto *rdata = new RDataSectionChunk(linkedFile);
-  auto *data = new DataSectionChunk(linkedFile);
-  auto *bss = new BssSectionChunk(linkedFile);
-  BaseRelocChunk *baseReloc = nullptr;
-  if (_PECOFFLinkingContext.getBaseRelocationEnabled())
-    baseReloc = new BaseRelocChunk(linkedFile);
-
   addChunk(dosStub);
   addChunk(peHeader);
   addChunk(dataDirectory);
   addChunk(sectionTable);
 
-  // Do not add the empty section. Windows loader does not like a section of
-  // size zero and rejects such executable.
-  if (text->size())
-    addSectionChunk(text, sectionTable);
-  if (rdata->size())
-    addSectionChunk(rdata, sectionTable);
-  if (data->size())
-    addSectionChunk(data, sectionTable);
-  if (bss->size())
-    addSectionChunk(bss, sectionTable);
+  SectionChunk *text = nullptr;
+  SectionChunk *data = nullptr;
+  for (auto i : atoms) {
+    StringRef sectionName = i.first;
+    std::vector<const DefinedAtom *> &contents = i.second;
+    auto *section = new GenericSectionChunk(sectionName, contents);
+    addSectionChunk(section, sectionTable);
+
+    if (!text && sectionName == ".text")
+      text = section;
+    else if (!data && (sectionName == ".data" || sectionName == ".rdata"))
+      data = section;
+  }
+
+  BaseRelocChunk *baseReloc = nullptr;
+  if (_PECOFFLinkingContext.getBaseRelocationEnabled())
+    baseReloc = new BaseRelocChunk(linkedFile);
 
   // 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
@@ -942,14 +953,10 @@ void ExecutableWriter::build(const File
   // Now that we know the size and file offset of sections. Set the file
   // header accordingly.
   peHeader->setSizeOfCode(calcSizeOfCode());
-  if (text->size()) {
+  if (text)
     peHeader->setBaseOfCode(text->getVirtualAddress());
-  }
-  if (rdata->size()) {
-    peHeader->setBaseOfData(rdata->getVirtualAddress());
-  } else if (data->size()) {
+  if (data)
     peHeader->setBaseOfData(data->getVirtualAddress());
-  }
   peHeader->setSizeOfInitializedData(calcSizeOfInitializedData());
   peHeader->setSizeOfUninitializedData(calcSizeOfUninitializedData());
   peHeader->setNumberOfSections(_numSections);
@@ -1027,7 +1034,7 @@ void ExecutableWriter::setImageSizeOnDis
   }
 }
 
-void ExecutableWriter::setAddressOfEntryPoint(TextSectionChunk *text,
+void ExecutableWriter::setAddressOfEntryPoint(SectionChunk *text,
                                               PEHeaderChunk *peHeader) {
   // Find the virtual address of the entry point symbol if any.
   // PECOFF spec says that entry point for dll images is optional, in which

Modified: lld/trunk/test/pecoff/alignment.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/alignment.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/alignment.test (original)
+++ lld/trunk/test/pecoff/alignment.test Tue Nov 26 18:55:45 2013
@@ -3,8 +3,8 @@
 # RUN: lld -flavor link /out:%t1 /subsystem:console /force /entry:start \
 # RUN:   -- %t.obj && llvm-readobj -sections %t1 | FileCheck %s
 
-CHECK:      Name: .text
-CHECK-NEXT: VirtualSize: 0x1001
-
-CHECK:      Name: .data
+CHECK:      Name: .data (2E 64 61 74 61 00 00 00)
 CHECK-NEXT: VirtualSize: 0x6
+
+CHECK:      Name: .text (2E 74 65 78 74 00 00 00)
+CHECK-NEXT: VirtualSize: 0x1001

Modified: lld/trunk/test/pecoff/base-reloc.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/base-reloc.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/base-reloc.test (original)
+++ lld/trunk/test/pecoff/base-reloc.test Tue Nov 26 18:55:45 2013
@@ -15,7 +15,7 @@
 # objdump does.
 
 BASEREL-SECTION: Contents of section .reloc:
-BASEREL-SECTION-NEXT:  3000 00100000 0c000000 07300c30 00000000  .........0.0....
+BASEREL-SECTION-NEXT:  3000 00200000 0c000000 07300c30 00000000
 
 NOBASEREL-SECTION-NOT: Contents of section .reloc:
 

Modified: lld/trunk/test/pecoff/bss-section.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/bss-section.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/bss-section.test (original)
+++ lld/trunk/test/pecoff/bss-section.test Tue Nov 26 18:55:45 2013
@@ -2,10 +2,10 @@
 # RUN:    -- %p/Inputs/bss.obj && llvm-readobj -sections %t | FileCheck %s
 
 CHECK:       Section {
-CHECK:         Number: 2
+CHECK:         Number: 1
 CHECK-NEXT:    Name: .bss
 CHECK-NEXT:    VirtualSize: 0x0
-CHECK-NEXT:    VirtualAddress: 0x2000
+CHECK-NEXT:    VirtualAddress: 0x1000
 CHECK-NEXT:    RawDataSize: 1024
 CHECK-NEXT:    PointerToRawData: 0x0
 CHECK-NEXT:    PointerToRelocations: 0x0

Modified: lld/trunk/test/pecoff/common-symbol.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/common-symbol.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/common-symbol.test (original)
+++ lld/trunk/test/pecoff/common-symbol.test Tue Nov 26 18:55:45 2013
@@ -4,10 +4,10 @@
 # RUN:    -- %t.obj %t.obj && llvm-readobj -sections %t | FileCheck %s
 
 CHECK:       Section {
-CHECK:         Number: 2
-CHECK-NEXT:    Name: .bss
+CHECK:         Number: 1
+CHECK-NEXT:    Name: .bss (2E 62 73 73 00 00 00 00)
 CHECK-NEXT:    VirtualSize: 0x0
-CHECK-NEXT:    VirtualAddress: 0x2000
+CHECK-NEXT:    VirtualAddress: 0x1000
 CHECK-NEXT:    RawDataSize: 512
 CHECK-NEXT:    PointerToRawData: 0x0
 CHECK-NEXT:    PointerToRelocations: 0x0

Modified: lld/trunk/test/pecoff/hello.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/hello.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/hello.test (original)
+++ lld/trunk/test/pecoff/hello.test Tue Nov 26 18:55:45 2013
@@ -13,42 +13,41 @@ FILE: }
 # RUN:   -- %t.obj \
 # RUN:   && llvm-readobj -sections %t1 | FileCheck -check-prefix=SECTIONS %s
 
-SECTIONS: Format: COFF-i386
-SECTIONS: Arch: i386
-SECTIONS: AddressSize: 32bit
-SECTIONS: Sections [
-SECTIONS:   Section {
-SECTIONS:     Number: 1
-SECTIONS:     Name: .text (2E 74 65 78 74 00 00 00)
-SECTIONS:     VirtualSize: 0x1C
-SECTIONS:     VirtualAddress: 0x1000
-SECTIONS:     RawDataSize: 512
-SECTIONS:     PointerToRawData: 0x200
-SECTIONS:     PointerToRelocations: 0x0
-SECTIONS:     PointerToLineNumbers: 0x0
-SECTIONS:     RelocationCount: 0
-SECTIONS:     LineNumberCount: 0
-SECTIONS:     Characteristics [ (0x60000020)
-SECTIONS:       IMAGE_SCN_CNT_CODE (0x20)
-SECTIONS:       IMAGE_SCN_MEM_EXECUTE (0x20000000)
-SECTIONS:       IMAGE_SCN_MEM_READ (0x40000000)
-SECTIONS:     ]
-SECTIONS:   }
-SECTIONS:   Section {
-SECTIONS:     Number: 2
-SECTIONS:     Name: .data (2E 64 61 74 61 00 00 00)
-SECTIONS:     VirtualSize: 0x12
-SECTIONS:     VirtualAddress: 0x2000
-SECTIONS:     RawDataSize: 512
-SECTIONS:     PointerToRawData: 0x400
-SECTIONS:     PointerToRelocations: 0x0
-SECTIONS:     PointerToLineNumbers: 0x0
-SECTIONS:     RelocationCount: 0
-SECTIONS:     LineNumberCount: 0
-SECTIONS:     Characteristics [ (0xC0000040)
-SECTIONS:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-SECTIONS:       IMAGE_SCN_MEM_READ (0x40000000)
-SECTIONS:       IMAGE_SCN_MEM_WRITE (0x80000000)
-SECTIONS:     ]
-SECTIONS:   }
-SECTIONS: ]
+SECTIONS:      Format: COFF-i386
+SECTIONS-NEXT: Arch: i386
+SECTIONS-NEXT: AddressSize: 32bit
+SECTIONS-NEXT: Sections [
+SECTIONS-NEXT:   Section {
+SECTIONS-NEXT:     Number: 1
+SECTIONS-NEXT:     Name: .data
+SECTIONS-NEXT:     VirtualSize: 0x12
+SECTIONS-NEXT:     VirtualAddress: 0x1000
+SECTIONS-NEXT:     RawDataSize: 512
+SECTIONS-NEXT:     PointerToRawData: 0x200
+SECTIONS-NEXT:     PointerToRelocations: 0x0
+SECTIONS-NEXT:     PointerToLineNumbers: 0x0
+SECTIONS-NEXT:     RelocationCount: 0
+SECTIONS-NEXT:     LineNumberCount: 0
+SECTIONS-NEXT:     Characteristics [
+SECTIONS-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA
+SECTIONS-NEXT:       IMAGE_SCN_MEM_READ
+SECTIONS-NEXT:       IMAGE_SCN_MEM_WRITE
+SECTIONS-NEXT:     ]
+SECTIONS-NEXT:   }
+SECTIONS-NEXT:   Section {
+SECTIONS-NEXT:     Number: 2
+SECTIONS-NEXT:     Name: .text (2E 74 65 78 74 00 00 00)
+SECTIONS-NEXT:     VirtualSize: 0x1C
+SECTIONS-NEXT:     VirtualAddress: 0x2000
+SECTIONS-NEXT:     RawDataSize: 512
+SECTIONS-NEXT:     PointerToRawData: 0x400
+SECTIONS-NEXT:     PointerToRelocations: 0x0
+SECTIONS-NEXT:     PointerToLineNumbers: 0x0
+SECTIONS-NEXT:     RelocationCount: 0
+SECTIONS-NEXT:     LineNumberCount: 0
+SECTIONS-NEXT:     Characteristics [
+SECTIONS-NEXT:       IMAGE_SCN_CNT_CODE
+SECTIONS-NEXT:       IMAGE_SCN_MEM_EXECUTE
+SECTIONS-NEXT:       IMAGE_SCN_MEM_READ
+SECTIONS-NEXT:     ]
+SECTIONS-NEXT:   }

Modified: lld/trunk/test/pecoff/importlib.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/importlib.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/importlib.test (original)
+++ lld/trunk/test/pecoff/importlib.test Tue Nov 26 18:55:45 2013
@@ -24,15 +24,15 @@
 
 CHECK: Disassembly of section .text:
 CHECK-NEXT: .text:
-CHECK-NEXT:     1000:       55                   pushl   %ebp
-CHECK-NEXT:     1001:       8b ec                movl    %esp, %ebp
-CHECK-NEXT:     1003:       56                   pushl   %esi
-CHECK-NEXT:     1004:       {{[0-9 a-f]+}}       calll *{{[0-9a-f]+}}
-CHECK-NEXT:     100a:       {{[0-9 a-f]+}}       movl {{[0-9a-f]+}}, %ecx
-CHECK-NEXT:     1010:       8b 31                movl    (%ecx), %esi
-CHECK-NEXT:     1012:       03 f0                addl    %eax, %esi
-CHECK-NEXT:     1014:       {{[0-9 a-f]+}}       calll *{{[0-9a-f]+}}
-CHECK-NEXT:     101a:       03 c6                addl    %esi, %eax
-CHECK-NEXT:     101c:       5e                   popl    %esi
-CHECK-NEXT:     101d:       5d                   popl    %ebp
-CHECK-NEXT:     101e:       c3                   ret
+CHECK-NEXT:     pushl   %ebp
+CHECK-NEXT:     movl    %esp, %ebp
+CHECK-NEXT:     pushl   %esi
+CHECK-NEXT:     calll   *{{[0-9]+}}
+CHECK-NEXT:     movl    {{[0-9]+}}, %ecx
+CHECK-NEXT:     movl    (%ecx), %esi
+CHECK-NEXT:     addl    %eax, %esi
+CHECK-NEXT:     calll   *{{[0-9]+}}
+CHECK-NEXT:     addl    %esi, %eax
+CHECK-NEXT:     popl    %esi
+CHECK-NEXT:     popl    %ebp
+CHECK-NEXT:     ret

Modified: lld/trunk/test/pecoff/lib.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/lib.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/lib.test (original)
+++ lld/trunk/test/pecoff/lib.test Tue Nov 26 18:55:45 2013
@@ -7,6 +7,6 @@
 
 CHECK: Disassembly of section .text:
 CHECK: .text:
-CHECK:     1000: a1 04 20 40 00      movl 4202500, %eax
-CHECK:     1005: 03 05 00 20 40 00   addl 4202496, %eax
-CHECK:     100b: c3                  ret
+CHECK:     2000: a1 04 10 40 00      movl    4198404, %eax
+CHECK:     2005: 03 05 00 10 40 00   addl    4198400, %eax
+CHECK:     200b: c3                  ret

Modified: lld/trunk/test/pecoff/multi.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/multi.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/multi.test (original)
+++ lld/trunk/test/pecoff/multi.test Tue Nov 26 18:55:45 2013
@@ -9,6 +9,6 @@
 
 CHECK: Disassembly of section .text:
 CHECK: .text:
-CHECK:     1000: a1 04 20 40 00      movl 4202500, %eax
-CHECK:     1005: 03 05 00 20 40 00   addl 4202496, %eax
-CHECK:     100b: c3                  ret
+CHECK:     movl {{[0-9]+}}, %eax
+CHECK:     addl {{[0-9]+}}, %eax
+CHECK:     ret

Modified: lld/trunk/test/pecoff/reloc.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/reloc.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/reloc.test (original)
+++ lld/trunk/test/pecoff/reloc.test Tue Nov 26 18:55:45 2013
@@ -7,34 +7,34 @@
 
 BEFORE: Disassembly of section .text:
 BEFORE: _main:
-BEFORE:       0:	55
-BEFORE:       1:	89 e5
-BEFORE:       3:	83 ec 14
-BEFORE:       6:	c7 45 fc 00 00 00 00
-BEFORE:       d:	c7 44 24 0c 00 00 00 00
-BEFORE:      15:	c7 44 24 08 07 00 00 00
-BEFORE:      1d:	c7 44 24 04 00 00 00 00
-BEFORE:      25:	c7 04 24 00 00 00 00
-BEFORE:      2c:	ff 15 00 00 00 00
-BEFORE:      32:	83 ec 10
-BEFORE:      35:	31 c0
-BEFORE:      37:	83 c4 14
-BEFORE:      3a:	5d
-BEFORE:      3b:	c3
+BEFORE:       0:        55
+BEFORE:       1:        89 e5
+BEFORE:       3:        83 ec 14
+BEFORE:       6:        c7 45 fc 00 00 00 00
+BEFORE:       d:        c7 44 24 0c 00 00 00 00
+BEFORE:      15:        c7 44 24 08 07 00 00 00
+BEFORE:      1d:        c7 44 24 04 00 00 00 00
+BEFORE:      25:        c7 04 24 00 00 00 00
+BEFORE:      2c:        ff 15 00 00 00 00
+BEFORE:      32:        83 ec 10
+BEFORE:      35:        31 c0
+BEFORE:      37:        83 c4 14
+BEFORE:      3a:        5d
+BEFORE:      3b:        c3
 
 AFTER: Disassembly of section .text:
 AFTER: .text:
-AFTER:    1000:	55
-AFTER:    1001:	89 e5
-AFTER:    1003:	83 ec 14
-AFTER:    1006:	c7 45 fc 00 00 00 00
-AFTER:    100d:	c7 44 24 0c 00 00 00 00
-AFTER:    1015:	c7 44 24 08 07 20 40 00
-AFTER:    101d:	c7 44 24 04 00 20 40 00
-AFTER:    1025:	c7 04 24 00 00 00 00
-AFTER:    102c:	ff 15 00 00 40 00
-AFTER:    1032:	83 ec 10
-AFTER:    1035:	31 c0
-AFTER:    1037:	83 c4 14
-AFTER:    103a:	5d
-AFTER:    103b:	c3
+AFTER:    pushl  %ebp
+AFTER:    movl   %esp, %ebp
+AFTER:    subl   $20, %esp
+AFTER:    movl   $0, -4(%ebp)
+AFTER:    movl   $0, 12(%esp)
+AFTER:    movl   $4198407, 8(%esp)
+AFTER:    movl   $4198400, 4(%esp)
+AFTER:    movl   $0, (%esp)
+AFTER:    calll  *4194304
+AFTER:    subl   $16, %esp
+AFTER:    xorl   %eax, %eax
+AFTER:    addl   $20, %esp
+AFTER:    popl   %ebp
+AFTER:    ret

Modified: lld/trunk/test/pecoff/trivial.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/trivial.test?rev=195797&r1=195796&r2=195797&view=diff
==============================================================================
--- lld/trunk/test/pecoff/trivial.test (original)
+++ lld/trunk/test/pecoff/trivial.test Tue Nov 26 18:55:45 2013
@@ -12,74 +12,90 @@
 # RUN:   -- %t.obj \
 # RUN:   && llvm-readobj -sections %t1 | FileCheck -check-prefix=SECTIONS %s
 
-FILE: Format: COFF-i386
-FILE: Arch: i386
-FILE: AddressSize: 32bit
-FILE: ImageFileHeader {
-FILE:   Machine: IMAGE_FILE_MACHINE_I386 (0x14C)
-FILE:   SectionCount: 1
-FILE:   TimeDateStamp:
-FILE:   PointerToSymbolTable: 0x0
-FILE:   SymbolCount: 0
-FILE:   OptionalHeaderSize: 224
-FILE:   Characteristics [ (0x102)
-FILE:     IMAGE_FILE_32BIT_MACHINE (0x100)
-FILE:     IMAGE_FILE_EXECUTABLE_IMAGE (0x2)
-FILE:   ]
-FILE: }
-FILE: ImageOptionalHeader {
-FILE:   MajorLinkerVersion: 0
-FILE:   MinorLinkerVersion: 0
-FILE:   SizeOfCode: 512
-FILE:   SizeOfInitializedData: 0
-FILE:   SizeOfUninitializedData: 0
-FILE:   AddressOfEntryPoint: 0x1000
-FILE:   BaseOfCode: 0x1000
-FILE:   BaseOfData: 0
-FILE:   ImageBase: 0x400000
-FILE:   SectionAlignment: 4096
-FILE:   FileAlignment: 512
-FILE:   MajorOperatingSystemVersion: 3
-FILE:   MinorOperatingSystemVersion: 11
-FILE:   MajorImageVersion: 1
-FILE:   MinorImageVersion: 25
-FILE:   MajorSubsystemVersion: 3
-FILE:   MinorSubsystemVersion: 11
-FILE:   SizeOfImage: 8192
-FILE:   SizeOfHeaders: 512
-FILE:   Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
-FILE:   Subsystem [ (0x8540)
-FILE:     IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE (0x40)
-FILE:     IMAGE_DLL_CHARACTERISTICS_NO_SEH (0x400)
-FILE:     IMAGE_DLL_CHARACTERISTICS_NX_COMPAT (0x100)
-FILE:     IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE (0x8000)
-FILE:   ]
-FILE:   SizeOfStackReserve: 1048576
-FILE:   SizeOfStackCommit: 4096
-FILE:   SizeOfHeapReserve: 1048576
-FILE:   SizeOfHeapCommit: 4096
-FILE:   NumberOfRvaAndSize: 16
-FILE: }
+FILE:      Format: COFF-i386
+FILE-NEXT: Arch: i386
+FILE-NEXT: AddressSize: 32bit
+FILE-NEXT: ImageFileHeader {
+FILE-NEXT:   Machine: IMAGE_FILE_MACHINE_I386 (0x14C)
+FILE-NEXT:   SectionCount: 2
+FILE-NEXT:   TimeDateStamp:
+FILE-NEXT:   PointerToSymbolTable: 0x0
+FILE-NEXT:   SymbolCount: 0
+FILE-NEXT:   OptionalHeaderSize: 224
+FILE-NEXT:   Characteristics [ (0x102)
+FILE-NEXT:     IMAGE_FILE_32BIT_MACHINE (0x100)
+FILE-NEXT:     IMAGE_FILE_EXECUTABLE_IMAGE (0x2)
+FILE-NEXT:   ]
+FILE-NEXT: }
+FILE-NEXT: ImageOptionalHeader {
+FILE-NEXT:   MajorLinkerVersion: 0
+FILE-NEXT:   MinorLinkerVersion: 0
+FILE-NEXT:   SizeOfCode: 512
+FILE-NEXT:   SizeOfInitializedData: 0
+FILE-NEXT:   SizeOfUninitializedData: 0
+FILE-NEXT:   AddressOfEntryPoint: 0x1000
+FILE-NEXT:   BaseOfCode: 0x1000
+FILE-NEXT:   BaseOfData: 0
+FILE-NEXT:   ImageBase: 0x400000
+FILE-NEXT:   SectionAlignment: 4096
+FILE-NEXT:   FileAlignment: 512
+FILE-NEXT:   MajorOperatingSystemVersion: 3
+FILE-NEXT:   MinorOperatingSystemVersion: 11
+FILE-NEXT:   MajorImageVersion: 1
+FILE-NEXT:   MinorImageVersion: 25
+FILE-NEXT:   MajorSubsystemVersion: 3
+FILE-NEXT:   MinorSubsystemVersion: 11
+FILE-NEXT:   SizeOfImage: 8192
+FILE-NEXT:   SizeOfHeaders: 512
+FILE-NEXT:   Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
+FILE-NEXT:   Subsystem [ (0x8540)
+FILE-NEXT:     IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE (0x40)
+FILE-NEXT:     IMAGE_DLL_CHARACTERISTICS_NO_SEH (0x400)
+FILE-NEXT:     IMAGE_DLL_CHARACTERISTICS_NX_COMPAT (0x100)
+FILE-NEXT:     IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE (0x8000)
+FILE-NEXT:   ]
+FILE-NEXT:   SizeOfStackReserve: 1048576
+FILE-NEXT:   SizeOfStackCommit: 4096
+FILE-NEXT:   SizeOfHeapReserve: 1048576
+FILE-NEXT:   SizeOfHeapCommit: 4096
+FILE-NEXT:   NumberOfRvaAndSize: 16
 
-SECTIONS: Format: COFF-i386
-SECTIONS: Arch: i386
-SECTIONS: AddressSize: 32bit
-SECTIONS: Sections [
-SECTIONS:   Section {
-SECTIONS:     Number: 1
-SECTIONS:     Name: .text (2E 74 65 78 74 00 00 00)
-SECTIONS:     VirtualSize: 0x6
-SECTIONS:     VirtualAddress: 0x1000
-SECTIONS:     RawDataSize: 512
-SECTIONS:     PointerToRawData: 0x200
-SECTIONS:     PointerToRelocations: 0x0
-SECTIONS:     PointerToLineNumbers: 0x0
-SECTIONS:     RelocationCount: 0
-SECTIONS:     LineNumberCount: 0
-SECTIONS:     Characteristics [ (0x60000020)
-SECTIONS:       IMAGE_SCN_CNT_CODE (0x20)
-SECTIONS:       IMAGE_SCN_MEM_EXECUTE (0x20000000)
-SECTIONS:       IMAGE_SCN_MEM_READ (0x40000000)
-SECTIONS:     ]
-SECTIONS:   }
-SECTIONS: ]
+SECTIONS:      Format: COFF-i386
+SECTIONS-NEXT: Arch: i386
+SECTIONS-NEXT: AddressSize: 32bit
+SECTIONS-NEXT: Sections [
+SECTIONS-NEXT:   Section {
+SECTIONS-NEXT:     Number: 1
+SECTIONS-NEXT:     Name: .data (2E 64 61 74 61 00 00 00)
+SECTIONS-NEXT:     VirtualSize: 0x0
+SECTIONS-NEXT:     VirtualAddress: 0x1000
+SECTIONS-NEXT:     RawDataSize: 0
+SECTIONS-NEXT:     PointerToRawData: 0x200
+SECTIONS-NEXT:     PointerToRelocations: 0x0
+SECTIONS-NEXT:     PointerToLineNumbers: 0x0
+SECTIONS-NEXT:     RelocationCount: 0
+SECTIONS-NEXT:     LineNumberCount: 0
+SECTIONS-NEXT:     Characteristics [
+SECTIONS-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA
+SECTIONS-NEXT:       IMAGE_SCN_MEM_READ
+SECTIONS-NEXT:       IMAGE_SCN_MEM_WRITE
+SECTIONS-NEXT:     ]
+SECTIONS-NEXT:   }
+SECTIONS-NEXT:   Section {
+SECTIONS-NEXT:     Number: 2
+SECTIONS-NEXT:     Name: .text (2E 74 65 78 74 00 00 00)
+SECTIONS-NEXT:     VirtualSize: 0x6
+SECTIONS-NEXT:     VirtualAddress: 0x1000
+SECTIONS-NEXT:     RawDataSize: 512
+SECTIONS-NEXT:     PointerToRawData: 0x200
+SECTIONS-NEXT:     PointerToRelocations: 0x0
+SECTIONS-NEXT:     PointerToLineNumbers: 0x0
+SECTIONS-NEXT:     RelocationCount: 0
+SECTIONS-NEXT:     LineNumberCount: 0
+SECTIONS-NEXT:     Characteristics [
+SECTIONS-NEXT:       IMAGE_SCN_CNT_CODE
+SECTIONS-NEXT:       IMAGE_SCN_MEM_EXECUTE
+SECTIONS-NEXT:       IMAGE_SCN_MEM_READ
+SECTIONS-NEXT:     ]
+SECTIONS-NEXT:   }
+SECTIONS-NEXT: ]





More information about the llvm-commits mailing list