MC: Eliminate MCSectionData::{,Address,File}Size, which can now be computed by

utility functions.

llvm-svn: 103695
This commit is contained in:
Daniel Dunbar 2010-05-13 03:19:50 +00:00
parent 03bd9216df
commit 561f55c1af
3 changed files with 40 additions and 74 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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();