[lld] r195794 - WriterPECOFF
Rui Ueyama
ruiu at google.com
Tue Nov 26 16:23:32 PST 2013
Author: ruiu
Date: Tue Nov 26 18:23:31 2013
New Revision: 195794
URL: http://llvm.org/viewvc/llvm-project?rev=195794&view=rev
Log:
WriterPECOFF
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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Tue Nov 26 18:23:31 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 §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.
@@ -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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/alignment.test (original)
+++ lld/trunk/test/pecoff/alignment.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/base-reloc.test (original)
+++ lld/trunk/test/pecoff/base-reloc.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/bss-section.test (original)
+++ lld/trunk/test/pecoff/bss-section.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/common-symbol.test (original)
+++ lld/trunk/test/pecoff/common-symbol.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/hello.test (original)
+++ lld/trunk/test/pecoff/hello.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/importlib.test (original)
+++ lld/trunk/test/pecoff/importlib.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/lib.test (original)
+++ lld/trunk/test/pecoff/lib.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/multi.test (original)
+++ lld/trunk/test/pecoff/multi.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/reloc.test (original)
+++ lld/trunk/test/pecoff/reloc.test Tue Nov 26 18:23:31 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=195794&r1=195793&r2=195794&view=diff
==============================================================================
--- lld/trunk/test/pecoff/trivial.test (original)
+++ lld/trunk/test/pecoff/trivial.test Tue Nov 26 18:23:31 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