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