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