Add a SymbolTableEntryBase.

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
This commit is contained in:
Rafael Espindola
2013-04-09 00:22:58 +00:00
parent b3d25a940c
commit 7df9c57651
2 changed files with 38 additions and 52 deletions

View File

@ -71,6 +71,13 @@ namespace MachOFormat {
support::ulittle32_t Word1; support::ulittle32_t Word1;
}; };
struct SymbolTableEntryBase {
support::ulittle32_t StringIndex;
uint8_t Type;
uint8_t SectionIndex;
support::ulittle16_t Flags;
};
template<bool is64Bits> template<bool is64Bits>
struct SymbolTableEntry; struct SymbolTableEntry;
@ -263,12 +270,11 @@ private:
void moveToNextSection(DataRefImpl &DRI) const; void moveToNextSection(DataRefImpl &DRI) const;
const MachOFormat::SymbolTableEntry<false> * const MachOFormat::SymbolTableEntryBase *
getSymbolTableEntry(DataRefImpl DRI, getSymbolTableEntryBase(DataRefImpl DRI) const;
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
const MachOFormat::SymbolTableEntry<true> * const MachOFormat::SymbolTableEntryBase *
getSymbol64TableEntry(DataRefImpl DRI, getSymbolTableEntryBase(DataRefImpl DRI,
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const; const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
void moveToNextSymbol(DataRefImpl &DRI) const; void moveToNextSymbol(DataRefImpl &DRI) const;

View File

@ -116,47 +116,40 @@ void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const {
} }
} }
const MachOFormat::SymbolTableEntry<false> * const MachOFormat::SymbolTableEntryBase *
MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const { MachOObjectFile::getSymbolTableEntryBase(DataRefImpl DRI) const {
const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a);
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd = const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command); reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
return getSymbolTableEntryBase(DRI, SymtabLoadCmd);
return getSymbolTableEntry(DRI, SymtabLoadCmd);
} }
const MachOFormat::SymbolTableEntry<false> * 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 { const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset; uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
unsigned Index = DRI.d.b; unsigned Index = DRI.d.b;
uint64_t Offset = (SymbolTableOffset +
Index * sizeof(MachOFormat::SymbolTableEntry<false>)); unsigned SymbolTableEntrySize = is64Bit() ?
StringRef Data = sizeof(MachOFormat::SymbolTableEntry<true>) :
getData(Offset, sizeof(MachOFormat::SymbolTableEntry<false>)); sizeof(MachOFormat::SymbolTableEntry<false>);
uint64_t Offset = SymbolTableOffset + Index * SymbolTableEntrySize;
StringRef Data = getData(Offset, SymbolTableEntrySize);
return return
reinterpret_cast<const MachOFormat::SymbolTableEntry<false>*>(Data.data()); reinterpret_cast<const MachOFormat::SymbolTableEntryBase*>(Data.data());
} }
const MachOFormat::SymbolTableEntry<true>* const MachOFormat::SymbolTableEntry<true>*
MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const { MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); const MachOFormat::SymbolTableEntryBase *Base = getSymbolTableEntryBase(DRI);
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd = return reinterpret_cast<const MachOFormat::SymbolTableEntry<true>*>(Base);
reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
return getSymbol64TableEntry(DRI, SymtabLoadCmd);
}
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());
} }
error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI, error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
@ -176,16 +169,9 @@ error_code MachOObjectFile::getSymbolName(DataRefImpl DRI,
StringRef StringTable = getData(SymtabLoadCmd->StringTableOffset, StringRef StringTable = getData(SymtabLoadCmd->StringTableOffset,
SymtabLoadCmd->StringTableSize); SymtabLoadCmd->StringTableSize);
uint32_t StringIndex; const MachOFormat::SymbolTableEntryBase *Entry =
if (is64Bit()) { getSymbolTableEntryBase(DRI, SymtabLoadCmd);
const MachOFormat::SymbolTableEntry<true> *Entry = uint32_t StringIndex = Entry->StringIndex;
getSymbol64TableEntry(DRI, SymtabLoadCmd);
StringIndex = Entry->StringIndex;
} else {
const MachOFormat::SymbolTableEntry<false> *Entry =
getSymbolTableEntry(DRI, SymtabLoadCmd);
StringIndex = Entry->StringIndex;
}
const char *Start = &StringTable.data()[StringIndex]; const char *Start = &StringTable.data()[StringIndex];
Result = StringRef(Start); Result = StringRef(Start);
@ -403,16 +389,10 @@ error_code MachOObjectFile::getSymbolSection(DataRefImpl Symb,
error_code MachOObjectFile::getSymbolType(DataRefImpl Symb, error_code MachOObjectFile::getSymbolType(DataRefImpl Symb,
SymbolRef::Type &Res) const { SymbolRef::Type &Res) const {
uint8_t n_type; const MachOFormat::SymbolTableEntryBase *Entry =
if (is64Bit()) { getSymbolTableEntryBase(Symb);
const MachOFormat::SymbolTableEntry<true> *Entry = uint8_t n_type = Entry->Type;
getSymbol64TableEntry(Symb);
n_type = Entry->Type;
} else {
const MachOFormat::SymbolTableEntry<false> *Entry =
getSymbolTableEntry(Symb);
n_type = Entry->Type;
}
Res = SymbolRef::ST_Other; Res = SymbolRef::ST_Other;
// If this is a STAB debugging symbol, we can do nothing more. // If this is a STAB debugging symbol, we can do nothing more.