1 //===- AlignFragment.cpp --------------------------------------------------===//
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 #include "mcld/Fragment/AlignFragment.h"
10 #include "mcld/LD/SectionData.h"
11
12 #include <llvm/Support/MathExtras.h>
13
14 namespace mcld {
15
16 //===----------------------------------------------------------------------===//
17 // AlignFragment
18 //===----------------------------------------------------------------------===//
AlignFragment(unsigned int pAlignment,int64_t pValue,unsigned int pValueSize,unsigned int pMaxBytesToEmit,SectionData * pSD)19 AlignFragment::AlignFragment(unsigned int pAlignment,
20 int64_t pValue,
21 unsigned int pValueSize,
22 unsigned int pMaxBytesToEmit,
23 SectionData* pSD)
24 : Fragment(Fragment::Alignment, pSD),
25 m_Alignment(pAlignment),
26 m_Value(pValue),
27 m_ValueSize(pValueSize),
28 m_MaxBytesToEmit(pMaxBytesToEmit),
29 m_bEmitNops(false) {
30 }
31
size() const32 size_t AlignFragment::size() const {
33 assert(hasOffset() &&
34 "AlignFragment::size() should not be called before layout.");
35 uint64_t size = llvm::OffsetToAlignment(getOffset(), m_Alignment);
36 if (size > m_MaxBytesToEmit)
37 return 0;
38
39 return size;
40 }
41
42 } // namespace mcld
43