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;
uint64_t getSectionSize(const coff_section *Sec) const;
std::error_code getSectionContents(const coff_section *Sec,
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 {
const coff_section *Sec = toSec(Ref);
return Sec->SizeOfRawData;
return getSectionSize(toSec(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;
}
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
COFFObjectFile::getSectionContents(const coff_section *Sec,
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
// data, as there's nothing that says that is not allowed.
uintptr_t ConStart = uintptr_t(base()) + Sec->PointerToRawData;
// 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 DataSize;
if (Sec->VirtualSize)
DataSize = std::min(Sec->VirtualSize, Sec->SizeOfRawData);
else
DataSize = Sec->SizeOfRawData;
uintptr_t ConEnd = ConStart + DataSize;
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<const uint8_t *>(ConStart), DataSize);
Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), SectionSize);
return object_error::success;
}