windows-nt/Source/XPSP1/NT/com/rpc/midl/analysis/opinfo.hxx

241 lines
5.7 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name:
opinfo.hxx
Abstract:
This file defines the classes used to store optimisation / usage specific
information.
Notes:
The analysis phase is a middle phase executed prior to code generation.
This phase walks thru the type sub-graph which will take part in an
rpc operation in an interface. Analysis consists of:
- structural analysis
Peculiarities of a type eg its alignment properties, layout
properties etc.
- usage analysis etc.
Usage count properties, directional properties, memory allocation
properties etc.
Author:
VibhasC Jul-25-1993 Created
Notes:
----------------------------------------------------------------------------*/
#ifndef __OPINFO_HXX__
#define __OPINFO_HXX__
#if 0
Notes
-----
The optim info and its derived classes store analysed optimization
info after the analysis pass has finished. Therefore it contains the
prepared information for the code generator to use.
#endif // 0
/****************************************************************************
* include files
***************************************************************************/
#include "nulldefs.h"
extern "C"
{
#include <stdio.h>
}
#include "common.hxx"
#include "nodeskl.hxx"
#include "optprop.hxx"
/****************************************************************************
* local definitions
***************************************************************************/
/////////////////////////////////////////////////////////////////////////////
// flag to indicate if the information block is valid.
/////////////////////////////////////////////////////////////////////////////
typedef unsigned long INFO_VALID_FLAG;
////////////////////////////////////////////////////////////////////////////
// optimisation data base class.
////////////////////////////////////////////////////////////////////////////
class OPTIM_INFO
{
private:
//
// This field specifies if the optimisation / code-gen information present
// here is valid. This flag will be set by the code generator / analyser
// when it has actually done the analysis. The presence of this object
// in the types information block in the symbol table is not necessarily
// an indication that the information in it is valid. The front-end may
// actually do parts of the analysis like usage counts, but that is not
// the complete information anyway. This flag must only be set by the
// code generator.
//
INFO_VALID_FLAG fInfoValid : 1;
public:
OPTIM_INFO()
{
SetInfoValid();
}
//
// Get and set functions.
//
INFO_VALID_FLAG SetInfoValid()
{
return ( fInfoValid = 1 );
}
INFO_VALID_FLAG InvalidateInfo()
{
return ( fInfoValid = 0 );
}
BOOL IsInfoValid()
{
return (BOOL)( fInfoValid == 1 );
}
};
////////////////////////////////////////////////////////////////////////////
// optimisation / code generation information class for structure / union.
////////////////////////////////////////////////////////////////////////////
//
// This class determines the properties of a composite type node, viz a
// structure or a union node. We define this class with an eye towards
// offlining the auxillary routines if needed. The union and structure nodes
// have some properties in common, but not all. Hence this class serves as
// the base class for other specific structure / union related properties.
//
class SU_OPTIM_INFO : public OPTIM_INFO
{
private:
//
// These 2 field describes the usage property. The usage count is tracked
// upto a certain threshold of use. After that it is assumed that the
// structure is used too many times.
//
USE_COUNT InUsageCount : 4;
USE_COUNT OutUsageCount : 4;
//
// This field describes the Zp vs Ndr property. It is useful in figuring
// out if the structure needs to be marshalled field by field or a memcopy
// is sufficient.
//
ZP_VS_NDR ZpVsNdr : 2;
public:
//
// the constructor.
//
SU_OPTIM_INFO()
{
InUsageCount = 0;
OutUsageCount= 0;
ZpVsNdr = ZP_VS_NDR_UNKNOWN;
}
//
// increment the usage count
//
USE_COUNT IncrInUsage();
USE_COUNT IncrOutUsage();
ZP_VS_NDR SetZpVsNdr( ZP_VS_NDR Z )
{
return( ZpVsNdr = Z );
}
};
////////////////////////////////////////////////////////////////////////////
// optimisation / code generation information class for structures.
////////////////////////////////////////////////////////////////////////////
class STRUCT_OPTIM_INFO : public SU_OPTIM_INFO
{
private:
//
// Store the memory size and ndr (wire) size, so we dont need to calculate
// the size again.
//
unsigned long MemSize;
unsigned long NdrSize;
//
// This flag indicates that the no of pointers in this structure exceeds
// a threshold. This flag (along with other things) helps the code
// generator decide whether to generate aux routines or in-line the
// code for this structure.
//
unsigned short fTooManyPointers : 1;
//
// This structure is recommended to be marshalled out of line.
//
OOL_PROPERTY OOLProperty : 2;
//
// store the pointer characteristics of the structure.
//
PTR_CHASE PtrChase : 4;
//
// The conformance property of the structure.
//
CONFORMANCE_PROPERTY Conformance : 8;
//
// The variance property of the structure.
//
VARIANCE_PROPERTY Variance : 8;
public:
//
// The constructor.
//
STRUCT_OPTIM_INFO(
unsigned long MSize,
unsigned long NSize )
{
MemSize = MSize;
NdrSize = NSize;
}
};
#endif // __OPINFO_HXX__