mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 22:58:50 +00:00
MC: Eliminate MCSectionData::{,Address,File}Size, which can now be computed by
utility functions. llvm-svn: 103695
This commit is contained in:
parent
03bd9216df
commit
561f55c1af
@ -84,27 +84,6 @@ public:
|
||||
/// \brief Set the computed address of the given section.
|
||||
void setSectionAddress(MCSectionData *SD, uint64_t Value);
|
||||
|
||||
/// \brief Get the data size of the given section, as emitted to the object
|
||||
/// file. This may include additional padding, or be 0 for virtual sections.
|
||||
uint64_t getSectionFileSize(const MCSectionData *SD) const;
|
||||
|
||||
/// \brief Set the data size of the given section.
|
||||
void setSectionFileSize(MCSectionData *SD, uint64_t Value);
|
||||
|
||||
/// \brief Get the address space size of the given section, as it effects
|
||||
/// layout. This may differ from the size reported by \see getSectionSize() by
|
||||
/// not including section tail padding.
|
||||
uint64_t getSectionAddressSize(const MCSectionData *SD) const;
|
||||
|
||||
/// \brief Set the address space size of the given section.
|
||||
void setSectionAddressSize(MCSectionData *SD, uint64_t Value);
|
||||
|
||||
/// \brief Get the logical data size of the given section.
|
||||
uint64_t getSectionSize(const MCSectionData *SD) const;
|
||||
|
||||
/// \brief Set the logical data size of the given section.
|
||||
void setSectionSize(MCSectionData *SD, uint64_t Value);
|
||||
|
||||
/// @}
|
||||
/// @name Utility Functions
|
||||
/// @{
|
||||
@ -113,6 +92,18 @@ public:
|
||||
/// layout.
|
||||
uint64_t getFragmentAddress(const MCFragment *F) const;
|
||||
|
||||
/// \brief Get the address space size of the given section, as it effects
|
||||
/// layout. This may differ from the size reported by \see getSectionSize() by
|
||||
/// not including section tail padding.
|
||||
uint64_t getSectionAddressSize(const MCSectionData *SD) const;
|
||||
|
||||
/// \brief Get the data size of the given section, as emitted to the object
|
||||
/// file. This may include additional padding, or be 0 for virtual sections.
|
||||
uint64_t getSectionFileSize(const MCSectionData *SD) const;
|
||||
|
||||
/// \brief Get the logical data size of the given section.
|
||||
uint64_t getSectionSize(const MCSectionData *SD) const;
|
||||
|
||||
/// \brief Get the address of the given symbol, as computed in the current
|
||||
/// layout.
|
||||
uint64_t getSymbolAddress(const MCSymbolData *SD) const;
|
||||
|
@ -404,17 +404,6 @@ private:
|
||||
/// initialized.
|
||||
uint64_t Address;
|
||||
|
||||
/// Size - The logical size of this section. This is ~0 until initialized.
|
||||
uint64_t Size;
|
||||
|
||||
/// AddressSize - The address space size used by this section. This is ~0
|
||||
/// until initialized.
|
||||
uint64_t AddressSize;
|
||||
|
||||
/// FileSize - The size of this section in the object file. This is ~0 until
|
||||
/// initialized.
|
||||
uint64_t FileSize;
|
||||
|
||||
/// HasInstructions - Whether this section has had instructions emitted into
|
||||
/// it.
|
||||
unsigned HasInstructions : 1;
|
||||
|
@ -110,28 +110,38 @@ void MCAsmLayout::setSectionAddress(MCSectionData *SD, uint64_t Value) {
|
||||
SD->Address = Value;
|
||||
}
|
||||
|
||||
uint64_t MCAsmLayout::getSectionSize(const MCSectionData *SD) const {
|
||||
assert(SD->Size != ~UINT64_C(0) && "File size not set!");
|
||||
return SD->Size;
|
||||
}
|
||||
void MCAsmLayout::setSectionSize(MCSectionData *SD, uint64_t Value) {
|
||||
SD->Size = Value;
|
||||
uint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const {
|
||||
// Empty sections have no size.
|
||||
if (SD->getFragmentList().empty())
|
||||
return 0;
|
||||
|
||||
// Otherwise, the size is the last fragment's end offset.
|
||||
const MCFragment &F = SD->getFragmentList().back();
|
||||
return getFragmentOffset(&F) + getFragmentEffectiveSize(&F);
|
||||
}
|
||||
|
||||
uint64_t MCAsmLayout::getSectionFileSize(const MCSectionData *SD) const {
|
||||
assert(SD->FileSize != ~UINT64_C(0) && "File size not set!");
|
||||
return SD->FileSize;
|
||||
}
|
||||
void MCAsmLayout::setSectionFileSize(MCSectionData *SD, uint64_t Value) {
|
||||
SD->FileSize = Value;
|
||||
// Virtual sections have no file size.
|
||||
if (getAssembler().getBackend().isVirtualSection(SD->getSection()))
|
||||
return 0;
|
||||
|
||||
// Otherwise, the file size is the same as the address space size.
|
||||
return getSectionAddressSize(SD);
|
||||
}
|
||||
|
||||
uint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const {
|
||||
assert(SD->AddressSize != ~UINT64_C(0) && "Address size not set!");
|
||||
return SD->AddressSize;
|
||||
}
|
||||
void MCAsmLayout::setSectionAddressSize(MCSectionData *SD, uint64_t Value) {
|
||||
SD->AddressSize = Value;
|
||||
uint64_t MCAsmLayout::getSectionSize(const MCSectionData *SD) const {
|
||||
// Empty sections have no size.
|
||||
if (SD->getFragmentList().empty())
|
||||
return 0;
|
||||
|
||||
// The logical size is the address space size minus any tail padding.
|
||||
uint64_t Size = getSectionAddressSize(SD);
|
||||
const MCAlignFragment *AF =
|
||||
dyn_cast<MCAlignFragment>(&(SD->getFragmentList().back()));
|
||||
if (AF && AF->hasOnlyAlignAddress())
|
||||
Size -= getFragmentEffectiveSize(AF);
|
||||
|
||||
return Size;
|
||||
}
|
||||
|
||||
/* *** */
|
||||
@ -157,9 +167,6 @@ MCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A)
|
||||
: Section(&_Section),
|
||||
Alignment(1),
|
||||
Address(~UINT64_C(0)),
|
||||
Size(~UINT64_C(0)),
|
||||
AddressSize(~UINT64_C(0)),
|
||||
FileSize(~UINT64_C(0)),
|
||||
HasInstructions(false)
|
||||
{
|
||||
if (A)
|
||||
@ -438,7 +445,6 @@ void MCAssembler::LayoutFragment(MCAsmLayout &Layout, MCFragment &F) {
|
||||
void MCAssembler::LayoutSection(MCAsmLayout &Layout,
|
||||
unsigned SectionOrderIndex) {
|
||||
MCSectionData &SD = *Layout.getSectionOrder()[SectionOrderIndex];
|
||||
bool IsVirtual = getBackend().isVirtualSection(SD.getSection());
|
||||
|
||||
++stats::SectionLayouts;
|
||||
|
||||
@ -458,25 +464,6 @@ void MCAssembler::LayoutSection(MCAsmLayout &Layout,
|
||||
|
||||
for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it)
|
||||
LayoutFragment(Layout, *it);
|
||||
|
||||
// Set the section sizes.
|
||||
uint64_t Size = 0;
|
||||
if (!SD.getFragmentList().empty()) {
|
||||
MCFragment *F = &SD.getFragmentList().back();
|
||||
Size = Layout.getFragmentOffset(F) + Layout.getFragmentEffectiveSize(F);
|
||||
}
|
||||
Layout.setSectionAddressSize(&SD, Size);
|
||||
Layout.setSectionFileSize(&SD, IsVirtual ? 0 : Size);
|
||||
|
||||
// Handle OnlyAlignAddress bit.
|
||||
if (!SD.getFragmentList().empty()) {
|
||||
MCAlignFragment *AF =
|
||||
dyn_cast<MCAlignFragment>(&SD.getFragmentList().back());
|
||||
if (AF && AF->hasOnlyAlignAddress())
|
||||
Size -= Layout.getFragmentEffectiveSize(AF);
|
||||
}
|
||||
|
||||
Layout.setSectionSize(&SD, Size);
|
||||
}
|
||||
|
||||
/// WriteFragmentData - Write the \arg F data to the output file.
|
||||
@ -948,8 +935,7 @@ void MCSectionData::dump() {
|
||||
|
||||
OS << "<MCSectionData";
|
||||
OS << " Alignment:" << getAlignment() << " Address:" << Address
|
||||
<< " Size:" << Size << " AddressSize:" << AddressSize
|
||||
<< " FileSize:" << FileSize << " Fragments:[\n ";
|
||||
<< " Fragments:[\n ";
|
||||
for (iterator it = begin(), ie = end(); it != ie; ++it) {
|
||||
if (it != begin()) OS << ",\n ";
|
||||
it->dump();
|
||||
|
Loading…
Reference in New Issue
Block a user