GOT.h revision f33f6de54db174aa679a4b6d1e040d37e95541c0
123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//===- GOT.h --------------------------------------------------------------===//
223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//
323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//                     The MCLinker Project
423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//
523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// This file is distributed under the University of Illinois Open Source
623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// License. See LICENSE.TXT for details.
723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//
823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//===----------------------------------------------------------------------===//
923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#ifndef MCLD_TARGET_GOT_H
1023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define MCLD_TARGET_GOT_H
1123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#ifdef ENABLE_UNITTEST
1223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <gtest.h>
1323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif
1423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
1523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <mcld/LD/LDSection.h>
1623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <mcld/LD/SectionData.h>
1723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <mcld/Fragment/TargetFragment.h>
1823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
1923b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace mcld {
20ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
21ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckclass GOT;
22ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckclass LDSection;
234c9e59d03c2bca38001225b79d01740b8999adfbJohn Reckclass ResolveInfo;
24ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
25ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck/** \class GOT
26ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *  \brief The Global Offset Table
27ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck */
28998a6d81896df8b662cc10ddeb35087b78b38d72John Reckclass GOT
2923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck{
3023b797ab5151eb2474f3bdd679f2f07bfd723042John Reckprotected:
3119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck  GOT(LDSection& pSection);
32d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck
334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic:
344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck  typedef SectionData::iterator iterator;
35ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck  typedef SectionData::const_iterator const_iterator;
36b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck
37ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne  template<size_t SIZE>
3823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck  class Entry : public TargetFragment
3923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck  {
4023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck  public:
414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    enum { EntrySize = SIZE };
42119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
4319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck  public:
444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    Entry(uint64_t pValue, SectionData* pParent)
454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck      : TargetFragment(Fragment::Target, pParent),
461949e7928eeec22cd3f74b5f763a4eb433238453John Reck        f_Value(pValue) {
47443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck    }
484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
4923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    virtual ~Entry() {}
5023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
513b20251a355c88193c439f928a84ae69483fb488John Reck    uint64_t getValue() const
524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { return f_Value; }
531125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck
541125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    void setValue(uint64_t pValue)
551125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    { f_Value = pValue; }
561125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck
571125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    // Override pure virtual function
5823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    size_t size() const
5923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    { return EntrySize; }
60119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
61e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck  protected:
6223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    uint64_t f_Value;
63119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck  };
64119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
65e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
6623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck  virtual ~GOT();
671125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck
681125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck  // ----- observers -----//
691125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck  uint64_t addr() const { return m_Section.addr(); }
70a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck  uint32_t size() const { return m_Section.size(); }
71a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck
7201a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck  const_iterator begin() const { return m_SectionData->begin(); }
73aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck  iterator       begin()       { return m_SectionData->begin(); }
74aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck  const_iterator end  () const { return m_SectionData->end();   }
7550210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette  iterator       end  ()       { return m_SectionData->end();   }
76058fc640017c90120c599d378a4cbc55668b05b7Chris Craik
7750210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette  bool empty() const
7863a06673253914510bbeebd500655008682dade1John Reck  { return m_SectionData->empty(); }
79860d155f866cc15a725e7ce03763280987f24901John Reck
8068bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck  // finalizeSectionSize - set LDSection size
81ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne  virtual void finalizeSectionSize();
82ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne
83e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckprotected:
8417035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck  LDSection& m_Section;
8523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck  SectionData* m_SectionData;
86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
87d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik
88ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} // namespace of mcld
89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
903e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck#endif
9119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
92998a6d81896df8b662cc10ddeb35087b78b38d72John Reck