StaticResolver.cpp revision 551ae4ebd3e9d137ea668fb83ae4a55b8cfba451
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- StaticResolver.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//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/StaticResolver.h>
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSymbol.h>
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
13551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <cxxabi.h>
14551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// StaticResolver
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoStaticResolver::~StaticResolver()
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
23affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool StaticResolver::resolve(ResolveInfo& __restrict__ pOld,
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                             const ResolveInfo& __restrict__ pNew,
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                             bool &pOverride, LDSymbol::ValueType pValue) const
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /* The state table itself.
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   * The first index is a link_row and the second index is a bfd_link_hash_type.
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   * Cs -> all rest kind of common (d_C, wd_C)
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   * Is -> all kind of indirect
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   */
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static const enum LinkAction link_action[LAST_ORD][LAST_ORD] =
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* new\old  U       w_U     d_U    wd_U   D      w_D    d_D    wd_D   C      w_C,   Cs,    Is   */
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    /* U    */ {NOACT,  UND,    UND,   UND,   NOACT, NOACT, DUND,  DUND,  NOACT, NOACT, NOACT, REFC },
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    /* w_U  */ {NOACT,  NOACT,  NOACT, WEAK,  NOACT, NOACT, DUNDW, DUNDW, NOACT, NOACT, NOACT, REFC },
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* d_U  */ {NOACT,  NOACT,  NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, REFC },
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* wd_U */ {NOACT,  NOACT,  NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, REFC },
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* D    */ {DEF,    DEF,    DEF,   DEF,   MDEF,  DEF,   DEF,   DEF,   CDEF,  CDEF,  CDEF,  MDEF },
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* w_D  */ {DEFW,   DEFW,   DEFW,  DEFW,  NOACT, NOACT, DEFW,  DEFW,  NOACT, NOACT, NOACT, NOACT},
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    /* d_D  */ {MDEFD,  MDEFD,  DEFD,  DEFD,  NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, MDEF },
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* wd_D */ {MDEFWD, MDEFWD, DEFWD, DEFWD, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT},
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* C    */ {COM,    COM,    COM,   COM,   CREF,  COM,   COM,   COM,   MBIG,  COM,   BIG,   REFC },
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* w_C  */ {COM,    COM,    COM,   COM,   NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, NOACT, REFC },
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* Cs   */ {COM,    COM,    COM,   COM,   NOACT, NOACT, NOACT, NOACT, MBIG,  MBIG,  MBIG,  REFC },
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /* Is   */ {IND,    IND,    IND,   IND,   MDEF,  IND,   IND,   IND,   CIND,  CIND,  CIND,  MIND }
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Special cases:
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // * when a dynamic defined symbol meets a dynamic weak defined symbol, act
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //   noting.
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // * when a undefined symbol meets a dynamic defined symbol, override by
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //   dynamic defined first, then recover back to undefined symbol later.
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // * when a dynamic defined symbol meets a undefined symbol or a weak
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //   undefined symbol, do not override, instead of marking.
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // * When a undefined symbol meets a dynamic defined symbol or a weak
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //   undefined symbol meets a dynamic defined symbol, should override.
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // * When a common symbol meets a weak common symbol, adjust the size of
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //   common symbol (ref: Google gold linker: resolve.cc)
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  unsigned int row = getOrdinate(pNew);
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  unsigned int col = getOrdinate(pOld);
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool cycle = false;
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  pOverride = false;
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ResolveInfo* old = &pOld;
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LinkAction action;
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  do {
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    cycle = false;
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    action = link_action[row][col];
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    switch(action) {
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case FAIL: {       /* abort.  */
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        fatal(diag::fail_sym_resolution)
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                << __FILE__ << __LINE__
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                << "mclinker@googlegroups.com";
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        return false;
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case NOACT: {      /* no action.  */
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = false;
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->overrideVisibility(pNew);
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case UND:          /* override by symbol undefined symbol.  */
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case WEAK:         /* override by symbol weak undefined.  */
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case DEF:          /* override by symbol defined.  */
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case DEFW:         /* override by symbol weak defined.  */
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case DEFD:         /* override by symbol dynamic defined.  */
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case DEFWD:        /* override by symbol dynamic weak defined. */
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case COM: {        /* override by symbol common defined.  */
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = true;
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->override(pNew);
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case MDEFD:        /* mark symbol dynamic defined.  */
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case MDEFWD: {     /* mark symbol dynamic weak defined.  */
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        uint32_t binding = old->binding();
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->override(pNew);
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->setBinding(binding);
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        ignore(diag::mark_dynamic_defined) << old->name();
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = true;
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case DUND:
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case DUNDW: {
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->overrideVisibility(pNew);
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        old->setDynamic();
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = false;
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case CREF: {       /* Possibly warn about common reference to defined symbol.  */
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        // A common symbol does not override a definition.
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        ignore(diag::comm_refer_to_define) << old->name();
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = false;
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case CDEF: {       /* redefine existing common symbol.  */
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        // We've seen a common symbol and now we see a definition.  The
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        // definition overrides.
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        //
123551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        // NOTE: m_Mesg uses 'name' instead of `name' for being compatible to GNU ld.
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        ignore(diag::redefine_common) << old->name();
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->override(pNew);
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = true;
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case BIG: {        /* override by symbol common using largest size.  */
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        if (old->size() < pNew.size())
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          old->setSize(pNew.size());
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->overrideAttributes(pNew);
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->overrideVisibility(pNew);
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = true;
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case MBIG: {       /* mark common symbol by larger size. */
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        if (old->size() < pNew.size())
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          old->setSize(pNew.size());
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->overrideVisibility(pNew);
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = false;
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case CIND: {       /* mark indirect symbol from existing common symbol.  */
145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang         ignore(diag::indirect_refer_to_common) << old->name();
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      /* Fall through */
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case IND: {        /* override by indirect symbol.  */
149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        if (NULL == pNew.link()) {
150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang          fatal(diag::indirect_refer_to_inexist) << pNew.name();
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          break;
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        }
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        /** Should detect the loop of indirect symbol during file reading **/
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        // if (pNew.link()->isIndirect() && pNew.link()->link() == &pNew) {
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        //  m_Mesg = "indirect symbol `"+pNew.name()+"' to `"+pNew.link()->name()+"' is a loop.";
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        //  return Resolver::Abort;
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        //}
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        // change the old symbol to the indirect symbol
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old->setLink(pNew.link());
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pOverride = true;
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case MIND: {       /* multiple indirect symbols.  */
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        // it is OK if they both point to the same symbol
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        if (old->link() == pNew.link()) {
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          pOverride = false;
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          break;
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        }
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      /* Fall through */
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case MDEF: {       /* multiple definition error.  */
174551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        int status;
175551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        char* demangled_name = abi::__cxa_demangle(pNew.name(), NULL, NULL,
176551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                                   &status);
17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (pOld.isDefine() && pNew.isDefine() &&
17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            pOld.isAbsolute() && pNew.isAbsolute() &&
17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            (pOld.desc() == pNew.desc() || pOld.desc() == ResolveInfo::NoType ||
18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             pNew.desc() == ResolveInfo::NoType)) {
18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          if (pOld.outSymbol()->value() == pValue) {
18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            pOverride = true;
18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            old->override(pNew);
18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            break;
18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          } else {
186551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines            if (demangled_name != NULL) {
187551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines              error(diag::multiple_absolute_definitions) << demangled_name
188551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                << pOld.outSymbol()->value() << pValue;
189551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines            } else {
190551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines              error(diag::multiple_absolute_definitions) << pNew.name()
191551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                << pOld.outSymbol()->value() << pValue;
192551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines            }
19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            break;
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          }
19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        }
196551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        if (demangled_name != NULL) {
197551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines          error(diag::multiple_definitions) << demangled_name;
198551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        } else {
199551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines          error(diag::multiple_definitions) << pNew.name();
200551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        }
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case REFC: {       /* Mark indirect symbol referenced and then CYCLE.  */
204affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        if (NULL == old->link()) {
205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang          fatal(diag::indirect_refer_to_inexist) << old->name();
2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          break;
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        }
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        old = old->link();
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        col = getOrdinate(*old);
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        cycle = true;
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
214affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      default: {
215affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        error(diag::undefined_situation) << action << old->name() << pNew.name();
216affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        return false;
217affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      }
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    } // end of the big switch (action)
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  } while(cycle);
220affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return true;
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
223