137b74a387bb3993387029859c2d9d051c41c724eStephen 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
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDFileFormat.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h"
15f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <llvm/Support/Casting.h>
17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
18f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesnamespace mcld {
19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// HexagonGOTPLT
22f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
2337b74a387bb3993387029859c2d9d051c41c724eStephen HinesHexagonGOTPLT::HexagonGOTPLT(LDSection& pSection) : HexagonGOT(pSection) {
24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Skip GOT0 entries
25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  for (size_t i = 0; i < HexagonGOTPLT0Num; ++i) {
26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    create();
27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  pSection.setAlign(8);
29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
3137b74a387bb3993387029859c2d9d051c41c724eStephen HinesHexagonGOTPLT::~HexagonGOTPLT() {
32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
34f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// Check if we really have GOT PLT entries ?
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool HexagonGOTPLT::hasGOT1() const {
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return (m_SectionData->size() > HexagonGOTPLT0Num);
37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid HexagonGOTPLT::applyGOT0(uint64_t pAddress) {
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  llvm::cast<HexagonGOTEntry>(*(m_SectionData->getFragmentList().begin()))
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      .setValue(pAddress);
42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid HexagonGOTPLT::applyAllGOTPLT(const HexagonPLT& pPLT) {
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  iterator it = begin();
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // skip GOT0
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  for (size_t i = 0; i < HexagonGOTPLT0Num; ++i)
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ++it;
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Set the initial value of the GOT entry to the address
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // of PLT0, the stub calculates the index of the caller directly from
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // the address where the call arised
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (; it != end(); ++it) {
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    llvm::cast<HexagonGOTEntry>(*it).setValue(pPLT.addr());
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
58