//===- HexagonGOTPLT.cpp ------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "HexagonGOTPLT.h" #include "HexagonPLT.h" #include <llvm/Support/Casting.h> #include <mcld/LD/LDSection.h> #include <mcld/LD/LDFileFormat.h> #include <mcld/Support/MsgHandling.h> namespace mcld { //===----------------------------------------------------------------------===// // HexagonGOTPLT //===----------------------------------------------------------------------===// HexagonGOTPLT::HexagonGOTPLT(LDSection& pSection) : HexagonGOT(pSection) { // Create GOT0 entries reserve(HexagonGOTPLT0Num); // Skip GOT0 entries for (size_t i = 0; i < HexagonGOTPLT0Num; ++i) { consume(); } pSection.setAlign(8); } HexagonGOTPLT::~HexagonGOTPLT() { } // Check if we really have GOT PLT entries ? bool HexagonGOTPLT::hasGOT1() const { return (m_SectionData->size() > HexagonGOTPLT0Num); } void HexagonGOTPLT::applyGOT0(uint64_t pAddress) { llvm::cast<HexagonGOTEntry> (*(m_SectionData->getFragmentList().begin())).setValue(pAddress); } void HexagonGOTPLT::applyAllGOTPLT(const HexagonPLT& pPLT) { iterator it = begin(); // skip GOT0 for (size_t i = 0; i < HexagonGOTPLT0Num; ++i) ++it; // Set the initial value of the GOT entry to the address // of PLT0, the stub calculates the index of the caller directly from // the address where the call arised for (; it != end() ; ++it) { llvm::cast<HexagonGOTEntry>(*it).setValue(pPLT.addr()); } } }