aboutsummaryrefslogtreecommitdiff
path: root/lib/Object/MachOObjectFile.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-04-06 03:31:08 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-04-06 03:31:08 +0000
commit82a21077a004087a87711bfd7a4ab171cebaa5ec (patch)
treef26fea69e40f2a77cd5aa817c99cc4e2f6a2c177 /lib/Object/MachOObjectFile.cpp
parent05b5bdd024d07e7a62f1cdc39f465e10ce5dbc6d (diff)
Don't use InMemoryStruct<macho::SymtabLoadCommand>.
This also required not using the RegisterStringTable API, which is also a good thing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178947 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Object/MachOObjectFile.cpp')
-rw-r--r--lib/Object/MachOObjectFile.cpp63
1 files changed, 43 insertions, 20 deletions
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index 4d9186490f..e2b0468b9a 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/lib/Object/MachOObjectFile.cpp
@@ -30,8 +30,7 @@ namespace object {
MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, MachOObject *MOO,
error_code &ec)
: ObjectFile(Binary::ID_MachO, Object, ec),
- MachOObj(MOO),
- RegisteredStringTable(std::numeric_limits<uint32_t>::max()) {
+ MachOObj(MOO) {
DataRefImpl DRI;
moveToNextSection(DRI);
uint32_t LoadCommandCount = MachOObj->getHeader().NumLoadCommands;
@@ -62,13 +61,20 @@ ObjectFile *ObjectFile::createMachOObjectFile(MemoryBuffer *Buffer) {
/*===-- Symbols -----------------------------------------------------------===*/
+const MachOFormat::SymtabLoadCommand *
+MachOObjectFile::getSymtabLoadCommand(LoadCommandInfo LCI) const {
+ StringRef Data = MachOObj->getData(LCI.Offset,
+ sizeof(MachOFormat::SymtabLoadCommand));
+ return reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Data.data());
+}
+
void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const {
uint32_t LoadCommandCount = MachOObj->getHeader().NumLoadCommands;
while (DRI.d.a < LoadCommandCount) {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
if (LCI.Command.Type == macho::LCT_Symtab) {
- InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd;
- MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd);
+ const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
+ getSymtabLoadCommand(LCI);
if (DRI.d.b < SymtabLoadCmd->NumSymbolTableEntries)
return;
}
@@ -80,15 +86,16 @@ void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const {
const MachOFormat::SymbolTableEntry *
MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
- InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd;
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
- MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd);
+ const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
+ getSymtabLoadCommand(LCI);
- if (RegisteredStringTable != DRI.d.a) {
- MachOObj->RegisterStringTable(*SymtabLoadCmd);
- RegisteredStringTable = DRI.d.a;
- }
+ return getSymbolTableEntry(DRI, SymtabLoadCmd);
+}
+const MachOFormat::SymbolTableEntry *
+MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI,
+ const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
unsigned Index = DRI.d.b;
uint64_t Offset = (SymbolTableOffset +
@@ -100,15 +107,16 @@ MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
const MachOFormat::Symbol64TableEntry*
MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
- InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd;
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
- MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd);
+ const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
+ getSymtabLoadCommand(LCI);
- if (RegisteredStringTable != DRI.d.a) {
- MachOObj->RegisterStringTable(*SymtabLoadCmd);
- RegisteredStringTable = DRI.d.a;
- }
+ return getSymbol64TableEntry(DRI, SymtabLoadCmd);
+}
+const MachOFormat::Symbol64TableEntry*
+MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI,
+ const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
unsigned Index = DRI.d.b;
uint64_t Offset = (SymbolTableOffset +
@@ -128,13 +136,28 @@ error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
error_code MachOObjectFile::getSymbolName(DataRefImpl DRI,
StringRef &Result) const {
+ LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
+ const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
+ getSymtabLoadCommand(LCI);
+
+ StringRef StringTable =
+ MachOObj->getData(SymtabLoadCmd->StringTableOffset,
+ SymtabLoadCmd->StringTableSize);
+
+ uint32_t StringIndex;
if (MachOObj->is64Bit()) {
- const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(DRI);
- Result = MachOObj->getStringAtIndex(Entry->StringIndex);
+ const MachOFormat::Symbol64TableEntry *Entry =
+ getSymbol64TableEntry(DRI, SymtabLoadCmd);
+ StringIndex = Entry->StringIndex;
} else {
- const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(DRI);
- Result = MachOObj->getStringAtIndex(Entry->StringIndex);
+ const MachOFormat::SymbolTableEntry *Entry =
+ getSymbolTableEntry(DRI, SymtabLoadCmd);
+ StringIndex = Entry->StringIndex;
}
+
+ const char *Start = &StringTable.data()[StringIndex];
+ Result = StringRef(Start);
+
return object_error::success;
}