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
14namespace mcld {
15
16//===----------------------------------------------------------------------===//
17// AlignFragment
18//===----------------------------------------------------------------------===//
19AlignFragment::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
32size_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