diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-05-13 01:10:26 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-05-13 01:10:26 +0000 |
commit | 456b5012704bcece2c8c28783e6efabb7b998616 (patch) | |
tree | d1a7d3c962927705fc264526adfca23e48b32953 /lib/MC/MCAssembler.cpp | |
parent | b5844ff1c44f0427bcf132eaece945da411e650f (diff) |
MC: Add MCAlignFragment::OnlyAlignAddress bit. This is a bit of magic that says the align fragment shouldn't contribute to the logical section size, it is will be used for cleaning up the code to handle section alignment.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103690 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAssembler.cpp')
-rw-r--r-- | lib/MC/MCAssembler.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index ced395c517..8086b3d4ae 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -392,6 +392,9 @@ void MCAssembler::LayoutFragment(MCAsmLayout &Layout, MCFragment &F) { case MCFragment::FT_Align: { MCAlignFragment &AF = cast<MCAlignFragment>(F); + assert((!AF.hasOnlyAlignAddress() || !AF.getNextNode()) && + "Invalid OnlyAlignAddress bit, not the last fragment!"); + EffectiveSize = OffsetToAlignment(Address, AF.getAlignment()); if (EffectiveSize > AF.getMaxBytesToEmit()) EffectiveSize = 0; @@ -474,9 +477,18 @@ void MCAssembler::LayoutSection(MCAsmLayout &Layout, MCFragment *F = &SD.getFragmentList().back(); Size = Layout.getFragmentOffset(F) + Layout.getFragmentEffectiveSize(F); } - Layout.setSectionSize(&SD, Size); 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. @@ -856,6 +868,10 @@ void MCAlignFragment::dump() { OS << "<MCAlignFragment "; this->MCFragment::dump(); + if (hasEmitNops()) + OS << " (emit nops)"; + if (hasOnlyAlignAddress()) + OS << " (only align section)"; OS << "\n "; OS << " Alignment:" << getAlignment() << " Value:" << getValue() << " ValueSize:" << getValueSize() |