122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- Attribute.h --------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_MC_ATTRIBUTE_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_MC_ATTRIBUTE_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass AttributeSet;
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class AttributeBase
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief AttributeBase provides the real storage for attributes of options.
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  Attributes are options affecting the link editing of input files.
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  Some options affects the input files mentioned on the command line after
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  them. For example, --whole-archive option affects archives mentioned on
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  the command line after the --whole-archve option. We call such options
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  "attributes of input files"
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  AttributeBase is the storage for attributes of input files. Each input
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  file (@see mcld::Input in MCLinker) has a pointer of an attribute. Since
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  most attributes of input files are identical, our design lets input files
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  which have identical attributes share common attribute. AttributeBase is
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  the shared storage for attribute.
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass AttributeBase
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  AttributeBase()
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : m_WholeArchive(false),
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_AsNeeded(false),
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_AddNeeded(true),
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Static(false)
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { }
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  AttributeBase(const AttributeBase& pBase)
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : m_WholeArchive(pBase.m_WholeArchive),
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_AsNeeded(pBase.m_AsNeeded),
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_AddNeeded(pBase.m_AddNeeded),
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Static(pBase.m_Static)
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { }
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~AttributeBase()
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { }
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // ----- observers  ----- //
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // represent GNU ld --whole-archive/--no-whole-archive options
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isWholeArchive() const
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_WholeArchive; }
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // represent GNU ld --as-needed/--no-as-needed options
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isAsNeeded() const
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_AsNeeded; }
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // represent GNU ld --add-needed/--no-add-needed options
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isAddNeeded() const
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_AddNeeded; }
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // represent GNU ld -static option
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isStatic() const
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Static; }
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // represent GNU ld -call_shared option
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isDynamic() const
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return !m_Static; }
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool m_WholeArchive : 1;
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool m_AsNeeded : 1;
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool m_AddNeeded : 1;
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool m_Static : 1;
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class Attribute
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief The base class of attributes. Providing the raw operations of an
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  attributes
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  For conventience and producing less bugs, we move the stoarges of attributes
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  onto AttributeBase, and modifiers remains with the class Attribute.
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Attribute : public AttributeBase
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  modifiers  ----- //
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setWholeArchive()
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_WholeArchive = true; }
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void unsetWholeArchive()
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_WholeArchive = false; }
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setAsNeeded()
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AsNeeded = true; }
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void unsetAsNeeded()
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AsNeeded = false; }
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setAddNeeded()
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AddNeeded = true; }
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void unsetAddNeeded()
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AddNeeded = false; }
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setStatic()
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_Static = true; }
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setDynamic()
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_Static = false; }
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class AttrConstraint
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief AttrConstarint is the constraint of a system.
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  Some systems can not enable certain attributes of a input file.
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  For example, systems which have no shared libraries can not enable
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  --call_shared options. We call the ability of enabling attributes
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  as the constraint of attributes of a system.
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  Systems enable attributes at the target implementation of SectLinker.
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  @see SectLinker
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass AttrConstraint : public AttributeBase
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void enableWholeArchive()
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_WholeArchive = true; }
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void disableWholeArchive()
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_WholeArchive = false; }
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void enableAsNeeded()
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AsNeeded = true; }
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void disableAsNeeded()
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AsNeeded = false; }
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void enableAddNeeded()
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AddNeeded = true; }
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void disableAddNeeded()
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AddNeeded = false; }
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setSharedSystem()
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_Static = false; }
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setStaticSystem()
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_Static = true; }
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isSharedSystem() const
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return !m_Static; }
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isStaticSystem() const
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Static; }
159551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isLegal(const Attribute& pAttr) const;
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class AttributeProxy
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief AttributeProxys is the illusion of private attribute of each
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  input file.
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  We designers want to hide the details of sharing common attributes
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  between input files. We want input files under the illusion that they
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  have their own private attributes to simplify the linking algorithms.
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  AttributeProxy hides the reality of sharing. An input file can change
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  its attribute without explicit searching of existing attributes
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  as it has a private ownership of the attribute. AttributeProxy does
17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  the searching in the AttributeSet and changes the pointer of
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  the attribute of the input file. If the searching fails, AttributeProxy
17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  requests a new attribute from the AttributeSet.
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass AttributeProxy
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  AttributeProxy(AttributeSet& pParent,
18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                 const Attribute& pBase,
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                 const AttrConstraint& pConstraint);
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ~AttributeProxy();
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // ----- observers  ----- //
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isWholeArchive() const;
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isAsNeeded() const;
1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isAddNeeded() const;
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isStatic() const;
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isDynamic() const;
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const Attribute* attr() const
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_pBase; }
2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  modifiers  ----- //
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setWholeArchive();
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void unsetWholeArchive();
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setAsNeeded();
2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void unsetAsNeeded();
2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setAddNeeded();
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void unsetAddNeeded();
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setStatic();
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setDynamic();
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  AttributeProxy& assign(Attribute* pBase);
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  AttributeSet &m_AttrPool;
21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const Attribute *m_pBase;
21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const AttrConstraint& m_Constraint;
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// -----  comparisons  ----- //
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline bool operator== (const Attribute& pLHS, const Attribute& pRHS)
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return ((pLHS.isWholeArchive() == pRHS.isWholeArchive()) &&
224551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    (pLHS.isAsNeeded() == pRHS.isAsNeeded()) &&
225551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    (pLHS.isAddNeeded() == pRHS.isAddNeeded()) &&
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    (pLHS.isStatic() == pRHS.isStatic()));
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline bool operator!= (const Attribute& pLHS, const Attribute& pRHS)
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return !(pLHS == pRHS);
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
238