Don't use InMemoryStruct in getSymbol64TableEntry.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178946 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2013-04-06 02:15:44 +00:00
parent 00555c13be
commit 05b5bdd024
2 changed files with 28 additions and 26 deletions

View File

@ -69,6 +69,13 @@ namespace MachOFormat {
support::ulittle32_t Value; support::ulittle32_t Value;
}; };
struct Symbol64TableEntry {
support::ulittle32_t StringIndex;
uint8_t Type;
uint8_t SectionIndex;
support::ulittle16_t Flags;
support::ulittle64_t Value;
};
} }
typedef MachOObject::LoadCommandInfo LoadCommandInfo; typedef MachOObject::LoadCommandInfo LoadCommandInfo;
@ -170,8 +177,8 @@ private:
void moveToNextSection(DataRefImpl &DRI) const; void moveToNextSection(DataRefImpl &DRI) const;
const MachOFormat::SymbolTableEntry * const MachOFormat::SymbolTableEntry *
getSymbolTableEntry(DataRefImpl DRI) const; getSymbolTableEntry(DataRefImpl DRI) const;
void getSymbol64TableEntry(DataRefImpl DRI, const MachOFormat::Symbol64TableEntry *
InMemoryStruct<macho::Symbol64TableEntry> &Res) const; getSymbol64TableEntry(DataRefImpl DRI) const;
void moveToNextSymbol(DataRefImpl &DRI) const; void moveToNextSymbol(DataRefImpl &DRI) const;
const MachOFormat::Section *getSection(DataRefImpl DRI) const; const MachOFormat::Section *getSection(DataRefImpl DRI) const;
const MachOFormat::Section64 *getSection64(DataRefImpl DRI) const; const MachOFormat::Section64 *getSection64(DataRefImpl DRI) const;

View File

@ -98,8 +98,8 @@ MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
return reinterpret_cast<const MachOFormat::SymbolTableEntry*>(Data.data()); return reinterpret_cast<const MachOFormat::SymbolTableEntry*>(Data.data());
} }
void MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI, const MachOFormat::Symbol64TableEntry*
InMemoryStruct<macho::Symbol64TableEntry> &Res) const { MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd; InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd;
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd); MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd);
@ -109,11 +109,15 @@ void MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI,
RegisteredStringTable = DRI.d.a; RegisteredStringTable = DRI.d.a;
} }
MachOObj->ReadSymbol64TableEntry(SymtabLoadCmd->SymbolTableOffset, DRI.d.b, uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
Res); unsigned Index = DRI.d.b;
uint64_t Offset = (SymbolTableOffset +
Index * sizeof(macho::Symbol64TableEntry));
StringRef Data = MachOObj->getData(Offset,
sizeof(MachOFormat::Symbol64TableEntry));
return reinterpret_cast<const MachOFormat::Symbol64TableEntry*>(Data.data());
} }
error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI, error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
SymbolRef &Result) const { SymbolRef &Result) const {
DRI.d.b++; DRI.d.b++;
@ -125,8 +129,7 @@ error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
error_code MachOObjectFile::getSymbolName(DataRefImpl DRI, error_code MachOObjectFile::getSymbolName(DataRefImpl DRI,
StringRef &Result) const { StringRef &Result) const {
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(DRI);
getSymbol64TableEntry(DRI, Entry);
Result = MachOObj->getStringAtIndex(Entry->StringIndex); Result = MachOObj->getStringAtIndex(Entry->StringIndex);
} else { } else {
const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(DRI); const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(DRI);
@ -138,8 +141,7 @@ error_code MachOObjectFile::getSymbolName(DataRefImpl DRI,
error_code MachOObjectFile::getSymbolFileOffset(DataRefImpl DRI, error_code MachOObjectFile::getSymbolFileOffset(DataRefImpl DRI,
uint64_t &Result) const { uint64_t &Result) const {
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(DRI);
getSymbol64TableEntry(DRI, Entry);
Result = Entry->Value; Result = Entry->Value;
if (Entry->SectionIndex) { if (Entry->SectionIndex) {
const MachOFormat::Section64 *Section = const MachOFormat::Section64 *Section =
@ -162,8 +164,7 @@ error_code MachOObjectFile::getSymbolFileOffset(DataRefImpl DRI,
error_code MachOObjectFile::getSymbolAddress(DataRefImpl DRI, error_code MachOObjectFile::getSymbolAddress(DataRefImpl DRI,
uint64_t &Result) const { uint64_t &Result) const {
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(DRI);
getSymbol64TableEntry(DRI, Entry);
Result = Entry->Value; Result = Entry->Value;
} else { } else {
const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(DRI); const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(DRI);
@ -179,8 +180,7 @@ error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI,
uint64_t EndOffset = 0; uint64_t EndOffset = 0;
uint8_t SectionIndex; uint8_t SectionIndex;
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(DRI);
getSymbol64TableEntry(DRI, Entry);
BeginOffset = Entry->Value; BeginOffset = Entry->Value;
SectionIndex = Entry->SectionIndex; SectionIndex = Entry->SectionIndex;
if (!SectionIndex) { if (!SectionIndex) {
@ -199,7 +199,7 @@ error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI,
while (Command == DRI.d.a) { while (Command == DRI.d.a) {
moveToNextSymbol(DRI); moveToNextSymbol(DRI);
if (DRI.d.a < LoadCommandCount) { if (DRI.d.a < LoadCommandCount) {
getSymbol64TableEntry(DRI, Entry); Entry = getSymbol64TableEntry(DRI);
if (Entry->SectionIndex == SectionIndex && Entry->Value > BeginOffset) if (Entry->SectionIndex == SectionIndex && Entry->Value > BeginOffset)
if (!EndOffset || Entry->Value < EndOffset) if (!EndOffset || Entry->Value < EndOffset)
EndOffset = Entry->Value; EndOffset = Entry->Value;
@ -248,8 +248,7 @@ error_code MachOObjectFile::getSymbolNMTypeChar(DataRefImpl DRI,
char &Result) const { char &Result) const {
uint8_t Type, Flags; uint8_t Type, Flags;
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(DRI);
getSymbol64TableEntry(DRI, Entry);
Type = Entry->Type; Type = Entry->Type;
Flags = Entry->Flags; Flags = Entry->Flags;
} else { } else {
@ -283,8 +282,7 @@ error_code MachOObjectFile::getSymbolFlags(DataRefImpl DRI,
uint16_t MachOFlags; uint16_t MachOFlags;
uint8_t MachOType; uint8_t MachOType;
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(DRI);
getSymbol64TableEntry(DRI, Entry);
MachOFlags = Entry->Flags; MachOFlags = Entry->Flags;
MachOType = Entry->Type; MachOType = Entry->Type;
} else { } else {
@ -321,8 +319,7 @@ error_code MachOObjectFile::getSymbolSection(DataRefImpl Symb,
section_iterator &Res) const { section_iterator &Res) const {
uint8_t index; uint8_t index;
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(Symb);
getSymbol64TableEntry(Symb, Entry);
index = Entry->SectionIndex; index = Entry->SectionIndex;
} else { } else {
const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(Symb); const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(Symb);
@ -341,8 +338,7 @@ error_code MachOObjectFile::getSymbolType(DataRefImpl Symb,
SymbolRef::Type &Res) const { SymbolRef::Type &Res) const {
uint8_t n_type; uint8_t n_type;
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(Symb);
getSymbol64TableEntry(Symb, Entry);
n_type = Entry->Type; n_type = Entry->Type;
} else { } else {
const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(Symb); const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(Symb);
@ -648,8 +644,7 @@ error_code MachOObjectFile::sectionContainsSymbol(DataRefImpl Sec,
SectEnd += SectBegin; SectEnd += SectBegin;
if (MachOObj->is64Bit()) { if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry; const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(Symb);
getSymbol64TableEntry(Symb, Entry);
uint64_t SymAddr= Entry->Value; uint64_t SymAddr= Entry->Value;
Result = (SymAddr >= SectBegin) && (SymAddr < SectEnd); Result = (SymAddr >= SectBegin) && (SymAddr < SectEnd);
} else { } else {