Relocation.cpp revision cedee4b38f4786845183be7f5916dd520a170ae0
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- Relocation.cpp -----------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Relocation.h> 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/RelocationFactory.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Layout.h> 1367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao#include <mcld/Support/MsgHandling.h> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation::Relocation(Relocation::Type pType, 18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef* pTargetRef, 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Relocation::Address pAddend, 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Relocation::DWord pTargetData) 21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao : Fragment(Fragment::Relocation), 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Type(pType), 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_TargetData(pTargetData), 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSymInfo(NULL), 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Addend(pAddend) 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if(NULL != pTargetRef) 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_TargetAddress.assign(*pTargetRef->frag(), pTargetRef->offset()) ; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation::~Relocation() 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation::Address Relocation::place(const Layout& pLayout) const 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Address sect_addr = pLayout.getOutputLDSection(*(m_TargetAddress.frag()))->addr(); 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return sect_addr + pLayout.getOutputOffset(m_TargetAddress); 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation::Address Relocation::symValue() const 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (m_pSymInfo->type() == ResolveInfo::Section && 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSymInfo->outSymbol()->hasFragRef()) { 45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao return m_pSymInfo->outSymbol()->fragRef()->frag()->getParent()->getSection().addr(); 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pSymInfo->outSymbol()->value(); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Relocation::apply(RelocationFactory& pRelocFactory, 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const MCLDInfo& pLDInfo) 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 5367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao RelocationFactory::Result result = 5467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao pRelocFactory.applyRelocation(*this, pLDInfo); 5567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 5667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao switch (result) { 5767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao case RelocationFactory::OK: { 5867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao // do nothing 5967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao return; 6067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao } 6167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao case RelocationFactory::Overflow: { 6267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao error(diag::result_overflow) << pRelocFactory.getName(type()) 6367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao << symInfo()->name(); 6467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao return; 6567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao } 6667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao case RelocationFactory::BadReloc: { 6767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao error(diag::result_badreloc) << pRelocFactory.getName(type()) 6867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao << symInfo()->name(); 6967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao return; 7067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao } 7167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao case RelocationFactory::Unsupport: { 7267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao fatal(diag::unsupported_relocation) << type() 7367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao << "mclinker@googlegroups.com"; 7467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao return; 7567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao } 7667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao } // end of switch 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Relocation::setType(Type pType) 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Type = pType; 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Relocation::setAddend(Address pAddend) 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Addend = pAddend; 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Relocation::setSymInfo(ResolveInfo* pSym) 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSymInfo = pSym; 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation::DWord& Relocation::target() 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_TargetData; 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst Relocation::DWord& Relocation::target() const 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_TargetData; 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 104