summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/MachOObjectFile.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-04-12 00:17:33 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-04-12 00:17:33 +0000
commitecf132057979bd5e0d005d042ffcf6fcffbcff22 (patch)
treedd16a6da637b835c0c0b788affc9b6c4cbea841c /llvm/lib/Object/MachOObjectFile.cpp
parent766d0dea11a7d47750d128c398f0c8e6c741d855 (diff)
downloadbcm5719-llvm-ecf132057979bd5e0d005d042ffcf6fcffbcff22.tar.gz
bcm5719-llvm-ecf132057979bd5e0d005d042ffcf6fcffbcff22.zip
Add 179294 back, but don't use bit fields so that it works on big endian hosts.
Original message: Print more information about relocations. With this patch llvm-readobj now prints if a relocation is pcrel, its length, if it is extern and if it is scattered. It also refactors the code a bit to use bit fields instead of shifts and masks all over the place. llvm-svn: 179345
Diffstat (limited to 'llvm/lib/Object/MachOObjectFile.cpp')
-rw-r--r--llvm/lib/Object/MachOObjectFile.cpp52
1 files changed, 44 insertions, 8 deletions
diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp
index c846206e6e4..627e7485a6b 100644
--- a/llvm/lib/Object/MachOObjectFile.cpp
+++ b/llvm/lib/Object/MachOObjectFile.cpp
@@ -80,6 +80,46 @@ 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->getPCRel();
+ }
+ return RE->getPCRel();
+}
+
+unsigned MachOObjectFileBase::getLength(const RelocationEntry *RE) const {
+ if (isScattered(RE)) {
+ const ScatteredRelocationEntry *SRE =
+ reinterpret_cast<const ScatteredRelocationEntry *>(RE);
+ return SRE->getLength();
+ }
+ return RE->getLength();
+}
+
+unsigned MachOObjectFileBase::getType(const RelocationEntry *RE) const {
+ if (isScattered(RE)) {
+ const ScatteredRelocationEntry *SRE =
+ reinterpret_cast<const ScatteredRelocationEntry *>(RE);
+ return SRE->getType();
+ }
+ return RE->getType();
+}
+
ObjectFile *ObjectFile::createMachOObjectFile(MemoryBuffer *Buffer) {
StringRef Magic = Buffer->getBuffer().slice(0, 4);
error_code ec;
@@ -435,16 +475,12 @@ 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) {
- uint32_t Val = RE->Word1;
+ if (isScattered(RE)) {
+ uint32_t Val = RE->SymbolNum;
error_code ec;
for (symbol_iterator SI = begin_symbols(), SE = end_symbols(); SI != SE;
@@ -486,8 +522,8 @@ MachOObjectFileBase::printRelocationTargetName(const RelocationEntry *RE,
}
StringRef S;
- bool isExtern = (RE->Word1 >> 27) & 1;
- uint32_t Val = RE->Word1 & 0xFFFFFF;
+ bool isExtern = RE->getExternal();
+ uint32_t Val = RE->Address;
if (isExtern) {
symbol_iterator SI = begin_symbols();
OpenPOWER on IntegriCloud