1 //===- OutputRelocSection.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 <mcld/Target/OutputRelocSection.h>
10
11 #include <mcld/LD/LDSection.h>
12 #include <mcld/LD/RelocationFactory.h>
13 #include <mcld/Module.h>
14 #include <mcld/Support/MsgHandling.h>
15 #include <mcld/IRBuilder.h>
16
17 #include <llvm/Support/Casting.h>
18
19 using namespace mcld;
20
21 //===----------------------------------------------------------------------===//
22 // OutputRelocSection
23 //===----------------------------------------------------------------------===//
OutputRelocSection(Module & pModule,LDSection & pSection)24 OutputRelocSection::OutputRelocSection(Module& pModule, LDSection& pSection)
25 : m_Module(pModule),
26 m_pRelocData(NULL),
27 m_isVisit(false),
28 m_ValidEntryIterator(){
29 assert(!pSection.hasRelocData() && "Given section is not a relocation section");
30 m_pRelocData = IRBuilder::CreateRelocData(pSection);
31 }
32
~OutputRelocSection()33 OutputRelocSection::~OutputRelocSection()
34 {
35 }
36
reserveEntry(size_t pNum)37 void OutputRelocSection::reserveEntry(size_t pNum)
38 {
39 for(size_t i=0; i<pNum; i++)
40 m_pRelocData->append(*Relocation::Create());
41 }
42
consumeEntry()43 Relocation* OutputRelocSection::consumeEntry()
44 {
45 // first time visit this function, set m_ValidEntryIterator to
46 // Fragments.begin()
47 if(!m_isVisit) {
48 assert(!m_pRelocData->getRelocationList().empty() &&
49 "DynRelSection contains no entries.");
50 m_ValidEntryIterator = m_pRelocData->begin();
51 m_isVisit = true;
52 }
53 else {
54 // Add m_ValidEntryIterator here instead of at the end of this function.
55 // We may reserve an entry and then consume it immediately, e.g. for COPY
56 // relocation, so we need to avoid setting this iterator to
57 // RelocData->end() in any case, or when reserve and consume again,
58 // ++m_ValidEntryIterator will still be RelocData->end().
59 ++m_ValidEntryIterator;
60 }
61 assert(m_ValidEntryIterator != m_pRelocData->end() &&
62 "No empty relocation entry for the incoming symbol.");
63
64 return &(*m_ValidEntryIterator);
65 }
66
numOfRelocs()67 size_t OutputRelocSection::numOfRelocs()
68 {
69 return m_pRelocData->size();
70 }
71
addSymbolToDynSym(LDSymbol & pSymbol)72 bool OutputRelocSection::addSymbolToDynSym(LDSymbol& pSymbol)
73 {
74 m_Module.getSymbolTable().changeToDynamic(pSymbol);
75 return true;
76 }
77
78