[lld] r226632 - Fix --start-group/end-group.
Rui Ueyama
ruiu at google.com
Tue Jan 20 17:26:44 PST 2015
Author: ruiu
Date: Tue Jan 20 19:26:43 2015
New Revision: 226632
URL: http://llvm.org/viewvc/llvm-project?rev=226632&view=rev
Log:
Fix --start-group/end-group.
We used to manage the state whether we are in a group or not
using a counter. The counter is incremented by one if we jump from
end-group to start-group, and decremented by one if we don't.
The counter was assumed to be either zero or one, but obviously it
could be negative (if there's a group which is not repeated at all).
This is a fix for that issue.
Modified:
lld/trunk/include/lld/Core/Resolver.h
lld/trunk/lib/Core/Resolver.cpp
lld/trunk/test/pecoff/Inputs/vars-main-x86.obj.yaml
Modified: lld/trunk/include/lld/Core/Resolver.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Resolver.h?rev=226632&r1=226631&r2=226632&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/Resolver.h (original)
+++ lld/trunk/include/lld/Core/Resolver.h Tue Jan 20 19:26:43 2015
@@ -58,7 +58,7 @@ private:
typedef std::function<void(StringRef, bool)> UndefCallback;
bool undefinesAdded(int begin, int end);
- File *getFile(int &index, int &groupLevel);
+ File *getFile(int &index, bool &inGroup);
/// \brief Add section group/.gnu.linkonce if it does not exist previously.
void maybeAddSectionGroupOrGnuLinkOnce(const DefinedAtom &atom);
Modified: lld/trunk/lib/Core/Resolver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=226632&r1=226631&r2=226632&view=diff
==============================================================================
--- lld/trunk/lib/Core/Resolver.cpp (original)
+++ lld/trunk/lib/Core/Resolver.cpp Tue Jan 20 19:26:43 2015
@@ -254,7 +254,7 @@ bool Resolver::undefinesAdded(int begin,
return false;
}
-File *Resolver::getFile(int &index, int &groupLevel) {
+File *Resolver::getFile(int &index, bool &inGroup) {
std::vector<std::unique_ptr<Node>> &inputs = _context.getNodes();
if ((size_t)index >= inputs.size())
return nullptr;
@@ -265,12 +265,12 @@ File *Resolver::getFile(int &index, int
int size = group->getSize();
if (undefinesAdded(index - size, index)) {
index -= size;
- ++groupLevel;
- return getFile(index, groupLevel);
+ inGroup = true;
+ return getFile(index, inGroup);
}
++index;
- --groupLevel;
- return getFile(index, groupLevel);
+ inGroup = false;
+ return getFile(index, inGroup);
}
return cast<FileNode>(inputs[index++].get())->getFile();
}
@@ -290,10 +290,10 @@ void Resolver::makePreloadArchiveMap() {
bool Resolver::resolveUndefines() {
ScopedTask task(getDefaultDomain(), "resolveUndefines");
int index = 0;
- int groupLevel = 0;
+ bool inGroup = false;
for (;;) {
bool undefAdded = false;
- File *file = getFile(index, groupLevel);
+ File *file = getFile(index, inGroup);
if (!file)
return true;
if (std::error_code ec = file->parse()) {
@@ -304,7 +304,7 @@ bool Resolver::resolveUndefines() {
file->beforeLink();
switch (file->kind()) {
case File::kindObject:
- if (groupLevel > 0)
+ if (inGroup)
break;
assert(!file->hasOrdinal());
file->setOrdinal(_context.getNextOrdinalAndIncrement());
Modified: lld/trunk/test/pecoff/Inputs/vars-main-x86.obj.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/vars-main-x86.obj.yaml?rev=226632&r1=226631&r2=226632&view=diff
==============================================================================
--- lld/trunk/test/pecoff/Inputs/vars-main-x86.obj.yaml (original)
+++ lld/trunk/test/pecoff/Inputs/vars-main-x86.obj.yaml Tue Jan 20 19:26:43 2015
@@ -60,4 +60,10 @@ symbols:
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: ___ImageBase
+ Value: 0
+ SectionNumber: 0
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
...
More information about the llvm-commits
mailing list