Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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 );
}
Exemplo n.º 5
0
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
        }
    }
}
Exemplo n.º 6
0
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;
}