1 //===- AlignFragment.h ----------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef MCLD_FRAGMENT_ALIGNFRAGMENT_H_ 10 #define MCLD_FRAGMENT_ALIGNFRAGMENT_H_ 11 12 #include "mcld/Fragment/Fragment.h" 13 14 namespace mcld { 15 16 class SectionData; 17 18 class AlignFragment : public Fragment { 19 public: 20 AlignFragment(unsigned int pAlignment, 21 int64_t pValue, 22 unsigned int pValueSize, 23 unsigned int pMaxBytesToEmit, 24 SectionData* pSD = NULL); 25 26 unsigned int getAlignment() const { return m_Alignment; } 27 28 int64_t getValue() const { return m_Value; } 29 30 unsigned int getValueSize() const { return m_ValueSize; } 31 32 unsigned int getMaxBytesToEmit() const { return m_MaxBytesToEmit; } 33 34 bool hasEmitNops() const { return m_bEmitNops; } 35 36 void setEmitNops(bool pValue) { m_bEmitNops = pValue; } 37 38 static bool classof(const Fragment* F) { 39 return F->getKind() == Fragment::Alignment; 40 } 41 42 static bool classof(const AlignFragment*) { return true; } 43 44 size_t size() const; 45 46 private: 47 /// Alignment - The alignment to ensure, in bytes. 48 unsigned int m_Alignment; 49 50 /// Value - Value to use for filling padding bytes. 51 int64_t m_Value; 52 53 /// ValueSize - The size of the integer (in bytes) of \arg Value. 54 unsigned int m_ValueSize; 55 56 /// MaxBytesToEmit - The maximum number of bytes to emit; if the alignment 57 /// cannot be satisfied in this width then this fragment is ignored. 58 unsigned int m_MaxBytesToEmit; 59 60 /// EmitNops - Flag to indicate that (optimal) NOPs should be emitted instead 61 /// of using the provided value. The exact interpretation of this flag is 62 /// target dependent. 63 bool m_bEmitNops : 1; 64 }; 65 66 } // namespace mcld 67 68 #endif // MCLD_FRAGMENT_ALIGNFRAGMENT_H_ 69