[llvm] r178990 - Add MachOObjectFile::LoadCommandInfo.
Rafael Espindola
rafael.espindola at gmail.com
Sun Apr 7 11:08:12 PDT 2013
Author: rafael
Date: Sun Apr 7 13:08:12 2013
New Revision: 178990
URL: http://llvm.org/viewvc/llvm-project?rev=178990&view=rev
Log:
Add MachOObjectFile::LoadCommandInfo.
This avoids using MachOObject::getLoadCommandInfo.
Modified:
llvm/trunk/include/llvm/Object/MachO.h
llvm/trunk/lib/Object/MachOObjectFile.cpp
llvm/trunk/tools/llvm-objdump/MachODump.cpp
Modified: llvm/trunk/include/llvm/Object/MachO.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachO.h?rev=178990&r1=178989&r2=178990&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/MachO.h (original)
+++ llvm/trunk/include/llvm/Object/MachO.h Sun Apr 7 13:08:12 2013
@@ -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<uint64_t> &Out) const;
const macho::Header &getHeader() const;
Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=178990&r1=178989&r2=178990&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Sun Apr 7 13:08:12 2013
@@ -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<const MachOFormat::LoadCommand*>(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(D
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(
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::getSectionNe
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;
}
Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=178990&r1=178989&r2=178990&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Sun Apr 7 13:08:12 2013
@@ -218,8 +218,8 @@ static void getSectionsAndSymbols(const
}
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 =
More information about the llvm-commits
mailing list