callinfo.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 456 行 · 第 1/2 页
C
456 行
//NO_FLOAT_REG_RETURNS |
//NO_STRUCT_REG_RETURNS |
//ROUTINE_RETURN |
//NO_8087_RETURNS |
//SPECIAL_RETURN |
SPECIAL_STRUCT_RETURN;
FastcallInfo.parms = FastcallParms;
FastcallInfo.objname = AUX_STRALLOC( "@*" );
HW_CAsgn( FastcallInfo.returns, HW_EMPTY );
HW_CAsgn( FastcallInfo.streturn, HW_EMPTY );
HW_TurnOn( FastcallInfo.save, full_no_segs );
HW_CTurnOff( FastcallInfo.save, HW_FLTS );
HW_CTurnOff( StdcallInfo.save, HW_ABCD );
HW_CTurnOff( StdcallInfo.save, HW_ES );
#endif
/*************************************************
* _Optlink calling convention
*************************************************/
OptlinkInfo.cclass = call_type |
#ifdef PARMS_STACK_RESERVE
PARMS_STACK_RESERVE |
#endif
//REVERSE_PARMS |
CALLER_POPS |
//GENERATE_STACK_FRAME |
//NO_FLOAT_REG_RETURNS |
NO_STRUCT_REG_RETURNS |
//ROUTINE_RETURN |
//NO_8087_RETURNS |
//SPECIAL_RETURN |
SPECIAL_STRUCT_RETURN;
#if _CPU == 386
OptlinkInfo.parms = OptlinkParms;
#else
OptlinkInfo.parms = StackParms;
#endif
OptlinkInfo.objname = AUX_STRALLOC( "*" );
HW_CAsgn( OptlinkInfo.returns, HW_EMPTY );
// HW_CAsgn( OptlinkInfo.returns, HW_FLTS );
HW_CAsgn( OptlinkInfo.streturn, HW_EMPTY );
HW_TurnOn( OptlinkInfo.save, full_no_segs );
HW_CTurnOff( OptlinkInfo.save, HW_FLTS );
#if _CPU == 386
HW_CTurnOff( OptlinkInfo.save, HW_EAX );
// HW_CTurnOff( OptlinkInfo.save, HW_EBX );
HW_CTurnOff( OptlinkInfo.save, HW_ECX );
HW_CTurnOff( OptlinkInfo.save, HW_EDX );
#else
HW_CTurnOff( OptlinkInfo.save, HW_ABCD );
HW_CTurnOff( OptlinkInfo.save, HW_ES );
#endif
/*************************************************
* __syscall calling convention
*************************************************/
SyscallInfo.cclass = call_type |
//REVERSE_PARMS |
CALLER_POPS |
//GENERATE_STACK_FRAME |
//NO_FLOAT_REG_RETURNS |
NO_STRUCT_REG_RETURNS |
//ROUTINE_RETURN |
//NO_8087_RETURNS |
//SPECIAL_RETURN |
SPECIAL_STRUCT_RETURN;
SyscallInfo.parms = StackParms;
SyscallInfo.objname = AUX_STRALLOC( "*" );
HW_CAsgn( SyscallInfo.returns, HW_EMPTY );
HW_CAsgn( SyscallInfo.streturn, HW_EMPTY );
HW_TurnOn( SyscallInfo.save, full_no_segs );
HW_CTurnOff( SyscallInfo.save, HW_FLTS );
#if _CPU == 386
HW_CTurnOff( SyscallInfo.save, HW_EAX );
// HW_CTurnOff( SyscallInfo.save, HW_EBX );
HW_CTurnOff( SyscallInfo.save, HW_ECX );
HW_CTurnOff( SyscallInfo.save, HW_EDX );
#else
HW_CTurnOff( SyscallInfo.save, HW_ABCD );
HW_CTurnOff( SyscallInfo.save, HW_ES );
#endif
#if _CPU == 386
/****************************************************
* OS/2 32-bit->16-bit calling convention ( _Far16 )
****************************************************/
/* these are internal, and will never be pointed to by
* an aux_entry, so we don't have to worry about them
*/
Far16CdeclInfo = CdeclInfo;
Far16CdeclInfo.cclass |= FAR16_CALL;
Far16CdeclInfo.parms = StackParms;
Far16CdeclInfo.objname = AUX_STRALLOC( CdeclInfo.objname );
// __far16 __cdecl depends on EBX being trashed in __cdecl
// but NT 386 __cdecl preserves EBX
HW_CTurnOff( Far16CdeclInfo.save, HW_EBX );
Far16PascalInfo = PascalInfo;
Far16PascalInfo.cclass |= FAR16_CALL;
Far16PascalInfo.parms = StackParms;
Far16PascalInfo.objname = AUX_STRALLOC( PascalInfo.objname );
#endif
}
#if _CPU == 386
void SetAuxStackConventions( void )
/*********************************/
{
WatcallInfo.cclass &= ( GENERATE_STACK_FRAME | FAR );
WatcallInfo.cclass |= CALLER_POPS | NO_8087_RETURNS;
WatcallInfo.parms = metaWareParms;
HW_CTurnOff( WatcallInfo.save, HW_EAX );
HW_CTurnOff( WatcallInfo.save, HW_EDX );
HW_CTurnOff( WatcallInfo.save, HW_ECX );
HW_CTurnOff( WatcallInfo.save, HW_FLTS );
WatcallInfo.objname = AUX_STRALLOC( "*" );
}
#endif
#endif
int IsAuxParmsBuiltIn( hw_reg_set *parms )
/***************************************/
{
if( parms == DefaultParms ) {
return( TRUE );
#if _INTEL_CPU
} else if( parms == StackParms ) {
return( TRUE );
} else if( parms == FastcallParms ) {
return( TRUE );
#if _CPU == 386
} else if( parms == OptlinkParms ) {
return( TRUE );
} else if( parms == metaWareParms ) {
return( TRUE );
#endif
#endif
} else if( parms == NULL ) {
return( TRUE );
} else {
return( FALSE );
}
}
void SetAuxWatcallInfo( void )
/****************************/
{
DftCallConv = &WatcallInfo;
WatcallInfo.cclass = 0;
WatcallInfo.code = NULL;
WatcallInfo.parms = DefaultParms;
#if _CPU == 370
WatcallInfo.linkage = &DefaultLinkage;
#endif
HW_CAsgn( WatcallInfo.returns, HW_EMPTY );
HW_CAsgn( WatcallInfo.streturn, HW_EMPTY );
HW_CAsgn( WatcallInfo.save, HW_FULL );
WatcallInfo.use = 0;
WatcallInfo.objname = NULL;
}
void SetAuxDefaultInfo( void )
/****************************/
{
DefaultInfo = *DftCallConv;
if( DefaultInfo.objname != NULL ) {
DefaultInfo.objname = AUX_STRALLOC( DefaultInfo.objname );
}
}
int IsAuxInfoBuiltIn( struct aux_info *inf )
/*****************************************/
{
if( inf == &DefaultInfo )
return( TRUE );
if( inf == &WatcallInfo )
return( TRUE );
if( inf == &CdeclInfo )
return( TRUE );
if( inf == &PascalInfo )
return( TRUE );
if( inf == &FortranInfo )
return( TRUE );
if( inf == &SyscallInfo )
return( TRUE );
if( inf == &StdcallInfo )
return( TRUE );
if( inf == &FastcallInfo )
return( TRUE );
if( inf == &OptlinkInfo )
return( TRUE );
#if _CPU == 386
if( inf == &Far16PascalInfo )
return( TRUE );
if( inf == &Far16CdeclInfo )
return( TRUE );
#endif
return( FALSE );
}
/* Variables need name mangling different from functions in many cases
* (__pascal, __stdcall, etc.). Note that _System and _Optlink do not
* decorate variable names. This is required for OS/2 SOM support to work
* and useful for interoperability with IBM compilers.
* NB: WatcallInfo.objname value depends on the -3r/3s switch.
*/
char *VarNamePattern( struct aux_info *inf )
/******************************************/
{
if( inf == &DefaultInfo )
inf = DftCallConv;
if( inf == &WatcallInfo )
return( WatcallInfo.objname );
if( inf == &CdeclInfo || inf == &StdcallInfo || inf == &FastcallInfo )
return( "_*" );
if( inf == &PascalInfo || inf == &FortranInfo )
return( "^" );
if( inf == &SyscallInfo || inf == &OptlinkInfo )
return( "*" );
return( inf->objname );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?