diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-10-09 08:42:31 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-10-09 08:42:31 +0000 |
commit | a9ee5c06f4c7d6e03aafe2b730f505f901694987 (patch) | |
tree | bc8610ca495fb68aa510f761bf711760a0e25388 /llvm/lib/Object/COFFObjectFile.cpp | |
parent | d5b14f79947fbd7d94e7bab689b9b01b8634a75e (diff) | |
download | bcm5719-llvm-a9ee5c06f4c7d6e03aafe2b730f505f901694987.tar.gz bcm5719-llvm-a9ee5c06f4c7d6e03aafe2b730f505f901694987.zip |
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.
llvm-svn: 219391
Diffstat (limited to 'llvm/lib/Object/COFFObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 72a6db4aab9..3beab00ed7d 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/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<uint8_t> &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<uint8_t> &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<const uint8_t *>(ConStart), DataSize); + Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), SectionSize); return object_error::success; } |