summaryrefslogtreecommitdiff
path: root/lib/Object/MachOObjectFile.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-04-11 17:46:10 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-04-11 17:46:10 +0000
commit59a8b5a8f09ae4c4f3b0e3d8025c6b4cf3ca1f1a (patch)
treeca0f4e97518092abe898964097539a8ccc364b06 /lib/Object/MachOObjectFile.cpp
parent6b281800d2bd2419d3f1c4e282c7c07dd54058f5 (diff)
downloadllvm-59a8b5a8f09ae4c4f3b0e3d8025c6b4cf3ca1f1a.tar.gz
llvm-59a8b5a8f09ae4c4f3b0e3d8025c6b4cf3ca1f1a.tar.bz2
llvm-59a8b5a8f09ae4c4f3b0e3d8025c6b4cf3ca1f1a.tar.xz
Revert my last two commits while I debug what is wrong in a big endian host.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179303 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Object/MachOObjectFile.cpp')
-rw-r--r--lib/Object/MachOObjectFile.cpp52
1 files changed, 8 insertions, 44 deletions
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index 98e28db88d..c846206e6e 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/lib/Object/MachOObjectFile.cpp
@@ -80,46 +80,6 @@ StringRef MachOObjectFileBase::getData(size_t Offset, size_t Size) const {
return ObjectFile::getData().substr(Offset, Size);
}
-const MachOObjectFileBase::RelocationEntry *
-MachOObjectFileBase::getRelocation(DataRefImpl Rel) const {
- if (const MachOObjectFile32Le *O = dyn_cast<MachOObjectFile32Le>(this))
- return O->getRelocation(Rel);
- const MachOObjectFile64Le *O = dyn_cast<MachOObjectFile64Le>(this);
- return O->getRelocation(Rel);
-}
-
-bool MachOObjectFileBase::isScattered(const RelocationEntry *RE) const {
- unsigned Arch = getArch();
- return (Arch != Triple::x86_64) && (RE->Address & macho::RF_Scattered);
-}
-
-bool MachOObjectFileBase::isPCRel(const RelocationEntry *RE) const {
- if (isScattered(RE)) {
- const ScatteredRelocationEntry *SRE =
- reinterpret_cast<const ScatteredRelocationEntry *>(RE);
- return SRE->PCRel;
- }
- return RE->PCRel;
-}
-
-unsigned MachOObjectFileBase::getLength(const RelocationEntry *RE) const {
- if (isScattered(RE)) {
- const ScatteredRelocationEntry *SRE =
- reinterpret_cast<const ScatteredRelocationEntry *>(RE);
- return SRE->Length;
- }
- return RE->Length;
-}
-
-unsigned MachOObjectFileBase::getType(const RelocationEntry *RE) const {
- if (isScattered(RE)) {
- const ScatteredRelocationEntry *SRE =
- reinterpret_cast<const ScatteredRelocationEntry *>(RE);
- return SRE->Type;
- }
- return RE->Type;
-}
-
ObjectFile *ObjectFile::createMachOObjectFile(MemoryBuffer *Buffer) {
StringRef Magic = Buffer->getBuffer().slice(0, 4);
error_code ec;
@@ -475,12 +435,16 @@ void advanceTo(T &it, size_t Val) {
void
MachOObjectFileBase::printRelocationTargetName(const RelocationEntry *RE,
raw_string_ostream &fmt) const {
+ unsigned Arch = getArch();
+ bool isScattered = (Arch != Triple::x86_64) &&
+ (RE->Word0 & macho::RF_Scattered);
+
// Target of a scattered relocation is an address. In the interest of
// generating pretty output, scan through the symbol table looking for a
// symbol that aligns with that address. If we find one, print it.
// Otherwise, we just print the hex address of the target.
- if (isScattered(RE)) {
- uint32_t Val = RE->SymbolNum;
+ if (isScattered) {
+ uint32_t Val = RE->Word1;
error_code ec;
for (symbol_iterator SI = begin_symbols(), SE = end_symbols(); SI != SE;
@@ -522,8 +486,8 @@ MachOObjectFileBase::printRelocationTargetName(const RelocationEntry *RE,
}
StringRef S;
- bool isExtern = RE->External;
- uint32_t Val = RE->Address;
+ bool isExtern = (RE->Word1 >> 27) & 1;
+ uint32_t Val = RE->Word1 & 0xFFFFFF;
if (isExtern) {
symbol_iterator SI = begin_symbols();