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