Home | History | Annotate | Download | only in LD
      1 //===- LDSymbol.h ---------------------------------------------------------===//
      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 #ifndef MCLD_LD_LDSYMBOL_H_
     10 #define MCLD_LD_LDSYMBOL_H_
     11 
     12 #include "mcld/Config/Config.h"
     13 #include "mcld/LD/ResolveInfo.h"
     14 #include "mcld/Support/Allocators.h"
     15 
     16 #include <cassert>
     17 
     18 namespace llvm {
     19 
     20 // forware declaration
     21 template <class T>
     22 void* object_creator();
     23 
     24 }  // namespace llvm
     25 
     26 namespace mcld {
     27 
     28 class FragmentRef;
     29 
     30 /** \class LDSymbol
     31  *  \brief LDSymbol provides a consistent abstraction for different formats
     32  *  in different targets.
     33  */
     34 class LDSymbol {
     35  public:
     36   // FIXME: use SizeTrait<32> or SizeTrait<64> instead of big type
     37   typedef ResolveInfo::SizeType SizeType;
     38   typedef uint64_t ValueType;
     39 
     40  public:
     41   ~LDSymbol();
     42 
     43   // -----  factory method ----- //
     44   static LDSymbol* Create(ResolveInfo& pResolveInfo);
     45 
     46   static void Destroy(LDSymbol*& pSymbol);
     47 
     48   /// Clear - This function tells MCLinker to clear all created LDSymbols.
     49   static void Clear();
     50 
     51   /// NullSymbol() - This returns a reference to a LDSymbol that represents Null
     52   /// symbol.
     53   static LDSymbol* Null();
     54 
     55   // -----  observers  ----- //
     56   bool isNull() const;
     57 
     58   const char* name() const {
     59     assert(m_pResolveInfo != NULL);
     60     return m_pResolveInfo->name();
     61   }
     62 
     63   unsigned int nameSize() const {
     64     assert(m_pResolveInfo != NULL);
     65     return m_pResolveInfo->nameSize();
     66   }
     67 
     68   llvm::StringRef str() const {
     69     assert(m_pResolveInfo != NULL);
     70     return llvm::StringRef(m_pResolveInfo->name(), m_pResolveInfo->nameSize());
     71   }
     72 
     73   bool isDyn() const {
     74     assert(m_pResolveInfo != NULL);
     75     return m_pResolveInfo->isDyn();
     76   }
     77 
     78   unsigned int type() const {
     79     assert(m_pResolveInfo != NULL);
     80     return m_pResolveInfo->type();
     81   }
     82   unsigned int desc() const {
     83     assert(m_pResolveInfo != NULL);
     84     return m_pResolveInfo->desc();
     85   }
     86   unsigned int binding() const {
     87     assert(m_pResolveInfo != NULL);
     88     return m_pResolveInfo->binding();
     89   }
     90 
     91   uint8_t other() const {
     92     assert(m_pResolveInfo != NULL);
     93     return m_pResolveInfo->other();
     94   }
     95 
     96   uint8_t visibility() const {
     97     assert(m_pResolveInfo != NULL);
     98     return m_pResolveInfo->other();
     99   }
    100 
    101   ValueType value() const { return m_Value; }
    102 
    103   const FragmentRef* fragRef() const { return m_pFragRef; }
    104   FragmentRef* fragRef() { return m_pFragRef; }
    105 
    106   SizeType size() const { return m_pResolveInfo->size(); }
    107 
    108   const ResolveInfo* resolveInfo() const { return m_pResolveInfo; }
    109   ResolveInfo* resolveInfo() { return m_pResolveInfo; }
    110 
    111   bool hasFragRef() const;
    112 
    113   // -----  modifiers  ----- //
    114   void setSize(SizeType pSize) {
    115     assert(m_pResolveInfo != NULL);
    116     m_pResolveInfo->setSize(pSize);
    117   }
    118 
    119   void setValue(ValueType pValue) { m_Value = pValue; }
    120 
    121   void setFragmentRef(FragmentRef* pFragmentRef);
    122 
    123   void setResolveInfo(const ResolveInfo& pInfo);
    124 
    125  private:
    126   friend class Chunk<LDSymbol, MCLD_SYMBOLS_PER_INPUT>;
    127   template <class T>
    128   friend void* llvm::object_creator();
    129 
    130   LDSymbol();
    131   LDSymbol(const LDSymbol& pCopy);
    132   LDSymbol& operator=(const LDSymbol& pCopy);
    133 
    134  private:
    135   // -----  Symbol's fields  ----- //
    136   ResolveInfo* m_pResolveInfo;
    137   FragmentRef* m_pFragRef;
    138   ValueType m_Value;
    139 };
    140 
    141 }  // namespace mcld
    142 
    143 #endif  // MCLD_LD_LDSYMBOL_H_
    144