Relocation.cpp revision 5460a1f25d9ddecb5c70667267d66d51af177a99
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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCAssembler.h> 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//#include <mcld/MC/MCLDInfo.h> 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Relocation.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/RelocationFactory.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Layout.h> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation::Relocation(Relocation::Type pType, 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCFragmentRef* pTargetRef, 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Relocation::Address pAddend, 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Relocation::DWord pTargetData) 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : MCFragment(llvm::MCFragment::FT_Reloc), 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{ 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if(m_pSymInfo->type() == ResolveInfo::Section && 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSymInfo->outSymbol()->hasFragRef()) { 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return llvm::cast<LDSection>( 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSymInfo->outSymbol()->fragRef()->frag()->getParent()->getSection()).addr(); 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pSymInfo->outSymbol()->value(); 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Relocation::apply(RelocationFactory& pRelocFactory, 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const MCLDInfo& pLDInfo) 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pRelocFactory.applyRelocation(*this, pLDInfo); 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Relocation::setType(Type pType) 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Type = pType; 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Relocation::setAddend(Address pAddend) 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Addend = pAddend; 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Relocation::setSymInfo(ResolveInfo* pSym) 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSymInfo = pSym; 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation::DWord& Relocation::target() 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_TargetData; 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst Relocation::DWord& Relocation::target() const 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_TargetData; 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 82