ELFAttributeValue.h revision 37b74a387bb3993387029859c2d9d051c41c724e
144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin//===- ELFAttributeValue.h ------------------------------------------------===// 244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// 344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// The MCLinker Project 444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// 544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// This file is distributed under the University of Illinois Open Source 644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// License. See LICENSE.TXT for details. 744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// 844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin//===----------------------------------------------------------------------===// 944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#ifndef MCLD_TARGET_ELFATTRIBUTEVALUE_H_ 1044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#define MCLD_TARGET_ELFATTRIBUTEVALUE_H_ 1144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 1244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <string> 1344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 1444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinnamespace mcld { 1544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 1644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin/** \class ELFAttributeValue 1744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * \brief ELFAttributeValue stroes the value of an attribute tag. The attribtue 1844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * tag itself is not stored in this object. 1944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin */ 2044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinclass ELFAttributeValue { 21e5729fac81c8a984e984fefc90afc64135817d4fColin Cross public: 22e5729fac81c8a984e984fefc90afc64135817d4fColin Cross // Type of value that an attribute tag holds. 2344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin enum Type { 2444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // The value contains no data and has unknown type. 2544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Uninitialized = 0, 2644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // The value contains integer data. 2844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Int = 1L << 0, 2944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala // The value contains string data. 317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala String = 1L << 1, 327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // This is for attribute in which "default value" (0 for int type and empty 3498e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin // string for string type) has special meaning for them. That is, the 3544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // default value is "disabled" and meaningful for those attribute. 3644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin NoDefault = 1L << 2, 3744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin }; 3844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 3944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin public: 4044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ELFAttributeValue() : m_Type(Uninitialized), m_IntValue(0), m_StringValue() {} 4144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ~ELFAttributeValue() {} 4344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin public: 4544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin unsigned int type() const { return m_Type; } 4644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin void setType(unsigned int pType) { m_Type = pType; } 4844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin unsigned int getIntValue() const { return m_IntValue; } 5044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 5144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin void setIntValue(unsigned int pIntValue) { m_IntValue = pIntValue; } 5244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 5344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const std::string& getStringValue() const { return m_StringValue; } 5444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 5544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin void setStringValue(const std::string& pStringValue) { 5644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin m_StringValue = pStringValue; 57cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 58cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 5944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin void setStringValue(const char* pStringValue, size_t pSize) { 60b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala m_StringValue.assign(pStringValue, pSize); 61b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala } 6298e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin 63b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala void setStringValue(const char* pStringValue) { 6498e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin m_StringValue.assign(pStringValue); 6598e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin } 6644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 6744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin size_t getSize() const; 6844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 6944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin inline bool isUninitialized() const { return (m_Type == Uninitialized); } 7044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin inline bool isInitialized() const { return !isUninitialized(); } 7244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin inline bool isIntValue() const { return (m_Type & Int); } 7444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin inline bool isStringValue() const { return (m_Type & String); } 7644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin inline bool hasNoDefault() const { return (m_Type & NoDefault); } 7844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool isDefaultValue() const; 8044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 81e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh // Returns true if this attribute value should be emitted to the output. 8244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin inline bool shouldEmit() const { 8344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // Attribute with non-default value should be emitted. 8444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return !isDefaultValue(); 8544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 8644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 87e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin bool equals(const ELFAttributeValue& pValue) const; 88e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 89e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin bool operator==(const ELFAttributeValue& pValue) const { 90e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin return equals(pValue); 91e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin } 92e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin bool operator!=(const ELFAttributeValue& pValue) const { 93e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin return !equals(pValue); 94e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin } 95e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 96e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin /// reset - reset this value to the uninitialized state 97e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin void reset() { 98e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin m_Type = Uninitialized; 9944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin m_IntValue = 0; 10044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin m_StringValue.clear(); 10144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return; 10244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 10366281c3a5d7eea486ddc6ad30088ba92956fd4fdZhijun He 10444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin private: 10544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin unsigned int m_Type; 10644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 10744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin unsigned int m_IntValue; 10844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin std::string m_StringValue; 10944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin}; 11044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 11144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} // namespace mcld 11244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 11344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#endif // MCLD_TARGET_ELFATTRIBUTEVALUE_H_ 11444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin