Beispiel #1
0
boolean SegmentIfBasedOK( SYMBOL func )
{
    fe_seg_id segid;

    segid = func->segid;
    if( segid == SEG_NULL ) {
        if( NULL != BasedType( func->sym_type ) ) {
            segid = SegmentFindBased( func->sym_type );
            return( segmentIsCode( segid ) );
        }
    }
    return( TRUE );
}
Beispiel #2
0
static fe_seg_id cgSegIdBased( SYMBOL sym, type_flag flags )
{
    fe_seg_id       id;         // - segment id
    target_offset_t align;      // - alignment for symbol
    target_size_t   size;       // - size of symbol
    TYPE            base_mod;   // - __based modifier

    size = CgMemorySize( sym->sym_type );
    #ifdef _CHECK_SIZE      // only defined if needed
        if( !(flags & TF1_HUGE) ) {
            if( _CHECK_SIZE( size ) ) {
                CErr2p( ERR_DATA_TOO_BIG, sym );
                return( SEG_NULL );
            }
        }
    #endif

    if( SymIsExtern( sym ) ) {
        // not defined in this compilation unit
        id = SegmentImport();
    } else {
        switch( flags & TF1_BASED ) {
        case TF1_BASED_STRING:
            id = SegmentFindBased( sym->sym_type );
            break;
        case TF1_BASED_SELF:
        case TF1_BASED_VOID:
            id = SEG_NULL;
            break;
        case TF1_BASED_FETCH:
        case TF1_BASED_ADD:
            base_mod = BasedType( sym->sym_type );
            id = CgSegIdData( (SYMBOL)base_mod->u.m.base, SI_DEFAULT );
            break;
        DbgDefault( "invalid based cgsegid call" );
        }
        if( id != SEG_NULL ) {
            align = cgSegIdAlign( sym, flags );
            id = SegmentAddSym( sym, id, size, align );
        }
    }
    return( id );
}
Beispiel #3
0
fe_seg_id SegmentForDefinedFunc(// GET SEGMENT FOR A DEFINED FUNCTION
    SYMBOL func )               // - function
{
    fe_seg_id segid;

    segid = func->segid;
    if( segid == SEG_NULL ) {
        if( NULL != BasedType( func->sym_type ) ) {
            segid = SegmentFindBased( func->sym_type );
        } else if( CompFlags.zm_switch_used ) {
#if _INTEL_CPU
            if( SymIsGennedComdatFun( func ) ) {
                segid = seg_code_comdat;
                if( SEG_NULL == segid ) {
                    segid = nextZmSegment();
                    seg_code_comdat = segid;
                }
            } else {
                segid = nextZmSegment();
            }
#elif _CPU == _AXP || COMP_CFG_COFF == 1
            segid = nextZmSegment();
            if( SymIsGennedComdatFun( func ) ) {
                segid = markSegmentComdat( segid );
            }
#else
#error Bad Machine Type
#endif
#if _CPU == _AXP || COMP_CFG_COFF == 1
        } else if( SymIsGennedComdatFun( func ) ) {
            segid = nextZmSegment();
            segid = markSegmentComdat( segid );
#endif
        } else {
            segid = code_def_seg.pcseg->seg_id;
            SegmentMarkUsed( segid );
            code_def_seg.ds_used = TRUE;
        }
    }
    return segid;
}