diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-08 23:57:13 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-08 23:57:13 +0000 |
| commit | 65d601f96c58cdcce9844a3973d178753dc0d9d3 (patch) | |
| tree | a99b75379fa60b486e1e52379ec7426bd4887d7d | |
| parent | 9dd90ac5b44b6a038c9a84be0cfd4c3d403031a8 (diff) | |
| download | bcm5719-llvm-65d601f96c58cdcce9844a3973d178753dc0d9d3.tar.gz bcm5719-llvm-65d601f96c58cdcce9844a3973d178753dc0d9d3.zip | |
Add a SectionBase struct.
Use it to share code and when we don't need to know if we have a 32 or 64
bit Section.
llvm-svn: 179072
| -rw-r--r-- | llvm/include/llvm/Object/MachO.h | 6 | ||||
| -rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 48 |
2 files changed, 30 insertions, 24 deletions
diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h index 5c50ceb2b67..07c8fc5ca2b 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -27,6 +27,11 @@ namespace llvm { namespace object { namespace MachOFormat { + struct SectionBase { + char Name[16]; + char SegmentName[16]; + }; + template<bool is64Bits> struct Section; @@ -254,6 +259,7 @@ private: typedef SmallVector<DataRefImpl, 1> SectionList; SectionList Sections; + const MachOFormat::SectionBase *getSectionBase(DataRefImpl DRI) const; void moveToNextSection(DataRefImpl &DRI) const; diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 30ab00f450c..3931c53ac83 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -509,11 +509,8 @@ error_code MachOObjectFile::getSectionNext(DataRefImpl DRI, const MachOFormat::Section<false> * MachOObjectFile::getSection(DataRefImpl DRI) const { assert(!is64Bit()); - const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); - uintptr_t CommandAddr = reinterpret_cast<uintptr_t>(Command); - uintptr_t SectionAddr = CommandAddr + sizeof(macho::SegmentLoadCommand) + - DRI.d.b * sizeof(MachOFormat::Section<false>); - return reinterpret_cast<const MachOFormat::Section<false>*>(SectionAddr); + const MachOFormat::SectionBase *Addr = getSectionBase(DRI); + return reinterpret_cast<const MachOFormat::Section<false>*>(Addr); } std::size_t MachOObjectFile::getSectionIndex(DataRefImpl Sec) const { @@ -523,14 +520,27 @@ std::size_t MachOObjectFile::getSectionIndex(DataRefImpl Sec) const { return std::distance(Sections.begin(), loc); } +const MachOFormat::SectionBase* +MachOObjectFile::getSectionBase(DataRefImpl DRI) const { + const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); + uintptr_t CommandAddr = reinterpret_cast<uintptr_t>(Command); + + bool Is64 = is64Bit(); + unsigned SegmentLoadSize = + Is64 ? sizeof(MachOFormat::SegmentLoadCommand<true>) : + sizeof(MachOFormat::SegmentLoadCommand<false>); + unsigned SectionSize = Is64 ? sizeof(MachOFormat::Section<true>) : + sizeof(MachOFormat::Section<false>); + + uintptr_t SectionAddr = CommandAddr + SegmentLoadSize + DRI.d.b * SectionSize; + return reinterpret_cast<const MachOFormat::SectionBase*>(SectionAddr); +} + const MachOFormat::Section<true> * MachOObjectFile::getSection64(DataRefImpl DRI) const { assert(is64Bit()); - const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a); - uintptr_t CommandAddr = reinterpret_cast<uintptr_t>(Command); - uintptr_t SectionAddr = CommandAddr + sizeof(macho::Segment64LoadCommand) + - DRI.d.b * sizeof(MachOFormat::Section<true>); - return reinterpret_cast<const MachOFormat::Section<true>*>(SectionAddr); + const MachOFormat::SectionBase *Addr = getSectionBase(DRI); + return reinterpret_cast<const MachOFormat::Section<true>*>(Addr); } static StringRef parseSegmentOrSectionName(const char *P) { @@ -542,13 +552,8 @@ static StringRef parseSegmentOrSectionName(const char *P) { } ArrayRef<char> MachOObjectFile::getSectionRawName(DataRefImpl DRI) const { - if (is64Bit()) { - const MachOFormat::Section<true> *sec = getSection64(DRI); - return ArrayRef<char>(sec->Name); - } else { - const MachOFormat::Section<false> *sec = getSection(DRI); - return ArrayRef<char>(sec->Name); - } + const MachOFormat::SectionBase *Base = getSectionBase(DRI); + return ArrayRef<char>(Base->Name); } error_code MachOObjectFile::getSectionName(DataRefImpl DRI, @@ -560,13 +565,8 @@ error_code MachOObjectFile::getSectionName(DataRefImpl DRI, ArrayRef<char> MachOObjectFile::getSectionRawFinalSegmentName(DataRefImpl Sec) const { - if (is64Bit()) { - const MachOFormat::Section<true> *sec = getSection64(Sec); - return ArrayRef<char>(sec->SegmentName, 16); - } else { - const MachOFormat::Section<false> *sec = getSection(Sec); - return ArrayRef<char>(sec->SegmentName); - } + const MachOFormat::SectionBase *Base = getSectionBase(Sec); + return ArrayRef<char>(Base->SegmentName); } StringRef MachOObjectFile::getSectionFinalSegmentName(DataRefImpl DRI) const { |

