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//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/Attribute.h>
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/AttributeSet.h>
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// AttrConstraint
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
18affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool AttrConstraint::isLegal(const Attribute& pAttr) const
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!isWholeArchive() && pAttr.isWholeArchive()) {
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    error(diag::err_unsupported_whole_archive);
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!isAsNeeded() && pAttr.isAsNeeded()) {
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    error(diag::err_unsupported_as_needed);
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!isAddNeeded() && pAttr.isAddNeeded()) {
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    error(diag::err_unsupported_add_needed);
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (isStaticSystem() && pAttr.isDynamic()) {
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    error(diag::err_unsupported_Bdynamic);
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (isStaticSystem() && pAttr.isAsNeeded()) {
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    warning(diag::err_enable_as_needed_on_static_system);
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return true;
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // FIXME: may be it's legal, but ignored by GNU ld.
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (pAttr.isAsNeeded() && pAttr.isStatic()) {
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    warning(diag::err_mix_static_as_needed);
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return true;
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return true;
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// AttributeProxy
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoAttributeProxy::AttributeProxy(AttributeSet& pParent,
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                               const Attribute& pBase,
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                               const AttrConstraint& pConstraint)
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : m_AttrPool(pParent), m_pBase(&pBase), m_Constraint(pConstraint) {
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoAttributeProxy::~AttributeProxy()
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isWholeArchive() const
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (m_Constraint.isWholeArchive())
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return m_pBase->isWholeArchive();
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isAsNeeded() const
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (m_Constraint.isAsNeeded())
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return m_pBase->isAsNeeded();
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isAddNeeded() const
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (m_Constraint.isAddNeeded())
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return m_pBase->isAddNeeded();
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isStatic() const
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (m_Constraint.isSharedSystem())
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return m_pBase->isStatic();
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return true;
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool AttributeProxy::isDynamic() const
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (m_Constraint.isSharedSystem())
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return m_pBase->isDynamic();
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic inline void ReplaceOrRecord(AttributeSet& pParent,
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                   const Attribute *&pBase,
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   Attribute *&pCopy)
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *result = pParent.exists(*pCopy);
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (NULL == result) { // can not find
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pParent.record(*pCopy);
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pBase = pCopy;
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else { // find
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    delete pCopy;
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pBase = result;
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setWholeArchive()
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *copy = new Attribute(*m_pBase);
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  copy->setWholeArchive();
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ReplaceOrRecord(m_AttrPool, m_pBase, copy);
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::unsetWholeArchive()
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *copy = new Attribute(*m_pBase);
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  copy->unsetWholeArchive();
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ReplaceOrRecord(m_AttrPool, m_pBase, copy);
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setAsNeeded()
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *copy = new Attribute(*m_pBase);
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  copy->setAsNeeded();
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ReplaceOrRecord(m_AttrPool, m_pBase, copy);
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::unsetAsNeeded()
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *copy = new Attribute(*m_pBase);
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  copy->unsetAsNeeded();
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ReplaceOrRecord(m_AttrPool, m_pBase, copy);
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setAddNeeded()
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *copy = new Attribute(*m_pBase);
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  copy->setAddNeeded();
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ReplaceOrRecord(m_AttrPool, m_pBase, copy);
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::unsetAddNeeded()
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *copy = new Attribute(*m_pBase);
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  copy->unsetAddNeeded();
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ReplaceOrRecord(m_AttrPool, m_pBase, copy);
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setStatic()
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *copy = new Attribute(*m_pBase);
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  copy->setStatic();
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ReplaceOrRecord(m_AttrPool, m_pBase, copy);
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid AttributeProxy::setDynamic()
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Attribute *copy = new Attribute(*m_pBase);
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  copy->setDynamic();
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ReplaceOrRecord(m_AttrPool, m_pBase, copy);
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoAttributeProxy& AttributeProxy::assign(Attribute* pBase)
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pBase = pBase;
17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return *this;
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
178