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);
 }