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