aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/MC/MCAsmLayout.h12
-rw-r--r--include/llvm/MC/MCAssembler.h6
-rw-r--r--lib/MC/MCAssembler.cpp21
3 files changed, 30 insertions, 9 deletions
diff --git a/include/llvm/MC/MCAsmLayout.h b/include/llvm/MC/MCAsmLayout.h
index c4492a6299..986610018d 100644
--- a/include/llvm/MC/MCAsmLayout.h
+++ b/include/llvm/MC/MCAsmLayout.h
@@ -91,10 +91,18 @@ public:
/// \brief Set the data size of the given section.
void setSectionFileSize(MCSectionData *SD, uint64_t Value);
- /// \brief Get the actual data size of the given section.
+ /// \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 actual data size of the given section.
+ /// \brief Set the logical data size of the given section.
void setSectionSize(MCSectionData *SD, uint64_t Value);
/// @}
diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h
index e0e009526d..b641b0241d 100644
--- a/include/llvm/MC/MCAssembler.h
+++ b/include/llvm/MC/MCAssembler.h
@@ -394,9 +394,13 @@ private:
/// initialized.
uint64_t Address;
- /// Size - The content size of this section. This is ~0 until initialized.
+ /// 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;
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 0bab34e4b2..ced395c517 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -126,6 +126,14 @@ void MCAsmLayout::setSectionFileSize(MCSectionData *SD, uint64_t Value) {
SD->FileSize = Value;
}
+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;
+}
+
/* *** */
MCFragment::MCFragment() : Kind(FragmentType(~0)) {
@@ -150,6 +158,7 @@ MCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A)
Alignment(1),
Address(~UINT64_C(0)),
Size(~UINT64_C(0)),
+ AddressSize(~UINT64_C(0)),
FileSize(~UINT64_C(0)),
HasInstructions(false)
{
@@ -434,7 +443,8 @@ void MCAssembler::LayoutSection(MCAsmLayout &Layout,
uint64_t StartAddress = 0;
if (SectionOrderIndex) {
MCSectionData *Prev = Layout.getSectionOrder()[SectionOrderIndex - 1];
- StartAddress = Layout.getSectionAddress(Prev) + Layout.getSectionSize(Prev);
+ StartAddress = (Layout.getSectionAddress(Prev) +
+ Layout.getSectionAddressSize(Prev));
}
// Align this section if necessary by adding padding bytes to the previous
@@ -465,6 +475,7 @@ void MCAssembler::LayoutSection(MCAsmLayout &Layout,
Size = Layout.getFragmentOffset(F) + Layout.getFragmentEffectiveSize(F);
}
Layout.setSectionSize(&SD, Size);
+ Layout.setSectionAddressSize(&SD, Size);
Layout.setSectionFileSize(&SD, IsVirtual ? 0 : Size);
}
@@ -837,9 +848,7 @@ void MCFragment::dump() {
raw_ostream &OS = llvm::errs();
OS << "<MCFragment " << (void*) this << " Offset:" << Offset
- << " EffectiveSize:" << EffectiveSize;
-
- OS << ">";
+ << " EffectiveSize:" << EffectiveSize << ">";
}
void MCAlignFragment::dump() {
@@ -914,8 +923,8 @@ void MCSectionData::dump() {
OS << "<MCSectionData";
OS << " Alignment:" << getAlignment() << " Address:" << Address
- << " Size:" << Size << " FileSize:" << FileSize
- << " Fragments:[\n ";
+ << " Size:" << Size << " AddressSize:" << AddressSize
+ << " FileSize:" << FileSize << " Fragments:[\n ";
for (iterator it = begin(), ie = end(); it != ie; ++it) {
if (it != begin()) OS << ",\n ";
it->dump();