1 //===- ELFAttributeValue.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_TARGET_ELFATTRIBUTEVALUE_H
10 #define MCLD_TARGET_ELFATTRIBUTEVALUE_H
11 
12 #include <string>
13 
14 namespace mcld
15 {
16 
17 /** \class ELFAttributeValue
18  *  \brief ELFAttributeValue stroes the value of an attribute tag. The attribtue
19  *  tag itself is not stored in this object.
20  */
21 class ELFAttributeValue
22 {
23 public:
24   // Type of value that an attribute tag holds.
25   enum Type {
26     // The value contains no data and has unknown type.
27     Uninitialized = 0,
28 
29     // The value contains integer data.
30     Int           = 1L << 0,
31 
32     // The value contains string data.
33     String        = 1L << 1,
34 
35     // This is for attribute in which "default value" (0 for int type and empty
36     // string for string type) has special meaning for them. That is, the
37     // default value is "disabled" and meaningful for those attribute.
38     NoDefault     = 1L << 2,
39   };
40 
41 public:
ELFAttributeValue()42   ELFAttributeValue()
43     : m_Type(Uninitialized), m_IntValue(0), m_StringValue() { }
44 
~ELFAttributeValue()45   ~ELFAttributeValue() { }
46 
47 public:
type()48   unsigned int type() const
49   { return m_Type; }
50 
setType(unsigned int pType)51   void setType(unsigned int pType)
52   { m_Type = pType; }
53 
getIntValue()54   unsigned int getIntValue() const
55   { return m_IntValue; }
56 
setIntValue(unsigned int pIntValue)57   void setIntValue(unsigned int pIntValue)
58   { m_IntValue = pIntValue; }
59 
getStringValue()60   const std::string &getStringValue() const
61   { return m_StringValue; }
62 
setStringValue(const std::string & pStringValue)63   void setStringValue(const std::string &pStringValue)
64   { m_StringValue = pStringValue; }
65 
setStringValue(const char * pStringValue,size_t pSize)66   void setStringValue(const char *pStringValue, size_t pSize)
67   { m_StringValue.assign(pStringValue, pSize); }
68 
setStringValue(const char * pStringValue)69   void setStringValue(const char *pStringValue)
70   { m_StringValue.assign(pStringValue); }
71 
72   size_t getSize() const;
73 
isUninitialized()74   inline bool isUninitialized() const
75   { return (m_Type == Uninitialized); }
76 
isInitialized()77   inline bool isInitialized() const
78   { return !isUninitialized(); }
79 
isIntValue()80   inline bool isIntValue() const
81   { return (m_Type & Int); }
82 
isStringValue()83   inline bool isStringValue() const
84   { return (m_Type & String); }
85 
hasNoDefault()86   inline bool hasNoDefault() const
87   { return (m_Type & NoDefault); }
88 
89   bool isDefaultValue() const;
90 
91   // Returns true if this attribute value should be emitted to the output.
shouldEmit()92   inline bool shouldEmit() const {
93     // Attribute with non-default value should be emitted.
94     return !isDefaultValue();
95   }
96 
97   bool equals(const ELFAttributeValue& pValue) const;
98 
99   bool operator==(const ELFAttributeValue& pValue) const
100   { return equals(pValue); }
101   bool operator!=(const ELFAttributeValue& pValue) const
102   { return !equals(pValue); }
103 
104   /// reset - reset this value to the uninitialized state
reset()105   void reset()
106   {
107     m_Type = Uninitialized;
108     m_IntValue = 0;
109     m_StringValue.clear();
110     return;
111   }
112 
113 private:
114   unsigned int m_Type;
115 
116   unsigned int m_IntValue;
117   std::string m_StringValue;
118 };
119 
120 } // namespace of mcld
121 
122 #endif
123