forked from OSchip/llvm-project
Add MachOObjectFile::LoadCommandInfo.
This avoids using MachOObject::getLoadCommandInfo. llvm-svn: 178990
This commit is contained in:
parent
1309a448ff
commit
224208b868
|
@ -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;
|
||||
|
||||
|
|
|
@ -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(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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 =
|
||||
|
|
Loading…
Reference in New Issue