symbol * HashReplace( symbol *sym ) /****************************************/ { symbol * newsym; if( sym->mod == NULL ) return sym; Ring2Prune( &sym->mod->publist, sym ); if( IS_SYM_COMMUNAL(sym) ) { sym->p.seg->isdead = TRUE; } if( !(LinkFlags & INC_LINK_FLAG) ) return sym; newsym = AddSym(); newsym->e.mainsym = sym; newsym->name = sym->name; newsym->namelen_cmp = sym->namelen_cmp; newsym->info = sym->info | SYM_DEAD | SYM_IS_ALTDEF; Ring2Append( &sym->mod->publist, newsym ); RingAppend( &sym->u.altdefs, newsym ); if( IS_SYM_NICOMDEF(sym) ) { sym->p.cdefsize = sym->p.seg->length; } return sym; }
static void DoAltDef( comdat_info *info ) /***************************************/ { if( !(LinkFlags & INC_LINK_FLAG) ) { FreeSegData( info->sdata ); } else { Ring2Append( &CurrMod->segs, info->sdata ); info->sdata->isdead = TRUE; InfoCDatAltDef( info ); } }
symbol * AddAltDef( symbol *sym, sym_info sym_type ) /*********************************************************/ { symbol * altsym; if( !(LinkFlags & INC_LINK_FLAG) ) return sym; altsym = AddSym(); SET_SYM_TYPE( altsym, sym_type ); altsym->info |= SYM_DEAD | SYM_IS_ALTDEF; altsym->mod = CurrMod; altsym->name = sym->name; altsym->e.mainsym = sym; Ring2Append( &CurrMod->publist, altsym ); RingAppend( &sym->u.altdefs, altsym ); return altsym; }