From 77638d9110d67333e4ea8e6bd3206606a89bc24f Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sun, 7 Apr 2013 18:08:12 +0000 Subject: [PATCH] Add MachOObjectFile::LoadCommandInfo. This avoids using MachOObject::getLoadCommandInfo. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178990 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/MachO.h | 17 ++++++++++++++--- lib/Object/MachOObjectFile.cpp | 31 +++++++++++++++++++++++-------- tools/llvm-objdump/MachODump.cpp | 4 ++-- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 9bd591a5406..8b3539a3e1c 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -77,6 +77,11 @@ namespace MachOFormat { support::ulittle64_t Value; }; + struct LoadCommand { + support::ulittle32_t Type; + support::ulittle32_t Size; + }; + struct SymtabLoadCommand { support::ulittle32_t Type; support::ulittle32_t Size; @@ -122,10 +127,16 @@ namespace MachOFormat { }; } -typedef MachOObject::LoadCommandInfo LoadCommandInfo; - class MachOObjectFile : public ObjectFile { public: + struct LoadCommandInfo { + /// The load command information. + const MachOFormat::LoadCommand *Command; + + /// The offset to the start of the load command in memory. + uint64_t Offset; + }; + MachOObjectFile(MemoryBuffer *Object, error_code &ec); virtual symbol_iterator begin_symbols() const; @@ -161,7 +172,7 @@ public: const MachOFormat::SymbolTableEntry * getSymbolTableEntry(DataRefImpl DRI) const; bool is64Bit() const; - const LoadCommandInfo &getLoadCommandInfo(unsigned Index) const; + LoadCommandInfo getLoadCommandInfo(unsigned Index) const; void ReadULEB128s(uint64_t Index, SmallVectorImpl &Out) const; const macho::Header &getHeader() const; diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index e20ca2b3533..dbbc812d14b 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -58,9 +58,23 @@ bool MachOObjectFile::is64Bit() const { return MachOObj->is64Bit(); } -const LoadCommandInfo & +MachOObjectFile::LoadCommandInfo MachOObjectFile::getLoadCommandInfo(unsigned Index) const { - return MachOObj->getLoadCommandInfo(Index); + uint64_t Offset; + uint64_t NewOffset = MachOObj->getHeaderSize(); + const MachOFormat::LoadCommand *Load; + unsigned I = 0; + do { + Offset = NewOffset; + StringRef Data = MachOObj->getData(Offset, + sizeof(MachOFormat::LoadCommand)); + Load = reinterpret_cast(Data.data()); + NewOffset = Offset + Load->Size; + ++I; + } while (I != Index + 1); + + LoadCommandInfo Ret = {Load, Offset}; + return Ret; } void MachOObjectFile::ReadULEB128s(uint64_t Index, @@ -116,7 +130,7 @@ void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const { uint32_t LoadCommandCount = MachOObj->getHeader().NumLoadCommands; while (DRI.d.a < LoadCommandCount) { LoadCommandInfo LCI = getLoadCommandInfo(DRI.d.a); - if (LCI.Command.Type == macho::LCT_Symtab) { + if (LCI.Command->Type == macho::LCT_Symtab) { const MachOFormat::SymtabLoadCommand *SymtabLoadCmd = getSymtabLoadCommand(LCI); if (DRI.d.b < SymtabLoadCmd->NumSymbolTableEntries) @@ -479,12 +493,12 @@ void MachOObjectFile::moveToNextSection(DataRefImpl &DRI) const { uint32_t LoadCommandCount = MachOObj->getHeader().NumLoadCommands; while (DRI.d.a < LoadCommandCount) { LoadCommandInfo LCI = getLoadCommandInfo(DRI.d.a); - if (LCI.Command.Type == macho::LCT_Segment) { + if (LCI.Command->Type == macho::LCT_Segment) { const MachOFormat::SegmentLoadCommand *SegmentLoadCmd = getSegmentLoadCommand(LCI); if (DRI.d.b < SegmentLoadCmd->NumSections) return; - } else if (LCI.Command.Type == macho::LCT_Segment64) { + } else if (LCI.Command->Type == macho::LCT_Segment64) { const MachOFormat::Segment64LoadCommand *Segment64LoadCmd = getSegment64LoadCommand(LCI); if (DRI.d.b < Segment64LoadCmd->NumSections) @@ -506,10 +520,11 @@ error_code MachOObjectFile::getSectionNext(DataRefImpl DRI, static bool is64BitLoadCommand(const MachOObjectFile *MachOObj, DataRefImpl DRI) { - LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); - if (LCI.Command.Type == macho::LCT_Segment64) + MachOObjectFile::LoadCommandInfo LCI = + MachOObj->getLoadCommandInfo(DRI.d.a); + if (LCI.Command->Type == macho::LCT_Segment64) return true; - assert(LCI.Command.Type == macho::LCT_Segment && "Unexpected Type."); + assert(LCI.Command->Type == macho::LCT_Segment && "Unexpected Type."); return false; } diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index d3f29d2d50f..44a6221c15e 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -218,8 +218,8 @@ static void getSectionsAndSymbols(const macho::Header &Header, } for (unsigned i = 0; i != Header.NumLoadCommands; ++i) { - const MachOObject::LoadCommandInfo &LCI = MachOObj->getLoadCommandInfo(i); - if (LCI.Command.Type == macho::LCT_FunctionStarts) { + MachOObjectFile::LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(i); + if (LCI.Command->Type == macho::LCT_FunctionStarts) { // We found a function starts segment, parse the addresses for later // consumption. const MachOFormat::LinkeditDataLoadCommand *LLC = -- 2.11.0