Add Pass to instantiate GOT entries

llvm-svn: 152874
diff --git a/lld/lib/Core/NativeReader.cpp b/lld/lib/Core/NativeReader.cpp
index 0eb95b94..41a2823 100644
--- a/lld/lib/Core/NativeReader.cpp
+++ b/lld/lib/Core/NativeReader.cpp
@@ -200,11 +200,22 @@
     return _ivarData->kind;
   }
   
+  virtual void setKind(Kind);
   virtual const Atom* target() const;
   virtual Addend addend() const;
   virtual void setTarget(const Atom* newAtom);
-   
+
 private:
+  // Used in rare cases when Reference is modified, 
+  // since ivar data is mapped read-only.
+  void cloneIvarData() {
+    // TODO: do nothing on second call
+   NativeReferenceIvarsV1* niv = reinterpret_cast<NativeReferenceIvarsV1*>
+                                (operator new(sizeof(NativeReferenceIvarsV1), 
+                                                                std::nothrow));
+    memcpy(niv, _ivarData, sizeof(NativeReferenceIvarsV1));
+  }
+
   const NativeFile*                 _file;
   const NativeReferenceIvarsV1*     _ivarData;
 };
@@ -785,6 +796,11 @@
   return _file->addend(_ivarData->addendIndex);
 }
 
+inline void NativeReferenceV1::setKind(Kind k) {
+  this->cloneIvarData();
+  const_cast<NativeReferenceIvarsV1*>(_ivarData)->kind = k;
+}
+
 inline void NativeReferenceV1::setTarget(const Atom* newAtom) {
   return _file->setTarget(_ivarData->targetIndex, newAtom);
 }
diff --git a/lld/lib/Core/YamlKeyValues.cpp b/lld/lib/Core/YamlKeyValues.cpp
index 7ee46cc..99fb95c 100644
--- a/lld/lib/Core/YamlKeyValues.cpp
+++ b/lld/lib/Core/YamlKeyValues.cpp
@@ -150,6 +150,7 @@
   { "data",           DefinedAtom::typeData },
   { "zero-fill",      DefinedAtom::typeZeroFill },
   { "cf-string",      DefinedAtom::typeCFString },
+  { "got",            DefinedAtom::typeGOT },
   { "initializer-ptr",DefinedAtom::typeInitializerPtr },
   { "terminator-ptr", DefinedAtom::typeTerminatorPtr },
   { "c-string-ptr",   DefinedAtom::typeCStringPtr },
diff --git a/lld/lib/Core/YamlReader.cpp b/lld/lib/Core/YamlReader.cpp
index 64192b0..b02f381 100644
--- a/lld/lib/Core/YamlReader.cpp
+++ b/lld/lib/Core/YamlReader.cpp
@@ -271,6 +271,10 @@
     return _kind;
   }
   
+  virtual void setKind(Kind k) {
+    _kind = k;
+  }
+
   virtual const Atom* target() const {
     return _target;
   }
diff --git a/lld/lib/Core/YamlWriter.cpp b/lld/lib/Core/YamlWriter.cpp
index 2a9e050..bd253b4 100644
--- a/lld/lib/Core/YamlWriter.cpp
+++ b/lld/lib/Core/YamlWriter.cpp
@@ -305,6 +305,9 @@
       for (unsigned int i=0; i < arr.size(); ++i) {
         if ( needComma )
           out  << ", ";
+        if ( ((i % 12) == 0) && (i != 0) ) {
+          out << "\n                           ";
+        }
         out  << hexdigit(arr[i] >> 4);
         out  << hexdigit(arr[i] & 0x0F);
         needComma = true;