/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Copyright (c) 1989-1999 Microsoft Corporation Module Name: fldattr.hxx Abstract: types for semantic analysis Notes: Author: GregJen Sep-24-1993 Created. Notes: ----------------------------------------------------------------------------*/ #ifndef __FLDATTR_HXX__ #define __FLDATTR_HXX__ /**************************************************************************** * include files ***************************************************************************/ #include "listhndl.hxx" #include "midlnode.hxx" #include "attrlist.hxx" #include "nodeskl.hxx" #include "optprop.hxx" #include "cmdana.hxx" /**************************************************************************** * local data ***************************************************************************/ /**************************************************************************** * externs ***************************************************************************/ /**************************************************************************** * definitions ***************************************************************************/ class node_interface; class type_node_list; class ATTRLIST; class SEM_ANALYSIS_CTXT; // // // class FIELD_ATTR_INFO // // describes the collection of field attributes on a node // #define STR_NO_STRING 0x00 #define STR_STRING 0x01 #define STR_BSTRING 0x02 #define FA_NONE 0x00 #define FA_CONFORMANT 0x01 #define FA_VARYING 0x02 #define FA_CONFORMANT_VARYING (FA_CONFORMANT | FA_VARYING) #define FA_STRING 0x04 #define FA_CONFORMANT_STRING (FA_STRING | FA_CONFORMANT) #define FA_INTERFACE 0x08 // control flags #define FA_PTR_STYLE 0x00 #define FA_ARRAY_STYLE 0x01 #define FA_STYLE_MASK 0x01 #define FA_CHILD_IS_ARRAY_OR_PTR 0x02 class FIELD_ATTR_INFO { public: expr_node * pSizeIsExpr; expr_node * pMinIsExpr; expr_node * pMaxIsExpr; expr_node * pLengthIsExpr; expr_node * pFirstIsExpr; expr_node * pIIDIsExpr; expr_node * pLastIsExpr; unsigned char StringKind; unsigned char Kind; unsigned char Control; FIELD_ATTR_INFO() { Control = 0; pSizeIsExpr = pMinIsExpr = pMaxIsExpr = pLengthIsExpr = pIIDIsExpr = pFirstIsExpr = pLastIsExpr = NULL; StringKind = STR_NO_STRING; Kind = FA_NONE; } FIELD_ATTR_INFO( expr_node * pSizeExpr, expr_node * pMinExpr = NULL, expr_node * pMaxExpr = NULL, expr_node * pLengthExpr = NULL, expr_node * pFirstExpr = NULL, expr_node * pLastExpr = NULL, expr_node * pIIDExpr = NULL ) { Control = 0; pSizeIsExpr = pSizeExpr; pMinIsExpr = pMinExpr; pMaxIsExpr = pMaxExpr; pLengthIsExpr = pLengthExpr; pIIDIsExpr = pIIDExpr; pFirstIsExpr = pFirstExpr; pLastIsExpr = pLastExpr; StringKind = STR_NO_STRING; Kind = FA_NONE; } void SetControl( BOOL PtrStyle, BOOL ChildFA ) { Control = ( unsigned char ) ( (PtrStyle) ? FA_PTR_STYLE : FA_ARRAY_STYLE ); Control |= (ChildFA) ? FA_CHILD_IS_ARRAY_OR_PTR : 0; } // normalize all the attributes into canonical forms for backend: // sizing -> min & size // lengthing -> first & length void Normalize(); void Normalize( expr_node * pLower, expr_node * pUpper ); // validate the bunch of attributes: check combinations, ranges, // and expressions void Validate( SEM_ANALYSIS_CTXT * pCtxt ); void Validate( SEM_ANALYSIS_CTXT * pCtxt, expr_node * pLower, expr_node * pUpper ); bool VerifyOnlySimpleExpression(); // // get and set methods // void SetSizeIs( expr_node * pE ) { pSizeIsExpr = pE; Kind |= FA_CONFORMANT; } void SetMinIs( expr_node * pE ) { pMinIsExpr = pE; Kind |= FA_CONFORMANT; } void SetMaxIs( expr_node * pE ) { pMaxIsExpr = pE; Kind |= FA_CONFORMANT; } void SetLengthIs( expr_node * pE ) { pLengthIsExpr = pE; Kind |= FA_VARYING; } void SetFirstIs( expr_node * pE ) { pFirstIsExpr = pE; Kind |= FA_VARYING; } void SetLastIs( expr_node * pE ) { pLastIsExpr = pE; Kind |= FA_VARYING; } void SetIIDIs( expr_node * pE ) { pIIDIsExpr = pE; Kind |= FA_INTERFACE; } void SetString() { StringKind = STR_STRING; Kind |= FA_STRING; } void SetBString() { StringKind = STR_BSTRING; Kind |= FA_STRING; } BOOL SetExpressionVariableUsage( SIZE_LENGTH_USAGE usage ); BOOL SetExpressionVariableUsage( expr_node *pExpr, SIZE_LENGTH_USAGE usage ); }; class CG_NDR; class XLAT_SIZE_INFO { private: unsigned short MemAlign; unsigned short WireAlign; unsigned long MemSize; unsigned long WireSize; unsigned long MemOffset; unsigned long WireOffset; unsigned short ZeePee; BOOL MustAlign; public: XLAT_SIZE_INFO() { MemAlign = 1; MemSize = 0; MemOffset = 0; WireAlign = 1; WireSize = 0; WireOffset = 0; ZeePee = pCommand->GetZeePee(); MustAlign = false; } XLAT_SIZE_INFO( unsigned short MA, unsigned short WA, unsigned long MS = 0, unsigned long WS = 0, unsigned short ZP = 8, unsigned long MO = 0, unsigned long WO = 0 ) { ZeePee = pCommand->GetZeePee(); MemAlign = MA; WireAlign = WA; MemSize = MS; WireSize = WS; MemOffset = 0; WireOffset = 0; MustAlign = false; // get rid of unreferenced formal parameter warning WO, MO, ZP; } XLAT_SIZE_INFO( XLAT_SIZE_INFO * pCtxt ) { MemAlign = 1; MemSize = 0; MemOffset = 0; WireAlign = 1; WireSize = 0; WireOffset = 0; ZeePee = pCtxt->ZeePee; MustAlign = false; } XLAT_SIZE_INFO( CG_NDR * pCG ); unsigned short & GetMemAlign() { return MemAlign; } unsigned long & GetMemSize() { return MemSize; } unsigned long & GetMemOffset() { return MemOffset; } unsigned short & GetWireAlign() { return WireAlign; } unsigned long & GetWireSize() { return WireSize; } unsigned long & GetWireOffset() { return WireOffset; } unsigned short & GetZeePee() { return ZeePee; } BOOL & GetMustAlign() { return MustAlign; } BOOL SameOffsets() { return ( MemOffset == WireOffset ); } // // size etc calculation routines // void ReturnSize( XLAT_SIZE_INFO & pCtxt ); void ReturnConfSize( XLAT_SIZE_INFO & pCtxt ); void ReturnUnionSize( XLAT_SIZE_INFO & pCtxt ); void BaseTypeSizes( node_skl * pNode ); void EnumTypeSizes( node_skl * pNode, BOOL Enum32 ); void ContextHandleSizes( node_skl * pNode ); void ArraySize( node_skl * pNode, FIELD_ATTR_INFO * pFA ); void GetOffset( XLAT_SIZE_INFO & pInfo ); void AlignOffset(); void AlignConfOffset(); void AlignEmbeddedUnion(); void AdjustForZP(); void AdjustSize(); void AdjustConfSize(); void AdjustTotalSize(); void Ndr64AdjustTotalStructSize(); void FixMemSizes( node_skl * pNode ); void IgnoredPtrSizes(); void ReturnOffset( XLAT_SIZE_INFO & pInfo ) { GetOffset( pInfo ); } }; #endif // __FLDATTR_HXX__