summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: b3d25a9)
raw | patch | inline | side by side (parent: b3d25a9)
author | Rafael Espindola <rafael.espindola@gmail.com> | |
Tue, 9 Apr 2013 00:22:58 +0000 (00:22 +0000) | ||
committer | Rafael Espindola <rafael.espindola@gmail.com> | |
Tue, 9 Apr 2013 00:22:58 +0000 (00:22 +0000) |
Use it when we don't need to know if we have a 32 or 64 bit SymbolTableEntry.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179074 91177308-0d34-0410-b5e6-96231b3b80d8
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179074 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Object/MachO.h | patch | blob | history | |
lib/Object/MachOObjectFile.cpp | patch | blob | history |
index 07c8fc5ca2bb89aa0f23ca4168660cd180eeb96d..8c2e268dae5d6d9be5d8af04c3eb668a1e97307c 100644 (file)
support::ulittle32_t Word1;
};
+ struct SymbolTableEntryBase {
+ support::ulittle32_t StringIndex;
+ uint8_t Type;
+ uint8_t SectionIndex;
+ support::ulittle16_t Flags;
+ };
+
template<bool is64Bits>
struct SymbolTableEntry;
void moveToNextSection(DataRefImpl &DRI) const;
- const MachOFormat::SymbolTableEntry<false> *
- getSymbolTableEntry(DataRefImpl DRI,
- const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
+ const MachOFormat::SymbolTableEntryBase *
+ getSymbolTableEntryBase(DataRefImpl DRI) const;
- const MachOFormat::SymbolTableEntry<true> *
- getSymbol64TableEntry(DataRefImpl DRI,
+ const MachOFormat::SymbolTableEntryBase *
+ getSymbolTableEntryBase(DataRefImpl DRI,
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
void moveToNextSymbol(DataRefImpl &DRI) const;
index 3931c53ac836fbff6a67ffe291e9f4c99d8be864..ae30105a93c3b8fcefb3719673b228bb5b8c5658 100644 (file)
}
}
-const MachOFormat::SymbolTableEntry<false> *
-MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
+const MachOFormat::SymbolTableEntryBase *
+MachOObjectFile::getSymbolTableEntryBase(DataRefImpl DRI) const {
const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a);
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
-
- return getSymbolTableEntry(DRI, SymtabLoadCmd);
+ return getSymbolTableEntryBase(DRI, SymtabLoadCmd);
}
const MachOFormat::SymbolTableEntry<false> *
-MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI,
+MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
+ const MachOFormat::SymbolTableEntryBase *Base = getSymbolTableEntryBase(DRI);
+ return reinterpret_cast<const MachOFormat::SymbolTableEntry<false>*>(Base);
+}
+
+const MachOFormat::SymbolTableEntryBase *
+MachOObjectFile::getSymbolTableEntryBase(DataRefImpl DRI,
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
unsigned Index = DRI.d.b;
- uint64_t Offset = (SymbolTableOffset +
- Index * sizeof(MachOFormat::SymbolTableEntry<false>));
- StringRef Data =
- getData(Offset, sizeof(MachOFormat::SymbolTableEntry<false>));
- return
- reinterpret_cast<const MachOFormat::SymbolTableEntry<false>*>(Data.data());
-}
-const MachOFormat::SymbolTableEntry<true>*
-MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
- const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a);
- const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
- reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
+ unsigned SymbolTableEntrySize = is64Bit() ?
+ sizeof(MachOFormat::SymbolTableEntry<true>) :
+ sizeof(MachOFormat::SymbolTableEntry<false>);
- return getSymbol64TableEntry(DRI, SymtabLoadCmd);
+ uint64_t Offset = SymbolTableOffset + Index * SymbolTableEntrySize;
+ StringRef Data = getData(Offset, SymbolTableEntrySize);
+ return
+ reinterpret_cast<const MachOFormat::SymbolTableEntryBase*>(Data.data());
}
const MachOFormat::SymbolTableEntry<true>*
-MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI,
- const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
- uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
- unsigned Index = DRI.d.b;
- uint64_t Offset = (SymbolTableOffset +
- Index * sizeof(MachOFormat::SymbolTableEntry<true>));
- StringRef Data = getData(Offset, sizeof(MachOFormat::SymbolTableEntry<true>));
- return
- reinterpret_cast<const MachOFormat::SymbolTableEntry<true>*>(Data.data());
+MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
+ const MachOFormat::SymbolTableEntryBase *Base = getSymbolTableEntryBase(DRI);
+ return reinterpret_cast<const MachOFormat::SymbolTableEntry<true>*>(Base);
}
error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
StringRef StringTable = getData(SymtabLoadCmd->StringTableOffset,
SymtabLoadCmd->StringTableSize);
- uint32_t StringIndex;
- if (is64Bit()) {
- const MachOFormat::SymbolTableEntry<true> *Entry =
- getSymbol64TableEntry(DRI, SymtabLoadCmd);
- StringIndex = Entry->StringIndex;
- } else {
- const MachOFormat::SymbolTableEntry<false> *Entry =
- getSymbolTableEntry(DRI, SymtabLoadCmd);
- StringIndex = Entry->StringIndex;
- }
+ const MachOFormat::SymbolTableEntryBase *Entry =
+ getSymbolTableEntryBase(DRI, SymtabLoadCmd);
+ uint32_t StringIndex = Entry->StringIndex;
const char *Start = &StringTable.data()[StringIndex];
Result = StringRef(Start);
error_code MachOObjectFile::getSymbolType(DataRefImpl Symb,
SymbolRef::Type &Res) const {
- uint8_t n_type;
- if (is64Bit()) {
- const MachOFormat::SymbolTableEntry<true> *Entry =
- getSymbol64TableEntry(Symb);
- n_type = Entry->Type;
- } else {
- const MachOFormat::SymbolTableEntry<false> *Entry =
- getSymbolTableEntry(Symb);
- n_type = Entry->Type;
- }
+ const MachOFormat::SymbolTableEntryBase *Entry =
+ getSymbolTableEntryBase(Symb);
+ uint8_t n_type = Entry->Type;
+
Res = SymbolRef::ST_Other;
// If this is a STAB debugging symbol, we can do nothing more.