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