[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