HexagonGOTPLT.cpp revision f33f6de54db174aa679a4b6d1e040d37e95541c0
1f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===- HexagonGOTPLT.cpp ------------------------------------------------------===//
2f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//
3f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//                     The MCLinker Project
4f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//
5f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// This file is distributed under the University of Illinois Open Source
6f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// License. See LICENSE.TXT for details.
7f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//
8f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
9f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include "HexagonGOTPLT.h"
10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include "HexagonPLT.h"
11f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
12f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <llvm/Support/Casting.h>
13f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
14f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LD/LDSection.h>
15f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LD/LDFileFormat.h>
16f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Support/MsgHandling.h>
17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
18f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesnamespace mcld {
19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// HexagonGOTPLT
22f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesHexagonGOTPLT::HexagonGOTPLT(LDSection& pSection)
24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  : HexagonGOT(pSection)
25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
26f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Skip GOT0 entries
27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  for (size_t i = 0; i < HexagonGOTPLT0Num; ++i) {
28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    create();
29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  pSection.setAlign(8);
31f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesHexagonGOTPLT::~HexagonGOTPLT()
34f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// Check if we really have GOT PLT entries ?
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonGOTPLT::hasGOT1() const
39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return (m_SectionData->size() > HexagonGOTPLT0Num);
41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonGOTPLT::applyGOT0(uint64_t pAddress)
44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  llvm::cast<HexagonGOTEntry>
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    (*(m_SectionData->getFragmentList().begin())).setValue(pAddress);
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonGOTPLT::applyAllGOTPLT(const HexagonPLT& pPLT)
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  iterator it = begin();
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // skip GOT0
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  for (size_t i = 0; i < HexagonGOTPLT0Num; ++i)
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ++it;
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Set the initial value of the GOT entry to the address
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // of PLT0, the stub calculates the index of the caller directly from
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // the address where the call arised
58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  for (; it != end() ; ++it) {
59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    llvm::cast<HexagonGOTEntry>(*it).setValue(pPLT.addr());
60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
64