HexagonPLT.cpp revision 6f75755c9204b1d8817ae5a65a2f7e5af0ec3f70
1//===- HexagonPLT.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 "HexagonPLT.h"
10
11#include <llvm/Support/ELF.h>
12#include <llvm/Support/Casting.h>
13
14#include <mcld/LD/LDSection.h>
15#include <mcld/LinkerConfig.h>
16#include <mcld/Support/MsgHandling.h>
17
18using namespace mcld;
19
20//===----------------------------------------------------------------------===//
21// PLT entry data
22//===----------------------------------------------------------------------===//
23HexagonDynPLT0::HexagonDynPLT0(SectionData& pParent)
24  : PLT::Entry<sizeof(hexagon_dyn_plt0)>(pParent)
25{
26}
27
28HexagonExecPLT0::HexagonExecPLT0(SectionData& pParent)
29  : PLT::Entry<sizeof(hexagon_exec_plt0)>(pParent)
30{
31}
32
33//===----------------------------------------------------------------------===//
34// HexagonPLT
35//===----------------------------------------------------------------------===//
36HexagonPLT::HexagonPLT(LDSection& pSection,
37               HexagonGOT &pGOTPLT,
38               const LinkerConfig& pConfig)
39  : PLT(pSection),
40    m_GOT(pGOTPLT),
41    m_Config(pConfig)
42{
43  assert(LinkerConfig::DynObj == m_Config.codeGenType() ||
44         LinkerConfig::Exec   == m_Config.codeGenType() ||
45         LinkerConfig::Binary == m_Config.codeGenType());
46
47  if (LinkerConfig::DynObj == m_Config.codeGenType()) {
48    m_PLT0 = hexagon_dyn_plt0;
49    m_PLT0Size = sizeof (hexagon_dyn_plt0);
50    // create PLT0
51    new HexagonDynPLT0(*m_SectionData);
52  }
53  else {
54    m_PLT0 = hexagon_exec_plt0;
55    m_PLT0Size = sizeof (hexagon_exec_plt0);
56    // create PLT0
57    new HexagonExecPLT0(*m_SectionData);
58  }
59  m_Last = m_SectionData->begin();
60}
61
62HexagonPLT::~HexagonPLT()
63{
64}
65
66PLTEntryBase* HexagonPLT::getPLT0() const
67{
68  iterator first = m_SectionData->getFragmentList().begin();
69
70  assert(first != m_SectionData->getFragmentList().end() &&
71         "FragmentList is empty, getPLT0 failed!");
72
73  PLTEntryBase* plt0 = &(llvm::cast<PLTEntryBase>(*first));
74
75  return plt0;
76}
77
78void HexagonPLT::finalizeSectionSize()
79{
80  uint64_t size = 0;
81  // plt0 size
82  size = getPLT0()->size();
83
84  m_Section.setSize(size);
85
86  uint32_t offset = 0;
87  SectionData::iterator frag, fragEnd = m_SectionData->end();
88  for (frag = m_SectionData->begin(); frag != fragEnd; ++frag) {
89    frag->setOffset(offset);
90    offset += frag->size();
91  }
92}
93
94void HexagonPLT::reserveEntry(size_t pNum)
95{
96}
97
98