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
18namespace llvm {
19
20// forware declaration
21template <class T>
22void* object_creator();
23
24}  // namespace llvm
25
26namespace mcld {
27
28class FragmentRef;
29
30/** \class LDSymbol
31 *  \brief LDSymbol provides a consistent abstraction for different formats
32 *  in different targets.
33 */
34class 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