16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- HexagonPLT.cpp -----------------------------------------------------===// 26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// The MCLinker Project 46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source 66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details. 76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonPLT.h" 10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include "HexagonRelocationFunctions.h" 116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/ELF.h> 136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/Casting.h> 146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/LDSection.h> 166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LinkerConfig.h> 176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/MsgHandling.h> 186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesusing namespace mcld; 206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// PLT entry data 236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesHexagonPLT0::HexagonPLT0(SectionData& pParent) 25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines : PLT::Entry<sizeof(hexagon_plt0)>(pParent) 266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesHexagonPLT1::HexagonPLT1(SectionData& pParent) 30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines : PLT::Entry<sizeof(hexagon_plt1)>(pParent) 316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonPLT 366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonPLT::HexagonPLT(LDSection& pSection, 38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonGOTPLT &pGOTPLT, 396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const LinkerConfig& pConfig) 406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines : PLT(pSection), 41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_GOTPLT(pGOTPLT), 426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_Config(pConfig) 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(LinkerConfig::DynObj == m_Config.codeGenType() || 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LinkerConfig::Exec == m_Config.codeGenType() || 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LinkerConfig::Binary == m_Config.codeGenType()); 476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_PLT0 = hexagon_plt0; 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_PLT0Size = sizeof (hexagon_plt0); 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // create PLT0 51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines new HexagonPLT0(*m_SectionData); 526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_Last = m_SectionData->begin(); 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pSection.setAlign(16); 546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonPLT::~HexagonPLT() 576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesPLTEntryBase* HexagonPLT::getPLT0() const 616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator first = m_SectionData->getFragmentList().begin(); 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(first != m_SectionData->getFragmentList().end() && 656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines "FragmentList is empty, getPLT0 failed!"); 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines PLTEntryBase* plt0 = &(llvm::cast<PLTEntryBase>(*first)); 686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return plt0; 706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid HexagonPLT::finalizeSectionSize() 736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint64_t size = 0; 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // plt0 size 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size = getPLT0()->size(); 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // get first plt1 entry 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonPLT::iterator it = begin(); 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++it; 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (end() != it) { 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // plt1 size 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines PLTEntryBase* plt1 = &(llvm::cast<PLTEntryBase>(*it)); 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines size += (m_SectionData->size() - 1) * plt1->size(); 85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_Section.setSize(size); 876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint32_t offset = 0; 896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SectionData::iterator frag, fragEnd = m_SectionData->end(); 906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (frag = m_SectionData->begin(); frag != fragEnd; ++frag) { 916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines frag->setOffset(offset); 926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines offset += frag->size(); 936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonPLT::hasPLT1() const 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return (m_SectionData->size() > 1); 99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid HexagonPLT::reserveEntry(size_t pNum) 1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines PLTEntryBase* plt1_entry = NULL; 104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (size_t i = 0; i < pNum; ++i) { 106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines plt1_entry = new HexagonPLT1(*m_SectionData); 107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 108f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL == plt1_entry) 109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines fatal(diag::fail_allocate_memory_plt); 110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesHexagonPLT1* HexagonPLT::consume() 114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++m_Last; 116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(m_Last != m_SectionData->end() && 117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "The number of PLT Entries and ResolveInfo doesn't match"); 118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return llvm::cast<HexagonPLT1>(&(*m_Last)); 120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonPLT::applyPLT0() 123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines PLTEntryBase* plt0 = getPLT0(); 125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t pltBase = m_Section.addr(); 126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines unsigned char* data = 0; 128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines data = static_cast<unsigned char*>(malloc(plt0->size())); 129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 130f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!data) 131f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines fatal(diag::fail_allocate_memory_plt); 132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines memcpy(data, m_PLT0, plt0->size()); 134f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t gotpltAddr = m_GOTPLT.addr(); 135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 136f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines int32_t *dest = (int32_t *)data; 137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines int32_t result = ((gotpltAddr - pltBase ) >> 6); 138f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *dest |= ApplyMask<int32_t>(0xfff3fff, result); 139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines dest = dest + 1; 140f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // Already calculated using pltBase 141f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines result = (gotpltAddr - pltBase); 142f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(dest) |= ApplyMask<int32_t>(0x1f80, result); 143f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 144f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines plt0->setValue(data); 145f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 146f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 147f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonPLT::applyPLT1() { 148f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 149f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t plt_base = m_Section.addr(); 150f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(plt_base && ".plt base address is NULL!"); 151f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 152f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t got_base = m_GOTPLT.addr(); 153f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(got_base && ".got base address is NULL!"); 154f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 155f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonPLT::iterator it = m_SectionData->begin(); 156f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonPLT::iterator ie = m_SectionData->end(); 157f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(it != ie && "FragmentList is empty, applyPLT1 failed!"); 158f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 159f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t GOTEntrySize = HexagonGOTEntry::EntrySize; 160f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t GOTEntryAddress = 161f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines got_base + GOTEntrySize * 4; 162f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 163f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t PLTEntryAddress = 164f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines plt_base + HexagonPLT0::EntrySize; //Offset of PLT0 165f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 166f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++it; //skip PLT0 167f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t PLT1EntrySize = HexagonPLT1::EntrySize; 168f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonPLT1* plt1 = NULL; 169f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 170f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t* Out = NULL; 171f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines while (it != ie) { 172f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines plt1 = &(llvm::cast<HexagonPLT1>(*it)); 173f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Out = static_cast<uint32_t*>(malloc(HexagonPLT1::EntrySize)); 174f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 175f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!Out) 176f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines fatal(diag::fail_allocate_memory_plt); 177f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 178f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines memcpy(Out, hexagon_plt1, plt1->size()); 179f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 180f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines int32_t *dest = (int32_t *)Out; 181f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines int32_t result = ((GOTEntryAddress - PLTEntryAddress ) >> 6); 182f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *dest |= ApplyMask<int32_t>(0xfff3fff, result); 183f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines dest = dest + 1; 184f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines result = (GOTEntryAddress - PLTEntryAddress); 185f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(dest) |= ApplyMask<int32_t>(0x1f80, result); 186f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 187f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // Address in the PLT entries point to the corresponding GOT entries 188f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // TODO: Fixup plt to point to the corresponding GOTEntryAddress 189f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // We need to borrow the same relocation code to fix the relocation 190f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines plt1->setValue(reinterpret_cast<unsigned char*>(Out)); 191f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++it; 192f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 193f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines GOTEntryAddress += GOTEntrySize; 194f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines PLTEntryAddress += PLT1EntrySize; 195f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 196f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 197f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 198f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesuint64_t HexagonPLT::emit(MemoryRegion& pRegion) 199f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 200f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t result = 0x0; 201f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines iterator it = begin(); 202f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 203f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines unsigned char* buffer = pRegion.getBuffer(); 204f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines memcpy(buffer, llvm::cast<HexagonPLT0>((*it)).getValue(), HexagonPLT0::EntrySize); 205f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines result += HexagonPLT0::EntrySize; 206f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++it; 207f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 208f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonPLT1* plt1 = 0; 209f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonPLT::iterator ie = end(); 210f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines while (it != ie) { 211f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines plt1 = &(llvm::cast<HexagonPLT1>(*it)); 212f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines memcpy(buffer + result, plt1->getValue(), HexagonPLT1::EntrySize); 213f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines result += HexagonPLT1::EntrySize; 214f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++it; 215f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 216f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return result; 2176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 2186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 219