aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/MC/MCAsmLayout.h27
-rw-r--r--include/llvm/MC/MCAssembler.h11
-rw-r--r--lib/MC/MCAssembler.cpp70
3 files changed, 37 insertions, 71 deletions
diff --git a/include/llvm/MC/MCAsmLayout.h b/include/llvm/MC/MCAsmLayout.h
index 9866100..8a38247 100644
--- a/include/llvm/MC/MCAsmLayout.h
+++ b/include/llvm/MC/MCAsmLayout.h
@@ -84,35 +84,26 @@ 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;
+ /// @}
+ /// @name Utility Functions
+ /// @{
- /// \brief Set the data size of the given section.
- void setSectionFileSize(MCSectionData *SD, uint64_t Value);
+ /// \brief Get the address of the given fragment, as computed in the current
+ /// 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 Set the address space size of the given section.
- void setSectionAddressSize(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 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
- /// @{
-
- /// \brief Get the address of the given fragment, as computed in the current
- /// layout.
- uint64_t getFragmentAddress(const MCFragment *F) const;
-
/// \brief Get the address of the given symbol, as computed in the current
/// layout.
uint64_t getSymbolAddress(const MCSymbolData *SD) const;
diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h
index 8918dbb..33fa295 100644
--- a/include/llvm/MC/MCAssembler.h
+++ b/include/llvm/MC/MCAssembler.h
@@ -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;
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 991de3d..7391285 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -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;
-uint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const {
- assert(SD->AddressSize != ~UINT64_C(0) && "Address size not set!");
- return SD->AddressSize;
+ // Otherwise, the file size is the same as the address space size.
+ return getSectionAddressSize(SD);
}
-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();