diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-24 19:47:55 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-24 19:47:55 +0000 |
commit | 802fe9340d032d20195b00334356cf63b303386c (patch) | |
tree | f8539af116260597f3f92336947b711300c7eb64 /lib/Object/MachOObjectFile.cpp | |
parent | d4ee3920c928f51e4c4d70b4fae97f4d99be2583 (diff) |
Use pointers to iterate over symbols.
While here, don't report a dummy symbol for relocations that don't have symbols.
We used to says such relocations were for the first defined symbol, but now we
return end_symbols(). The llvm-readobj output change agrees with otool.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180214 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Object/MachOObjectFile.cpp')
-rw-r--r-- | lib/Object/MachOObjectFile.cpp | 66 |
1 files changed, 36 insertions, 30 deletions
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 4e6e0bdada..51cd5b9a95 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -216,23 +216,9 @@ static const char *getPtr(const MachOObjectFile *O, size_t Offset) { return O->getData().substr(Offset, 1).data(); } -static const char *getSymbolTableEntryPtr(const MachOObjectFile *O, - DataRefImpl DRI) { - macho::SymtabLoadCommand S = O->getSymtabLoadCommand(); - - unsigned Index = DRI.d.b; - - unsigned SymbolTableEntrySize = O->is64Bit() ? - sizeof(macho::Symbol64TableEntry) : - sizeof(macho::SymbolTableEntry); - - uint64_t Offset = S.SymbolTableOffset + Index * SymbolTableEntrySize; - return getPtr(O, Offset); -} - static SymbolTableEntryBase getSymbolTableEntryBase(const MachOObjectFile *O, DataRefImpl DRI) { - const char *P = getSymbolTableEntryPtr(O, DRI); + const char *P = reinterpret_cast<const char *>(DRI.p); return getStruct<SymbolTableEntryBase>(O, P); } @@ -420,7 +406,10 @@ MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, error_code MachOObjectFile::getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const { - Symb.d.b++; + unsigned SymbolTableEntrySize = is64Bit() ? + sizeof(macho::Symbol64TableEntry) : + sizeof(macho::SymbolTableEntry); + Symb.p += SymbolTableEntrySize; Res = SymbolRef(Symb, this); return object_error::success; } @@ -494,15 +483,15 @@ error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI, } // Unfortunately symbols are unsorted so we need to touch all // symbols from load command - macho::SymtabLoadCommand Symtab = getSymtabLoadCommand(); - DRI.d.b = 0; - while (DRI.d.b <= Symtab.NumSymbolTableEntries) { + error_code ec; + for (symbol_iterator I = begin_symbols(), E = end_symbols(); I != E; + I.increment(ec)) { + DataRefImpl DRI = I->getRawDataRefImpl(); Entry = getSymbolTableEntryBase(this, DRI); getSymbolAddress(DRI, Value); if (Entry.SectionIndex == SectionIndex && Value > BeginOffset) if (!EndOffset || Value < EndOffset) EndOffset = Value; - DRI.d.b++; } if (!EndOffset) { uint64_t Size; @@ -829,11 +818,18 @@ MachOObjectFile::getRelocationSymbol(DataRefImpl Rel, SymbolRef &Res) const { macho::RelocationEntry RE = getRelocation(Rel); uint32_t SymbolIdx = getPlainRelocationSymbolNum(RE); bool isExtern = getPlainRelocationExternal(RE); + if (!isExtern) { + Res = *end_symbols(); + return object_error::success; + } + macho::SymtabLoadCommand S = getSymtabLoadCommand(); + unsigned SymbolTableEntrySize = is64Bit() ? + sizeof(macho::Symbol64TableEntry) : + sizeof(macho::SymbolTableEntry); + uint64_t Offset = S.SymbolTableOffset + SymbolIdx * SymbolTableEntrySize; DataRefImpl Sym; - if (isExtern) { - Sym.d.b = SymbolIdx; - } + Sym.p = reinterpret_cast<uintptr_t>(getPtr(this, Offset)); Res = SymbolRef(Sym, this); return object_error::success; } @@ -1160,17 +1156,27 @@ error_code MachOObjectFile::getLibraryPath(DataRefImpl LibData, } symbol_iterator MachOObjectFile::begin_symbols() const { - // DRI.d.a = segment number; DRI.d.b = symbol index. DataRefImpl DRI; + if (!SymtabLoadCmd) + return symbol_iterator(SymbolRef(DRI, this)); + + macho::SymtabLoadCommand Symtab = getSymtabLoadCommand(); + DRI.p = reinterpret_cast<uintptr_t>(getPtr(this, Symtab.SymbolTableOffset)); return symbol_iterator(SymbolRef(DRI, this)); } symbol_iterator MachOObjectFile::end_symbols() const { DataRefImpl DRI; - if (SymtabLoadCmd) { - macho::SymtabLoadCommand Symtab = getSymtabLoadCommand(); - DRI.d.b = Symtab.NumSymbolTableEntries; - } + if (!SymtabLoadCmd) + return symbol_iterator(SymbolRef(DRI, this)); + + macho::SymtabLoadCommand Symtab = getSymtabLoadCommand(); + unsigned SymbolTableEntrySize = is64Bit() ? + sizeof(macho::Symbol64TableEntry) : + sizeof(macho::SymbolTableEntry); + unsigned Offset = Symtab.SymbolTableOffset + + Symtab.NumSymbolTableEntries * SymbolTableEntrySize; + DRI.p = reinterpret_cast<uintptr_t>(getPtr(this, Offset)); return symbol_iterator(SymbolRef(DRI, this)); } @@ -1369,13 +1375,13 @@ macho::Section64 MachOObjectFile::getSection64(DataRefImpl DRI) const { macho::SymbolTableEntry MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const { - const char *P = getSymbolTableEntryPtr(this, DRI); + const char *P = reinterpret_cast<const char *>(DRI.p); return getStruct<macho::SymbolTableEntry>(this, P); } macho::Symbol64TableEntry MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const { - const char *P = getSymbolTableEntryPtr(this, DRI); + const char *P = reinterpret_cast<const char *>(DRI.p); return getStruct<macho::Symbol64TableEntry>(this, P); } |