From f4e2c73fa71cd205324882e0bd1ca48ecd982d55 Mon Sep 17 00:00:00 2001 From: Nick Kledzik Date: Thu, 15 Mar 2012 23:36:24 +0000 Subject: Add Pass to instantiate GOT entries llvm-svn: 152874 --- lld/lib/Core/NativeReader.cpp | 18 +++++++++++++++++- lld/lib/Core/YamlKeyValues.cpp | 1 + lld/lib/Core/YamlReader.cpp | 4 ++++ lld/lib/Core/YamlWriter.cpp | 3 +++ 4 files changed, 25 insertions(+), 1 deletion(-) (limited to 'lld/lib/Core') diff --git a/lld/lib/Core/NativeReader.cpp b/lld/lib/Core/NativeReader.cpp index 0eb95b948d7..41a2823c7b8 100644 --- a/lld/lib/Core/NativeReader.cpp +++ b/lld/lib/Core/NativeReader.cpp @@ -200,11 +200,22 @@ public: 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 + (operator new(sizeof(NativeReferenceIvarsV1), + std::nothrow)); + memcpy(niv, _ivarData, sizeof(NativeReferenceIvarsV1)); + } + const NativeFile* _file; const NativeReferenceIvarsV1* _ivarData; }; @@ -785,6 +796,11 @@ inline Reference::Addend NativeReferenceV1::addend() const { return _file->addend(_ivarData->addendIndex); } +inline void NativeReferenceV1::setKind(Kind k) { + this->cloneIvarData(); + const_cast(_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 7ee46cc07fd..99fb95cc1ba 100644 --- a/lld/lib/Core/YamlKeyValues.cpp +++ b/lld/lib/Core/YamlKeyValues.cpp @@ -150,6 +150,7 @@ static const ContentTypeMapping typeMappings[] = { { "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 64192b0ee3f..b02f381c2cf 100644 --- a/lld/lib/Core/YamlReader.cpp +++ b/lld/lib/Core/YamlReader.cpp @@ -271,6 +271,10 @@ public: 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 2a9e05078ea..bd253b42506 100644 --- a/lld/lib/Core/YamlWriter.cpp +++ b/lld/lib/Core/YamlWriter.cpp @@ -305,6 +305,9 @@ public: 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; -- cgit v1.2.3