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