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; }
// #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(); } }
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 ); }
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 ); }