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 | a6780da6614acff7d6f407c486c9cc1144978980 (patch) | |
| tree | ea5d30999a3e8e06fc9015bd4dc82765871074d4 | |
| parent | 4dac59dcb7725df200d35a5ae64335f84c0e7c6a (diff) | |
| download | bcm5719-llvm-a6780da6614acff7d6f407c486c9cc1144978980.tar.gz bcm5719-llvm-a6780da6614acff7d6f407c486c9cc1144978980.zip | |
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.
llvm-svn: 103690
| -rw-r--r-- | llvm/include/llvm/MC/MCAssembler.h | 12 | ||||
| -rw-r--r-- | llvm/lib/MC/MCAssembler.cpp | 18 |
2 files changed, 28 insertions, 2 deletions
diff --git a/llvm/include/llvm/MC/MCAssembler.h b/llvm/include/llvm/MC/MCAssembler.h index b641b0241d8..8918dbbb3c3 100644 --- a/llvm/include/llvm/MC/MCAssembler.h +++ b/llvm/include/llvm/MC/MCAssembler.h @@ -258,12 +258,19 @@ class MCAlignFragment : public MCFragment { /// target dependent. bool EmitNops : 1; + /// OnlyAlignAddress - Flag to indicate that this align is only used to adjust + /// the address space size of a section and that it should not be included as + /// part of the section size. This flag can only be used on the last fragment + /// in a section. + bool OnlyAlignAddress : 1; + public: MCAlignFragment(unsigned _Alignment, int64_t _Value, unsigned _ValueSize, unsigned _MaxBytesToEmit, MCSectionData *SD = 0) : MCFragment(FT_Align, SD), Alignment(_Alignment), Value(_Value),ValueSize(_ValueSize), - MaxBytesToEmit(_MaxBytesToEmit), EmitNops(false) {} + MaxBytesToEmit(_MaxBytesToEmit), EmitNops(false), + OnlyAlignAddress(false) {} /// @name Accessors /// @{ @@ -279,6 +286,9 @@ public: bool hasEmitNops() const { return EmitNops; } void setEmitNops(bool Value) { EmitNops = Value; } + bool hasOnlyAlignAddress() const { return OnlyAlignAddress; } + void setOnlyAlignAddress(bool Value) { OnlyAlignAddress = Value; } + /// @} static bool classof(const MCFragment *F) { diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index ced395c5170..8086b3d4aea 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/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() |

