187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- ELFAttributeValue.h ------------------------------------------------===// 287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// The MCLinker Project 487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source 687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details. 787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_TARGET_ELFATTRIBUTEVALUE_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_TARGET_ELFATTRIBUTEVALUE_H_ 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <string> 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class ELFAttributeValue 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief ELFAttributeValue stroes the value of an attribute tag. The attribtue 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * tag itself is not stored in this object. 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ELFAttributeValue { 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Type of value that an attribute tag holds. 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enum Type { 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // The value contains no data and has unknown type. 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Uninitialized = 0, 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // The value contains integer data. 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines Int = 1L << 0, 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // The value contains string data. 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines String = 1L << 1, 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // This is for attribute in which "default value" (0 for int type and empty 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // string for string type) has special meaning for them. That is, the 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // default value is "disabled" and meaningful for those attribute. 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines NoDefault = 1L << 2, 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ELFAttributeValue() : m_Type(Uninitialized), m_IntValue(0), m_StringValue() {} 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ~ELFAttributeValue() {} 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines unsigned int type() const { return m_Type; } 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setType(unsigned int pType) { m_Type = pType; } 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines unsigned int getIntValue() const { return m_IntValue; } 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setIntValue(unsigned int pIntValue) { m_IntValue = pIntValue; } 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const std::string& getStringValue() const { return m_StringValue; } 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setStringValue(const std::string& pStringValue) { 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_StringValue = pStringValue; 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setStringValue(const char* pStringValue, size_t pSize) { 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_StringValue.assign(pStringValue, pSize); 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setStringValue(const char* pStringValue) { 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_StringValue.assign(pStringValue); 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t getSize() const; 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines inline bool isUninitialized() const { return (m_Type == Uninitialized); } 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines inline bool isInitialized() const { return !isUninitialized(); } 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines inline bool isIntValue() const { return (m_Type & Int); } 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines inline bool isStringValue() const { return (m_Type & String); } 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines inline bool hasNoDefault() const { return (m_Type & NoDefault); } 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool isDefaultValue() const; 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Returns true if this attribute value should be emitted to the output. 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines inline bool shouldEmit() const { 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Attribute with non-default value should be emitted. 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return !isDefaultValue(); 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool equals(const ELFAttributeValue& pValue) const; 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool operator==(const ELFAttributeValue& pValue) const { 9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines return equals(pValue); 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool operator!=(const ELFAttributeValue& pValue) const { 9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines return !equals(pValue); 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// reset - reset this value to the uninitialized state 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines void reset() { 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_Type = Uninitialized; 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_IntValue = 0; 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_StringValue.clear(); 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return; 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines unsigned int m_Type; 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines unsigned int m_IntValue; 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_StringValue; 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_TARGET_ELFATTRIBUTEVALUE_H_ 114