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