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