void ConvertVFSym( symbol * sym ) /**************************************/ /* convert the symbol from a virtual function def. record to either a extdef * or a lazy reference*/ { symbol * defsym; defsym = *(sym->e.vfdata); _LnkFree( sym->e.vfdata ); sym->e.def = defsym; if( IS_SYM_PURE_REF( sym ) ) { SET_SYM_TYPE( sym, SYM_LAZY_REF ); } else { SET_SYM_TYPE( sym, SYM_REGULAR ); } sym->info &= ~SYM_CHECKED; }
static void SetSymAlias( symbol *sym, char *target, size_t targetlen ) /********************************************************************/ { SET_SYM_TYPE( sym, SYM_ALIAS ); sym->p.alias = ChkToString( target, targetlen ); sym->u.aliaslen = targetlen; sym->info |= SYM_DEFINED; /* an alias can't be undefined */ sym->info &= ~SYM_WAS_LAZY; }
symbol * MakeWeakExtdef( char *name, symbol *def ) /*******************************************************/ /* make a weak extdef */ { symbol * sym; sym = SymOp( ST_CREATE, name, strlen( name ) ); sym->e.def = def; SET_SYM_TYPE( sym, SYM_LINK_WEAK_REF ); return sym; }
static bool GetNovImport( void ) /******************************/ { symbol *sym; const char *name = NULL; const char *prefix = NULL; size_t namelen = 0; size_t prefixlen = 0; bool result; /* // we need to trap import/export prefixes here. Unfortunately the prefix context // is not followed by a valid seperator so the GetToken() call in ProcArgList // at the end of the do...while loop terminates the loop after we return from // this call (and WildCard from where we were called of course */ if( IsNetWarePrefix( Token.this, Token.len ) ) { result = SetCurrentPrefix( Token.this, Token.len ); if( result ) { Token.skipToNext = DoWeNeedToSkipASeparator( false ); #ifndef NDEBUG printf( "Set new prefix. Skip = %d\n", Token.skipToNext ); #endif } return( result ); } if( !NetWareSplitSymbol( Token.this, Token.len, &name, &namelen, &prefix, &prefixlen ) ) { return( false ); } sym = SymOpNWPfx( ST_DEFINE_SYM, name, namelen, prefix, prefixlen ); if( sym == NULL || sym->p.import != NULL ) { return( true ); } #ifndef NDEBUG printf( "imported %s from %s\n", sym->name, ( sym->prefix != NULL ) ? sym->prefix : "(NONE)" ); #endif SET_SYM_TYPE( sym, SYM_IMPORTED ); sym->info |= SYM_DCE_REF; // make sure we don't try to get rid of these. SetNovImportSymbol( sym ); Token.skipToNext = DoWeNeedToSkipASeparator( true ); return( true ); }
static void CollapseLazy( void *node, void *dummy ) /*************************************************/ { extnode * curr; dummy = dummy; curr = node; if( IS_SYM_A_REF( curr->entry ) && !curr->isweak ) { ClearSymUnion( curr->entry ); SET_SYM_TYPE( curr->entry, SYM_REGULAR ); if( LinkState & SEARCHING_LIBRARIES ) { curr->entry->info &= ~SYM_CHECKED; LinkState |= LIBRARIES_ADDED; // force another pass thru libs } } }
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; }