summaryrefslogtreecommitdiffstats
path: root/lld/lib/Driver/GnuLdDriver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/Driver/GnuLdDriver.cpp')
-rw-r--r--lld/lib/Driver/GnuLdDriver.cpp27
1 files changed, 15 insertions, 12 deletions
diff --git a/lld/lib/Driver/GnuLdDriver.cpp b/lld/lib/Driver/GnuLdDriver.cpp
index c309e652082..aab08741d38 100644
--- a/lld/lib/Driver/GnuLdDriver.cpp
+++ b/lld/lib/Driver/GnuLdDriver.cpp
@@ -295,7 +295,8 @@ bool GnuLdDriver::parse(int argc, const char *argv[],
}
std::unique_ptr<InputGraph> inputGraph(new InputGraph());
- std::stack<Group *> groupStack;
+ std::stack<int> groupStack;
+ int numfiles = 0;
ELFFileNode::Attributes attributes;
@@ -468,16 +469,21 @@ bool GnuLdDriver::parse(int argc, const char *argv[],
break;
}
- case OPT_start_group: {
- std::unique_ptr<Group> group(new Group());
- groupStack.push(group.get());
- inputGraph->addInputElement(std::move(group));
+ case OPT_start_group:
+ groupStack.push(numfiles);
break;
- }
- case OPT_end_group:
+ case OPT_end_group: {
+ if (groupStack.empty()) {
+ diagnostics << "stray --end-group\n";
+ return false;
+ }
+ int startGroupPos = groupStack.top();
+ inputGraph->addInputElement(
+ llvm::make_unique<GroupEnd>(numfiles - startGroupPos));
groupStack.pop();
break;
+ }
case OPT_z: {
StringRef extOpt = inputArg->getValue();
@@ -552,11 +558,8 @@ bool GnuLdDriver::parse(int argc, const char *argv[],
}
}
std::unique_ptr<InputElement> inputFile(inputNode);
- if (groupStack.empty()) {
- inputGraph->addInputElement(std::move(inputFile));
- } else {
- groupStack.top()->addFile(std::move(inputFile));
- }
+ ++numfiles;
+ inputGraph->addInputElement(std::move(inputFile));
break;
}
OpenPOWER on IntegriCloud