Attribute.cpp revision affc150dc44fab1911775a49636d0ce85333b634
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MCLDAttribute.cpp --------------------------------------------------===// 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//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLDAttribute.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/AttributeFactory.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//========================== 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// AttrConstraint 17affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool AttrConstraint::isLegal(const Attribute& pAttr) const 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!isWholeArchive() && pAttr.isWholeArchive()) { 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang error(diag::err_unsupported_whole_archive); 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!isAsNeeded() && pAttr.isAsNeeded()) { 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang error(diag::err_unsupported_as_needed); 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!isAddNeeded() && pAttr.isAddNeeded()) { 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang error(diag::err_unsupported_add_needed); 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (isStaticSystem() && pAttr.isDynamic()) { 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang error(diag::err_unsupported_Bdynamic); 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (isStaticSystem() && pAttr.isAsNeeded()) { 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang warning(diag::err_enable_as_needed_on_static_system); 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // FIXME: may be it's legal, but ignored by GNU ld. 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pAttr.isAsNeeded() && pAttr.isStatic()) { 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang warning(diag::err_mix_static_as_needed); 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//========================== 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// AttributeProxy 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoAttributeProxy::AttributeProxy(AttributeFactory& pParent, Attribute& pBase) 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_AttrPool(pParent), m_pBase(&pBase) { 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoAttributeProxy::~AttributeProxy() 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isWholeArchive() const 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_AttrPool.constraint().isWholeArchive()) 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pBase->isWholeArchive(); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isAsNeeded() const 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_AttrPool.constraint().isAsNeeded()) 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pBase->isAsNeeded(); 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isAddNeeded() const 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_AttrPool.constraint().isAddNeeded()) 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pBase->isAddNeeded(); 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isStatic() const 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_AttrPool.constraint().isSharedSystem()) 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pBase->isStatic(); 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isDynamic() const 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_AttrPool.constraint().isSharedSystem()) 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pBase->isDynamic(); 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic inline void ReplaceOrRecord(AttributeFactory& pParent, 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *&pBase, 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *&pCopy) 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *result = pParent.exists(*pCopy); 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (0 == result) { // can not find 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pParent.record(*pCopy); 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pBase = pCopy; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else { // find 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao delete pCopy; 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pBase = result; 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setWholeArchive() 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *copy = new Attribute(*m_pBase); 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao copy->setWholeArchive(); 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReplaceOrRecord(m_AttrPool, m_pBase, copy); 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::unsetWholeArchive() 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *copy = new Attribute(*m_pBase); 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao copy->unsetWholeArchive(); 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReplaceOrRecord(m_AttrPool, m_pBase, copy); 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setAsNeeded() 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *copy = new Attribute(*m_pBase); 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao copy->setAsNeeded(); 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReplaceOrRecord(m_AttrPool, m_pBase, copy); 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::unsetAsNeeded() 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *copy = new Attribute(*m_pBase); 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao copy->unsetAsNeeded(); 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReplaceOrRecord(m_AttrPool, m_pBase, copy); 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setAddNeeded() 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *copy = new Attribute(*m_pBase); 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao copy->setAddNeeded(); 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReplaceOrRecord(m_AttrPool, m_pBase, copy); 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::unsetAddNeeded() 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *copy = new Attribute(*m_pBase); 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao copy->unsetAddNeeded(); 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReplaceOrRecord(m_AttrPool, m_pBase, copy); 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setStatic() 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *copy = new Attribute(*m_pBase); 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao copy->setStatic(); 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReplaceOrRecord(m_AttrPool, m_pBase, copy); 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setDynamic() 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Attribute *copy = new Attribute(*m_pBase); 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao copy->setDynamic(); 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReplaceOrRecord(m_AttrPool, m_pBase, copy); 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoAttributeProxy* AttributeProxy::clone() const 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return new AttributeProxy(m_AttrPool, *m_pBase); 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 173