[lld] r195852 - [PECOFF] Fix atom ordinals.
Rui Ueyama
ruiu at google.com
Wed Nov 27 09:31:53 PST 2013
Author: ruiu
Date: Wed Nov 27 11:31:53 2013
New Revision: 195852
URL: http://llvm.org/viewvc/llvm-project?rev=195852&view=rev
Log:
[PECOFF] Fix atom ordinals.
Atom ordinals are the indeces in a file. Currently the PECOFF reader assigns
ordinals for each section, so it's (incorrectly) assigning duplicate ordinals.
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h
lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
lld/trunk/test/pecoff/lib.test
Modified: lld/trunk/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h?rev=195852&r1=195851&r2=195852&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h Wed Nov 27 11:31:53 2013
@@ -75,11 +75,10 @@ private:
/// Returns the list of atoms that appeared at the beginning of sections.
SectionToAtomsT filterHeadAtoms(MutableFile &mutableFile) const {
SectionToAtomsT result;
- for (const DefinedAtom *atom : mutableFile.defined()) {
- auto *coffAtom = dyn_cast<COFFDefinedAtom>((COFFBaseDefinedAtom *)atom);
- if (coffAtom && coffAtom->ordinal() == 0)
- result[coffAtom->customSectionName()].push_back(coffAtom);
- }
+ for (const DefinedAtom *atom : mutableFile.defined())
+ if (auto *coffAtom = dyn_cast<COFFDefinedAtom>((COFFBaseDefinedAtom *)atom))
+ if (result.find(coffAtom->customSectionName()) == result.end())
+ result[coffAtom->customSectionName()].push_back(coffAtom);
return result;
}
Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=195852&r1=195851&r2=195852&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Wed Nov 27 11:31:53 2013
@@ -157,6 +157,7 @@ private:
mutable llvm::BumpPtrAllocator _alloc;
const LinkingContext &_context;
+ uint64_t _ordinal;
};
class BumpPtrStringSaver : public llvm::cl::StringSaver {
@@ -279,7 +280,8 @@ DefinedAtom::Merge getMerge(const coff_a
FileCOFF::FileCOFF(const LinkingContext &context,
std::unique_ptr<MemoryBuffer> mb, error_code &ec)
- : File(mb->getBufferIdentifier(), kindObject), _context(context) {
+ : File(mb->getBufferIdentifier(), kindObject), _context(context),
+ _ordinal(0) {
OwningPtr<llvm::object::Binary> bin;
ec = llvm::object::createBinary(mb.release(), bin);
if (ec)
@@ -457,7 +459,7 @@ error_code FileCOFF::createDefinedSymbol
uint32_t size = sym->Value;
auto *atom = new (_alloc)
COFFBSSAtom(*this, name, getScope(sym), DefinedAtom::permRW_,
- DefinedAtom::mergeAsWeakAndAddressUsed, size, 0);
+ DefinedAtom::mergeAsWeakAndAddressUsed, size, _ordinal++);
result.push_back(atom);
continue;
}
@@ -565,7 +567,6 @@ FileCOFF::AtomizeDefinedSymbolsInSection
StringRef sectionName;
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.
@@ -576,7 +577,7 @@ FileCOFF::AtomizeDefinedSymbolsInSection
: si[1]->Value - sym->Value;
auto *atom = new (_alloc) COFFBSSAtom(
*this, _symbolName[sym], getScope(sym), getPermissions(section),
- DefinedAtom::mergeAsWeakAndAddressUsed, size, ++ordinal);
+ DefinedAtom::mergeAsWeakAndAddressUsed, size, _ordinal++);
atoms.push_back(atom);
_symbolAtom[sym] = atom;
}
@@ -609,7 +610,7 @@ FileCOFF::AtomizeDefinedSymbolsInSection
ArrayRef<uint8_t> data(secData.data(), secData.size());
auto *atom = new (_alloc)
COFFDefinedAtom(*this, "", sectionName, Atom::scopeTranslationUnit,
- type, isComdat, perms, _merge[section], data, 0);
+ type, isComdat, perms, _merge[section], data, _ordinal++);
atoms.push_back(atom);
_definedAtomLocations[section][0].push_back(atom);
return error_code::success();
@@ -622,7 +623,7 @@ FileCOFF::AtomizeDefinedSymbolsInSection
ArrayRef<uint8_t> data(secData.data(), size);
auto *atom = new (_alloc) COFFDefinedAtom(
*this, "", sectionName, Atom::scopeTranslationUnit, type, isComdat,
- perms, _merge[section], data, ++ordinal);
+ perms, _merge[section], data, _ordinal++);
atoms.push_back(atom);
_definedAtomLocations[section][0].push_back(atom);
}
@@ -635,7 +636,7 @@ FileCOFF::AtomizeDefinedSymbolsInSection
ArrayRef<uint8_t> data(start, end);
auto *atom = new (_alloc) COFFDefinedAtom(
*this, _symbolName[*si], sectionName, getScope(*si), type, isComdat,
- perms, _merge[section], data, ++ordinal);
+ perms, _merge[section], data, _ordinal++);
atoms.push_back(atom);
_symbolAtom[*si] = atom;
_definedAtomLocations[section][(*si)->Value].push_back(atom);
Modified: lld/trunk/test/pecoff/lib.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/lib.test?rev=195852&r1=195851&r2=195852&view=diff
==============================================================================
--- lld/trunk/test/pecoff/lib.test (original)
+++ lld/trunk/test/pecoff/lib.test Wed Nov 27 11:31:53 2013
@@ -5,8 +5,8 @@
# RUN: lld -flavor link /out:%t1 /subsystem:console /entry:main /opt:noref \
# RUN: -- %t.obj %p/Inputs/static.lib && llvm-objdump -d %t1 | FileCheck %s
-CHECK: Disassembly of section .text:
-CHECK: .text:
-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
+CHECK: Disassembly of section .text:
+CHECK-NEXT: .text:
+CHECK-NEXT: movl 4198400, %eax
+CHECK-NEXT: addl 4198404, %eax
+CHECK-NEXT: ret
More information about the llvm-commits
mailing list