[ELF] - Refactoring of Writer<ELFT>::scanRelocs()

Code for handling TLS relocations was moved out scanRelocs() to new function handleTlsRelocations().
That is because scanRelocs already too large to put more TLS code into it.

Differential revision: http://reviews.llvm.org/D16354

llvm-svn: 258392
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index ce334aa..6828b11 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -192,6 +192,34 @@
 };
 }
 
+template <class ELFT, class RelT>
+static bool handleTlsRelocation(unsigned Type, SymbolBody *Body,
+                                InputSectionBase<ELFT> &C, RelT &RI) {
+  if (Target->isTlsLocalDynamicReloc(Type)) {
+    if (Target->isTlsOptimized(Type, nullptr))
+      return true;
+    if (Out<ELFT>::Got->addCurrentModuleTlsIndex())
+      Out<ELFT>::RelaDyn->addReloc({&C, &RI});
+    return true;
+  }
+
+  if (!Body || !Body->isTls())
+    return false;
+
+  if (Target->isTlsGlobalDynamicReloc(Type)) {
+    bool Opt = Target->isTlsOptimized(Type, Body);
+    if (!Opt && Out<ELFT>::Got->addDynTlsEntry(Body)) {
+      Out<ELFT>::RelaDyn->addReloc({&C, &RI});
+      Out<ELFT>::RelaDyn->addReloc({nullptr, nullptr});
+      Body->setUsedInDynamicReloc();
+      return true;
+    }
+    if (!canBePreempted(Body, true))
+      return true;
+  }
+  return !Target->isTlsDynReloc(Type, *Body);
+}
+
 // The reason we have to do this early scan is as follows
 // * To mmap the output file, we need to know the size
 // * For that, we need to know how many dynamic relocs we will have.
@@ -219,14 +247,6 @@
     if (Target->isGotRelative(Type))
       HasGotOffRel = true;
 
-    if (Target->isTlsLocalDynamicReloc(Type)) {
-      if (Target->isTlsOptimized(Type, nullptr))
-        continue;
-      if (Out<ELFT>::Got->addCurrentModuleTlsIndex())
-        Out<ELFT>::RelaDyn->addReloc({&C, &RI});
-      continue;
-    }
-
     // Set "used" bit for --as-needed.
     if (Body && Body->isUndefined() && !Body->isWeak())
       if (auto *S = dyn_cast<SharedSymbol<ELFT>>(Body->repl()))
@@ -235,19 +255,7 @@
     if (Body)
       Body = Body->repl();
 
-    if (Body && Body->isTls() && Target->isTlsGlobalDynamicReloc(Type)) {
-      bool Opt = Target->isTlsOptimized(Type, Body);
-      if (!Opt && Out<ELFT>::Got->addDynTlsEntry(Body)) {
-        Out<ELFT>::RelaDyn->addReloc({&C, &RI});
-        Out<ELFT>::RelaDyn->addReloc({nullptr, nullptr});
-        Body->setUsedInDynamicReloc();
-        continue;
-      }
-      if (!canBePreempted(Body, true))
-        continue;
-    }
-
-    if (Body && Body->isTls() && !Target->isTlsDynReloc(Type, *Body))
+    if (handleTlsRelocation<ELFT>(Type, Body, C, RI))
       continue;
 
     if (Target->relocNeedsDynRelative(Type)) {