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//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_TARGET_ELFATTRIBUTEVALUE_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_TARGET_ELFATTRIBUTEVALUE_H 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <string> 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class ELFAttributeValue 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief ELFAttributeValue stroes the value of an attribute tag. The attribtue 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * tag itself is not stored in this object. 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ELFAttributeValue 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Type of value that an attribute tag holds. 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enum Type { 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // The value contains no data and has unknown type. 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Uninitialized = 0, 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // The value contains integer data. 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Int = 1L << 0, 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // The value contains string data. 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines String = 1L << 1, 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // This is for attribute in which "default value" (0 for int type and empty 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // string for string type) has special meaning for them. That is, the 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // default value is "disabled" and meaningful for those attribute. 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines NoDefault = 1L << 2, 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ELFAttributeValue() 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines : m_Type(Uninitialized), m_IntValue(0), m_StringValue() { } 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~ELFAttributeValue() { } 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines unsigned int type() const 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return m_Type; } 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setType(unsigned int pType) 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { m_Type = pType; } 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines unsigned int getIntValue() const 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return m_IntValue; } 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setIntValue(unsigned int pIntValue) 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { m_IntValue = pIntValue; } 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string &getStringValue() const 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return m_StringValue; } 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setStringValue(const std::string &pStringValue) 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { m_StringValue = pStringValue; } 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setStringValue(const char *pStringValue, size_t pSize) 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { m_StringValue.assign(pStringValue, pSize); } 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setStringValue(const char *pStringValue) 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { m_StringValue.assign(pStringValue); } 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t getSize() const; 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines inline bool isUninitialized() const 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return (m_Type == Uninitialized); } 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines inline bool isInitialized() const 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return !isUninitialized(); } 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines inline bool isIntValue() const 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return (m_Type & Int); } 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines inline bool isStringValue() const 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return (m_Type & String); } 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines inline bool hasNoDefault() const 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return (m_Type & NoDefault); } 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool isDefaultValue() const; 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Returns true if this attribute value should be emitted to the output. 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines inline bool shouldEmit() const { 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Attribute with non-default value should be emitted. 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return !isDefaultValue(); 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool equals(const ELFAttributeValue& pValue) const; 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool operator==(const ELFAttributeValue& pValue) const 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return equals(pValue); } 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool operator!=(const ELFAttributeValue& pValue) const 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return !equals(pValue); } 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// reset - reset this value to the uninitialized state 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void reset() 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_Type = Uninitialized; 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_IntValue = 0; 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_StringValue.clear(); 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return; 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines unsigned int m_Type; 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines unsigned int m_IntValue; 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_StringValue; 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif 123