From: David Majnemer Date: Thu, 9 Oct 2014 08:42:31 +0000 (+0000) Subject: Object, COFF: Move the VirtualSize/SizeOfRawData logic to getSectionSize X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=06f1f357e360c3a0bcc703182878583a98120f65;p=oota-llvm.git Object, COFF: Move the VirtualSize/SizeOfRawData logic to getSectionSize While getSectionContents was updated to do the right thing, getSectionSize wasn't. Move the logic to getSectionSize and leverage it from getSectionContents. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219391 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 75857c954d8..c3428cdd1aa 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -655,6 +655,7 @@ public: } std::error_code getSectionName(const coff_section *Sec, StringRef &Res) const; + uint64_t getSectionSize(const coff_section *Sec) const; std::error_code getSectionContents(const coff_section *Sec, ArrayRef &Res) const; diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 72a6db4aab9..3beab00ed7d 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -271,8 +271,7 @@ uint64_t COFFObjectFile::getSectionAddress(DataRefImpl Ref) const { } uint64_t COFFObjectFile::getSectionSize(DataRefImpl Ref) const { - const coff_section *Sec = toSec(Ref); - return Sec->SizeOfRawData; + return getSectionSize(toSec(Ref)); } std::error_code COFFObjectFile::getSectionContents(DataRefImpl Ref, @@ -866,17 +865,7 @@ std::error_code COFFObjectFile::getSectionName(const coff_section *Sec, return object_error::success; } -std::error_code -COFFObjectFile::getSectionContents(const coff_section *Sec, - ArrayRef &Res) const { - // PointerToRawData and SizeOfRawData won't make sense for BSS sections, - // don't do anything interesting for them. - assert((Sec->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) == 0 && - "BSS sections don't have contents!"); - // The only thing that we need to verify is that the contents is contained - // within the file bounds. We don't need to make sure it doesn't cover other - // data, as there's nothing that says that is not allowed. - uintptr_t ConStart = uintptr_t(base()) + Sec->PointerToRawData; +uint64_t COFFObjectFile::getSectionSize(const coff_section *Sec) const { // SizeOfRawData and VirtualSize change what they represent depending on // whether or not we have an executable image. // @@ -887,15 +876,31 @@ COFFObjectFile::getSectionContents(const coff_section *Sec, // actual section size is in VirtualSize. It is possible for VirtualSize to // be greater than SizeOfRawData; the contents past that point should be // considered to be zero. - uint32_t DataSize; + uint32_t SectionSize; if (Sec->VirtualSize) - DataSize = std::min(Sec->VirtualSize, Sec->SizeOfRawData); + SectionSize = std::min(Sec->VirtualSize, Sec->SizeOfRawData); else - DataSize = Sec->SizeOfRawData; - uintptr_t ConEnd = ConStart + DataSize; + SectionSize = Sec->SizeOfRawData; + + return SectionSize; +} + +std::error_code +COFFObjectFile::getSectionContents(const coff_section *Sec, + ArrayRef &Res) const { + // PointerToRawData and SizeOfRawData won't make sense for BSS sections, + // don't do anything interesting for them. + assert((Sec->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) == 0 && + "BSS sections don't have contents!"); + // The only thing that we need to verify is that the contents is contained + // within the file bounds. We don't need to make sure it doesn't cover other + // data, as there's nothing that says that is not allowed. + uintptr_t ConStart = uintptr_t(base()) + Sec->PointerToRawData; + uint32_t SectionSize = getSectionSize(Sec); + uintptr_t ConEnd = ConStart + SectionSize; if (ConEnd > uintptr_t(Data.getBufferEnd())) return object_error::parse_failed; - Res = makeArrayRef(reinterpret_cast(ConStart), DataSize); + Res = makeArrayRef(reinterpret_cast(ConStart), SectionSize); return object_error::success; }