cmdlnx86.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,273 行 · 第 1/3 页
C
1,273 行
DefSwitchMacro( "3" );
break;
case CPU_486:
DefSwitchMacro( "4" );
break;
case CPU_586:
DefSwitchMacro( "5" );
break;
case CPU_686:
DefSwitchMacro( "6" );
break;
}
switch( GET_FPU_LEVEL( CpuSwitches ) ) {
case FPU_NONE:
CompFlags.op_switch_used = 0;
DefSwitchMacro( "FPC" );
break;
case FPU_87:
DefSwitchMacro( "FP287" );
defEmu();
break;
case FPU_387:
DefSwitchMacro( "FP387" );
defEmu();
break;
case FPU_586:
DefSwitchMacro( "FP5" );
defEmu();
break;
case FPU_686:
DefSwitchMacro( "FP6" );
defEmu();
break;
}
if( CompFlags.op_switch_used ) {
DefSwitchMacro( "OP" );
}
#if _CPU == 386
PreDefineStringMacro( "_STDCALL_SUPPORTED" );
PreDefineStringMacro( "_INTEGRAL_MAX_BITS=64" );
if( CompFlags.extensions_enabled ) {
PreDefineStringMacro( "SOMLINK=_Syscall" );
PreDefineStringMacro( "SOMDLINK=_Syscall" );
}
#endif
#if _CPU == 8086
PreDefineStringMacro( "_INTEGRAL_MAX_BITS=64" );
if( CompFlags.extensions_enabled ) {
if( TargetSwitches & WINDOWS ) {
PreDefineStringMacro( "SOMLINK=__cdecl" );
PreDefineStringMacro( "SOMDLINK=__far" );
}
}
#endif
}
static void miscAnalysis( OPT_STORAGE *data )
{
#if _CPU == 8086
if( data->bd || data->zu ) {
if( TargetSwitches & SMART_WINDOWS ) {
CErr1( ERR_ZWS_MUST_HAVE_SS_DS_SAME );
}
}
#endif
if( GET_CPU( CpuSwitches ) < CPU_386 ) {
/* issue warning message if /zf[f|p] or /zg[f|p] spec'd? */
TargetSwitches &= ~( FLOATING_FS | FLOATING_GS );
}
if( ! CompFlags.save_restore_segregs ) {
if( TargetSwitches & FLOATING_DS ) {
HW_CTurnOff( WatcallInfo.save, HW_DS );
}
if( TargetSwitches & FLOATING_ES ) {
HW_CTurnOff( WatcallInfo.save, HW_ES );
}
if( TargetSwitches & FLOATING_FS ) {
HW_CTurnOff( WatcallInfo.save, HW_FS );
}
if( TargetSwitches & FLOATING_GS ) {
HW_CTurnOff( WatcallInfo.save, HW_GS );
}
}
if( GET_FPU( CpuSwitches ) > FPU_NONE ) {
PreDefineStringMacro( "__FPI__" );
}
#if _CPU == 386
if( ! CompFlags.register_conventions ) {
SetAuxStackConventions();
}
#endif
if( data->zx ) {
HW_CTurnOff( WatcallInfo.save, HW_FLTS );
}
}
void CmdSysAnalyse( OPT_STORAGE *data )
/*************************************/
{
char *target_name = NULL;
mem_model_control mmc = MMC_NULL;
GenSwitches &= ~( DBG_CV | DBG_DF | DBG_PREDEF );
switch( data->dbg_output ) {
case OPT_dbg_output_hc:
GenSwitches |= DBG_CV;
break;
case OPT_dbg_output_hda:
if( data->fhd ) {
CompFlags.pch_debug_info_opt = 1;
}
GenSwitches |= DBG_DF | DBG_PREDEF;
break;
case OPT_dbg_output_hw:
break;
case OPT_dbg_output_hd:
default:
if( data->fhd ) {
CompFlags.pch_debug_info_opt = 1;
}
GenSwitches |= DBG_DF;
break;
}
switch( data->ds_peg ) {
case OPT_ds_peg_zdp:
TargetSwitches &= ~ FLOATING_DS;
mmc |= MMC_DS;
break;
case OPT_ds_peg_zdf:
TargetSwitches |= FLOATING_DS;
mmc |= MMC_DS;
break;
}
if( data->zfw ) {
TargetSwitches |= GEN_FWAIT_386;
}
#if _CPU == 386
if( data->zro && data->zri ) {
// DbgDefault( "invalid fp rounding flags - ignored" );
data->zro = data->zri = 0;
}
if( data->zri ) {
GenSwitches |= FPU_ROUNDING_INLINE;
} else if( data->zro ) {
GenSwitches |= FPU_ROUNDING_OMIT;
}
#else
if( data->zro ) {
GenSwitches |= FPU_ROUNDING_OMIT;
}
#endif
#if _CPU == 386
if( data->zdl ) {
TargetSwitches |= LOAD_DS_DIRECTLY;
mmc |= MMC_DS;
}
#endif
switch( data->fs_peg ) {
case OPT_fs_peg_zfp:
TargetSwitches &= ~ FLOATING_FS;
mmc |= MMC_FS;
break;
case OPT_fs_peg_zff:
TargetSwitches |= FLOATING_FS;
mmc |= MMC_FS;
break;
}
switch( data->gs_peg ) {
case OPT_gs_peg_zgp:
TargetSwitches &= ~ FLOATING_GS;
mmc |= MMC_GS;
break;
case OPT_gs_peg_zgf:
TargetSwitches |= FLOATING_GS;
mmc |= MMC_GS;
break;
}
// -zw overrides a build target setting
if( data->bt ) {
char *target = SetStringOption( NULL, &(data->bt_value) );
SetTargetLiteral( &target_name, target );
if( target_name != NULL ) {
if( strcmp( target_name, "WINDOWS" ) == 0 ||
strcmp( target_name, "CHEAP_WINDOWS" ) == 0 ) {
mmc |= MMC_WIN;
} else if( strcmp( target_name, "NETWARE" ) == 0 ) {
mmc |= MMC_NETWARE;
} else if( strcmp( target_name, "NETWARE5" ) == 0 ) {
mmc |= MMC_NETWARE;
}
}
CMemFree( target );
}
#if _CPU == 8086
switch( data->win ) {
case OPT_win_zw:
SetTargetLiteral( &target_name, "windows" );
mmc |= MMC_WIN;
break;
case OPT_win_zW:
SetTargetLiteral( &target_name, "cheap_windows" );
mmc |= MMC_WIN;
break;
case OPT_win_zws:
SetTargetLiteral( &target_name, "windows" );
TargetSwitches |= SMART_WINDOWS;
mmc |= MMC_WIN;
break;
case OPT_win_zWs:
SetTargetLiteral( &target_name, "cheap_windows" );
TargetSwitches |= SMART_WINDOWS;
mmc |= MMC_WIN;
break;
}
#else
switch( data->win ) {
case OPT_win_zw:
SetTargetLiteral( &target_name, "windows" );
mmc |= MMC_WIN;
break;
}
#endif
// depends on 'mmc' being set fully
setIntelArchitecture( data, mmc );
switch( data->intel_fpu_model ) {
case OPT_intel_fpu_model_fpi:
SET_FPU_EMU( CpuSwitches );
break;
#ifdef OPT_intel_fpu_model__7
case OPT_intel_fpu__7:
/* fall through */
#endif
case OPT_intel_fpu_model_fpi87:
SET_FPU_INLINE( CpuSwitches );
break;
case OPT_intel_fpu_model_fpc:
SET_FPU( CpuSwitches, FPU_NONE );
break;
case OPT_intel_fpu_model__87d:
if( data->_87d_value ) {
Stack87 = data->_87d_value;
}
break;
}
switch( data->intel_fpu_level ) {
case OPT_intel_fpu_level_fp6:
SET_FPU_LEVEL( CpuSwitches, FPU_686 );
break;
case OPT_intel_fpu_level_fp5:
SET_FPU_LEVEL( CpuSwitches, FPU_586 );
break;
case OPT_intel_fpu_level_fp3:
SET_FPU_LEVEL( CpuSwitches, FPU_387 );
break;
case OPT_intel_fpu_level_fp2:
SET_FPU_LEVEL( CpuSwitches, FPU_87 );
break;
}
// depends on architecture and fpu being set
setMemoryModel( data, mmc );
if( data->fpd ) {
TargetSwitches |= P5_DIVIDE_CHECK;
}
/*
// Changed the ordering.
// Always set Stack87 if fpr switch is used.
// If fpr switch is not present but are using NetWare then set Stack87
// unless the target is NetWare 5 or above.
*/
if( data->fpr ) {
Stack87 = 4;
} else {
if( mmc & MMC_NETWARE ) {
if(TS_NETWARE5 != TargetSystem){
Stack87 = 4; /* no fpr for netware 5 */
}
}
}
if( data->g ) {
SetStringOption( &GenCodeGroup, &(data->g_value) );
}
if( data->nc ) {
SetStringOption( &CodeClassName, &(data->nc_value) );
}
if( data->nd ) {
SetStringOption( &DataSegName, &(data->nd_value) );
}
if( data->nm ) {
SetStringOption( &ModuleName, &(data->nm_value) );
}
if( data->nt ) {
SetStringOption( &TextSegName, &(data->nt_value) );
}
if( data->oc ) {
TargetSwitches |= NO_CALL_RET_TRANSFORM;
}
if( data->of ) {
TargetSwitches |= NEED_STACK_FRAME;
}
if( data->of_plus ) {
TargetSwitches |= NEED_STACK_FRAME;
WatcallInfo.cclass |= GENERATE_STACK_FRAME;
}
if( data->om ) {
TargetSwitches |= I_MATH_INLINE;
}
if( data->r ) {
CompFlags.save_restore_segregs = 1;
}
if( data->ri ) {
CompFlags.returns_promoted = 1;
}
if( data->sg ) {
CompFlags.sg_switch_used = 1;
}
if( data->st ) {
CompFlags.st_switch_used = 1;
}
if( data->zc ) {
CompFlags.strings_in_code_segment = 1;
CompFlags.zc_switch_used = 1;
TargetSwitches |= CONST_IN_CODE;
}
if( data->zm ) {
CompFlags.zm_switch_used = 1;
}
if( data->zmf ) {
CompFlags.zm_switch_used = 1;
CompFlags.zmf_switch_used = 1;
}
if( data->zu ) {
CompFlags.zu_switch_used = 1;
TargetSwitches |= FLOATING_SS;
}
if( data->zx ) {
CompFlags.zx_switch_used = 1;
}
if( data->zt ) {
DataThreshold = data->zt_value;
}
#if _CPU == 386
if( data->vcap ) {
CompFlags.vc_alloca_parm = 1;
}
if( data->br ) {
CompFlags.br_switch_used = 1;
}
if( data->ez ) {
TargetSwitches |= EZ_OMF;
}
if( data->etp ) {
TargetSwitches |= NEW_P5_PROFILING;
}
if( data->esp ) {
TargetSwitches |= STATEMENT_COUNTING;
}
if( data->et ) {
TargetSwitches |= P5_PROFILING;
}
if( data->et0 ) {
TargetSwitches |= P5_PROFILING | P5_PROFILING_CTR0;
}
if( data->xgv ) {
TargetSwitches |= INDEXED_GLOBALS;
}
if( data->zo ) {
CompFlags.zo_switch_used = 1;
}
if( data->zz ) {
CompFlags.use_stdcall_at_number = 0;
}
#else
if( data->xgls ) {
TargetSwitches |= NULL_SELECTOR_BAD;
}
#endif
if( data->iso == OPT_iso_za ) {
TargetSwitches &= ~I_MATH_INLINE;
}
switch( data->intel_call_conv ) {
#if ( _CPU == 8086 ) || ( _CPU == 386 )
case OPT_intel_call_conv_ecc:
DftCallConv = &CdeclInfo;
break;
case OPT_intel_call_conv_ecd:
DftCallConv = &StdcallInfo;
break;
case OPT_intel_call_conv_ecf:
DftCallConv = &FastcallInfo;
break;
#ifndef NDEBUG
case OPT_intel_call_conv_eco:
DftCallConv = &OptlinkInfo;
break;
#endif
case OPT_intel_call_conv_ecp:
DftCallConv = &PascalInfo;
break;
case OPT_intel_call_conv_ecr:
DftCallConv = &SyscallInfo;
break;
case OPT_intel_call_conv_ecs:
DftCallConv = &FortranInfo;
break;
case OPT_intel_call_conv_ecw:
#endif
case OPT_intel_call_conv_default:
default:
DftCallConv = &WatcallInfo;
break;
}
// frees 'target_name' memory
setFinalTargetSystem( data, target_name );
miscAnalysis( data );
defineFSRegistration();
macroDefs();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?