[lld] r190724 - [PECOFF] Fix alignment bug.
Rui Ueyama
ruiu at google.com
Fri Sep 13 14:11:00 PDT 2013
Author: ruiu
Date: Fri Sep 13 16:11:00 2013
New Revision: 190724
URL: http://llvm.org/viewvc/llvm-project?rev=190724&view=rev
Log:
[PECOFF] Fix alignment bug.
There was a bug that if a section has an alignment requirement and there are
multiple symbols at offset 0 in the section, only the last atom at offset 0
would be aligned properly. That bug would move only the last symbol to an
alignment boundary, leaving other symbols unaligned, although they should be at
the same location. That caused a mysterious SEGV error of the resultant
executable.
With this patch, we manage all symbols at the same location properly, rather
than keeping the last one.
Added:
lld/trunk/test/pecoff/Inputs/alignment.obj.yaml
lld/trunk/test/pecoff/alignment.test
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=190724&r1=190723&r2=190724&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Fri Sep 13 16:11:00 2013
@@ -478,7 +478,7 @@ private:
COFFDefinedAtom(*this, "", sectionName, Atom::scopeTranslationUnit,
type, perms, _merge[section], data, 0);
atoms.push_back(atom);
- _definedAtomLocations[section][0] = atom;
+ _definedAtomLocations[section][0].push_back(atom);
return error_code::success();
}
@@ -491,7 +491,7 @@ private:
COFFDefinedAtom(*this, "", sectionName, Atom::scopeTranslationUnit,
type, perms, _merge[section], data, ++ordinal);
atoms.push_back(atom);
- _definedAtomLocations[section][0] = atom;
+ _definedAtomLocations[section][0].push_back(atom);
}
for (auto si = symbols.begin(), se = symbols.end(); si != se; ++si) {
@@ -505,12 +505,12 @@ private:
type, perms, _merge[section], data, ++ordinal);
atoms.push_back(atom);
_symbolAtom[*si] = atom;
- _definedAtomLocations[section][(*si)->Value] = atom;
+ _definedAtomLocations[section][(*si)->Value].push_back(atom);
}
// Finally, set alignment to the first atom so that the section contents
// will be aligned as specified by the object section header.
- _definedAtomLocations[section][0]->setAlignment(getAlignment(section));
+ _definedAtomLocations[section][0][0]->setAlignment(getAlignment(section));
return error_code::success();
}
@@ -542,7 +542,8 @@ private:
COFFDefinedFileAtom *&result, uint32_t &offsetInAtom) {
for (auto i : _definedAtomLocations[section]) {
uint32_t atomAddress = i.first;
- COFFDefinedAtom *atom = i.second;
+ std::vector<COFFDefinedAtom *> &atomsAtSameLocation = i.second;
+ COFFDefinedAtom *atom = atomsAtSameLocation.back();
if (atomAddress <= targetAddress &&
targetAddress < atomAddress + atom->size()) {
result = atom;
@@ -697,7 +698,8 @@ private:
// A sorted map to find an atom from a section and an offset within
// the section.
- std::map<const coff_section *, std::map<uint32_t, COFFDefinedAtom *> >
+ std::map<const coff_section *,
+ std::map<uint32_t, std::vector<COFFDefinedAtom *> > >
_definedAtomLocations;
mutable llvm::BumpPtrAllocator _alloc;
Added: lld/trunk/test/pecoff/Inputs/alignment.obj.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/alignment.obj.yaml?rev=190724&view=auto
==============================================================================
--- lld/trunk/test/pecoff/Inputs/alignment.obj.yaml (added)
+++ lld/trunk/test/pecoff/Inputs/alignment.obj.yaml Fri Sep 13 16:11:00 2013
@@ -0,0 +1,48 @@
+---
+header:
+ Machine: IMAGE_FILE_MACHINE_I386
+ Characteristics: [ ]
+sections:
+ - Name: .text
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ Alignment: 256
+ SectionData: 5589E583EC14C745FC00000000C744240C00000000C744240807000000C744240400000000C7042400000000FF150000000083EC1031C083C4145DC3
+ Relocations:
+ - VirtualAddress: 25
+ SymbolName: .data
+ Type: IMAGE_REL_I386_DIR32
+ - VirtualAddress: 33
+ SymbolName: .data
+ Type: IMAGE_REL_I386_DIR32
+ - Name: .text$1
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ Alignment: 4096
+ SectionData: 00
+ - Name: .data
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
+ Alignment: 4
+ SectionData: 576F726C64210048656C6C6F2C00
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ NumberOfAuxSymbols: 1
+ AuxiliaryData: 3C0000000300000000000000010000000000
+ - Name: .data
+ Value: 0
+ SectionNumber: 2
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ NumberOfAuxSymbols: 1
+ AuxiliaryData: 0E0000000000000000000000020000000000
+ - Name: _start
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_FUNCTION
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+...
Added: lld/trunk/test/pecoff/alignment.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/alignment.test?rev=190724&view=auto
==============================================================================
--- lld/trunk/test/pecoff/alignment.test (added)
+++ lld/trunk/test/pecoff/alignment.test Fri Sep 13 16:11:00 2013
@@ -0,0 +1,6 @@
+# RUN: yaml2obj %p/Inputs/alignment.obj.yaml > %t.obj
+#
+# RUN: lld -flavor link /out:%t1 /subsystem:console /force /entry:start \
+# RUN: -- %t.obj && llvm-readobj -sections %t1 | FileCheck %s
+
+CHECK: VirtualSize: 0x1001
More information about the llvm-commits
mailing list