252 lines
6 KiB
C++
252 lines
6 KiB
C++
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
Copyright (c) 1989-1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
ilbase.cxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Intermediate Language translator for base types
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
|
||
|
Author:
|
||
|
|
||
|
GregJen Dec-24-1993 Created.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
/****************************************************************************
|
||
|
* include files
|
||
|
***************************************************************************/
|
||
|
|
||
|
#include "becls.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "ilxlat.hxx"
|
||
|
#include "ilreg.hxx"
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
* local data
|
||
|
***************************************************************************/
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
* externs
|
||
|
***************************************************************************/
|
||
|
|
||
|
extern CMD_ARG * pCommand;
|
||
|
extern BOOL IsTempName( char *);
|
||
|
extern REUSE_DICT * pReUseDict;
|
||
|
|
||
|
/****************************************************************************
|
||
|
* definitions
|
||
|
***************************************************************************/
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
//
|
||
|
// node_skl::ILxlate
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
CG_CLASS *
|
||
|
node_skl::ILxlate( XLAT_CTXT* )
|
||
|
{
|
||
|
#ifdef trace_cg
|
||
|
printf("..node_skl... kind is %d\n",NodeKind() );
|
||
|
#endif
|
||
|
return 0;
|
||
|
};
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
//
|
||
|
// node_base_type::ILxlate
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
CG_CLASS *
|
||
|
node_base_type::ILxlate( XLAT_CTXT * pContext )
|
||
|
{
|
||
|
CG_NDR * pCG;
|
||
|
XLAT_CTXT MyContext(this, pContext);
|
||
|
#ifdef trace_cg
|
||
|
printf("..node_base_type,\t%s\n", GetSymName());
|
||
|
#endif
|
||
|
MyContext.BaseTypeSizes( this );
|
||
|
|
||
|
// Note that these nodes are all preallocated so the modifiers
|
||
|
// and this node can be ignored.
|
||
|
|
||
|
// process any context_handle attributes from param nodes
|
||
|
if ( pContext->ExtractAttribute( ATTR_CONTEXT ) )
|
||
|
{
|
||
|
MyContext.FixMemSizes( this );
|
||
|
pCG = new CG_CONTEXT_HANDLE (
|
||
|
this,
|
||
|
0,
|
||
|
MyContext
|
||
|
);
|
||
|
}
|
||
|
|
||
|
switch ( NodeKind() )
|
||
|
{
|
||
|
case NODE_HANDLE_T:
|
||
|
{
|
||
|
pCG = new CG_PRIMITIVE_HANDLE( this, NULL, MyContext );
|
||
|
break;
|
||
|
}
|
||
|
case NODE_INT3264:
|
||
|
{
|
||
|
if ( pCommand->Is64BitEnv() )
|
||
|
pCG = new CG_INT3264( this, MyContext );
|
||
|
else
|
||
|
pCG = new CG_BASETYPE( this, MyContext );
|
||
|
break;
|
||
|
}
|
||
|
case NODE_VOID:
|
||
|
{
|
||
|
// VOID should only occur as as a single VOID param;
|
||
|
// return NULL here, then the PARAM returns NULL as well
|
||
|
if (!pContext->AnyAncestorBits(IL_IN_LIBRARY) )
|
||
|
return NULL;
|
||
|
}
|
||
|
// this looks like a conditional fall through..
|
||
|
default:
|
||
|
{
|
||
|
|
||
|
if ( pContext->AnyAncestorBits( IL_CS_STAG | IL_CS_DRTAG | IL_CS_RTAG ) )
|
||
|
{
|
||
|
pCG = new CG_CS_TAG(
|
||
|
this,
|
||
|
MyContext,
|
||
|
pContext->AnyAncestorBits( IL_CS_STAG ),
|
||
|
pContext->AnyAncestorBits( IL_CS_DRTAG ),
|
||
|
pContext->AnyAncestorBits( IL_CS_RTAG ) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pCG = new CG_BASETYPE( this, MyContext );
|
||
|
node_range_attr* pRA = ( node_range_attr* ) pContext->ExtractAttribute( ATTR_RANGE );
|
||
|
if ( pRA != 0 && pCommand->IsSwitchDefined( SWITCH_ROBUST ) )
|
||
|
{
|
||
|
pCG->SetRangeAttribute( pRA );
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
pContext->ReturnSize( MyContext );
|
||
|
|
||
|
#ifdef trace_cg
|
||
|
printf("..node_base_type return \n");
|
||
|
#endif
|
||
|
return pCG;
|
||
|
};
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
//
|
||
|
// node_label::ILxlate
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
CG_CLASS *
|
||
|
node_label::ILxlate( XLAT_CTXT * pContext )
|
||
|
{
|
||
|
pContext->ExtractAttribute(ATTR_IDLDESCATTR);
|
||
|
pContext->ExtractAttribute(ATTR_VARDESCATTR);
|
||
|
pContext->ExtractAttribute(ATTR_ID);
|
||
|
pContext->ExtractAttribute(ATTR_HIDDEN);
|
||
|
|
||
|
#ifdef trace_cg
|
||
|
printf("..node_label,\t%s\n", GetSymName());
|
||
|
#endif
|
||
|
|
||
|
|
||
|
return NULL;
|
||
|
};
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
//
|
||
|
// node_e_status_t::ILxlate
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
CG_CLASS *
|
||
|
node_e_status_t::ILxlate( XLAT_CTXT * pContext )
|
||
|
{
|
||
|
XLAT_CTXT MyContext( this, pContext );
|
||
|
CG_ERROR_STATUS_T * pCG;
|
||
|
|
||
|
#ifdef trace_cg
|
||
|
printf("..node_e_status_t,\t%s\n", GetSymName());
|
||
|
#endif
|
||
|
|
||
|
MyContext.BaseTypeSizes( this );
|
||
|
|
||
|
// gaj - do we need to see which we used ??
|
||
|
MyContext.ExtractAttribute( ATTR_COMMSTAT );
|
||
|
MyContext.ExtractAttribute( ATTR_FAULTSTAT );
|
||
|
|
||
|
pContext->ReturnSize( MyContext );
|
||
|
|
||
|
pCG = new CG_ERROR_STATUS_T( this, MyContext );
|
||
|
return pCG;
|
||
|
};
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
//
|
||
|
// node_wchar_t::ILxlate
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
CG_CLASS *
|
||
|
node_wchar_t::ILxlate( XLAT_CTXT * pContext )
|
||
|
{
|
||
|
CG_BASETYPE * pCG;
|
||
|
XLAT_CTXT MyContext( this, pContext );
|
||
|
|
||
|
#ifdef trace_cg
|
||
|
printf("..node_wchar_t,\t%s\n", GetSymName());
|
||
|
#endif
|
||
|
|
||
|
MyContext.BaseTypeSizes( this );
|
||
|
|
||
|
pContext->ReturnSize( MyContext );
|
||
|
|
||
|
pCG = new CG_BASETYPE( this, MyContext );
|
||
|
return pCG;
|
||
|
};
|
||
|
|
||
|
|
||
|
|