diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h index 8b3539a3e1cc..37ecad0eed18 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -129,14 +129,6 @@ namespace MachOFormat { 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; @@ -163,8 +155,6 @@ public: ArrayRef getSectionRawName(DataRefImpl Sec) const; ArrayRefgetSectionRawFinalSegmentName(DataRefImpl Sec) const; - const MachOFormat::LinkeditDataLoadCommand * - getLinkeditDataLoadCommand(LoadCommandInfo LCI) const; const MachOFormat::Section64 *getSection64(DataRefImpl DRI) const; const MachOFormat::Section *getSection(DataRefImpl DRI) const; const MachOFormat::Symbol64TableEntry * @@ -172,7 +162,7 @@ public: const MachOFormat::SymbolTableEntry * getSymbolTableEntry(DataRefImpl DRI) const; bool is64Bit() const; - LoadCommandInfo getLoadCommandInfo(unsigned Index) const; + const MachOFormat::LoadCommand *getLoadCommandInfo(unsigned Index) const; void ReadULEB128s(uint64_t Index, SmallVectorImpl &Out) const; const macho::Header &getHeader() const; @@ -251,12 +241,6 @@ private: void moveToNextSymbol(DataRefImpl &DRI) const; const MachOFormat::RelocationEntry *getRelocation(DataRefImpl Rel) const; - const MachOFormat::SymtabLoadCommand * - getSymtabLoadCommand(LoadCommandInfo LCI) const; - const MachOFormat::SegmentLoadCommand * - getSegmentLoadCommand(LoadCommandInfo LCI) const; - const MachOFormat::Segment64LoadCommand * - getSegment64LoadCommand(LoadCommandInfo LCI) const; std::size_t getSectionIndex(DataRefImpl Sec) const; void printRelocationTargetName(const MachOFormat::RelocationEntry *RE, diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index dbbc812d14be..002a98cbe6c7 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -58,7 +58,7 @@ bool MachOObjectFile::is64Bit() const { return MachOObj->is64Bit(); } -MachOObjectFile::LoadCommandInfo +const MachOFormat::LoadCommand * MachOObjectFile::getLoadCommandInfo(unsigned Index) const { uint64_t Offset; uint64_t NewOffset = MachOObj->getHeaderSize(); @@ -73,8 +73,7 @@ MachOObjectFile::getLoadCommandInfo(unsigned Index) const { ++I; } while (I != Index + 1); - LoadCommandInfo Ret = {Load, Offset}; - return Ret; + return Load; } void MachOObjectFile::ReadULEB128s(uint64_t Index, @@ -96,43 +95,13 @@ 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()); -} - -const MachOFormat::SegmentLoadCommand * -MachOObjectFile::getSegmentLoadCommand(LoadCommandInfo LCI) const { - StringRef Data = MachOObj->getData(LCI.Offset, - sizeof(MachOFormat::SegmentLoadCommand)); - return reinterpret_cast(Data.data()); -} - -const MachOFormat::LinkeditDataLoadCommand * -MachOObjectFile::getLinkeditDataLoadCommand(LoadCommandInfo LCI) const { - StringRef Data = MachOObj->getData(LCI.Offset, - sizeof(MachOFormat::LinkeditDataLoadCommand)); - return - reinterpret_cast(Data.data()); -} - -const MachOFormat::Segment64LoadCommand * -MachOObjectFile::getSegment64LoadCommand(LoadCommandInfo LCI) const { - StringRef Data = MachOObj->getData(LCI.Offset, - sizeof(MachOFormat::Segment64LoadCommand)); - return - reinterpret_cast(Data.data()); -} - 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) { + const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); + if (Command->Type == macho::LCT_Symtab) { const MachOFormat::SymtabLoadCommand *SymtabLoadCmd = - getSymtabLoadCommand(LCI); + reinterpret_cast(Command); if (DRI.d.b < SymtabLoadCmd->NumSymbolTableEntries) return; } @@ -144,9 +113,9 @@ void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const { const MachOFormat::SymbolTableEntry * MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const { - LoadCommandInfo LCI = getLoadCommandInfo(DRI.d.a); + const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); const MachOFormat::SymtabLoadCommand *SymtabLoadCmd = - getSymtabLoadCommand(LCI); + reinterpret_cast(Command); return getSymbolTableEntry(DRI, SymtabLoadCmd); } @@ -165,9 +134,9 @@ MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI, const MachOFormat::Symbol64TableEntry* MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const { - LoadCommandInfo LCI = getLoadCommandInfo(DRI.d.a); + const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); const MachOFormat::SymtabLoadCommand *SymtabLoadCmd = - getSymtabLoadCommand(LCI); + reinterpret_cast(Command); return getSymbol64TableEntry(DRI, SymtabLoadCmd); } @@ -194,9 +163,9 @@ error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI, error_code MachOObjectFile::getSymbolName(DataRefImpl DRI, StringRef &Result) const { - LoadCommandInfo LCI = getLoadCommandInfo(DRI.d.a); + const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); const MachOFormat::SymtabLoadCommand *SymtabLoadCmd = - getSymtabLoadCommand(LCI); + reinterpret_cast(Command); StringRef StringTable = MachOObj->getData(SymtabLoadCmd->StringTableOffset, @@ -492,15 +461,15 @@ StringRef MachOObjectFile::getLoadName() const { 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) { + const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); + if (Command->Type == macho::LCT_Segment) { const MachOFormat::SegmentLoadCommand *SegmentLoadCmd = - getSegmentLoadCommand(LCI); + reinterpret_cast(Command); if (DRI.d.b < SegmentLoadCmd->NumSections) return; - } else if (LCI.Command->Type == macho::LCT_Segment64) { + } else if (Command->Type == macho::LCT_Segment64) { const MachOFormat::Segment64LoadCommand *Segment64LoadCmd = - getSegment64LoadCommand(LCI); + reinterpret_cast(Command); if (DRI.d.b < Segment64LoadCmd->NumSections) return; } @@ -520,21 +489,21 @@ error_code MachOObjectFile::getSectionNext(DataRefImpl DRI, static bool is64BitLoadCommand(const MachOObjectFile *MachOObj, DataRefImpl DRI) { - MachOObjectFile::LoadCommandInfo LCI = + const MachOFormat::LoadCommand *Command = MachOObj->getLoadCommandInfo(DRI.d.a); - if (LCI.Command->Type == macho::LCT_Segment64) + if (Command->Type == macho::LCT_Segment64) return true; - assert(LCI.Command->Type == macho::LCT_Segment && "Unexpected Type."); + assert(Command->Type == macho::LCT_Segment && "Unexpected Type."); return false; } const MachOFormat::Section *MachOObjectFile::getSection(DataRefImpl DRI) const { assert(!is64BitLoadCommand(this, DRI)); - LoadCommandInfo LCI = getLoadCommandInfo(DRI.d.a); - unsigned SectionOffset = LCI.Offset + sizeof(macho::SegmentLoadCommand) + + const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); + uintptr_t CommandAddr = reinterpret_cast(Command); + uintptr_t SectionAddr = CommandAddr + sizeof(macho::SegmentLoadCommand) + DRI.d.b * sizeof(MachOFormat::Section); - StringRef Data = MachOObj->getData(SectionOffset, sizeof(MachOFormat::Section)); - return reinterpret_cast(Data.data()); + return reinterpret_cast(SectionAddr); } std::size_t MachOObjectFile::getSectionIndex(DataRefImpl Sec) const { @@ -547,11 +516,11 @@ std::size_t MachOObjectFile::getSectionIndex(DataRefImpl Sec) const { const MachOFormat::Section64 * MachOObjectFile::getSection64(DataRefImpl DRI) const { assert(is64BitLoadCommand(this, DRI)); - LoadCommandInfo LCI = getLoadCommandInfo(DRI.d.a); - unsigned SectionOffset = LCI.Offset + sizeof(macho::Segment64LoadCommand) + + const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); + uintptr_t CommandAddr = reinterpret_cast(Command); + uintptr_t SectionAddr = CommandAddr + sizeof(macho::Segment64LoadCommand) + DRI.d.b * sizeof(MachOFormat::Section64); - StringRef Data = MachOObj->getData(SectionOffset, sizeof(MachOFormat::Section64)); - return reinterpret_cast(Data.data()); + return reinterpret_cast(SectionAddr); } static StringRef parseSegmentOrSectionName(const char *P) { diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 44a6221c15e8..9275fe147ab0 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -218,12 +218,12 @@ static void getSectionsAndSymbols(const macho::Header &Header, } for (unsigned i = 0; i != Header.NumLoadCommands; ++i) { - MachOObjectFile::LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(i); - if (LCI.Command->Type == macho::LCT_FunctionStarts) { + const MachOFormat::LoadCommand *Command = MachOObj->getLoadCommandInfo(i); + if (Command->Type == macho::LCT_FunctionStarts) { // We found a function starts segment, parse the addresses for later // consumption. const MachOFormat::LinkeditDataLoadCommand *LLC = - MachOObj->getLinkeditDataLoadCommand(LCI); + reinterpret_cast(Command); MachOObj->ReadULEB128s(LLC->DataOffset, FoundFns); }