⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cvinfo.h

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 H
📖 第 1 页 / 共 5 页
字号:
/***    cvinfo.h - Generic CodeView information definitions
 *
 *      Structures, constants, etc. for accessing and interpreting
 *      CodeView information.
 *
 */

#ifndef _CV_INFO_INCLUDED
#define _CV_INFO_INCLUDED


#ifndef __INLINE
#define __INLINE
#endif

#pragma pack(1)

typedef unsigned long   CV_uoff32_t;
typedef          long   CV_off32_t;
typedef unsigned short  CV_uoff16_t;
typedef          short  CV_off16_t;
typedef unsigned int  CV_typ_t;

#if !defined (CV_ZEROLEN)
#define CV_ZEROLEN 1 
#endif

#if !defined (FLOAT10)
#if defined (_M_ALPHA) ||  \
    defined (_M_MRX000) || \
    ((_MSC_VER >= 800) &&  \
     defined(_M_IX86) &&   \
     (_M_IX86 >= 300))
// above ifdef tests for 32-bit compiler and existence of long double support
typedef struct {
    char b[10];
} FLOAT10;

#else
typedef long double FLOAT10;
#endif
typedef FLOAT10 REAL10;
#endif


#define CV_SIGNATURE_C6         0L  // Actual signature is >64K
#define CV_SIGNATURE_C7         1L  // First explicit signature
#define CV_SIGNATURE_32BIT	2L  // 32 bit signature
#define CV_SIGNATURE_RESERVED   3L  // All signatures from 2 to 64K are reserved

#define CV_MAXOFFSET   0xffffffff

/**     CodeView Symbol and Type OMF type information is broken up into two
 *      ranges.  Type indices less than 0x1000 describe type information
 *      that is frequently used.  Type indices above 0x1000 are used to
 *      describe more complex features such as functions, arrays and
 *      structures.
 */




/**     Primitive types have predefined meaning that is encoded in the
 *      values of the various bit fields in the value.
 *
 *      A CodeView primitive type is defined as:
 *
 *      1 1
 *      1 089  7654  3  210
 *      r mode type  r  sub
 *
 *      Where
 *          mode is the pointer mode
 *          type is a type indicator
 *          sub  is a subtype enumeration
 *          r    is a reserved field
 *
 *      See Microsoft Symbol and Type OMF (Version 4.0) for more
 *      information.
 */


#define CV_MMASK        0x700   // mode mask
#define CV_TMASK        0x0f0   // type mask

#if CC_BIGINT
// can we use the reserved bit ??
#define CV_SMASK        0x008   // subtype mask
#else
#define CV_SMASK        0x007   // subtype mask
#endif

#define CV_MSHIFT       8       // primitive mode right shift count
#define CV_TSHIFT       4       // primitive type right shift count
#define CV_SSHIFT       0       // primitive subtype right shift count

// macros to extract primitive mode, type and size

#define CV_MODE(typ)    (((typ) & CV_MMASK) >> CV_MSHIFT)
#define CV_TYPE(typ)    (((typ) & CV_TMASK) >> CV_TSHIFT)
#define CV_SUBT(typ)    (((typ) & CV_SMASK) >> CV_SSHIFT)

// macros to insert new primitive mode, type and size

#define CV_NEWMODE(typ, nm)     ((CV_typ_t)(((typ) & ~CV_MMASK) | ((nm) << CV_MSHIFT)))
#define CV_NEWTYPE(typ, nt)     (((typ) & ~CV_TMASK) | ((nt) << CV_TSHIFT))
#define CV_NEWSUBT(typ, ns)     (((typ) & ~CV_SMASK) | ((ns) << CV_SSHIFT))



//     pointer mode enumeration values

typedef enum CV_prmode_e {
    CV_TM_DIRECT = 0,           // mode is not a pointer
    CV_TM_NPTR   = 1,           // mode is a near pointer
    CV_TM_FPTR   = 2,           // mode is a far pointer
    CV_TM_HPTR   = 3,           // mode is a huge pointer
    CV_TM_NPTR32 = 4,           // mode is a 32 bit near pointer
    CV_TM_FPTR32 = 5,           // mode is a 32 bit far pointer
    CV_TM_NPTR64 = 6            // mode is a 64 bit near pointer
#if CC_BIGINT
    ,
    CV_TM_NPTR128 = 7           // mode is a 128 bit near pointer
#endif
} CV_prmode_e;




//      type enumeration values


typedef enum CV_type_e {
    CV_SPECIAL      = 0x00,     // special type size values
    CV_SIGNED       = 0x01,     // signed integral size values
    CV_UNSIGNED     = 0x02,     // unsigned integral size values
    CV_BOOLEAN      = 0x03,     // Boolean size values
    CV_REAL         = 0x04,     // real number size values
    CV_COMPLEX      = 0x05,     // complex number size values
    CV_SPECIAL2     = 0x06,     // second set of special types
    CV_INT          = 0x07,     // integral (int) values
    CV_CVRESERVED   = 0x0f
} CV_type_e;




//      subtype enumeration values for CV_SPECIAL


typedef enum CV_special_e {
    CV_SP_NOTYPE    = 0x00,
    CV_SP_ABS       = 0x01,
    CV_SP_SEGMENT   = 0x02,
    CV_SP_VOID      = 0x03,
    CV_SP_CURRENCY  = 0x04,
    CV_SP_NBASICSTR = 0x05,
    CV_SP_FBASICSTR = 0x06,
    CV_SP_NOTTRANS  = 0x07
} CV_special_e;




//      subtype enumeration values for CV_SPECIAL2


typedef enum CV_special2_e {
    CV_S2_BIT       = 0x00,
    CV_S2_PASCHAR   = 0x01      // Pascal CHAR
} CV_special2_e;





//      subtype enumeration values for CV_SIGNED, CV_UNSIGNED and CV_BOOLEAN


typedef enum CV_integral_e {
    CV_IN_1BYTE     = 0x00,
    CV_IN_2BYTE     = 0x01,
    CV_IN_4BYTE     = 0x02,
    CV_IN_8BYTE     = 0x03
#if CC_BIGINT
    ,
    CV_IN_16BYTE    = 0x04
#endif
} CV_integral_e;





//      subtype enumeration values for CV_REAL and CV_COMPLEX


typedef enum CV_real_e {
    CV_RC_REAL32    = 0x00,
    CV_RC_REAL64    = 0x01,
    CV_RC_REAL80    = 0x02,
    CV_RC_REAL128   = 0x03,
    CV_RC_REAL48    = 0x04
} CV_real_e;




//      subtype enumeration values for CV_INT (really int)


typedef enum CV_int_e {
    CV_RI_CHAR      = 0x00,
    CV_RI_INT1      = 0x00,
    CV_RI_WCHAR     = 0x01,
    CV_RI_UINT1     = 0x01,
    CV_RI_INT2      = 0x02,
    CV_RI_UINT2     = 0x03,
    CV_RI_INT4      = 0x04,
    CV_RI_UINT4     = 0x05,
    CV_RI_INT8      = 0x06,
    CV_RI_UINT8     = 0x07
#if CC_BIGINT
    ,
    CV_RI_INT16     = 0x08,
    CV_RI_UINT16    = 0x09
#endif
} CV_int_e;




// macros to check the type of a primitive

#define CV_TYP_IS_DIRECT(typ)   (CV_MODE(typ) == CV_TM_DIRECT)
#define CV_TYP_IS_PTR(typ)      (CV_MODE(typ) != CV_TM_DIRECT)
#define CV_TYP_IS_NPTR(typ)     (CV_MODE(typ) == CV_TM_NPTR)
#define CV_TYP_IS_FPTR(typ)     (CV_MODE(typ) == CV_TM_FPTR)
#define CV_TYP_IS_HPTR(typ)     (CV_MODE(typ) == CV_TM_HPTR)
#define CV_TYP_IS_NPTR32(typ)   (CV_MODE(typ) == CV_TM_NPTR32)
#define CV_TYP_IS_FPTR32(typ)   (CV_MODE(typ) == CV_TM_FPTR32)

#if CC_BIGINT
#define CV_TYP_IS_SIGNED(typ)   (((CV_TYPE(typ) == CV_SIGNED)  && CV_TYP_IS_DIRECT(typ)) || \
                                    (typ == T_INT1) || \
                                    (typ == T_INT2) || \
                                    (typ == T_INT4) || \
                                    (typ == T_INT8) || \
                                    (typ == T_INT16) || \
                                    (typ == T_RCHAR))
#define CV_TYP_IS_UNSIGNED(typ) (((CV_TYPE(typ) == CV_UNSIGNED)  && CV_TYP_IS_DIRECT(typ)) || \
                                    (typ == T_UINT1) || \
                                    (typ == T_UINT2) || \
                                    (typ == T_UINT4) || \
                                    (typ == T_UINT8) || \
                                    (typ == T_UINT16))
#else
#define CV_TYP_IS_SIGNED(typ)   (((CV_TYPE(typ) == CV_SIGNED)  && CV_TYP_IS_DIRECT(typ)) || \
                                    (typ == T_INT1) || \
                                    (typ == T_INT2) || \
                                    (typ == T_INT4) || \
                                    (typ == T_INT8) || \
                                    (typ == T_RCHAR))

#define CV_TYP_IS_UNSIGNED(typ) (((CV_TYPE(typ) == CV_UNSIGNED)  && CV_TYP_IS_DIRECT(typ)) || \
                                    (typ == T_UINT1) || \
                                    (typ == T_UINT2) || \
                                    (typ == T_UINT4) || \
                                    (typ == T_UINT8))
#endif
#define CV_TYP_IS_REAL(typ)     ((CV_TYPE(typ) == CV_REAL)  && CV_TYP_IS_DIRECT(typ))

#define CV_FIRST_NONPRIM 0x1000
#define CV_IS_PRIMITIVE(typ)    ((typ) < CV_FIRST_NONPRIM)
#define CV_TYP_IS_COMPLEX(typ)  ((CV_TYPE(typ) == CV_COMPLEX)   && CV_TYP_IS_DIRECT(typ))



// selected values for type_index - for a more complete definition, see
// Microsoft Symbol and Type OMF document




//      Special Types


#define T_NOTYPE        0x0000  // uncharacterized type (no type)
#define T_ABS           0x0001  // absolute symbol
#define T_SEGMENT       0x0002  // segment type
#define T_VOID          0x0003  // void
#define T_PVOID         0x0103  // near pointer to void
#define T_PFVOID        0x0203  // far pointer to void
#define T_PHVOID        0x0303  // huge pointer to void
#define T_32PVOID       0x0403  // 16:32 near pointer to void
#define T_32PFVOID      0x0503  // 16:32 far pointer to void
#define T_CURRENCY      0x0004  // BASIC 8 byte currency value
#define T_NBASICSTR     0x0005  // Near BASIC string
#define T_FBASICSTR     0x0006  // Far BASIC string
#define T_NOTTRANS      0x0007  // type not translated by cvpack
#define T_BIT           0x0060  // bit
#define T_PASCHAR       0x0061  // Pascal CHAR



//      Character types


#define T_CHAR          0x0010  // 8 bit signed
#define T_UCHAR         0x0020  // 8 bit unsigned
#define T_PCHAR         0x0110  // near pointer to 8 bit signed
#define T_PUCHAR        0x0120  // near pointer to 8 bit unsigned
#define T_PFCHAR        0x0210  // far pointer to 8 bit signed
#define T_PFUCHAR       0x0220  // far pointer to 8 bit unsigned
#define T_PHCHAR        0x0310  // huge pointer to 8 bit signed
#define T_PHUCHAR       0x0320  // huge pointer to 8 bit unsigned
#define T_32PCHAR       0x0410  // 16:32 near pointer to 8 bit signed
#define T_32PUCHAR      0x0420  // 16:32 near pointer to 8 bit unsigned
#define T_32PFCHAR      0x0510  // 16:32 far pointer to 8 bit signed
#define T_32PFUCHAR     0x0520  // 16:32 far pointer to 8 bit unsigned




//      really a character types

#define T_RCHAR         0x0070  // really a char
#define T_PRCHAR        0x0170  // 16:16 near pointer to a real char
#define T_PFRCHAR       0x0270  // 16:16 far pointer to a real char
#define T_PHRCHAR       0x0370  // 16:16 huge pointer to a real char
#define T_32PRCHAR      0x0470  // 16:32 near pointer to a real char
#define T_32PFRCHAR     0x0570  // 16:32 far pointer to a real char




//      really a wide character types

#define T_WCHAR         0x0071  // wide char
#define T_PWCHAR        0x0171  // 16:16 near pointer to a wide char
#define T_PFWCHAR       0x0271  // 16:16 far pointer to a wide char
#define T_PHWCHAR       0x0371  // 16:16 huge pointer to a wide char
#define T_32PWCHAR      0x0471  // 16:32 near pointer to a wide char
#define T_32PFWCHAR     0x0571  // 16:32 far pointer to a wide char


//      8 bit int types


#define T_INT1          0x0068  // 8 bit signed int
#define T_UINT1         0x0069  // 8 bit unsigned int
#define T_PINT1         0x0168  // near pointer to 8 bit signed int
#define T_PUINT1        0x0169  // near pointer to 8 bit unsigned int
#define T_PFINT1        0x0268  // far pointer to 8 bit signed int
#define T_PFUINT1       0x0269  // far pointer to 8 bit unsigned int
#define T_PHINT1        0x0368  // huge pointer to 8 bit signed int
#define T_PHUINT1       0x0369  // huge pointer to 8 bit unsigned int

#define T_32PINT1       0x0468  // 16:32 near pointer to 8 bit signed int
#define T_32PUINT1      0x0469  // 16:32 near pointer to 8 bit unsigned int
#define T_32PFINT1      0x0568  // 16:32 far pointer to 8 bit signed int
#define T_32PFUINT1     0x0569  // 16:32 far pointer to 8 bit unsigned int


//      16 bit short types


#define T_SHORT         0x0011  // 16 bit signed
#define T_USHORT        0x0021  // 16 bit unsigned
#define T_PSHORT        0x0111  // near pointer to 16 bit signed
#define T_PUSHORT       0x0121  // near pointer to 16 bit unsigned
#define T_PFSHORT       0x0211  // far pointer to 16 bit signed
#define T_PFUSHORT      0x0221  // far pointer to 16 bit unsigned
#define T_PHSHORT       0x0311  // huge pointer to 16 bit signed
#define T_PHUSHORT      0x0321  // huge pointer to 16 bit unsigned

#define T_32PSHORT      0x0411  // 16:32 near pointer to 16 bit signed
#define T_32PUSHORT     0x0421  // 16:32 near pointer to 16 bit unsigned
#define T_32PFSHORT     0x0511  // 16:32 far pointer to 16 bit signed
#define T_32PFUSHORT    0x0521  // 16:32 far pointer to 16 bit unsigned




//      16 bit int types


#define T_INT2          0x0072  // 16 bit signed int
#define T_UINT2         0x0073  // 16 bit unsigned int
#define T_PINT2         0x0172  // near pointer to 16 bit signed int
#define T_PUINT2        0x0173  // near pointer to 16 bit unsigned int
#define T_PFINT2        0x0272  // far pointer to 16 bit signed int
#define T_PFUINT2       0x0273  // far pointer to 16 bit unsigned int
#define T_PHINT2        0x0372  // huge pointer to 16 bit signed int
#define T_PHUINT2       0x0373  // huge pointer to 16 bit unsigned int

#define T_32PINT2       0x0472  // 16:32 near pointer to 16 bit signed int
#define T_32PUINT2      0x0473  // 16:32 near pointer to 16 bit unsigned int
#define T_32PFINT2      0x0572  // 16:32 far pointer to 16 bit signed int
#define T_32PFUINT2     0x0573  // 16:32 far pointer to 16 bit unsigned int




//      32 bit long types


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -