From db7a9f12bc4600769af847de69a2021cb0c0c14a Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 26 Jun 2015 12:33:37 +0000 Subject: [PATCH] Add a ELFSectionRef class and use it to expose getSectionType. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240778 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELFObjectFile.h | 25 +++++++++++++++---- .../RuntimeDyld/RuntimeDyld.cpp | 6 ++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index dc337050e48..889425c4d92 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -40,12 +40,14 @@ class ELFSymbolRef; class ELFObjectFileBase : public ObjectFile { friend class ELFSymbolRef; + friend class ELFSectionRef; protected: ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source); virtual uint64_t getSymbolSize(DataRefImpl Symb) const = 0; virtual uint8_t getSymbolOther(DataRefImpl Symb) const = 0; + virtual uint32_t getSectionType(DataRefImpl Sec) const = 0; public: virtual ErrorOr getRelocationAddend(DataRefImpl Rel) const = 0; @@ -58,13 +60,27 @@ public: virtual elf_symbol_iterator_range getDynamicSymbolIterators() const = 0; virtual uint64_t getSectionFlags(SectionRef Sec) const = 0; - virtual uint32_t getSectionType(SectionRef Sec) const = 0; elf_symbol_iterator_range symbols() const; static inline bool classof(const Binary *v) { return v->isELF(); } }; +class ELFSectionRef : public SectionRef { +public: + ELFSectionRef(const SectionRef &B) : SectionRef(B) { + assert(isa(SectionRef::getObject())); + } + + const ELFObjectFileBase *getObject() const { + return cast(SectionRef::getObject()); + } + + uint32_t getType() const { + return getObject()->getSectionType(getRawDataRefImpl()); + } +}; + class ELFSymbolRef : public SymbolRef { public: ELFSymbolRef(const SymbolRef &B) : SymbolRef(B) { @@ -170,6 +186,7 @@ protected: getRelocationTypeName(DataRefImpl Rel, SmallVectorImpl &Result) const override; + uint32_t getSectionType(DataRefImpl Sec) const override; uint64_t getROffset(DataRefImpl Rel) const; StringRef getRelocationTypeName(uint32_t Type) const; @@ -263,7 +280,6 @@ public: bool hasRelocationAddend(DataRefImpl Rel) const override; uint64_t getSectionFlags(SectionRef Sec) const override; - uint32_t getSectionType(SectionRef Sec) const override; uint8_t getBytesInAddress() const override; StringRef getFileFormatName() const override; @@ -315,9 +331,8 @@ uint64_t ELFObjectFile::getSectionFlags(SectionRef Sec) const { } template -uint32_t ELFObjectFile::getSectionType(SectionRef Sec) const { - DataRefImpl DRI = Sec.getRawDataRefImpl(); - return toELFShdrIter(DRI)->sh_type; +uint32_t ELFObjectFile::getSectionType(DataRefImpl Sec) const { + return toELFShdrIter(Sec)->sh_type; } template diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 6df3d778565..fdb634e888c 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -306,10 +306,10 @@ static bool isReadOnlyData(const SectionRef &Section) { return false; } -static bool isZeroInit(const SectionRef &Section) { +static bool isZeroInit(const SectionRef Section) { const ObjectFile *Obj = Section.getObject(); - if (auto *ELFObj = dyn_cast(Obj)) - return ELFObj->getSectionType(Section) == ELF::SHT_NOBITS; + if (isa(Obj)) + return ELFSectionRef(Section).getType() == ELF::SHT_NOBITS; if (auto *COFFObj = dyn_cast(Obj)) return COFFObj->getCOFFSection(Section)->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;