mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-26 18:20:39 +00:00
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:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user