[Object, MachO] Cache parsed MachO header in MachOObjectFile. NFC.

Summary:
Avoid parsing object file each time MachOObjectFile::getHeader() is
called. Instead, cache the header in MachOObjectFile constructor, where
it's parsed anyway. In future, we must avoid constructing the object
at all if the header can't be parsed.

Test Plan: regression test suite.

Reviewers: rafael

Subscribers: llvm-commits

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239075 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alexey Samsonov 2015-06-04 19:22:03 +00:00
parent 23fd513829
commit d7eb7d7fb1
2 changed files with 23 additions and 22 deletions

View File

@ -385,8 +385,8 @@ public:
MachO::any_relocation_info getRelocation(DataRefImpl Rel) const;
MachO::data_in_code_entry getDice(DataRefImpl Rel) const;
MachO::mach_header getHeader() const;
MachO::mach_header_64 getHeader64() const;
const MachO::mach_header &getHeader() const;
const MachO::mach_header_64 &getHeader64() const;
uint32_t
getIndirectSymbolTableEntry(const MachO::dysymtab_command &DLC,
unsigned Index) const;
@ -433,6 +433,7 @@ private:
LoadCommandInfo getFirstLoadCommandInfo() const;
LoadCommandInfo getNextLoadCommandInfo(const LoadCommandInfo &L) const;
MachO::mach_header_64 Header64;
typedef SmallVector<const char*, 1> SectionList;
SectionList Sections;
typedef SmallVector<const char*, 1> LibraryList;

View File

@ -187,7 +187,16 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
DataInCodeLoadCmd(nullptr), LinkOptHintsLoadCmd(nullptr),
DyldInfoLoadCmd(nullptr), UuidLoadCmd(nullptr),
HasPageZeroSegment(false) {
uint32_t LoadCommandCount = this->getHeader().ncmds;
// Parse header.
if (is64Bit())
Header64 = getStruct<MachO::mach_header_64>(this, getPtr(this, 0));
else
// First fields of MachO::mach_header_64 are the same as
// in MachO::mach_header.
*reinterpret_cast<MachO::mach_header *>(&this->Header64) =
getStruct<MachO::mach_header>(this, getPtr(this, 0));
uint32_t LoadCommandCount = getHeader().ncmds;
if (LoadCommandCount == 0)
return;
@ -1195,21 +1204,9 @@ unsigned MachOObjectFile::getArch() const {
Triple MachOObjectFile::getArch(const char **McpuDefault,
Triple *ThumbTriple) const {
Triple T;
if (is64Bit()) {
MachO::mach_header_64 H_64;
H_64 = getHeader64();
T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype, McpuDefault);
*ThumbTriple = MachOObjectFile::getThumbArch(H_64.cputype, H_64.cpusubtype,
McpuDefault);
} else {
MachO::mach_header H;
H = getHeader();
T = MachOObjectFile::getArch(H.cputype, H.cpusubtype, McpuDefault);
*ThumbTriple = MachOObjectFile::getThumbArch(H.cputype, H.cpusubtype,
McpuDefault);
}
return T;
const auto &Header = getHeader();
*ThumbTriple = getThumbArch(Header.cputype, Header.cpusubtype, McpuDefault);
return getArch(Header.cputype, Header.cpusubtype, McpuDefault);
}
relocation_iterator MachOObjectFile::section_rel_begin(unsigned Index) const {
@ -2164,12 +2161,15 @@ MachOObjectFile::getDice(DataRefImpl Rel) const {
return getStruct<MachO::data_in_code_entry>(this, P);
}
MachO::mach_header MachOObjectFile::getHeader() const {
return getStruct<MachO::mach_header>(this, getPtr(this, 0));
const MachO::mach_header &MachOObjectFile::getHeader() const {
// First fields of MachO::mach_header_64 are the same as
// in MachO::mach_header.
return *reinterpret_cast<const MachO::mach_header *>(&this->Header64);
}
MachO::mach_header_64 MachOObjectFile::getHeader64() const {
return getStruct<MachO::mach_header_64>(this, getPtr(this, 0));
const MachO::mach_header_64 &MachOObjectFile::getHeader64() const {
assert(is64Bit());
return Header64;
}
uint32_t MachOObjectFile::getIndirectSymbolTableEntry(