Simplify.

What we are trying to do here is to skip object files in group if
group is repeated. This code is simpler than before.

llvm-svn: 226688
This commit is contained in:
Rui Ueyama 2015-01-21 18:54:26 +00:00
parent cfb8ad29b5
commit bcf8918013
2 changed files with 11 additions and 9 deletions

View File

@ -58,7 +58,7 @@ private:
typedef std::function<void(StringRef, bool)> UndefCallback;
bool undefinesAdded(int begin, int end);
File *getFile(int &index, bool &inGroup);
File *getFile(int &index);
/// \brief Add section group/.gnu.linkonce if it does not exist previously.
void maybeAddSectionGroupOrGnuLinkOnce(const DefinedAtom &atom);

View File

@ -254,7 +254,7 @@ bool Resolver::undefinesAdded(int begin, int end) {
return false;
}
File *Resolver::getFile(int &index, bool &inGroup) {
File *Resolver::getFile(int &index) {
std::vector<std::unique_ptr<Node>> &inputs = _context.getNodes();
if ((size_t)index >= inputs.size())
return nullptr;
@ -265,12 +265,10 @@ File *Resolver::getFile(int &index, bool &inGroup) {
int size = group->getSize();
if (undefinesAdded(index - size, index)) {
index -= size;
inGroup = true;
return getFile(index, inGroup);
return getFile(index);
}
++index;
inGroup = false;
return getFile(index, inGroup);
return getFile(index);
}
return cast<FileNode>(inputs[index++].get())->getFile();
}
@ -290,10 +288,10 @@ void Resolver::makePreloadArchiveMap() {
bool Resolver::resolveUndefines() {
ScopedTask task(getDefaultDomain(), "resolveUndefines");
int index = 0;
bool inGroup = false;
std::set<File *> seen;
for (;;) {
bool undefAdded = false;
File *file = getFile(index, inGroup);
File *file = getFile(index);
if (!file)
return true;
if (std::error_code ec = file->parse()) {
@ -304,8 +302,12 @@ bool Resolver::resolveUndefines() {
file->beforeLink();
switch (file->kind()) {
case File::kindObject:
if (inGroup)
// The same file may be visited more than once if the file is
// in --start-group and --end-group. Only library files should
// be processed more than once.
if (seen.count(file))
break;
seen.insert(file);
assert(!file->hasOrdinal());
file->setOrdinal(_context.getNextOrdinalAndIncrement());
undefAdded = handleFile(*file);