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