Home | History | Annotate | Download | only in X86
      1 //===- X86GOTPLT.cpp ------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #include "X86GOTPLT.h"
     10 #include "X86PLT.h"
     11 
     12 #include <llvm/Support/Casting.h>
     13 
     14 #include <mcld/LD/LDSection.h>
     15 #include <mcld/LD/LDFileFormat.h>
     16 #include <mcld/Support/MsgHandling.h>
     17 
     18 namespace mcld {
     19 
     20 //===----------------------------------------------------------------------===//
     21 // X86_32GOTPLT
     22 //===----------------------------------------------------------------------===//
     23 X86_32GOTPLT::X86_32GOTPLT(LDSection& pSection)
     24   : X86_32GOT(pSection)
     25 {
     26   // create GOT0 entries
     27   for (size_t i = 0; i < X86GOTPLT0Num; ++i)
     28     create();
     29 }
     30 
     31 X86_32GOTPLT::~X86_32GOTPLT()
     32 {
     33 }
     34 
     35 bool X86_32GOTPLT::hasGOT1() const
     36 {
     37   return (m_SectionData->size() > X86GOTPLT0Num);
     38 }
     39 
     40 void X86_32GOTPLT::applyGOT0(uint64_t pAddress)
     41 {
     42   llvm::cast<X86_32GOTEntry>
     43     (*(m_SectionData->getFragmentList().begin())).setValue(pAddress);
     44 }
     45 
     46 void X86_32GOTPLT::applyAllGOTPLT(const X86PLT& pPLT)
     47 {
     48   iterator it = begin();
     49   // skip GOT0
     50   for (size_t i = 0; i < X86GOTPLT0Num; ++i)
     51     ++it;
     52   // address of corresponding plt entry
     53   uint64_t plt_addr = pPLT.addr() + pPLT.getPLT0Size();
     54   for (; it != end() ; ++it) {
     55     llvm::cast<X86_32GOTEntry>(*it).setValue(plt_addr + 6);
     56     plt_addr += pPLT.getPLT1Size();
     57   }
     58 }
     59 
     60 //===----------------------------------------------------------------------===//
     61 // X86_64GOTPLT
     62 //===----------------------------------------------------------------------===//
     63 X86_64GOTPLT::X86_64GOTPLT(LDSection& pSection)
     64   : X86_64GOT(pSection)
     65 {
     66   for (size_t i = 0; i < X86GOTPLT0Num; ++i)
     67     create();
     68 }
     69 
     70 X86_64GOTPLT::~X86_64GOTPLT()
     71 {
     72 }
     73 
     74 bool X86_64GOTPLT::hasGOT1() const
     75 {
     76   return (m_SectionData->size() > X86GOTPLT0Num);
     77 }
     78 
     79 void X86_64GOTPLT::applyGOT0(uint64_t pAddress)
     80 {
     81   llvm::cast<X86_64GOTEntry>
     82     (*(m_SectionData->getFragmentList().begin())).setValue(pAddress);
     83 }
     84 
     85 void X86_64GOTPLT::applyAllGOTPLT(const X86PLT& pPLT)
     86 {
     87   iterator it = begin();
     88   // skip GOT0
     89   for (size_t i = 0; i < X86GOTPLT0Num; ++i)
     90     ++it;
     91   // address of corresponding plt entry
     92   uint64_t plt_addr = pPLT.addr() + pPLT.getPLT0Size();
     93   for (; it != end() ; ++it) {
     94     llvm::cast<X86_64GOTEntry>(*it).setValue(plt_addr + 6);
     95     plt_addr += pPLT.getPLT1Size();
     96   }
     97 }
     98 
     99 } //end mcld namespace
    100