From 82a21077a004087a87711bfd7a4ab171cebaa5ec Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sat, 6 Apr 2013 03:31:08 +0000 Subject: [PATCH] Don't use InMemoryStruct. 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 --- include/llvm/Object/MachO.h | 23 ++++++++++++- lib/Object/MachOObjectFile.cpp | 63 +++++++++++++++++++++++----------- 2 files changed, 65 insertions(+), 21 deletions(-) diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 1da9a912d34..d6abaf1be22 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -76,6 +76,15 @@ namespace MachOFormat { support::ulittle16_t Flags; support::ulittle64_t Value; }; + + struct SymtabLoadCommand { + support::ulittle32_t Type; + support::ulittle32_t Size; + support::ulittle32_t SymbolTableOffset; + support::ulittle32_t NumSymbolTableEntries; + support::ulittle32_t StringTableOffset; + support::ulittle32_t StringTableSize; + }; } typedef MachOObject::LoadCommandInfo LoadCommandInfo; @@ -169,20 +178,32 @@ protected: private: OwningPtr MachOObj; - mutable uint32_t RegisteredStringTable; typedef SmallVector SectionList; SectionList Sections; void moveToNextSection(DataRefImpl &DRI) const; + const MachOFormat::SymbolTableEntry * getSymbolTableEntry(DataRefImpl DRI) const; + + const MachOFormat::SymbolTableEntry * + getSymbolTableEntry(DataRefImpl DRI, + const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const; + const MachOFormat::Symbol64TableEntry * getSymbol64TableEntry(DataRefImpl DRI) const; + + const MachOFormat::Symbol64TableEntry * + getSymbol64TableEntry(DataRefImpl DRI, + const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const; + void moveToNextSymbol(DataRefImpl &DRI) const; const MachOFormat::Section *getSection(DataRefImpl DRI) const; const MachOFormat::Section64 *getSection64(DataRefImpl DRI) const; const MachOFormat::RelocationEntry *getRelocation(DataRefImpl Rel) const; + const MachOFormat::SymtabLoadCommand * + getSymtabLoadCommand(LoadCommandInfo LCI) const; std::size_t getSectionIndex(DataRefImpl Sec) const; void printRelocationTargetName(const MachOFormat::RelocationEntry *RE, diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 4d9186490fe..e2b0468b9a5 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::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(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 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 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 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; }