Update mclinker to 96e60abf286338c8e231b7c990c30c7c4651be0e.

Change-Id: I29a840d11cecc1ed133768b79222f8bae5f4db2d
diff --git a/lib/Object/ObjectBuilder.cpp b/lib/Object/ObjectBuilder.cpp
index d222110..f5c9fe5 100644
--- a/lib/Object/ObjectBuilder.cpp
+++ b/lib/Object/ObjectBuilder.cpp
@@ -40,7 +40,7 @@
                                         uint32_t pAlign)
 {
   // try to get one from output LDSection
-  const SectionMap::NamePair& pair = m_Config.scripts().sectionMap().find(pName);
+  const SectionMap::NamePair& pair = m_Module.getScript().sectionMap().find(pName);
   std::string output_name = (pair.isNull())?pName:pair.to;
   LDSection* output_sect = LDSection::Create(output_name, pKind, pType, pFlag);
   output_sect->setAlign(pAlign);
@@ -52,7 +52,7 @@
 LDSection* ObjectBuilder::MergeSection(LDSection& pInputSection)
 {
   const SectionMap::NamePair& pair =
-              m_Config.scripts().sectionMap().find(pInputSection.name());
+              m_Module.getScript().sectionMap().find(pInputSection.name());
   std::string output_name = (pair.isNull())?pInputSection.name():pair.to;
   LDSection* target = m_Module.getSection(output_name);
 
diff --git a/lib/Object/ObjectLinker.cpp b/lib/Object/ObjectLinker.cpp
index bbca437..1b16f95 100644
--- a/lib/Object/ObjectLinker.cpp
+++ b/lib/Object/ObjectLinker.cpp
@@ -23,9 +23,11 @@
 #include <mcld/LD/ObjectWriter.h>
 #include <mcld/LD/ResolveInfo.h>
 #include <mcld/LD/RelocData.h>
+#include <mcld/LD/Relocator.h>
 #include <mcld/Support/RealPath.h>
 #include <mcld/Support/MemoryArea.h>
 #include <mcld/Support/MsgHandling.h>
+#include <mcld/Support/DefSymParser.h>
 #include <mcld/Target/TargetLDBackend.h>
 #include <mcld/Fragment/FragmentLinker.h>
 #include <mcld/Object/ObjectBuilder.h>
@@ -35,7 +37,6 @@
 
 using namespace llvm;
 using namespace mcld;
-
 ObjectLinker::ObjectLinker(const LinkerConfig& pConfig,
                            TargetLDBackend& pLDBackend)
   : m_Config(pConfig),
@@ -66,6 +67,7 @@
 {
   m_pModule = &pModule;
   m_pBuilder = &pBuilder;
+
   // set up soname
   if (!m_Config.options().soname().empty()) {
     m_pModule->setName(m_Config.options().soname());
@@ -88,9 +90,9 @@
   m_pObjectReader  = m_LDBackend.createObjectReader(*m_pBuilder);
   m_pArchiveReader = m_LDBackend.createArchiveReader(*m_pModule);
   m_pDynObjReader  = m_LDBackend.createDynObjReader(*m_pBuilder);
-  m_pGroupReader   = new GroupReader(*m_pModule, *m_pObjectReader,
-                                     *m_pDynObjReader, *m_pArchiveReader);
   m_pBinaryReader  = m_LDBackend.createBinaryReader(*m_pBuilder);
+  m_pGroupReader   = new GroupReader(*m_pModule, *m_pObjectReader,
+                         *m_pDynObjReader, *m_pArchiveReader, *m_pBinaryReader);
   m_pWriter        = m_LDBackend.createWriter();
 
   // initialize Relocator
@@ -262,7 +264,14 @@
           if (!(*sect)->hasEhFrame())
             continue; // skip
 
-          if (NULL == builder.MergeSection(**sect)) {
+          LDSection* out_sect = NULL;
+          if (NULL == (out_sect = builder.MergeSection(**sect))) {
+            error(diag::err_cannot_merge_section) << (*sect)->name()
+                                                  << (*obj)->name();
+            return false;
+          }
+
+          if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) {
             error(diag::err_cannot_merge_section) << (*sect)->name()
                                                   << (*obj)->name();
             return false;
@@ -273,15 +282,14 @@
           if (!(*sect)->hasSectionData())
             continue; // skip
 
-          LDSection* out_sect = builder.MergeSection(**sect);
-          if (NULL != out_sect) {
-            if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) {
-              error(diag::err_cannot_merge_section) << (*sect)->name()
-                                                    << (*obj)->name();
-              return false;
-            }
+          LDSection* out_sect = NULL;
+          if (NULL == (out_sect = builder.MergeSection(**sect))) {
+            error(diag::err_cannot_merge_section) << (*sect)->name()
+                                                  << (*obj)->name();
+            return false;
           }
-          else {
+
+          if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) {
             error(diag::err_cannot_merge_section) << (*sect)->name()
                                                   << (*obj)->name();
             return false;
@@ -321,10 +329,43 @@
 
 /// addScriptSymbols - define symbols from the command line option or linker
 /// scripts.
-///   @return if there are some existing symbols with identical name to the
-///   script symbols, return false.
 bool ObjectLinker::addScriptSymbols()
 {
+  const LinkerScript& script = m_pModule->getScript();
+  LinkerScript::DefSymMap::const_entry_iterator it;
+  LinkerScript::DefSymMap::const_entry_iterator ie = script.defSymMap().end();
+  // go through the entire defSymMap
+  for (it = script.defSymMap().begin(); it != ie; ++it) {
+    const llvm::StringRef sym =  it.getEntry()->key();
+    ResolveInfo* old_info = m_pModule->getNamePool().findInfo(sym);
+    // if the symbol does not exist, we can set type to NOTYPE
+    // else we retain its type, same goes for size - 0 or retain old value
+    // and visibility - Default or retain
+    if (old_info != NULL) {
+      if(!m_pBuilder->AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>(
+                             sym,
+                             static_cast<ResolveInfo::Type>(old_info->type()),
+                             ResolveInfo::Define,
+                             ResolveInfo::Absolute,
+                             old_info->size(),
+                             0x0,
+                             FragmentRef::Null(),
+                             old_info->visibility()))
+        return false;
+    }
+    else {
+      if (!m_pBuilder->AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>(
+                             sym,
+                             ResolveInfo::NoType,
+                             ResolveInfo::Define,
+                             ResolveInfo::Absolute,
+                             0x0,
+                             0x0,
+                             FragmentRef::Null(),
+                             ResolveInfo::Default))
+        return false;
+    }
+  }
   return true;
 }
 
@@ -333,6 +374,7 @@
   // apply all relocations of all inputs
   Module::obj_iterator input, inEnd = m_pModule->obj_end();
   for (input = m_pModule->obj_begin(); input != inEnd; ++input) {
+    m_LDBackend.getRelocator()->initializeScan(**input);
     LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd();
     for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) {
       // bypass the reloc section if
@@ -347,11 +389,14 @@
         Relocation* relocation = llvm::cast<Relocation>(reloc);
         // scan relocation
         if (LinkerConfig::Object != m_Config.codeGenType())
-          m_LDBackend.scanRelocation(*relocation, *m_pBuilder, *m_pModule, **rs);
+          m_LDBackend.getRelocator()->scanRelocation(
+                                    *relocation, *m_pBuilder, *m_pModule, **rs);
         else
-          m_LDBackend.partialScanRelocation(*relocation, *m_pModule, **rs);
+          m_LDBackend.getRelocator()->partialScanRelocation(
+                                                 *relocation, *m_pModule, **rs);
       } // for all relocations
     } // for all relocation section
+    m_LDBackend.getRelocator()->finalizeScan(**input);
   } // for all inputs
   return true;
 }
@@ -387,7 +432,9 @@
   // into output symbol table
   Module::iterator sect, sEnd = m_pModule->end();
   for (sect = m_pModule->begin(); sect != sEnd; ++sect) {
-    m_pModule->getSectionSymbolSet().finalize(**sect, m_pModule->getSymbolTable());
+    m_pModule->getSectionSymbolSet().finalize(**sect,
+        m_pModule->getSymbolTable(),
+        m_Config.codeGenType() == LinkerConfig::Object);
   }
 
   m_LDBackend.preLayout(*m_pModule, *m_pBuilder);
@@ -405,7 +452,9 @@
   ///
   /// dump all symbols and strings from FragmentLinker and build the format-dependent
   /// hash table.
-  m_LDBackend.sizeNamePools(*m_pModule, m_Config.isCodeStatic());
+  /// @note sizeNamePools replies on LinkerConfig::CodePosition. Must determine
+  /// code position model before calling GNULDBackend::sizeNamePools()
+  m_LDBackend.sizeNamePools(*m_pModule);
 
   return true;
 }
@@ -433,7 +482,26 @@
 ///   symbol.
 bool ObjectLinker::finalizeSymbolValue()
 {
-  return (m_pLinker->finalizeSymbols() && m_LDBackend.finalizeSymbols());
+  bool finalized = m_pLinker->finalizeSymbols() && m_LDBackend.finalizeSymbols();
+  bool scriptSymsAdded = true;
+  uint64_t symVal;
+  const LinkerScript& script = m_pModule->getScript();
+  LinkerScript::DefSymMap::const_entry_iterator it;
+  LinkerScript::DefSymMap::const_entry_iterator ie = script.defSymMap().end();
+
+  DefSymParser parser(*m_pModule);
+  for (it = script.defSymMap().begin(); it != ie; ++it) {
+    llvm::StringRef symName =  it.getEntry()->key();
+    llvm::StringRef expr =  it.getEntry()->value();
+
+    LDSymbol* symbol = m_pModule->getNamePool().findSymbol(symName);
+    assert(NULL != symbol && "--defsym symbol should be in the name pool");
+    scriptSymsAdded &= parser.parse(expr, symVal);
+    if (!scriptSymsAdded)
+      break;
+    symbol->setValue(symVal);
+  }
+  return finalized && scriptSymsAdded ;
 }
 
 /// relocate - applying relocation entries and create relocation
@@ -452,6 +520,7 @@
   return llvm::errc::success == getWriter()->writeObject(*m_pModule, pOutput);
 }
 
+
 /// postProcessing - do modification after all processes
 bool ObjectLinker::postProcessing(MemoryArea& pOutput)
 {
diff --git a/lib/Object/SectionMap.cpp b/lib/Object/SectionMap.cpp
index ce987e3..d3da574 100644
--- a/lib/Object/SectionMap.cpp
+++ b/lib/Object/SectionMap.cpp
@@ -98,7 +98,7 @@
   if (pNamePair.from.size() > pInput.size())
     return false;
 
-  if (!StringHash<ES>::may_include(pNamePair.hash, pHashValue))
+  if (!hash::StringHash<hash::ES>::may_include(pNamePair.hash, pHashValue))
     return false;
 
   if (0 == strncmp(pInput.c_str(),
@@ -112,7 +112,7 @@
 
 unsigned int SectionMap::hash(const std::string& pString)
 {
-  static StringHash<ES> hash_func;
+  static hash::StringHash<hash::ES> hash_func;
   return hash_func(pString);
 }