summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core
diff options
context:
space:
mode:
authorNick Kledzik <kledzik@apple.com>2012-03-15 23:36:24 +0000
committerNick Kledzik <kledzik@apple.com>2012-03-15 23:36:24 +0000
commitf4e2c73fa71cd205324882e0bd1ca48ecd982d55 (patch)
tree89d2dc948f9174c05673a0133d50c7c4cd5648af /lld/lib/Core
parent6f87b44fe378184316b9e7bfdd2316d3ce80eac7 (diff)
downloadbcm5719-llvm-f4e2c73fa71cd205324882e0bd1ca48ecd982d55.tar.gz
bcm5719-llvm-f4e2c73fa71cd205324882e0bd1ca48ecd982d55.zip
Add Pass to instantiate GOT entries
llvm-svn: 152874
Diffstat (limited to 'lld/lib/Core')
-rw-r--r--lld/lib/Core/NativeReader.cpp18
-rw-r--r--lld/lib/Core/YamlKeyValues.cpp1
-rw-r--r--lld/lib/Core/YamlReader.cpp4
-rw-r--r--lld/lib/Core/YamlWriter.cpp3
4 files changed, 25 insertions, 1 deletions
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<NativeReferenceIvarsV1*>
+ (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<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 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;
OpenPOWER on IntegriCloud