Beispiel #1
0
static void initDefaultCodeSeg( char *code_seg_name )
{
    PC_SEGMENT *pcseg;

    SegmentCode( code_seg_name, NULL );
    code_def_seg.ds_used = TRUE;
    pcseg = code_def_seg.pcseg;
    _markUsed( pcseg, TRUE );
    seg_default_code = pcseg->seg_id;
}
Beispiel #2
0
// #pragma code_seg ( segment [, class] )
// #pragma code_seg segment
//
// "segment" sets the default code segment for remaining functions
// "class" is ignored
//
static void pragCodeSeg(        // SET NEW CODE SEGMENT
    void )
{
    char *seg_name;
    char *seg_class;

    if( CurToken == T_LEFT_PAREN ) {
        PPCTL_ENABLE_MACROS();
        NextToken();
        if( ( CurToken == T_STRING ) || ( CurToken == T_ID ) ) {
            seg_name = strsave( Buffer );
            seg_class = NULL;
            NextToken();
            if( CurToken == T_COMMA ) {
                NextToken();
                if( ( CurToken == T_STRING ) || ( CurToken == T_ID ) ) {
                    seg_class = strsave( Buffer );
                    NextToken();
                } else {
                    MustRecog( T_STRING );
                }
            }
            SegmentCode( seg_name, seg_class );
            CMemFree( seg_name );
            CMemFree( seg_class );
        } else if( CurToken == T_RIGHT_PAREN ) {
            // restore back to default behaviour
            SegmentCode( NULL, NULL );
        }
        PPCTL_DISABLE_MACROS();
        MustRecog( T_RIGHT_PAREN );
    } else if( CurToken == T_STRING ) {
        SegmentCode( Buffer, NULL );
        NextToken();
    }
}
Beispiel #3
0
void SegmentCodeCgInit(         // TURN OFF USED BIT FOR ALL CODE SEGMENTS
    void )
{
    PC_SEGMENT *segment;        // - current segment

    // reset any #pragma data_seg/code_seg changes back to defaults
    SegmentData( NULL, NULL );
    SegmentCode( NULL, NULL );
    RingIterBeg( seg_list, segment ) {
        if( ( segment->attrs & EXEC ) && ! segment->has_data ) {
            _markUsed( segment, FALSE );
        }
    } RingIterEnd( segment )
    // call out for non-call graph code segment uses
    DbgSuppSegRequest();
    // used for default code segment externs
    SegmentMarkUsed( SEG_CODE );
}
Beispiel #4
0
void SegmentCode(               // SET DEFAULT CODE SEGMENT
    char *segname,              // - segment name
    char *segclass )            // - segment class name
{
    PC_SEGMENT *seg;            // - new default segment
    unsigned control;           // - segmentAlloc control mask

    if( segname == NULL ) {
        SegmentCode( TextSegName, NULL );
        return;
    }
    pruneDefSeg( &code_def_seg );
    control = SA_NULL;
    if( strpref( ModuleName, segname ) ) {
        control |= SA_MODULE_PREFIX;
    }
    seg = segmentDefine( segname, segclass, SEG_NULL, SGAT_CODE_GEN, control );
    initDefSeg( &code_def_seg, seg );
}