remove warnings
[dyninst.git] / pdutil / h / Symbol.h
1 /************************************************************************
2  * Symbol.h: symbol table objects.
3 ************************************************************************/
4
5
6 \f
7
8
9 #if !defined(_Symbol_h_)
10 #define _Symbol_h_
11
12
13 \f
14
15
16 /************************************************************************
17  * header files.
18 ************************************************************************/
19
20 #include <util/h/String.h>
21 #include <util/h/Types.h>
22
23
24 \f
25
26
27 /************************************************************************
28  * class Symbol
29 ************************************************************************/
30
31 class Symbol {
32 public:
33     enum SymbolType {
34         ST_UNKNOWN,
35         ST_FUNCTION,
36         ST_OBJECT,
37         ST_MODULE
38     };
39
40     enum SymbolLinkage {
41         SL_UNKNOWN,
42         SL_GLOBAL,
43         SL_LOCAL
44     };
45
46     enum SymbolTag {
47         TAG_UNKNOWN,
48         TAG_USER,
49         TAG_LIBRARY,
50         TAG_INTERNAL
51     };
52
53      Symbol ();
54      Symbol (unsigned);
55      Symbol (const string &, const string &, SymbolType, SymbolLinkage,
56              Address, const bool);
57      Symbol (const Symbol &);
58     ~Symbol ();
59
60     Symbol&        operator= (const Symbol &);
61     bool          operator== (const Symbol &) const;
62
63     const string&       name ()               const;
64     const string&     module ()               const;
65     SymbolType          type ()               const;
66     SymbolLinkage    linkage ()               const;
67     Address             addr ()               const;
68     bool              kludge ()               const;
69     SymbolTag&           tag ()               const;
70
71     friend
72     ostream&      operator<< (ostream &os, const Symbol &s) {
73       return os << "{"
74         << " name="    << s.name_
75         << " module="  << s.module_
76         << " type="    << (unsigned) s.type_
77         << " linkage=" << (unsigned) s.linkage_
78         << " addr="    << s.addr_
79         << " tag="     << (unsigned) s.tag_
80         << " kludge="  << s.kludge_
81         << " }" << endl;
82     }
83
84
85
86 private:
87     string        name_;
88     string        module_;
89     SymbolType    type_;
90     SymbolLinkage linkage_;
91     Address       addr_;
92     SymbolTag     tag_;
93     bool          kludge_;
94 };
95
96 inline
97 Symbol::Symbol()
98     : name_("*bad-symbol*"), module_("*bad-module*"),
99     type_(ST_UNKNOWN), linkage_(SL_UNKNOWN), addr_(0),
100     tag_(TAG_UNKNOWN), kludge_(false) {
101 }
102
103 inline
104 Symbol::Symbol(unsigned dummy)
105     : name_("*bad-symbol*"), module_("*bad-module*"),
106     type_(ST_UNKNOWN), linkage_(SL_UNKNOWN), addr_(0),
107     tag_(TAG_UNKNOWN), kludge_(false) {
108 }
109
110 inline
111 Symbol::Symbol(const string& iname, const string& imodule,
112     SymbolType itype, SymbolLinkage ilinkage, Address iaddr, const bool ikl)
113     : name_(iname), module_(imodule),
114     type_(itype), linkage_(ilinkage), addr_(iaddr),
115     tag_(TAG_UNKNOWN), kludge_(ikl) {
116 }
117
118 inline
119 Symbol::Symbol(const Symbol& s)
120     : name_(s.name_), module_(s.module_),
121     type_(s.type_), linkage_(s.linkage_), addr_(s.addr_),
122     tag_(s.tag_), kludge_(s.kludge_) {
123 }
124
125 inline
126 Symbol::~Symbol() {
127 }
128
129 inline
130 Symbol&
131 Symbol::operator=(const Symbol& s) {
132     name_    = s.name_;
133     module_  = s.module_;
134     type_    = s.type_;
135     linkage_ = s.linkage_;
136     addr_    = s.addr_;
137     tag_     = s.tag_;
138     kludge_  = s.kludge_;
139
140     return *this;
141 }
142
143 inline
144 bool
145 Symbol::operator==(const Symbol& s) const {
146     // explicitly ignore tags when comparing symbols
147     return ((name_   == s.name_)
148         && (module_  == s.module_)
149         && (type_    == s.type_)
150         && (linkage_ == s.linkage_)
151         && (addr_    == s.addr_)
152         && (kludge_  == s.kludge_));
153 }
154
155 inline
156 const string&
157 Symbol::name() const {
158     return name_;
159 }
160
161 inline
162 const string&
163 Symbol::module() const {
164     return module_;
165 }
166
167 inline
168 Symbol::SymbolType
169 Symbol::type() const {
170     return type_;
171 }
172
173 inline
174 Symbol::SymbolLinkage
175 Symbol::linkage() const {
176     return linkage_;
177 }
178
179 inline
180 Address
181 Symbol::addr() const {
182     return addr_;
183 }
184
185 inline
186 Symbol::SymbolTag&
187 Symbol::tag() const {
188     return (SymbolTag &) tag_;
189 }
190
191 inline
192 bool
193 Symbol::kludge() const {
194     return kludge_;
195 }
196
197
198 \f
199
200
201 #endif /* !defined(_Symbol_h_) */