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
This commit is contained in:
David Majnemer
2014-10-09 08:42:31 +00:00
parent 340b5b9ad7
commit 06f1f357e3
2 changed files with 25 additions and 19 deletions

View File

@@ -655,6 +655,7 @@ public:
} }
std::error_code getSectionName(const coff_section *Sec, StringRef &Res) const; 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, std::error_code getSectionContents(const coff_section *Sec,
ArrayRef<uint8_t> &Res) const; ArrayRef<uint8_t> &Res) const;

View File

@@ -271,8 +271,7 @@ uint64_t COFFObjectFile::getSectionAddress(DataRefImpl Ref) const {
} }
uint64_t COFFObjectFile::getSectionSize(DataRefImpl Ref) const { uint64_t COFFObjectFile::getSectionSize(DataRefImpl Ref) const {
const coff_section *Sec = toSec(Ref); return getSectionSize(toSec(Ref));
return Sec->SizeOfRawData;
} }
std::error_code COFFObjectFile::getSectionContents(DataRefImpl Ref, std::error_code COFFObjectFile::getSectionContents(DataRefImpl Ref,
@@ -866,6 +865,26 @@ std::error_code COFFObjectFile::getSectionName(const coff_section *Sec,
return object_error::success; return object_error::success;
} }
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.
//
// For object files, SizeOfRawData contains the size of section's data;
// VirtualSize is always zero.
//
// For executables, SizeOfRawData *must* be a multiple of FileAlignment; the
// 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 SectionSize;
if (Sec->VirtualSize)
SectionSize = std::min(Sec->VirtualSize, Sec->SizeOfRawData);
else
SectionSize = Sec->SizeOfRawData;
return SectionSize;
}
std::error_code std::error_code
COFFObjectFile::getSectionContents(const coff_section *Sec, COFFObjectFile::getSectionContents(const coff_section *Sec,
ArrayRef<uint8_t> &Res) const { ArrayRef<uint8_t> &Res) const {
@@ -877,25 +896,11 @@ COFFObjectFile::getSectionContents(const coff_section *Sec,
// within the file bounds. We don't need to make sure it doesn't cover other // 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. // data, as there's nothing that says that is not allowed.
uintptr_t ConStart = uintptr_t(base()) + Sec->PointerToRawData; uintptr_t ConStart = uintptr_t(base()) + Sec->PointerToRawData;
// SizeOfRawData and VirtualSize change what they represent depending on uint32_t SectionSize = getSectionSize(Sec);
// whether or not we have an executable image. uintptr_t ConEnd = ConStart + SectionSize;
//
// For object files, SizeOfRawData contains the size of section's data;
// VirtualSize is always zero.
//
// For executables, SizeOfRawData *must* be a multiple of FileAlignment; the
// 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;
if (Sec->VirtualSize)
DataSize = std::min(Sec->VirtualSize, Sec->SizeOfRawData);
else
DataSize = Sec->SizeOfRawData;
uintptr_t ConEnd = ConStart + DataSize;
if (ConEnd > uintptr_t(Data.getBufferEnd())) if (ConEnd > uintptr_t(Data.getBufferEnd()))
return object_error::parse_failed; return object_error::parse_failed;
Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), DataSize); Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), SectionSize);
return object_error::success; return object_error::success;
} }