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