summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/COFFObjectFile.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-10-09 08:42:31 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-10-09 08:42:31 +0000
commita9ee5c06f4c7d6e03aafe2b730f505f901694987 (patch)
treebc8610ca495fb68aa510f761bf711760a0e25388 /llvm/lib/Object/COFFObjectFile.cpp
parentd5b14f79947fbd7d94e7bab689b9b01b8634a75e (diff)
downloadbcm5719-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.cpp41
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;
}
OpenPOWER on IntegriCloud