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