Simplify LinkerScript::addOrphanSections. NFCI.
authorRui Ueyama <ruiu@google.com>
Fri, 6 Oct 2017 23:06:55 +0000 (23:06 +0000)
committerRui Ueyama <ruiu@google.com>
Fri, 6 Oct 2017 23:06:55 +0000 (23:06 +0000)
This patch moves a std::find to a new function. It also removes
the following piece of code. I believe it should be fine because all
tests still pass.

  unsigned Index = std::distance(Opt.Commands.begin(), I);
  assert(Sec->SectionIndex == INT_MAX || Sec->SectionIndex == Index);
  Sec->SectionIndex = Index;

llvm-svn: 315125

lld/ELF/LinkerScript.cpp

index 6cfbc5d4585b989f5ee6832595ba5afb87f07de6..85c170b142f049411aab0ab174927561c75b8a65 100644 (file)
@@ -443,29 +443,32 @@ void LinkerScript::fabricateDefaultCommands() {
                       make<SymbolAssignment>(".", Expr, ""));
 }
 
+static OutputSection *findByName(ArrayRef<BaseCommand *> Vec,
+                                 StringRef Name) {
+  for (BaseCommand *Base : Vec)
+    if (auto *Sec = dyn_cast<OutputSection>(Base))
+      if (Sec->Name == Name)
+        return Sec;
+  return nullptr;
+}
+
 // Add sections that didn't match any sections command.
 void LinkerScript::addOrphanSections(OutputSectionFactory &Factory) {
-  unsigned NumCommands = Opt.Commands.size();
+  unsigned End = Opt.Commands.size();
+
   for (InputSectionBase *S : InputSections) {
     if (!S->Live || S->Parent)
       continue;
+
     StringRef Name = getOutputSectionName(S->Name);
-    auto End = Opt.Commands.begin() + NumCommands;
-    auto I = std::find_if(Opt.Commands.begin(), End, [&](BaseCommand *Base) {
-      if (auto *Sec = dyn_cast<OutputSection>(Base))
-        return Sec->Name == Name;
-      return false;
-    });
     log(toString(S) + " is being placed in '" + Name + "'");
-    if (I == End) {
+
+    if (OutputSection *Sec = findByName(
+            makeArrayRef(Opt.Commands).slice(0, End), Name)) {
+      Factory.addInputSec(S, Name, Sec);
+    } else {
       Factory.addInputSec(S, Name, nullptr);
       assert(S->getOutputSection()->SectionIndex == INT_MAX);
-    } else {
-      OutputSection *Sec = cast<OutputSection>(*I);
-      Factory.addInputSec(S, Name, Sec);
-      unsigned Index = std::distance(Opt.Commands.begin(), I);
-      assert(Sec->SectionIndex == INT_MAX || Sec->SectionIndex == Index);
-      Sec->SectionIndex = Index;
     }
   }
 }