home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sdktools / image / include / cvinfo.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-08  |  100.6 KB  |  3,200 lines

  1. /***    cvinfo.h - Generic CodeView information definitions
  2.  *
  3.  *      Structures, constants, etc. for accessing and interpreting
  4.  *      CodeView information.
  5.  *
  6.  */
  7.  
  8. #ifndef _CV_INFO_INCLUDED
  9. #define _CV_INFO_INCLUDED
  10.  
  11. #ifdef  __cplusplus
  12. #pragma warning ( disable: 4200 )
  13. #endif
  14.  
  15. #ifndef __INLINE
  16. #ifdef  __cplusplus
  17. #define __INLINE inline
  18. #else
  19. #define __INLINE __inline
  20. #endif
  21. #endif
  22.  
  23. #include <pshpack1.h>
  24. typedef unsigned long   CV_uoff32_t;
  25. typedef          long   CV_off32_t;
  26. typedef unsigned short  CV_uoff16_t;
  27. typedef          short  CV_off16_t;
  28. typedef unsigned short  CV_typ_t;
  29.  
  30. #if !defined (CV_ZEROLEN)
  31. #define CV_ZEROLEN
  32. #endif
  33.  
  34. #if !defined (FLOAT10)
  35. #if defined (_M_ALPHA) ||  \
  36.     defined (_M_MRX000) || \
  37.     ((_MSC_VER >= 800) &&  \
  38.      defined(_M_IX86) &&   \
  39.      (_M_IX86 >= 300))
  40. // above ifdef tests for 32-bit compiler and existence of long double support
  41. typedef struct {
  42.     char b[10];
  43. } FLOAT10;
  44.  
  45. #else
  46. typedef long double FLOAT10;
  47. #endif
  48. typedef FLOAT10 REAL10;
  49. #endif
  50.  
  51.  
  52. #define CV_SIGNATURE_C6         0L  // Actual signature is >64K
  53. #define CV_SIGNATURE_C7         1L  // First explicit signature
  54. #define CV_SIGNATURE_RESERVED   2L  // All signatures from 2 to 64K are reserved
  55.  
  56. #define CV_MAXOFFSET   0xffffffff
  57.  
  58. /**     CodeView Symbol and Type OMF type information is broken up into two
  59.  *      ranges.  Type indices less than 0x1000 describe type information
  60.  *      that is frequently used.  Type indices above 0x1000 are used to
  61.  *      describe more complex features such as functions, arrays and
  62.  *      structures.
  63.  */
  64.  
  65.  
  66.  
  67.  
  68. /**     Primitive types have predefined meaning that is encoded in the
  69.  *      values of the various bit fields in the value.
  70.  *
  71.  *      A CodeView primitive type is defined as:
  72.  *
  73.  *      1 1
  74.  *      1 089  7654  3  210
  75.  *      r mode type  r  sub
  76.  *
  77.  *      Where
  78.  *          mode is the pointer mode
  79.  *          type is a type indicator
  80.  *          sub  is a subtype enumeration
  81.  *          r    is a reserved field
  82.  *
  83.  *      See Microsoft Symbol and Type OMF (Version 4.0) for more
  84.  *      information.
  85.  */
  86.  
  87.  
  88. #define CV_MMASK        0x700   // mode mask
  89. #define CV_TMASK        0x0f0   // type mask
  90.  
  91. #if CC_BIGINT
  92. // can we use the reserved bit ??
  93. #define CV_SMASK        0x008   // subtype mask
  94. #else
  95. #define CV_SMASK        0x007   // subtype mask
  96. #endif
  97.  
  98. #define CV_MSHIFT       8       // primitive mode right shift count
  99. #define CV_TSHIFT       4       // primitive type right shift count
  100. #define CV_SSHIFT       0       // primitive subtype right shift count
  101.  
  102. // macros to extract primitive mode, type and size
  103.  
  104. #define CV_MODE(typ)    (((typ) & CV_MMASK) >> CV_MSHIFT)
  105. #define CV_TYPE(typ)    (((typ) & CV_TMASK) >> CV_TSHIFT)
  106. #define CV_SUBT(typ)    (((typ) & CV_SMASK) >> CV_SSHIFT)
  107.  
  108. // macros to insert new primitive mode, type and size
  109.  
  110. #define CV_NEWMODE(typ, nm)     ((CV_typ_t)(((typ) & ~CV_MMASK) | ((nm) << CV_MSHIFT)))
  111. #define CV_NEWTYPE(typ, nt)     (((typ) & ~CV_TMASK) | ((nt) << CV_TSHIFT))
  112. #define CV_NEWSUBT(typ, ns)     (((typ) & ~CV_SMASK) | ((ns) << CV_SSHIFT))
  113.  
  114.  
  115.  
  116. //     pointer mode enumeration values
  117.  
  118. typedef enum CV_prmode_e {
  119.     CV_TM_DIRECT = 0,           // mode is not a pointer
  120.     CV_TM_NPTR   = 1,           // mode is a near pointer
  121.     CV_TM_FPTR   = 2,           // mode is a far pointer
  122.     CV_TM_HPTR   = 3,           // mode is a huge pointer
  123.     CV_TM_NPTR32 = 4,           // mode is a 32 bit near pointer
  124.     CV_TM_FPTR32 = 5,           // mode is a 32 bit far pointer
  125.     CV_TM_NPTR64 = 6            // mode is a 64 bit near pointer
  126. #if CC_BIGINT
  127.     ,
  128.     CV_TM_NPTR128 = 7           // mode is a 128 bit near pointer
  129. #endif
  130. } CV_prmode_e;
  131.  
  132.  
  133.  
  134.  
  135. //      type enumeration values
  136.  
  137.  
  138. typedef enum CV_type_e {
  139.     CV_SPECIAL      = 0x00,     // special type size values
  140.     CV_SIGNED       = 0x01,     // signed integral size values
  141.     CV_UNSIGNED     = 0x02,     // unsigned integral size values
  142.     CV_BOOLEAN      = 0x03,     // Boolean size values
  143.     CV_REAL         = 0x04,     // real number size values
  144.     CV_COMPLEX      = 0x05,     // complex number size values
  145.     CV_SPECIAL2     = 0x06,     // second set of special types
  146.     CV_INT          = 0x07,     // integral (int) values
  147.     CV_CVRESERVED   = 0x0f
  148. } CV_type_e;
  149.  
  150.  
  151.  
  152.  
  153. //      subtype enumeration values for CV_SPECIAL
  154.  
  155.  
  156. typedef enum CV_special_e {
  157.     CV_SP_NOTYPE    = 0x00,
  158.     CV_SP_ABS       = 0x01,
  159.     CV_SP_SEGMENT   = 0x02,
  160.     CV_SP_VOID      = 0x03,
  161.     CV_SP_CURRENCY  = 0x04,
  162.     CV_SP_NBASICSTR = 0x05,
  163.     CV_SP_FBASICSTR = 0x06,
  164.     CV_SP_NOTTRANS  = 0x07
  165. } CV_special_e;
  166.  
  167.  
  168.  
  169.  
  170. //      subtype enumeration values for CV_SPECIAL2
  171.  
  172.  
  173. typedef enum CV_special2_e {
  174.     CV_S2_BIT       = 0x00,
  175.     CV_S2_PASCHAR   = 0x01      // Pascal CHAR
  176. } CV_special2_e;
  177.  
  178.  
  179.  
  180.  
  181.  
  182. //      subtype enumeration values for CV_SIGNED, CV_UNSIGNED and CV_BOOLEAN
  183.  
  184.  
  185. typedef enum CV_integral_e {
  186.     CV_IN_1BYTE     = 0x00,
  187.     CV_IN_2BYTE     = 0x01,
  188.     CV_IN_4BYTE     = 0x02,
  189.     CV_IN_8BYTE     = 0x03
  190. #if CC_BIGINT
  191.     ,
  192.     CV_IN_16BYTE    = 0x04
  193. #endif
  194. } CV_integral_e;
  195.  
  196.  
  197.  
  198.  
  199.  
  200. //      subtype enumeration values for CV_REAL and CV_COMPLEX
  201.  
  202.  
  203. typedef enum CV_real_e {
  204.     CV_RC_REAL32    = 0x00,
  205.     CV_RC_REAL64    = 0x01,
  206.     CV_RC_REAL80    = 0x02,
  207.     CV_RC_REAL128   = 0x03,
  208.     CV_RC_REAL48    = 0x04
  209. } CV_real_e;
  210.  
  211.  
  212.  
  213.  
  214. //      subtype enumeration values for CV_INT (really int)
  215.  
  216.  
  217. typedef enum CV_int_e {
  218.     CV_RI_CHAR      = 0x00,
  219.     CV_RI_INT1      = 0x00,
  220.     CV_RI_WCHAR     = 0x01,
  221.     CV_RI_UINT1     = 0x01,
  222.     CV_RI_INT2      = 0x02,
  223.     CV_RI_UINT2     = 0x03,
  224.     CV_RI_INT4      = 0x04,
  225.     CV_RI_UINT4     = 0x05,
  226.     CV_RI_INT8      = 0x06,
  227.     CV_RI_UINT8     = 0x07
  228. #if CC_BIGINT
  229.     ,
  230.     CV_RI_INT16     = 0x08,
  231.     CV_RI_UINT16    = 0x09
  232. #endif
  233. } CV_int_e;
  234.  
  235.  
  236.  
  237.  
  238. // macros to check the type of a primitive
  239.  
  240. #define CV_TYP_IS_DIRECT(typ)   (CV_MODE(typ) == CV_TM_DIRECT)
  241. #define CV_TYP_IS_PTR(typ)      (CV_MODE(typ) != CV_TM_DIRECT)
  242. #define CV_TYP_IS_NPTR(typ)     (CV_MODE(typ) == CV_TM_NPTR)
  243. #define CV_TYP_IS_FPTR(typ)     (CV_MODE(typ) == CV_TM_FPTR)
  244. #define CV_TYP_IS_HPTR(typ)     (CV_MODE(typ) == CV_TM_HPTR)
  245. #define CV_TYP_IS_NPTR32(typ)   (CV_MODE(typ) == CV_TM_NPTR32)
  246. #define CV_TYP_IS_FPTR32(typ)   (CV_MODE(typ) == CV_TM_FPTR32)
  247.  
  248. #if CC_BIGINT
  249. #define CV_TYP_IS_SIGNED(typ)   (((CV_TYPE(typ) == CV_SIGNED)  && CV_TYP_IS_DIRECT(typ)) || \
  250.                                     (typ == T_INT1) || \
  251.                                     (typ == T_INT2) || \
  252.                                     (typ == T_INT4) || \
  253.                                     (typ == T_INT8) || \
  254.                                     (typ == T_INT16) || \
  255.                                     (typ == T_RCHAR))
  256. #define CV_TYP_IS_UNSIGNED(typ) (((CV_TYPE(typ) == CV_UNSIGNED)  && CV_TYP_IS_DIRECT(typ)) || \
  257.                                     (typ == T_UINT1) || \
  258.                                     (typ == T_UINT2) || \
  259.                                     (typ == T_UINT4) || \
  260.                                     (typ == T_UINT8) || \
  261.                                     (typ == T_UINT16))
  262. #else
  263. #define CV_TYP_IS_SIGNED(typ)   (((CV_TYPE(typ) == CV_SIGNED)  && CV_TYP_IS_DIRECT(typ)) || \
  264.                                     (typ == T_INT1) || \
  265.                                     (typ == T_INT2) || \
  266.                                     (typ == T_INT4) || \
  267.                                     (typ == T_RCHAR))
  268.  
  269. #define CV_TYP_IS_UNSIGNED(typ) (((CV_TYPE(typ) == CV_UNSIGNED)  && CV_TYP_IS_DIRECT(typ)) || \
  270.                                     (typ == T_UINT1) || \
  271.                                     (typ == T_UINT2) || \
  272.                                     (typ == T_UINT4))
  273. #endif
  274. #define CV_TYP_IS_REAL(typ)     ((CV_TYPE(typ) == CV_REAL)  && CV_TYP_IS_DIRECT(typ))
  275.  
  276. #define CV_FIRST_NONPRIM 0x1000
  277. #define CV_IS_PRIMITIVE(typ)    ((typ) < CV_FIRST_NONPRIM)
  278. #define CV_TYP_IS_COMPLEX(typ)  ((CV_TYPE(typ) == CV_COMPLEX)   && CV_TYP_IS_DIRECT(typ))
  279.  
  280.  
  281.  
  282. // selected values for type_index - for a more complete definition, see
  283. // Microsoft Symbol and Type OMF document
  284.  
  285.  
  286.  
  287.  
  288. //      Special Types
  289.  
  290.  
  291. #define T_NOTYPE        0x0000  // uncharacterized type (no type)
  292. #define T_ABS           0x0001  // absolute symbol
  293. #define T_SEGMENT       0x0002  // segment type
  294. #define T_VOID          0x0003  // void
  295. #define T_PVOID         0x0103  // near pointer to void
  296. #define T_PFVOID        0x0203  // far pointer to void
  297. #define T_PHVOID        0x0303  // huge pointer to void
  298. #define T_32PVOID       0x0403  // 16:32 near pointer to void
  299. #define T_32PFVOID      0x0503  // 16:32 far pointer to void
  300. #define T_CURRENCY      0x0004  // BASIC 8 byte currency value
  301. #define T_NBASICSTR     0x0005  // Near BASIC string
  302. #define T_FBASICSTR     0x0006  // Far BASIC string
  303. #define T_NOTTRANS      0x0007  // type not translated by cvpack
  304. #define T_BIT           0x0060  // bit
  305. #define T_PASCHAR       0x0061  // Pascal CHAR
  306.  
  307.  
  308.  
  309. //      Character types
  310.  
  311.  
  312. #define T_CHAR          0x0010  // 8 bit signed
  313. #define T_UCHAR         0x0020  // 8 bit unsigned
  314. #define T_PCHAR         0x0110  // near pointer to 8 bit signed
  315. #define T_PUCHAR        0x0120  // near pointer to 8 bit unsigned
  316. #define T_PFCHAR        0x0210  // far pointer to 8 bit signed
  317. #define T_PFUCHAR       0x0220  // far pointer to 8 bit unsigned
  318. #define T_PHCHAR        0x0310  // huge pointer to 8 bit signed
  319. #define T_PHUCHAR       0x0320  // huge pointer to 8 bit unsigned
  320. #define T_32PCHAR       0x0410  // 16:32 near pointer to 8 bit signed
  321. #define T_32PUCHAR      0x0420  // 16:32 near pointer to 8 bit unsigned
  322. #define T_32PFCHAR      0x0510  // 16:32 far pointer to 8 bit signed
  323. #define T_32PFUCHAR     0x0520  // 16:32 far pointer to 8 bit unsigned
  324.  
  325.  
  326.  
  327.  
  328. //      really a character types
  329.  
  330. #define T_RCHAR         0x0070  // really a char
  331. #define T_PRCHAR        0x0170  // 16:16 near pointer to a real char
  332. #define T_PFRCHAR       0x0270  // 16:16 far pointer to a real char
  333. #define T_PHRCHAR       0x0370  // 16:16 huge pointer to a real char
  334. #define T_32PRCHAR      0x0470  // 16:32 near pointer to a real char
  335. #define T_32PFRCHAR     0x0570  // 16:32 far pointer to a real char
  336.  
  337.  
  338.  
  339.  
  340. //      really a wide character types
  341.  
  342. #define T_WCHAR         0x0071  // wide char
  343. #define T_PWCHAR        0x0171  // 16:16 near pointer to a wide char
  344. #define T_PFWCHAR       0x0271  // 16:16 far pointer to a wide char
  345. #define T_PHWCHAR       0x0371  // 16:16 huge pointer to a wide char
  346. #define T_32PWCHAR      0x0471  // 16:32 near pointer to a wide char
  347. #define T_32PFWCHAR     0x0571  // 16:32 far pointer to a wide char
  348.  
  349.  
  350. //      8 bit int types
  351.  
  352.  
  353. #define T_INT1          0x0068  // 8 bit signed int
  354. #define T_UINT1         0x0069  // 8 bit unsigned int
  355. #define T_PINT1         0x0168  // near pointer to 8 bit signed int
  356. #define T_PUINT1        0x0169  // near pointer to 8 bit unsigned int
  357. #define T_PFINT1        0x0268  // far pointer to 8 bit signed int
  358. #define T_PFUINT1       0x0269  // far pointer to 8 bit unsigned int
  359. #define T_PHINT1        0x0368  // huge pointer to 8 bit signed int
  360. #define T_PHUINT1       0x0369  // huge pointer to 8 bit unsigned int
  361.  
  362. #define T_32PINT1       0x0468  // 16:32 near pointer to 8 bit signed int
  363. #define T_32PUINT1      0x0469  // 16:32 near pointer to 8 bit unsigned int
  364. #define T_32PFINT1      0x0568  // 16:32 far pointer to 8 bit signed int
  365. #define T_32PFUINT1     0x0569  // 16:32 far pointer to 8 bit unsigned int
  366.  
  367.  
  368. //      16 bit short types
  369.  
  370.  
  371. #define T_SHORT         0x0011  // 16 bit signed
  372. #define T_USHORT        0x0021  // 16 bit unsigned
  373. #define T_PSHORT        0x0111  // near pointer to 16 bit signed
  374. #define T_PUSHORT       0x0121  // near pointer to 16 bit unsigned
  375. #define T_PFSHORT       0x0211  // far pointer to 16 bit signed
  376. #define T_PFUSHORT      0x0221  // far pointer to 16 bit unsigned
  377. #define T_PHSHORT       0x0311  // huge pointer to 16 bit signed
  378. #define T_PHUSHORT      0x0321  // huge pointer to 16 bit unsigned
  379.  
  380. #define T_32PSHORT      0x0411  // 16:32 near pointer to 16 bit signed
  381. #define T_32PUSHORT     0x0421  // 16:32 near pointer to 16 bit unsigned
  382. #define T_32PFSHORT     0x0511  // 16:32 far pointer to 16 bit signed
  383. #define T_32PFUSHORT    0x0521  // 16:32 far pointer to 16 bit unsigned
  384.  
  385.  
  386.  
  387.  
  388. //      16 bit int types
  389.  
  390.  
  391. #define T_INT2          0x0072  // 16 bit signed int
  392. #define T_UINT2         0x0073  // 16 bit unsigned int
  393. #define T_PINT2         0x0172  // near pointer to 16 bit signed int
  394. #define T_PUINT2        0x0173  // near pointer to 16 bit unsigned int
  395. #define T_PFINT2        0x0272  // far pointer to 16 bit signed int
  396. #define T_PFUINT2       0x0273  // far pointer to 16 bit unsigned int
  397. #define T_PHINT2        0x0372  // huge pointer to 16 bit signed int
  398. #define T_PHUINT2       0x0373  // huge pointer to 16 bit unsigned int
  399.  
  400. #define T_32PINT2       0x0472  // 16:32 near pointer to 16 bit signed int
  401. #define T_32PUINT2      0x0473  // 16:32 near pointer to 16 bit unsigned int
  402. #define T_32PFINT2      0x0572  // 16:32 far pointer to 16 bit signed int
  403. #define T_32PFUINT2     0x0573  // 16:32 far pointer to 16 bit unsigned int
  404.  
  405.  
  406.  
  407.  
  408. //      32 bit long types
  409.  
  410.  
  411. #define T_LONG          0x0012  // 32 bit signed
  412. #define T_ULONG         0x0022  // 32 bit unsigned
  413. #define T_PLONG         0x0112  // near pointer to 32 bit signed
  414. #define T_PULONG        0x0122  // near pointer to 32 bit unsigned
  415. #define T_PFLONG        0x0212  // far pointer to 32 bit signed
  416. #define T_PFULONG       0x0222  // far pointer to 32 bit unsigned
  417. #define T_PHLONG        0x0312  // huge pointer to 32 bit signed
  418. #define T_PHULONG       0x0322  // huge pointer to 32 bit unsigned
  419.  
  420. #define T_32PLONG       0x0412  // 16:32 near pointer to 32 bit signed
  421. #define T_32PULONG      0x0422  // 16:32 near pointer to 32 bit unsigned
  422. #define T_32PFLONG      0x0512  // 16:32 far pointer to 32 bit signed
  423. #define T_32PFULONG     0x0522  // 16:32 far pointer to 32 bit unsigned
  424.  
  425.  
  426.  
  427.  
  428. //      32 bit int types
  429.  
  430.  
  431. #define T_INT4          0x0074  // 32 bit signed int
  432. #define T_UINT4         0x0075  // 32 bit unsigned int
  433. #define T_PINT4         0x0174  // near pointer to 32 bit signed int
  434. #define T_PUINT4        0x0175  // near pointer to 32 bit unsigned int
  435. #define T_PFINT4        0x0274  // far pointer to 32 bit signed int
  436. #define T_PFUINT4       0x0275  // far pointer to 32 bit unsigned int
  437. #define T_PHINT4        0x0374  // huge pointer to 32 bit signed int
  438. #define T_PHUINT4       0x0375  // huge pointer to 32 bit unsigned int
  439.  
  440. #define T_32PINT4       0x0474  // 16:32 near pointer to 32 bit signed int
  441. #define T_32PUINT4      0x0475  // 16:32 near pointer to 32 bit unsigned int
  442. #define T_32PFINT4      0x0574  // 16:32 far pointer to 32 bit signed int
  443. #define T_32PFUINT4     0x0575  // 16:32 far pointer to 32 bit unsigned int
  444.  
  445.  
  446.  
  447.  
  448. //      64 bit quad types
  449.  
  450.  
  451. #define T_QUAD          0x0013  // 64 bit signed
  452. #define T_UQUAD         0x0023  // 64 bit unsigned
  453. #define T_PQUAD         0x0113  // near pointer to 64 bit signed
  454. #define T_PUQUAD        0x0123  // near pointer to 64 bit unsigned
  455. #define T_PFQUAD        0x0213  // far pointer to 64 bit signed
  456. #define T_PFUQUAD       0x0223  // far pointer to 64 bit unsigned
  457. #define T_PHQUAD        0x0313  // huge pointer to 64 bit signed
  458. #define T_PHUQUAD       0x0323  // huge pointer to 64 bit unsigned
  459. #define T_32PQUAD       0x0413  // 16:32 near pointer to 64 bit signed
  460. #define T_32PUQUAD      0x0423  // 16:32 near pointer to 64 bit unsigned
  461. #define T_32PFQUAD      0x0513  // 16:32 far pointer to 64 bit signed
  462. #define T_32PFUQUAD     0x0523  // 16:32 far pointer to 64 bit unsigned
  463.  
  464.  
  465.  
  466. //      64 bit int types
  467.  
  468.  
  469. #define T_INT8          0x0076  // 64 bit signed int
  470. #define T_UINT8         0x0077  // 64 bit unsigned int
  471. #define T_PINT8         0x0176  // near pointer to 64 bit signed int
  472. #define T_PUINT8        0x0177  // near pointer to 64 bit unsigned int
  473. #define T_PFINT8        0x0276  // far pointer to 64 bit signed int
  474. #define T_PFUINT8       0x0277  // far pointer to 64 bit unsigned int
  475. #define T_PHINT8        0x0376  // huge pointer to 64 bit signed int
  476. #define T_PHUINT8       0x0377  // huge pointer to 64 bit unsigned int
  477.  
  478. #define T_32PINT8       0x0476  // 16:32 near pointer to 64 bit signed int
  479. #define T_32PUINT8      0x0477  // 16:32 near pointer to 64 bit unsigned int
  480. #define T_32PFINT8      0x0576  // 16:32 far pointer to 64 bit signed int
  481. #define T_32PFUINT8     0x0577  // 16:32 far pointer to 64 bit unsigned int
  482.  
  483.  
  484. #if CC_BIGINT
  485. //      128 bit octet types
  486.  
  487.  
  488. #define T_OCT           0x0014  // 128 bit signed
  489. #define T_UOCT          0x0024  // 128 bit unsigned
  490. #define T_POCT          0x0114  // near pointer to 128 bit signed
  491. #define T_PUOCT         0x0124  // near pointer to 128 bit unsigned
  492. #define T_PFOCT         0x0214  // far pointer to 128 bit signed
  493. #define T_PFUOCT        0x0224  // far pointer to 128 bit unsigned
  494. #define T_PHOCT         0x0314  // huge pointer to 128 bit signed
  495. #define T_PHUOCT        0x0324  // huge pointer to 128 bit unsigned
  496.  
  497. #define T_32POCT        0x0414  // 16:32 near pointer to 128 bit signed
  498. #define T_32PUOCT       0x0424  // 16:32 near pointer to 128 bit unsigned
  499. #define T_32PFOCT       0x0514  // 16:32 far pointer to 128 bit signed
  500. #define T_32PFUOCT      0x0524  // 16:32 far pointer to 128 bit unsigned
  501.  
  502. //      128 bit int types
  503.  
  504.  
  505. #define T_INT16         0x0078  // 128 bit signed int
  506. #define T_UINT16        0x0079  // 128 bit unsigned int
  507. #define T_PINT16        0x0178  // near pointer to 128 bit signed int
  508. #define T_PUINT16       0x0179  // near pointer to 128 bit unsigned int
  509. #define T_PFINT16       0x0278  // far pointer to 128 bit signed int
  510. #define T_PFUINT16      0x0279  // far pointer to 128 bit unsigned int
  511. #define T_PHINT16       0x0378  // huge pointer to 128 bit signed int
  512. #define T_PHUINT16      0x0379  // huge pointer to 128 bit unsigned int
  513.  
  514. #define T_32PINT16      0x0478  // 16:32 near pointer to 128 bit signed int
  515. #define T_32PUINT16     0x0479  // 16:32 near pointer to 128 bit unsigned int
  516. #define T_32PFINT16     0x0578  // 16:32 far pointer to 128 bit signed int
  517. #define T_32PFUINT16    0x0579  // 16:32 far pointer to 128 bit unsigned int
  518.  
  519. #endif
  520.  
  521.  
  522.  
  523.  
  524. //      32 bit real types
  525.  
  526.  
  527. #define T_REAL32        0x0040  // 32 bit real
  528. #define T_PREAL32       0x0140  // near pointer to 32 bit real
  529. #define T_PFREAL32      0x0240  // far pointer to 32 bit real
  530. #define T_PHREAL32      0x0340  // huge pointer to 32 bit real
  531. #define T_32PREAL32     0x0440  // 16:32 near pointer to 32 bit real
  532. #define T_32PFREAL32    0x0540  // 16:32 far pointer to 32 bit real
  533.  
  534.  
  535.  
  536. //      48 bit real types
  537.  
  538.  
  539. #define T_REAL48        0x0044  // 48 bit real
  540. #define T_PREAL48       0x0144  // near pointer to 48 bit real
  541. #define T_PFREAL48      0x0244  // far pointer to 48 bit real
  542. #define T_PHREAL48      0x0344  // huge pointer to 48 bit real
  543. #define T_32PREAL48     0x0444  // 16:32 near pointer to 48 bit real
  544. #define T_32PFREAL48    0x0544  // 16:32 far pointer to 48 bit real
  545.  
  546.  
  547.  
  548.  
  549. //      64 bit real types
  550.  
  551.  
  552. #define T_REAL64        0x0041  // 64 bit real
  553. #define T_PREAL64       0x0141  // near pointer to 64 bit real
  554. #define T_PFREAL64      0x0241  // far pointer to 64 bit real
  555. #define T_PHREAL64      0x0341  // huge pointer to 64 bit real
  556. #define T_32PREAL64     0x0441  // 16:32 near pointer to 64 bit real
  557. #define T_32PFREAL64    0x0541  // 16:32 far pointer to 64 bit real
  558.  
  559.  
  560.  
  561.  
  562. //      80 bit real types
  563.  
  564.  
  565. #define T_REAL80        0x0042  // 80 bit real
  566. #define T_PREAL80       0x0142  // near pointer to 80 bit real
  567. #define T_PFREAL80      0x0242  // far pointer to 80 bit real
  568. #define T_PHREAL80      0x0342  // huge pointer to 80 bit real
  569. #define T_32PREAL80     0x0442  // 16:32 near pointer to 80 bit real
  570. #define T_32PFREAL80    0x0542  // 16:32 far pointer to 80 bit real
  571.  
  572.  
  573.  
  574.  
  575. //      128 bit real types
  576.  
  577.  
  578. #define T_REAL128       0x0043  // 128 bit real
  579. #define T_PREAL128      0x0143  // near pointer to 128 bit real
  580. #define T_PFREAL128     0x0243  // far pointer to 128 bit real
  581. #define T_PHREAL128     0x0343  // huge pointer to 128 bit real
  582. #define T_32PREAL128    0x0443  // 16:32 near pointer to 128 bit real
  583. #define T_32PFREAL128   0x0543  // 16:32 far pointer to 128 bit real
  584.  
  585.  
  586.  
  587.  
  588. //      32 bit complex types
  589.  
  590.  
  591. #define T_CPLX32        0x0050  // 32 bit complex
  592. #define T_PCPLX32       0x0150  // near pointer to 32 bit complex
  593. #define T_PFCPLX32      0x0250  // far pointer to 32 bit complex
  594. #define T_PHCPLX32      0x0350  // huge pointer to 32 bit complex
  595. #define T_32PCPLX32     0x0450  // 16:32 near pointer to 32 bit complex
  596. #define T_32PFCPLX32    0x0550  // 16:32 far pointer to 32 bit complex
  597.  
  598.  
  599.  
  600.  
  601. //      64 bit complex types
  602.  
  603.  
  604. #define T_CPLX64        0x0051  // 64 bit complex
  605. #define T_PCPLX64       0x0151  // near pointer to 64 bit complex
  606. #define T_PFCPLX64      0x0251  // far pointer to 64 bit complex
  607. #define T_PHCPLX64      0x0351  // huge pointer to 64 bit complex
  608. #define T_32PCPLX64     0x0451  // 16:32 near pointer to 64 bit complex
  609. #define T_32PFCPLX64    0x0551  // 16:32 far pointer to 64 bit complex
  610.  
  611.  
  612.  
  613.  
  614. //      80 bit complex types
  615.  
  616.  
  617. #define T_CPLX80        0x0052  // 80 bit complex
  618. #define T_PCPLX80       0x0152  // near pointer to 80 bit complex
  619. #define T_PFCPLX80      0x0252  // far pointer to 80 bit complex
  620. #define T_PHCPLX80      0x0352  // huge pointer to 80 bit complex
  621. #define T_32PCPLX80     0x0452  // 16:32 near pointer to 80 bit complex
  622. #define T_32PFCPLX80    0x0552  // 16:32 far pointer to 80 bit complex
  623.  
  624.  
  625.  
  626.  
  627. //      128 bit complex types
  628.  
  629.  
  630. #define T_CPLX128       0x0053  // 128 bit complex
  631. #define T_PCPLX128      0x0153  // near pointer to 128 bit complex
  632. #define T_PFCPLX128     0x0253  // far pointer to 128 bit complex
  633. #define T_PHCPLX128     0x0353  // huge pointer to 128 bit real
  634. #define T_32PCPLX128    0x0453  // 16:32 near pointer to 128 bit complex
  635. #define T_32PFCPLX128   0x0553  // 16:32 far pointer to 128 bit complex
  636.  
  637.  
  638.  
  639.  
  640. //      boolean types
  641.  
  642.  
  643. #define T_BOOL08        0x0030  // 8 bit boolean
  644. #define T_BOOL16        0x0031  // 16 bit boolean
  645. #define T_BOOL32        0x0032  // 32 bit boolean
  646. #define T_BOOL64        0x0033  // 64 bit boolean
  647. #define T_PBOOL08       0x0130  // near pointer to  8 bit boolean
  648. #define T_PBOOL16       0x0131  // near pointer to 16 bit boolean
  649. #define T_PBOOL32       0x0132  // near pointer to 32 bit boolean
  650. #define T_PBOOL64       0x0133  // near pointer to 64 bit boolean
  651. #define T_PFBOOL08      0x0230  // far pointer to  8 bit boolean
  652. #define T_PFBOOL16      0x0231  // far pointer to 16 bit boolean
  653. #define T_PFBOOL32      0x0232  // far pointer to 32 bit boolean
  654. #define T_PFBOOL64      0x0233  // far pointer to 64 bit boolean
  655. #define T_PHBOOL08      0x0330  // huge pointer to  8 bit boolean
  656. #define T_PHBOOL16      0x0331  // huge pointer to 16 bit boolean
  657. #define T_PHBOOL32      0x0332  // huge pointer to 32 bit boolean
  658. #define T_PHBOOL64      0x0333  // huge pointer to 64 bit boolean
  659.  
  660. #define T_32PBOOL08     0x0430  // 16:32 near pointer to 8 bit boolean
  661. #define T_32PFBOOL08    0x0530  // 16:32 far pointer to 8 bit boolean
  662. #define T_32PBOOL16     0x0431  // 16:32 near pointer to 18 bit boolean
  663. #define T_32PFBOOL16    0x0531  // 16:32 far pointer to 16 bit boolean
  664. #define T_32PBOOL32     0x0432  // 16:32 near pointer to 32 bit boolean
  665. #define T_32PFBOOL32    0x0532  // 16:32 far pointer to 32 bit boolean
  666. #define T_32PBOOL64     0x0433  // 16:32 near pointer to 64 bit boolean
  667. #define T_32PFBOOL64    0x0533  // 16:32 far pointer to 64 bit boolean
  668.  
  669.  
  670. #define T_NCVPTR        0x01f0  // CV Internal type for created near pointers
  671. #define T_FCVPTR        0x02f0  // CV Internal type for created far pointers
  672. #define T_HCVPTR        0x03f0  // CV Internal type for created huge pointers
  673. #define T_32NCVPTR      0x04f0  // CV Internal type for created near 32-bit pointers
  674. #define T_32FCVPTR      0x05f0  // CV Internal type for created far 32-bit pointers
  675. #define T_64NCVPTR      0x06f0  // CV Internal type for created near 64-bit pointers
  676.  
  677. #define CV_IS_INTERNAL_PTR(typ) (CV_IS_PRIMITIVE(typ) && \
  678.                                  CV_TYPE(typ) == CV_CVRESERVED && \
  679.                                  CV_TYP_IS_PTR(typ))
  680.  
  681.  
  682. /**     No leaf index can have a value of 0x0000.  The leaf indices are
  683.  *      separated into ranges depending upon the use of the type record.
  684.  *      The second range is for the type records that are directly referenced
  685.  *      in symbols. The first range is for type records that are not
  686.  *      referenced by symbols but instead are referenced by other type
  687.  *      records.  All type records must have a starting leaf index in these
  688.  *      first two ranges.  The third range of leaf indices are used to build
  689.  *      up complex lists such as the field list of a class type record.  No
  690.  *      type record can begin with one of the leaf indices. The fourth ranges
  691.  *      of type indices are used to represent numeric data in a symbol or
  692.  *      type record. These leaf indices are greater than 0x8000.  At the
  693.  *      point that type or symbol processor is expecting a numeric field, the
  694.  *      next two bytes in the type record are examined.  If the value is less
  695.  *      than 0x8000, then the two bytes contain the numeric value. If the
  696.  *      value is greater than 0x8000, then the data follows the leaf index in
  697.  *      a format specified by the leaf index. The final range of leaf indices
  698.  *      are used to force alignment of subfields within a complex type record..
  699.  */
  700.  
  701.  
  702.  
  703. // leaf indices starting records but referenced from symbol records
  704.  
  705. #define LF_MODIFIER     0x0001
  706. #define LF_POINTER      0x0002
  707. #define LF_ARRAY        0x0003
  708. #define LF_CLASS        0x0004
  709. #define LF_STRUCTURE    0x0005
  710. #define LF_UNION        0x0006
  711. #define LF_ENUM         0x0007
  712. #define LF_PROCEDURE    0x0008
  713. #define LF_MFUNCTION    0x0009
  714. #define LF_VTSHAPE      0x000a
  715. #define LF_COBOL0       0x000b
  716. #define LF_COBOL1       0x000c
  717. #define LF_BARRAY       0x000d
  718. #define LF_LABEL        0x000e
  719. #define LF_NULL         0x000f
  720. #define LF_NOTTRAN      0x0010
  721. #define LF_DIMARRAY     0x0011
  722. #define LF_VFTPATH      0x0012
  723. #define LF_PRECOMP      0x0013  // not referenced from symbol
  724. #define LF_ENDPRECOMP   0x0014  // not referenced from symbol
  725. #define LF_OEM          0x0015  // oem definable type string
  726. #define LF_TYPESERVER   0x0016  // not referenced from symbol
  727.  
  728. // leaf indices starting records but referenced only from type records
  729.  
  730. #define LF_SKIP         0x0200
  731. #define LF_ARGLIST      0x0201
  732. #define LF_DEFARG       0x0202
  733. #define LF_LIST         0x0203
  734. #define LF_FIELDLIST    0x0204
  735. #define LF_DERIVED      0x0205
  736. #define LF_BITFIELD     0x0206
  737. #define LF_METHODLIST   0x0207
  738. #define LF_DIMCONU      0x0208
  739. #define LF_DIMCONLU     0x0209
  740. #define LF_DIMVARU      0x020a
  741. #define LF_DIMVARLU     0x020b
  742. #define LF_REFSYM       0x020c
  743.  
  744. #define LF_BCLASS       0x0400
  745. #define LF_VBCLASS      0x0401
  746. #define LF_IVBCLASS     0x0402
  747. #define LF_ENUMERATE    0x0403
  748. #define LF_FRIENDFCN    0x0404
  749. #define LF_INDEX        0x0405
  750. #define LF_MEMBER       0x0406
  751. #define LF_STMEMBER     0x0407
  752. #define LF_METHOD       0x0408
  753. #define LF_NESTTYPE     0x0409
  754. #define LF_VFUNCTAB     0x040a
  755. #define LF_FRIENDCLS    0x040b
  756. #define LF_ONEMETHOD    0x040c
  757. #define LF_VFUNCOFF     0x040d
  758.  
  759. #define LF_NUMERIC      0x8000
  760. #define LF_CHAR         0x8000
  761. #define LF_SHORT        0x8001
  762. #define LF_USHORT       0x8002
  763. #define LF_LONG         0x8003
  764. #define LF_ULONG        0x8004
  765. #define LF_REAL32       0x8005
  766. #define LF_REAL64       0x8006
  767. #define LF_REAL80       0x8007
  768. #define LF_REAL128      0x8008
  769. #define LF_QUADWORD     0x8009
  770. #define LF_UQUADWORD    0x800a
  771. #define LF_REAL48       0x800b
  772. #define LF_COMPLEX32    0x800c
  773. #define LF_COMPLEX64    0x800d
  774. #define LF_COMPLEX80    0x800e
  775. #define LF_COMPLEX128   0x800f
  776. #define LF_VARSTRING    0x8010
  777.  
  778. #if CC_BIGINT
  779. #define LF_OCTWORD      0x8017
  780. #define LF_UOCTWORD     0x8018
  781. #endif
  782.  
  783. #define LF_PAD0         0xf0
  784. #define LF_PAD1         0xf1
  785. #define LF_PAD2         0xf2
  786. #define LF_PAD3         0xf3
  787. #define LF_PAD4         0xf4
  788. #define LF_PAD5         0xf5
  789. #define LF_PAD6         0xf6
  790. #define LF_PAD7         0xf7
  791. #define LF_PAD8         0xf8
  792. #define LF_PAD9         0xf9
  793. #define LF_PAD10        0xfa
  794. #define LF_PAD11        0xfb
  795. #define LF_PAD12        0xfc
  796. #define LF_PAD13        0xfd
  797. #define LF_PAD14        0xfe
  798. #define LF_PAD15        0xff
  799.  
  800. // end of leaf indices
  801.  
  802.  
  803.  
  804.  
  805. //      Type enum for pointer records
  806. //      Pointers can be one of the following types
  807.  
  808.  
  809. typedef enum CV_ptrtype_e {
  810.     CV_PTR_NEAR         = 0x00, // near pointer
  811.     CV_PTR_FAR          = 0x01, // far pointer
  812.     CV_PTR_HUGE         = 0x02, // huge pointer
  813.     CV_PTR_BASE_SEG     = 0x03, // based on segment
  814.     CV_PTR_BASE_VAL     = 0x04, // based on value of base
  815.     CV_PTR_BASE_SEGVAL  = 0x05, // based on segment value of base
  816.     CV_PTR_BASE_ADDR    = 0x06, // based on address of base
  817.     CV_PTR_BASE_SEGADDR = 0x07, // based on segment address of base
  818.     CV_PTR_BASE_TYPE    = 0x08, // based on type
  819.     CV_PTR_BASE_SELF    = 0x09, // based on self
  820.     CV_PTR_NEAR32       = 0x0a, // 16:32 near pointer
  821.     CV_PTR_FAR32        = 0x0b, // 16:32 far pointer
  822.     CV_PTR_UNUSEDPTR    = 0x0c  // first unused pointer type
  823. } CV_ptrtype_e;
  824.  
  825.  
  826.  
  827.  
  828.  
  829. //      Mode enum for pointers
  830. //      Pointers can have one of the following modes
  831.  
  832.  
  833. typedef enum CV_ptrmode_e {
  834.     CV_PTR_MODE_PTR     = 0x00, // "normal" pointer
  835.     CV_PTR_MODE_REF     = 0x01, // reference
  836.     CV_PTR_MODE_PMEM    = 0x02, // pointer to data member
  837.     CV_PTR_MODE_PMFUNC  = 0x03, // pointer to member function
  838.     CV_PTR_MODE_RESERVED= 0x04  // first unused pointer mode
  839. } CV_ptrmode_e;
  840.  
  841.  
  842.  
  843.  
  844. //      Enumeration for function call type
  845.  
  846.  
  847. typedef enum CV_call_e {
  848.     CV_CALL_NEAR_C      = 0x00, // near right to left push, caller pops stack
  849.     CV_CALL_FAR_C       = 0x01, // far right to left push, caller pops stack
  850.     CV_CALL_NEAR_PASCAL = 0x02, // near left to right push, callee pops stack
  851.     CV_CALL_FAR_PASCAL  = 0x03, // far left to right push, callee pops stack
  852.     CV_CALL_NEAR_FAST   = 0x04, // near left to right push with regs, callee pops stack
  853.     CV_CALL_FAR_FAST    = 0x05, // far left to right push with regs, callee pops stack
  854.     CV_CALL_SKIPPED     = 0x06, // skipped (unused) call index
  855.     CV_CALL_NEAR_STD    = 0x07, // near standard call
  856.     CV_CALL_FAR_STD     = 0x08, // far standard call
  857.     CV_CALL_NEAR_SYS    = 0x09, // near sys call
  858.     CV_CALL_FAR_SYS     = 0x0a, // far sys call
  859.     CV_CALL_THISCALL    = 0x0b, // this call (this passed in register)
  860.     CV_CALL_MIPSCALL    = 0x0c, // Mips call
  861.     CV_CALL_GENERIC     = 0x0d, // Generic call sequence
  862.     CV_CALL_ALPHACALL   = 0x0e, // Alpha call
  863.     CV_CALL_PPCCALL     = 0x0f, // PPC call
  864.     CV_CALL_RESERVED    = 0x10  // first unused call enumeration
  865. } CV_call_e;
  866.  
  867.  
  868.  
  869.  
  870. //      Values for the access protection of class attributes
  871.  
  872.  
  873. typedef enum CV_access_e {
  874.     CV_private   = 1,
  875.     CV_protected = 2,
  876.     CV_public    = 3
  877. } CV_access_e;
  878.  
  879.  
  880.  
  881. //      enumeration for method properties
  882.  
  883. typedef enum CV_methodprop_e {
  884.     CV_MTvanilla    = 0x00,
  885.     CV_MTvirtual    = 0x01,
  886.     CV_MTstatic     = 0x02,
  887.     CV_MTfriend     = 0x03,
  888.     CV_MTintro      = 0x04,
  889.     CV_MTpurevirt   = 0x05,
  890.     CV_MTpureintro  = 0x06
  891. } CV_methodprop_e;
  892.  
  893.  
  894.  
  895.  
  896. //      enumeration for virtual shape table entries
  897.  
  898. typedef enum CV_VTS_desc_e {
  899.     CV_VTS_near     = 0x00,
  900.     CV_VTS_far      = 0x01,
  901.     CV_VTS_thin     = 0x02,
  902.     CV_VTS_outer    = 0x03,
  903.     CV_VTS_meta     = 0x04,
  904.     CV_VTS_near32   = 0x05,
  905.     CV_VTS_far32    = 0x06,
  906.     CV_VTS_unused   = 0x07
  907. } CV_VTS_desc_e;
  908.  
  909.  
  910.  
  911.  
  912. //      enumeration for LF_LABEL address modes
  913.  
  914. typedef enum CV_LABEL_TYPE_e {
  915.     CV_LABEL_NEAR = 0,          // near return
  916.     CV_LABEL_FAR  = 4           // far return
  917. } CV_LABEL_TYPE_e;
  918.  
  919.  
  920.  
  921. //      enumeration for LF_MODIFIER values
  922.  
  923.  
  924. typedef struct CV_modifier_t {
  925.     unsigned short  MOD_const       :1;
  926.     unsigned short  MOD_volatile    :1;
  927.     unsigned short  MOD_unaligned   :1;
  928.     unsigned short  MOD_unused      :13;
  929. } CV_modifier_t;
  930.  
  931.  
  932. //      bit field structure describing class/struct/union/enum properties
  933.  
  934. typedef struct CV_prop_t {
  935.     unsigned short  packed      :1;     // true if structure is packed
  936.     unsigned short  ctor        :1;     // true if constructors or destructors present
  937.     unsigned short  ovlops      :1;     // true if overloaded operators present
  938.     unsigned short  isnested    :1;     // true if this is a nested class
  939.     unsigned short  cnested     :1;     // true if this class contains nested types
  940.     unsigned short  opassign    :1;     // true if overloaded assignment (=)
  941.     unsigned short  opcast      :1;     // true if casting methods
  942.     unsigned short  fwdref      :1;     // true if forward reference (incomplete defn)
  943.     unsigned short  scoped      :1;     // scoped definition
  944.     unsigned short  reserved    :7;
  945. } CV_prop_t;
  946.  
  947.  
  948.  
  949.  
  950. //      class field attribute
  951.  
  952. typedef struct CV_fldattr_t {
  953.     unsigned short  access      :2;     // access protection CV_access_t
  954.     unsigned short  mprop       :3;     // method properties CV_methodprop_t
  955.     unsigned short  pseudo      :1;     // compiler generated fcn and does not exist
  956.     unsigned short  noinherit   :1;     // true if class cannot be inherited
  957.     unsigned short  noconstruct :1;     // true if class cannot be constructed
  958.     unsigned short  unused      :8;     // unused
  959. } CV_fldattr_t;
  960.  
  961.  
  962.  
  963. //      Structures to access to the type records
  964.  
  965.  
  966. typedef struct TYPTYPE {
  967.     unsigned short  len;
  968.     unsigned short  leaf;
  969.     unsigned char   data[CV_ZEROLEN];
  970. } TYPTYPE;                      // general types record
  971.  
  972.  
  973. __INLINE char *NextType (char * pType) {
  974.     return (pType + ((TYPTYPE *)pType)->len + sizeof(unsigned short));
  975. }
  976.  
  977. typedef enum CV_PMEMBER {
  978.     CV_PDM16_NONVIRT        = 0x00, // 16:16 data no virtual fcn or base
  979.     CV_PDM16_VFCN           = 0x01, // 16:16 data with virtual functions
  980.     CV_PDM16_VBASE          = 0x02, // 16:16 data with virtual bases
  981.     CV_PDM32_NVVFCN         = 0x03, // 16:32 data w/wo virtual functions
  982.     CV_PDM32_VBASE          = 0x04, // 16:32 data with virtual bases
  983.  
  984.     CV_PMF16_NEARNVSA       = 0x05, // 16:16 near method nonvirtual single address point
  985.     CV_PMF16_NEARNVMA       = 0x06, // 16:16 near method nonvirtual multiple address points
  986.     CV_PMF16_NEARVBASE      = 0x07, // 16:16 near method virtual bases
  987.     CV_PMF16_FARNVSA        = 0x08, // 16:16 far method nonvirtual single address point
  988.     CV_PMF16_FARNVMA        = 0x09, // 16:16 far method nonvirtual multiple address points
  989.     CV_PMF16_FARVBASE       = 0x0a, // 16:16 far method virtual bases
  990.  
  991.     CV_PMF32_NVSA           = 0x0b, // 16:32 method nonvirtual single address point
  992.     CV_PMF32_NVMA           = 0x0c, // 16:32 method nonvirtual multiple address point
  993.     CV_PMF32_VBASE          = 0x0d  // 16:32 method virtual bases
  994. } CV_PMEMBER;
  995.  
  996.  
  997.  
  998. //      memory representation of pointer to member.  These representations are
  999. //      indexed by the enumeration above in the LF_POINTER record
  1000.  
  1001.  
  1002.  
  1003.  
  1004. //      representation of a 16:16 pointer to data for a class with no
  1005. //      virtual functions or virtual bases
  1006.  
  1007.  
  1008. struct CV_PDMR16_NONVIRT {
  1009.     CV_off16_t      mdisp;          // displacement to data (NULL = -1)
  1010. };
  1011.  
  1012.  
  1013.  
  1014.  
  1015. //      representation of a 16:16 pointer to data for a class with virtual
  1016. //      functions
  1017.  
  1018.  
  1019. struct CV_PMDR16_VFCN {
  1020.     CV_off16_t      mdisp;          // displacement to data ( NULL = 0)
  1021. };
  1022.  
  1023.  
  1024.  
  1025.  
  1026. //      representation of a 16:16 pointer to data for a class with
  1027. //      virtual bases
  1028.  
  1029.  
  1030. struct CV_PDMR16_VBASE {
  1031.     CV_off16_t      mdisp;          // displacement to data
  1032.     CV_off16_t      pdisp;          // this pointer displacement to vbptr
  1033.     CV_off16_t      vdisp;          // displacement within vbase table
  1034.                                     // NULL = (,,0xffff)
  1035. };
  1036.  
  1037.  
  1038.  
  1039.  
  1040. //      representation of a 16:32 near pointer to data for a class with
  1041. //      or without virtual functions and no virtual bases
  1042.  
  1043.  
  1044. struct CV_PDMR32_NVVFCN {
  1045.     CV_off32_t      mdisp;          // displacement to data (NULL = 0x80000000)
  1046. };
  1047.  
  1048.  
  1049.  
  1050.  
  1051. //      representation of a 16:32 near pointer to data for a class
  1052. //      with virtual bases
  1053.  
  1054.  
  1055. struct CV_PDMR32_VBASE {
  1056.     CV_off32_t      mdisp;          // displacement to data
  1057.     CV_off32_t      pdisp;          // this pointer displacement
  1058.     CV_off32_t      vdisp;          // vbase table displacement
  1059.                                     // NULL = (,,0xffffffff)
  1060. };
  1061.  
  1062.  
  1063.  
  1064.  
  1065. //      representation of a 16:16 pointer to near member function for a
  1066. //      class with no virtual functions or bases and a single address point
  1067.  
  1068.  
  1069. struct CV_PMFR16_NEARNVSA {
  1070.     CV_uoff16_t     off;            // near address of function (NULL = 0)
  1071. };
  1072.  
  1073.  
  1074.  
  1075. //      representation of a 16:16 near pointer to member functions of a
  1076. //      class with no virtual bases and multiple address points
  1077.  
  1078.  
  1079. struct CV_PMFR16_NEARNVMA {
  1080.     CV_uoff16_t     off;            // offset of function (NULL = 0,x)
  1081.     signed short    disp;
  1082. };
  1083.  
  1084.  
  1085.  
  1086.  
  1087. //      representation of a 16:16 near pointer to member function of a
  1088. //      class with virtual bases
  1089.  
  1090.  
  1091. struct CV_PMFR16_NEARVBASE {
  1092.     CV_uoff16_t     off;            // offset of function (NULL = 0,x,x,x)
  1093.     CV_off16_t      mdisp;          // displacement to data
  1094.     CV_off16_t      pdisp;          // this pointer displacement
  1095.     CV_off16_t      vdisp;          // vbase table displacement
  1096. };
  1097.  
  1098.  
  1099.  
  1100.  
  1101. //      representation of a 16:16 pointer to far member function for a
  1102. //      class with no virtual bases and a single address point
  1103.  
  1104.  
  1105. struct CV_PMFR16_FARNVSA {
  1106.     CV_uoff16_t     off;            // offset of function (NULL = 0:0)
  1107.     unsigned short  seg;            // segment of function
  1108. };
  1109.  
  1110.  
  1111.  
  1112.  
  1113. //      representation of a 16:16 far pointer to member functions of a
  1114. //      class with no virtual bases and multiple address points
  1115.  
  1116.  
  1117. struct CV_PMFR16_FARNVMA {
  1118.     CV_uoff16_t     off;            // offset of function (NULL = 0:0,x)
  1119.     unsigned short  seg;
  1120.     signed short    disp;
  1121. };
  1122.  
  1123.  
  1124.  
  1125.  
  1126. //      representation of a 16:16 far pointer to member function of a
  1127. //      class with virtual bases
  1128.  
  1129.  
  1130. struct CV_PMFR16_FARVBASE {
  1131.     CV_uoff16_t     off;            // offset of function (NULL = 0:0,x,x,x)
  1132.     unsigned short  seg;
  1133.     CV_off16_t      mdisp;          // displacement to data
  1134.     CV_off16_t      pdisp;          // this pointer displacement
  1135.     CV_off16_t      vdisp;          // vbase table displacement
  1136.  
  1137. };
  1138.  
  1139.  
  1140.  
  1141.  
  1142. //      representation of a 16:32 near pointer to member function for a
  1143. //      class with no virtual bases and a single address point
  1144.  
  1145.  
  1146. struct CV_PMFR32_NVSA {
  1147.     CV_uoff32_t      off;            // near address of function (NULL = 0L)
  1148. };
  1149.  
  1150.  
  1151.  
  1152.  
  1153. //      representation of a 16:32 near pointer to member function for a
  1154. //      class with no virtual bases and multiple address points
  1155.  
  1156.  
  1157. struct CV_PMFR32_NVMA {
  1158.     CV_uoff32_t     off;            // near address of function (NULL = 0L,x)
  1159.     CV_off32_t      disp;
  1160. };
  1161.  
  1162.  
  1163.  
  1164.  
  1165. //      representation of a 16:32 near pointer to member function for a
  1166. //      class with virtual bases
  1167.  
  1168.  
  1169. struct CV_PMFR32_VBASE {
  1170.     CV_uoff32_t     off;            // near address of function (NULL = 0L,x,x,x)
  1171.     CV_off32_t      mdisp;          // displacement to data
  1172.     CV_off32_t      pdisp;          // this pointer displacement
  1173.     CV_off32_t      vdisp;          // vbase table displacement
  1174. };
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180. //      Easy leaf - used for generic casting to reference leaf field
  1181. //      of a subfield of a complex list
  1182.  
  1183. typedef struct lfEasy {
  1184.     unsigned short  leaf;           // LF_...
  1185. } lfEasy;
  1186.  
  1187.  
  1188. /**     The following type records are basically variant records of the
  1189.  *      above structure.  The "unsigned short leaf" of the above structure and
  1190.  *      the "unsigned short leaf" of the following type definitions are the same
  1191.  *      symbol.  When the OMF record is locked via the MHOMFLock API
  1192.  *      call, the address of the "unsigned short leaf" is returned
  1193.  */
  1194.  
  1195.  
  1196. //      Type record for LF_MODIFIER
  1197.  
  1198.  
  1199. typedef struct lfModifier {
  1200.     unsigned short  leaf;           // LF_MODIFIER
  1201.     CV_modifier_t   attr;           // modifier attribute modifier_t
  1202.     CV_typ_t        type;           // modified type
  1203. } lfModifier;
  1204.  
  1205.  
  1206.  
  1207.  
  1208. //      type record for LF_POINTER
  1209.  
  1210. #ifndef __cplusplus
  1211. typedef struct lfPointer {
  1212. #endif
  1213.     struct lfPointerBody {
  1214.         unsigned short      leaf;           // LF_POINTER
  1215.         struct lfPointerAttr {
  1216.             unsigned char   ptrtype     :5; // ordinal specifying pointer type (ptrtype-t)
  1217.             unsigned char   ptrmode     :3; // ordinal specifying pointer mode (ptrmode_t)
  1218.             unsigned char   isflat32    :1; // true if 0:32 pointer
  1219.             unsigned char   isvolatile  :1; // TRUE if volatile pointer
  1220.             unsigned char   isconst     :1; // TRUE if const pointer
  1221.             unsigned char   isunaligned :1; // TRUE if unaligned pointer
  1222.             unsigned char   unused      :4;
  1223.         } attr;
  1224.         CV_typ_t    utype;                  // type index of the underlying type
  1225. #if (defined(__cplusplus) || defined(_MSC_VER)) // for C++ and MS compilers that support unnamed unions
  1226.     };
  1227. #else
  1228.     } u;
  1229. #endif
  1230. #ifdef  __cplusplus
  1231. typedef struct lfPointer : public lfPointerBody {
  1232. #endif
  1233.     union  {
  1234.         struct {
  1235.             CV_typ_t        pmclass;    // index of containing class for pointer to member
  1236.             unsigned short  pmenum;     // enumeration specifying pm format
  1237.         } pm;
  1238.         unsigned short      bseg;       // base segment if PTR_BASE_SEG
  1239.         unsigned char       Sym[1];     // copy of base symbol record (including length)
  1240.         struct  {
  1241.             CV_typ_t        index;      // type index if CV_PTR_BASE_TYPE
  1242.             unsigned char   name[1];    // name of base type
  1243.         } btype;
  1244.     } pbase;
  1245. } lfPointer;
  1246.  
  1247.  
  1248.  
  1249.  
  1250. //      type record for LF_ARRAY
  1251.  
  1252.  
  1253. typedef struct lfArray {
  1254.     unsigned short  leaf;           // LF_ARRAY
  1255.     CV_typ_t        elemtype;       // type index of element type
  1256.     CV_typ_t        idxtype;        // type index of indexing type
  1257.     unsigned char   data[CV_ZEROLEN]; // variable length data specifying
  1258.                                     // size in bytes and name
  1259. } lfArray;
  1260.  
  1261.  
  1262.  
  1263.  
  1264. //      type record for LF_CLASS, LF_STRUCTURE
  1265.  
  1266.  
  1267. typedef struct lfClass {
  1268.     unsigned short  leaf;           // LF_CLASS, LF_STRUCT
  1269.     unsigned short  count;          // count of number of elements in class
  1270.     CV_typ_t        field;          // type index of LF_FIELD descriptor list
  1271.     CV_prop_t       property;       // property attribute field (prop_t)
  1272.     CV_typ_t        derived;        // type index of derived from list if not zero
  1273.     CV_typ_t        vshape;         // type index of vshape table for this class
  1274.     unsigned char   data[CV_ZEROLEN]; // data describing length of structure in
  1275.                                     // bytes and name
  1276. } lfClass;
  1277. typedef lfClass lfStructure;
  1278.  
  1279.  
  1280.  
  1281.  
  1282. //      type record for LF_UNION
  1283.  
  1284.  
  1285. typedef struct lfUnion {
  1286.     unsigned short  leaf;           // LF_UNION
  1287.     unsigned short  count;          // count of number of elements in class
  1288.     CV_typ_t        field;          // type index of LF_FIELD descriptor list
  1289.     CV_prop_t       property;       // property attribute field
  1290.     unsigned char   data[CV_ZEROLEN]; // variable length data describing length of
  1291.                                     // structure and name
  1292. } lfUnion;
  1293.  
  1294.  
  1295.  
  1296.  
  1297. //      type record for LF_ENUM
  1298.  
  1299.  
  1300. typedef struct lfEnum {
  1301.     unsigned short  leaf;           // LF_ENUM
  1302.     unsigned short  count;          // count of number of elements in class
  1303.     CV_typ_t        utype;          // underlying type of the enum
  1304.     CV_typ_t        field;          // type index of LF_FIELD descriptor list
  1305.     CV_prop_t       property;       // property attribute field
  1306.     unsigned char   Name[1];        // length prefixed name of enum
  1307. } lfEnum;
  1308.  
  1309.  
  1310.  
  1311.  
  1312. //      Type record for LF_PROCEDURE
  1313.  
  1314.  
  1315. typedef struct lfProc {
  1316.     unsigned short  leaf;           // LF_PROCEDURE
  1317.     CV_typ_t        rvtype;         // type index of return value
  1318.     unsigned char   calltype;       // calling convention (CV_call_t)
  1319.     unsigned char   reserved;       // reserved for future use
  1320.     unsigned short  parmcount;      // number of parameters
  1321.     CV_typ_t        arglist;        // type index of argument list
  1322. } lfProc;
  1323.  
  1324.  
  1325.  
  1326. //      Type record for member function
  1327.  
  1328.  
  1329. typedef struct lfMFunc {
  1330.     unsigned short  leaf;           // LF_MFUNCTION
  1331.     CV_typ_t        rvtype;         // type index of return value
  1332.     CV_typ_t        classtype;      // type index of containing class
  1333.     CV_typ_t        thistype;       // type index of this pointer (model specific)
  1334.     unsigned char   calltype;       // calling convention (call_t)
  1335.     unsigned char   reserved;       // reserved for future use
  1336.     unsigned short  parmcount;      // number of parameters
  1337.     CV_typ_t        arglist;        // type index of argument list
  1338.     long            thisadjust;     // this adjuster (long because pad required anyway)
  1339. } lfMFunc;
  1340.  
  1341.  
  1342.  
  1343.  
  1344. //     type record for virtual function table shape
  1345.  
  1346.  
  1347. typedef struct lfVTShape {
  1348.     unsigned short  leaf;           // LF_VTSHAPE
  1349.     unsigned short  count;          // number of entries in vfunctable
  1350.     unsigned char   desc[CV_ZEROLEN]; // 4 bit (CV_VTS_desc) descriptors
  1351. } lfVTShape;
  1352.  
  1353.  
  1354.  
  1355.  
  1356. //      type record for cobol0
  1357.  
  1358.  
  1359. typedef struct lfCobol0 {
  1360.     unsigned short  leaf;           // LF_COBOL0
  1361.     CV_typ_t        type;           // parent type record index
  1362.     unsigned char   data[CV_ZEROLEN];
  1363. } lfCobol0;
  1364.  
  1365.  
  1366.  
  1367.  
  1368. //      type record for cobol1
  1369.  
  1370.  
  1371. typedef struct lfCobol1 {
  1372.     unsigned short  leaf;           // LF_COBOL1
  1373.     unsigned char   data[CV_ZEROLEN];
  1374. } lfCobol1;
  1375.  
  1376.  
  1377.  
  1378.  
  1379. //      type record for basic array
  1380.  
  1381.  
  1382. typedef struct lfBArray {
  1383.     unsigned short  leaf;           // LF_BARRAY
  1384.     CV_typ_t        utype;          // type index of underlying type
  1385. } lfBArray;
  1386.  
  1387. //      type record for assembler labels
  1388.  
  1389.  
  1390. typedef struct lfLabel {
  1391.     unsigned short  leaf;           // LF_LABEL
  1392.     unsigned short  mode;           // addressing mode of label
  1393. } lfLabel;
  1394.  
  1395.  
  1396.  
  1397. //      type record for dimensioned arrays
  1398.  
  1399.  
  1400. typedef struct lfDimArray {
  1401.     unsigned short  leaf;           // LF_DIMARRAY
  1402.     CV_typ_t        utype;          // underlying type of the array
  1403.     CV_typ_t        diminfo;        // dimension information
  1404.     char            name[1];        // length prefixed name
  1405. } lfDimArray;
  1406.  
  1407.  
  1408.  
  1409. //      type record describing path to virtual function table
  1410.  
  1411.  
  1412. typedef struct lfVFTPath {
  1413.     unsigned short  leaf;           // LF_VFTPATH
  1414.     unsigned short  count;          // count of number of bases in path
  1415.     CV_typ_t        base[1];        // bases from root to leaf
  1416. } lfVFTPath;
  1417.  
  1418.  
  1419. //      type record describing inclusion of precompiled types
  1420.  
  1421.  
  1422. typedef struct lfPreComp {
  1423.     unsigned short  leaf;           // LF_PRECOMP
  1424.     unsigned short  start;          // starting type index included
  1425.     unsigned short  count;          // number of types in inclusion
  1426.     unsigned long   signature;      // signature
  1427.     unsigned char   name[CV_ZEROLEN]; // length prefixed name of included type file
  1428. } lfPreComp;
  1429.  
  1430.  
  1431. //      type record describing end of precompiled types that can be
  1432. //      included by another file
  1433.  
  1434.  
  1435. typedef struct lfEndPreComp {
  1436.     unsigned short  leaf;           // LF_ENDPRECOMP
  1437.     unsigned long   signature;      // signature
  1438. } lfEndPreComp;
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444. //      type record for OEM definable type strings
  1445.  
  1446.  
  1447. typedef struct lfOEM {
  1448.     unsigned short  leaf;           // LF_OEM
  1449.     unsigned short  cvOEM;          // MS assigned OEM identified
  1450.     unsigned short  recOEM;         // OEM assigned type identifier
  1451.     unsigned short  count;          // count of type indices to follow
  1452.     CV_typ_t        index[CV_ZEROLEN];  // array of type indices followed
  1453.                                     // by OEM defined data
  1454. } lfOEM;
  1455.  
  1456. #define OEM_ODI                 0x0010
  1457.  
  1458. #define OEM_ODI_REC_BASELIST    0x0000
  1459.  
  1460.  
  1461. //      type record describing using of a type server
  1462.  
  1463. typedef struct lfTypeServer {
  1464.     unsigned short  leaf;           // LF_TYPESERVER
  1465.     unsigned long   signature;      // signature
  1466.     unsigned long   age;            // age of database used by this module
  1467.     unsigned char   name[CV_ZEROLEN];     // length prefixed name of PDB
  1468. } lfTypeServer;
  1469.  
  1470. //      description of type records that can be referenced from
  1471. //      type records referenced by symbols
  1472.  
  1473.  
  1474.  
  1475. //      type record for skip record
  1476.  
  1477.  
  1478. typedef struct lfSkip {
  1479.     unsigned short  leaf;           // LF_SKIP
  1480.     CV_typ_t        type;           // next valid index
  1481.     unsigned char   data[CV_ZEROLEN];     // pad data
  1482. } lfSkip;
  1483.  
  1484.  
  1485.  
  1486. //      argument list leaf
  1487.  
  1488.  
  1489. typedef struct lfArgList {
  1490.     unsigned short  leaf;           // LF_ARGLIST
  1491.     unsigned short  count;          // number of arguments
  1492.     CV_typ_t        arg[CV_ZEROLEN];  // number of arguments
  1493. } lfArgList;
  1494.  
  1495.  
  1496.  
  1497.  
  1498. //      derived class list leaf
  1499.  
  1500.  
  1501. typedef struct lfDerived {
  1502.     unsigned short  leaf;           // LF_DERIVED
  1503.     unsigned short  count;          // number of arguments
  1504.     CV_typ_t        drvdcls[CV_ZEROLEN];  // type indices of derived classes
  1505. } lfDerived;
  1506.  
  1507.  
  1508.  
  1509.  
  1510. //      leaf for default arguments
  1511.  
  1512.  
  1513. typedef struct lfDefArg {
  1514.     unsigned short  leaf;           // LF_DEFARG
  1515.     CV_typ_t        type;           // type of resulting expression
  1516.     unsigned char   expr[CV_ZEROLEN]; // length prefixed expression string
  1517. } lfDefArg;
  1518.  
  1519.  
  1520.  
  1521. //      list leaf
  1522. //      This list should no longer be used because the utilities cannot
  1523. //      verify the contents of the list without knowing what type of list
  1524. //      it is.  New specific leaf indices should be used instead.
  1525.  
  1526.  
  1527. typedef struct lfList {
  1528.     unsigned short  leaf;           // LF_LIST
  1529.     char            data[CV_ZEROLEN]; // data format specified by indexing type
  1530. } lfList;
  1531.  
  1532.  
  1533.  
  1534.  
  1535. //      field list leaf
  1536. //      This is the header leaf for a complex list of class and structure
  1537. //      subfields.
  1538.  
  1539.  
  1540. typedef struct lfFieldList {
  1541.     unsigned short  leaf;           // LF_FIELDLIST
  1542.     char            data[CV_ZEROLEN]; // field list sub lists
  1543. } lfFieldList;
  1544.  
  1545.  
  1546.  
  1547. //      type record for non-static methods and friends in overloaded method list
  1548.  
  1549. typedef struct mlMethod {
  1550.     CV_fldattr_t   attr;           // method attribute
  1551.     CV_typ_t       index;          // index to type record for procedure
  1552.     unsigned long  vbaseoff[CV_ZEROLEN];    // offset in vfunctable if intro virtual
  1553. } mlMethod;
  1554.  
  1555.  
  1556. typedef struct lfMethodList {
  1557.     unsigned short leaf;
  1558.     unsigned char  mList[CV_ZEROLEN];       // really a mlMethod type
  1559. } lfMethodList;
  1560.  
  1561.  
  1562.  
  1563. //      type record for LF_BITFIELD
  1564.  
  1565.  
  1566. typedef struct lfBitfield {
  1567.     unsigned short  leaf;           // LF_BITFIELD
  1568.     unsigned char   length;
  1569.     unsigned char   position;
  1570.     CV_typ_t        type;           // type of bitfield
  1571. } lfBitfield;
  1572.  
  1573.  
  1574.  
  1575.  
  1576. //      type record for dimensioned array with constant bounds
  1577.  
  1578.  
  1579. typedef struct lfDimCon {
  1580.     unsigned short  leaf;           // LF_DIMCONU or LF_DIMCONLU
  1581.     unsigned short  rank;           // number of dimensions
  1582.     CV_typ_t        typ;            // type of index
  1583.     unsigned char   dim[CV_ZEROLEN];  // array of dimension information with
  1584.                                     // either upper bounds or lower/upper bound
  1585. } lfDimCon;
  1586.  
  1587.  
  1588.  
  1589.  
  1590. //      type record for dimensioned array with variable bounds
  1591.  
  1592.  
  1593. typedef struct lfDimVar {
  1594.     unsigned short  leaf;           // LF_DIMVARU or LF_DIMVARLU
  1595.     unsigned short  rank;           // number of dimensions
  1596.     CV_typ_t        typ;            // type of index
  1597.     unsigned char   dim[CV_ZEROLEN];  // array of type indices for either
  1598.                                     // variable upper bound or variable
  1599.                                     // lower/upper bound.  The referenced
  1600.                                     // types must be LF_REFSYM or T_VOID
  1601. } lfDimVar;
  1602.  
  1603.  
  1604.  
  1605.  
  1606. //      type record for referenced symbol
  1607.  
  1608.  
  1609. typedef struct lfRefSym {
  1610.     unsigned short  leaf;           // LF_REFSYM
  1611.     unsigned char   Sym[1];         // copy of referenced symbol record
  1612.                                     // (including length)
  1613. } lfRefSym;
  1614.  
  1615.  
  1616.  
  1617.  
  1618.  
  1619. /**     the following are numeric leaves.  They are used to indicate the
  1620.  *      size of the following variable length data.  When the numeric
  1621.  *      data is a single byte less than 0x8000, then the data is output
  1622.  *      directly.  If the data is more the 0x8000 or is a negative value,
  1623.  *      then the data is preceeded by the proper index.
  1624.  */
  1625.  
  1626.  
  1627.  
  1628. //      signed character leaf
  1629.  
  1630. typedef struct lfChar {
  1631.     unsigned short  leaf;           // LF_CHAR
  1632.     signed char     val;            // signed 8-bit value
  1633. } lfChar;
  1634.  
  1635.  
  1636.  
  1637.  
  1638. //      signed short leaf
  1639.  
  1640. typedef struct lfShort {
  1641.     unsigned short  leaf;           // LF_SHORT
  1642.     short           val;            // signed 16-bit value
  1643. } lfShort;
  1644.  
  1645.  
  1646.  
  1647.  
  1648. //      unsigned short leaf
  1649.  
  1650. typedef struct lfUShort {
  1651.     unsigned short  leaf;           // LF_unsigned short
  1652.     unsigned short  val;            // unsigned 16-bit value
  1653. } lfUShort;
  1654.  
  1655.  
  1656.  
  1657.  
  1658. //      signed long leaf
  1659.  
  1660. typedef struct lfLong {
  1661.     unsigned short  leaf;           // LF_LONG
  1662.     long            val;            // signed 32-bit value
  1663. } lfLong;
  1664.  
  1665.  
  1666.  
  1667.  
  1668. //      unsigned long leaf
  1669.  
  1670. typedef struct lfULong {
  1671.     unsigned short  leaf;           // LF_ULONG
  1672.     unsigned long   val;            // unsigned 32-bit value
  1673. } lfULong;
  1674.  
  1675.  
  1676.  
  1677.  
  1678. //      signed quad leaf
  1679.  
  1680. typedef struct lfQuad {
  1681.     unsigned short  leaf;           // LF_QUAD
  1682.     unsigned char   val[8];         // signed 64-bit value
  1683. } lfQuad;
  1684.  
  1685.  
  1686.  
  1687.  
  1688. //      unsigned quad leaf
  1689.  
  1690. typedef struct lfUQuad {
  1691.     unsigned short  leaf;           // LF_UQUAD
  1692.     unsigned char   val[8];         // unsigned 64-bit value
  1693. } lfUQuad;
  1694.  
  1695.  
  1696. #if CC_BIGINT
  1697.  
  1698. //      signed int128 leaf
  1699.  
  1700. typedef struct lfOct {
  1701.     unsigned short  leaf;           // LF_OCT
  1702.     unsigned char   val[16];        // signed 128-bit value
  1703. } lfOct;
  1704.  
  1705. //      unsigned int128 leaf
  1706.  
  1707. typedef struct lfUOct {
  1708.     unsigned short  leaf;           // LF_UOCT
  1709.     unsigned char   val[16];        // unsigned 128-bit value
  1710. } lfUOct;
  1711.  
  1712. #endif
  1713.  
  1714.  
  1715.  
  1716. //      real 32-bit leaf
  1717.  
  1718. typedef struct lfReal32 {
  1719.     unsigned short  leaf;           // LF_REAL32
  1720.     float           val;            // 32-bit real value
  1721. } lfReal32;
  1722.  
  1723.  
  1724.  
  1725.  
  1726. //      real 48-bit leaf
  1727.  
  1728. typedef struct lfReal48 {
  1729.     unsigned short  leaf;           // LF_REAL48
  1730.     unsigned char   val[6];         // 48-bit real value
  1731. } lfReal48;
  1732.  
  1733.  
  1734.  
  1735.  
  1736. //      real 64-bit leaf
  1737.  
  1738. typedef struct lfReal64 {
  1739.     unsigned short  leaf;           // LF_REAL64
  1740.     double          val;            // 64-bit real value
  1741. } lfReal64;
  1742.  
  1743.  
  1744.  
  1745.  
  1746. //      real 80-bit leaf
  1747.  
  1748. typedef struct lfReal80 {
  1749.     unsigned short  leaf;           // LF_REAL80
  1750.     FLOAT10         val;            // real 80-bit value
  1751. } lfReal80;
  1752.  
  1753.  
  1754.  
  1755.  
  1756. //      real 128-bit leaf
  1757.  
  1758. typedef struct lfReal128 {
  1759.     unsigned short  leaf;           // LF_REAL128
  1760.     char            val[16];        // real 128-bit value
  1761. } lfReal128;
  1762.  
  1763.  
  1764.  
  1765.  
  1766. //      complex 32-bit leaf
  1767.  
  1768. typedef struct lfCmplx32 {
  1769.     unsigned short  leaf;           // LF_COMPLEX32
  1770.     float           val_real;       // real component
  1771.     float           val_imag;       // imaginary component
  1772. } lfCmplx32;
  1773.  
  1774.  
  1775.  
  1776.  
  1777. //      complex 64-bit leaf
  1778.  
  1779. typedef struct lfCmplx64 {
  1780.     unsigned short  leaf;           // LF_COMPLEX64
  1781.     double          val_real;       // real component
  1782.     double          val_imag;       // imaginary component
  1783. } flCmplx64;
  1784.  
  1785.  
  1786.  
  1787.  
  1788. //      complex 80-bit leaf
  1789.  
  1790. typedef struct lfCmplx80 {
  1791.     unsigned short  leaf;           // LF_COMPLEX80
  1792.     FLOAT10         val_real;       // real component
  1793.     FLOAT10         val_imag;       // imaginary component
  1794. } lfCmplx80;
  1795.  
  1796.  
  1797.  
  1798.  
  1799. //      complex 128-bit leaf
  1800.  
  1801. typedef struct lfCmplx128 {
  1802.     unsigned short  leaf;           // LF_COMPLEX128
  1803.     char            val_real[16];   // real component
  1804.     char            val_imag[16];   // imaginary component
  1805. } lfCmplx128;
  1806.  
  1807.  
  1808.  
  1809. //      variable length numeric field
  1810.  
  1811. typedef struct lfVarString {
  1812.     unsigned short  leaf;           // LF_VARSTRING
  1813.     unsigned short  len;            // length of value in bytes
  1814.     unsigned char   value[CV_ZEROLEN];  // value
  1815. } lfVarString;
  1816.  
  1817. //***********************************************************************
  1818.  
  1819.  
  1820. //      index leaf - contains type index of another leaf
  1821. //      a major use of this leaf is to allow the compilers to emit a
  1822. //      long complex list (LF_FIELD) in smaller pieces.
  1823.  
  1824. typedef struct lfIndex {
  1825.     unsigned short  leaf;           // LF_INDEX
  1826.     CV_typ_t        index;          // type index of referenced leaf
  1827. } lfIndex;
  1828.  
  1829.  
  1830. //      subfield record for base class field
  1831.  
  1832. typedef struct lfBClass {
  1833.     unsigned short  leaf;           // LF_BCLASS
  1834.     CV_typ_t        index;          // type index of base class
  1835.     CV_fldattr_t    attr;           // attribute
  1836.     unsigned char   offset[CV_ZEROLEN];   // variable length offset of base within class
  1837. } lfBClass;
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843. //      subfield record for direct and indirect virtual base class field
  1844.  
  1845. typedef struct lfVBClass {
  1846.     unsigned short  leaf;           // LF_VBCLASS | LV_IVBCLASS
  1847.     CV_typ_t        index;          // type index of direct virtual base class
  1848.     CV_typ_t        vbptr;          // type index of virtual base pointer
  1849.     CV_fldattr_t    attr;           // attribute
  1850.     unsigned char   vbpoff[CV_ZEROLEN];   // virtual base pointer offset from address point
  1851.                                     // followed by virtual base offset from vbtable
  1852. } lfVBClass;
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858. //      subfield record for friend class
  1859.  
  1860.  
  1861. typedef struct lfFriendCls {
  1862.     unsigned short  leaf;           // LF_FRIENDCLS
  1863.     CV_typ_t        index;          // index to type record of friend class
  1864. } lfFriendCls;
  1865.  
  1866.  
  1867.  
  1868.  
  1869.  
  1870. //      subfield record for friend function
  1871.  
  1872.  
  1873. typedef struct lfFriendFcn {
  1874.     unsigned short  leaf;           // LF_FRIENDFCN
  1875.     CV_typ_t        index;          // index to type record of friend function
  1876.     char            Name[1];        // name of friend function
  1877. } lfFriendFcn;
  1878.  
  1879.  
  1880.  
  1881. //      subfield record for non-static data members
  1882.  
  1883. typedef struct lfMember {
  1884.     unsigned short  leaf;           // LF_MEMBER
  1885.     CV_typ_t        index;          // index of type record for field
  1886.     CV_fldattr_t    attr;           // attribute mask
  1887.     unsigned char   offset[CV_ZEROLEN];   // variable length offset of field followed
  1888.                                     // by length prefixed name of field
  1889. } lfMember;
  1890.  
  1891.  
  1892.  
  1893. //      type record for static data members
  1894.  
  1895. typedef struct lfSTMember {
  1896.     unsigned short  leaf;           // LF_STMEMBER
  1897.     CV_typ_t        index;          // index of type record for field
  1898.     CV_fldattr_t    attr;           // attribute mask
  1899.     char            Name[1];        // length prefixed name of field
  1900. } lfSTMember;
  1901.  
  1902.  
  1903.  
  1904. //      subfield record for virtual function table pointer
  1905.  
  1906. typedef struct lfVFuncTab {
  1907.     unsigned short  leaf;           // LF_VFUNCTAB
  1908.     CV_typ_t        type;           // type index of pointer
  1909. } lfVFuncTab;
  1910.  
  1911.  
  1912.  
  1913. //      subfield record for virtual function table pointer with offset
  1914.  
  1915. typedef struct lfVFuncOff {
  1916.     unsigned short  leaf;           // LF_VFUNCTAB
  1917.     CV_typ_t        type;           // type index of pointer
  1918.     CV_off32_t      offset;         // offset of virtual function table pointer
  1919. } lfVFuncOff;
  1920.  
  1921.  
  1922.  
  1923. //      subfield record for overloaded method list
  1924.  
  1925.  
  1926. typedef struct lfMethod {
  1927.     unsigned short  leaf;           // LF_METHOD
  1928.     unsigned short  count;          // number of occurances of function
  1929.     CV_typ_t        mList;          // index to LF_METHODLIST record
  1930.     char            Name[1];        // length prefixed name of method
  1931. } lfMethod;
  1932.  
  1933.  
  1934.  
  1935. //      subfield record for nonoverloaded method
  1936.  
  1937.  
  1938. typedef struct lfOneMethod {
  1939.     unsigned short  leaf;           // LF_ONEMETHOD
  1940.     CV_fldattr_t    attr;           // method attribute
  1941.     CV_typ_t        index;          // index to type record for procedure
  1942.     unsigned long   vbaseoff[CV_ZEROLEN];    // offset in vfunctable if
  1943.                                     // intro virtual followed by
  1944.                                     // length prefixed name of method
  1945. } lfOneMethod;
  1946.  
  1947.  
  1948. //              subfield record for enumerate
  1949.  
  1950. typedef struct lfEnumerate {
  1951.     unsigned short  leaf;           // LF_ENUMERATE
  1952.     CV_fldattr_t    attr;           // access
  1953.     unsigned char   value[CV_ZEROLEN];  // variable length value field followed
  1954.                                         // by length prefixed name
  1955. } lfEnumerate;
  1956.  
  1957.  
  1958. //      type record for nested (scoped) type definition
  1959.  
  1960. typedef struct lfNestType {
  1961.     unsigned short  leaf;           // LF_NESTTYPE
  1962.     CV_typ_t        index;          // index of nested type definition
  1963.     unsigned char   Name[1];        // length prefixed type name
  1964. } lfNestType;
  1965.  
  1966.  
  1967. //      type record for pad leaf
  1968.  
  1969. typedef struct lfPad {
  1970.     unsigned char   leaf;
  1971. } SYM_PAD;
  1972.  
  1973.  
  1974.  
  1975. //      Symbol definitions
  1976.  
  1977. typedef enum SYM_ENUM_e {
  1978.     S_COMPILE    =  0x0001, // Compile flags symbol
  1979.     S_REGISTER   =  0x0002, // Register variable
  1980.     S_CONSTANT   =  0x0003, // constant symbol
  1981.     S_UDT        =  0x0004, // User defined type
  1982.     S_SSEARCH    =  0x0005, // Start Search
  1983.     S_END        =  0x0006, // Block, procedure, "with" or thunk end
  1984.     S_SKIP       =  0x0007, // Reserve symbol space in $$Symbols table
  1985.     S_CVRESERVE  =  0x0008, // Reserved symbol for CV internal use
  1986.     S_OBJNAME    =  0x0009, // path to object file name
  1987.     S_ENDARG     =  0x000a, // end of argument/return list
  1988.     S_COBOLUDT   =  0x000b, // special UDT for cobol that does not symbol pack
  1989.     S_MANYREG    =  0x000c, // multiple register variable
  1990.     S_RETURN     =  0x000d, // return description symbol
  1991.     S_ENTRYTHIS  =  0x000e, // description of this pointer on entry
  1992.  
  1993.     S_BPREL16    =  0x0100, // BP-relative
  1994.     S_LDATA16    =  0x0101, // Module-local symbol
  1995.     S_GDATA16    =  0x0102, // Global data symbol
  1996.     S_PUB16      =  0x0103, // a public symbol
  1997.     S_LPROC16    =  0x0104, // Local procedure start
  1998.     S_GPROC16    =  0x0105, // Global procedure start
  1999.     S_THUNK16    =  0x0106, // Thunk Start
  2000.     S_BLOCK16    =  0x0107, // block start
  2001.     S_WITH16     =  0x0108, // with start
  2002.     S_LABEL16    =  0x0109, // code label
  2003.     S_CEXMODEL16 =  0x010a, // change execution model
  2004.     S_VFTABLE16  =  0x010b, // address of virtual function table
  2005.     S_REGREL16   =  0x010c, // register relative address
  2006.  
  2007.     S_BPREL32    =  0x0200, // BP-relative
  2008.     S_LDATA32    =  0x0201, // Module-local symbol
  2009.     S_GDATA32    =  0x0202, // Global data symbol
  2010.     S_PUB32      =  0x0203, // a public symbol (CV internal reserved)
  2011.     S_LPROC32    =  0x0204, // Local procedure start
  2012.     S_GPROC32    =  0x0205, // Global procedure start
  2013.     S_THUNK32    =  0x0206, // Thunk Start
  2014.     S_BLOCK32    =  0x0207, // block start
  2015.     S_WITH32     =  0x0208, // with start
  2016.     S_LABEL32    =  0x0209, // code label
  2017.     S_CEXMODEL32 =  0x020a, // change execution model
  2018.     S_VFTABLE32  =  0x020b, // address of virtual function table
  2019.     S_REGREL32   =  0x020c, // register relative address
  2020.     S_LTHREAD32  =  0x020d, // local thread storage
  2021.     S_GTHREAD32  =  0x020e, // global thread storage
  2022.     S_SLINK32    =  0x020f, // static link for MIPS EH implementation
  2023.  
  2024.     S_LPROCMIPS  =  0x0300, // Local procedure start
  2025.     S_GPROCMIPS  =  0x0301, // Global procedure start
  2026.  
  2027.     S_PROCREF    =  0x0400, // Reference to a procedure
  2028.     S_DATAREF    =  0x0401, // Reference to data
  2029.     S_ALIGN      =  0x0402, // Used for page alignment of symbols
  2030.     S_LPROCREF   =  0x0403  // Local Reference to a procedure
  2031. } SYM_ENUM_e;
  2032.  
  2033.  
  2034.  
  2035.  
  2036. //      enum describing the compile flag source language
  2037.  
  2038.  
  2039. typedef enum CV_CFL_LANG {
  2040.     CV_CFL_C        = 0x00,
  2041.     CV_CFL_CXX      = 0x01,
  2042.     CV_CFL_FORTRAN  = 0x02,
  2043.     CV_CFL_MASM     = 0x03,
  2044.     CV_CFL_PASCAL   = 0x04,
  2045.     CV_CFL_BASIC    = 0x05,
  2046.     CV_CFL_COBOL    = 0x06
  2047. } CV_CFL_LANG;
  2048.  
  2049.  
  2050. //  enum describing target processor
  2051.  
  2052. typedef enum CV_CPU_TYPE_e {
  2053.     CV_CFL_8080         = 0x00,
  2054.     CV_CFL_8086         = 0x01,
  2055.     CV_CFL_80286        = 0x02,
  2056.     CV_CFL_80386        = 0x03,
  2057.     CV_CFL_80486        = 0x04,
  2058.     CV_CFL_PENTIUM      = 0x05,
  2059.     CV_CFL_MIPSR4000    = 0x10,
  2060.     CV_CFL_M68000       = 0x20,
  2061.     CV_CFL_M68010       = 0x21,
  2062.     CV_CFL_M68020       = 0x22,
  2063.     CV_CFL_M68030       = 0x23,
  2064.     CV_CFL_M68040       = 0x24,
  2065.     CV_CFL_ALPHA        = 0x30,
  2066.     CV_CFL_PPC601       = 0x40,
  2067.     CV_CFL_PPC603       = 0x41,
  2068.     CV_CFL_PPC604       = 0x42,
  2069.     CV_CFL_PPC620       = 0x43
  2070. } CV_CPU_TYPE_e;
  2071.  
  2072.  
  2073.  
  2074.  
  2075. //  enum describing compile flag ambiant data model
  2076.  
  2077.  
  2078. typedef enum CV_CFL_DATA {
  2079.     CV_CFL_DNEAR    = 0x00,
  2080.     CV_CFL_DFAR     = 0x01,
  2081.     CV_CFL_DHUGE    = 0x02
  2082. } CV_CFL_DATA;
  2083.  
  2084.  
  2085.  
  2086.  
  2087. //  enum describing compile flag ambiant code model
  2088.  
  2089.  
  2090. typedef enum CV_CFL_CODE_e {
  2091.     CV_CFL_CNEAR    = 0x00,
  2092.     CV_CFL_CFAR     = 0x01,
  2093.     CV_CFL_CHUGE    = 0x02
  2094. } CV_CFL_CODE_e;
  2095.  
  2096.  
  2097.  
  2098.  
  2099. //  enum describing compile flag target floating point package
  2100.  
  2101. typedef enum CV_CFL_FPKG_e {
  2102.     CV_CFL_NDP      = 0x00,
  2103.     CV_CFL_EMU      = 0x01,
  2104.     CV_CFL_ALT      = 0x02
  2105. } CV_CFL_FPKG_e;
  2106.  
  2107.  
  2108. // enum describing function return method
  2109.  
  2110.  
  2111. typedef struct CV_PROCFLAGS {
  2112.     union {
  2113.         unsigned char   bAll;
  2114.         struct {
  2115.             unsigned char CV_PFLAG_FPO  :1; // frame pointer omitted
  2116.             unsigned char CV_PFLAG_INT  :1; // interrupt return
  2117.             unsigned char CV_PFLAG_FAR  :1; // far return
  2118.             unsigned char CV_PFLAG_NEVER:1; // function does not return
  2119.             unsigned char unused        :4; //
  2120.         };
  2121.     };
  2122. } CV_PROCFLAGS;
  2123.  
  2124.  
  2125. // enum describing function data return method
  2126.  
  2127. typedef enum CV_GENERIC_STYLE_e {
  2128.     CV_GENERIC_VOID   = 0x00,       // void return type
  2129.     CV_GENERIC_REG    = 0x01,       // return data is in registers
  2130.     CV_GENERIC_ICAN   = 0x02,       // indirect caller allocated near
  2131.     CV_GENERIC_ICAF   = 0x03,       // indirect caller allocated far
  2132.     CV_GENERIC_IRAN   = 0x04,       // indirect returnee allocated near
  2133.     CV_GENERIC_IRAF   = 0x05,       // indirect returnee allocated far
  2134.     CV_GENERIC_UNUSED = 0x06        // first unused
  2135. } CV_GENERIC_STYLE_e;
  2136.  
  2137.  
  2138. typedef struct CV_GENERIC_FLAG {
  2139.     unsigned short  cstyle  :1;     // true push varargs right to left
  2140.     unsigned short  rsclean :1;     // true if returnee stack cleanup
  2141.     unsigned short  unused  :14;    // unused
  2142. } CV_GENERIC_FLAG;
  2143.  
  2144.  
  2145. typedef struct SYMTYPE {
  2146.     unsigned short  reclen;         // Record length
  2147.     unsigned short  rectyp;         // Record type
  2148.     char            data[CV_ZEROLEN];
  2149. } SYMTYPE;
  2150.  
  2151. __INLINE SYMTYPE *NextSym (SYMTYPE * pSym) {
  2152.     return (SYMTYPE *) ((char *)pSym + pSym->reclen + sizeof(unsigned short));
  2153. }
  2154.  
  2155. //              non-model specific symbol types
  2156.  
  2157.  
  2158.  
  2159. typedef struct REGSYM {
  2160.         unsigned short  reclen;         // Record length
  2161.         unsigned short  rectyp;         // S_REGISTER
  2162.         CV_typ_t                typind;         // Type index
  2163.         unsigned short  reg;            // register enumerate
  2164.         unsigned char   name[1];        // Length-prefixed name
  2165. } REGSYM;
  2166.  
  2167.  
  2168.  
  2169. typedef struct MANYREGSYM {
  2170.     unsigned short  reclen;         // Record length
  2171.     unsigned short  rectyp;         // S_MANYREG
  2172.     CV_typ_t        typind;         // Type index
  2173.     unsigned char   count;          // count of number of registers
  2174.     unsigned char   reg[1];         // count register enumerates followed by
  2175.                                     // length-prefixed name.  Registers are
  2176.                                     // most significant first.
  2177. } MANYREGSYM;
  2178.  
  2179.  
  2180.  
  2181. typedef struct CONSTSYM {
  2182.     unsigned short  reclen;         // Record length
  2183.     unsigned short  rectyp;         // S_CONSTANT
  2184.     CV_typ_t        typind;         // Type index (containing enum if enumerate)
  2185.     unsigned short  value;          // numeric leaf containing value
  2186.     unsigned char   name[CV_ZEROLEN];         // Length-prefixed name
  2187. } CONSTSYM;
  2188.  
  2189. typedef struct UDTSYM {
  2190.     unsigned short  reclen;         // Record length
  2191.     unsigned short  rectyp;         // S_UDT | S_COBOLUDT
  2192.     CV_typ_t        typind;         // Type index
  2193.     unsigned char   name[1];        // Length-prefixed name
  2194. } UDTSYM;
  2195.  
  2196. typedef struct SEARCHSYM {
  2197.     unsigned short  reclen;         // Record length
  2198.     unsigned short  rectyp;         // S_SSEARCH
  2199.     unsigned long   startsym;       // offset of the procedure
  2200.     unsigned short  seg;            // segment of symbol
  2201. } SEARCHSYM;
  2202.  
  2203. typedef struct CFLAGSYM {
  2204.     unsigned short  reclen;         // Record length
  2205.     unsigned short  rectyp;         // S_COMPILE
  2206.     unsigned char   machine;        // target processor
  2207.     struct  {
  2208.         unsigned char   language    :8; // language index
  2209.         unsigned char   pcode       :1; // true if pcode present
  2210.         unsigned char   floatprec   :2; // floating precision
  2211.         unsigned char   floatpkg    :2; // float package
  2212.         unsigned char   ambdata     :3; // ambiant data model
  2213.         unsigned char   ambcode     :3; // ambiant code model
  2214.         unsigned char   mode32      :1; // true if compiled 32 bit mode
  2215.         unsigned char   pad         :4; // reserved
  2216.     } flags;
  2217.     unsigned char   ver[1];         // Length-prefixed compiler version string
  2218. } CFLAGSYM;
  2219.  
  2220.  
  2221.  
  2222.  
  2223.  
  2224. typedef struct OBJNAMESYM {
  2225.     unsigned short  reclen;         // Record length
  2226.     unsigned short  rectyp;         // S_OBJNAME
  2227.     unsigned long   signature;      // signature
  2228.     unsigned char   name[1];        // Length-prefixed name
  2229. } OBJNAMESYM;
  2230.  
  2231.  
  2232.  
  2233.  
  2234. typedef struct ENDARGSYM {
  2235.     unsigned short  reclen;         // Record length
  2236.     unsigned short  rectyp;         // S_ENDARG
  2237. } ENDARGSYM;
  2238.  
  2239.  
  2240. typedef struct RETURNSYM {
  2241.     unsigned short  reclen;         // Record length
  2242.     unsigned short  rectyp;         // S_RETURN
  2243.     CV_GENERIC_FLAG flags;          // flags
  2244.     CV_GENERIC_STYLE_e style;       // return style
  2245.                                     // followed by return method data
  2246. } RETURNSYM;
  2247.  
  2248.  
  2249. typedef struct ENTRYTHISSYM {
  2250.     unsigned short  reclen;         // Record length
  2251.     unsigned short  rectyp;         // S_ENTRYTHIS
  2252.     unsigned char   thissym;        // symbol describing this pointer on entry
  2253. } ENTRYTHISSYM;
  2254.  
  2255.  
  2256. //  symbol types for 16:16 memory model
  2257.  
  2258.  
  2259. typedef struct BPRELSYM16 {
  2260.     unsigned short  reclen;         // Record length
  2261.     unsigned short  rectyp;         // S_BPREL16
  2262.     CV_off16_t      off;            // BP-relative offset
  2263.     CV_typ_t        typind;         // Type index
  2264.     unsigned char   name[1];        // Length-prefixed name
  2265. } BPRELSYM16;
  2266.  
  2267.  
  2268.  
  2269. typedef struct DATASYM16 {
  2270.     unsigned short  reclen;         // Record length
  2271.     unsigned short  rectyp;         // S_LDATA or S_GDATA
  2272.     CV_uoff16_t     off;            // offset of symbol
  2273.     unsigned short  seg;            // segment of symbol
  2274.     CV_typ_t        typind;         // Type index
  2275.     unsigned char   name[1];        // Length-prefixed name
  2276. } DATASYM16;
  2277. typedef DATASYM16 PUBSYM16;
  2278.  
  2279.  
  2280. typedef struct PROCSYM16 {
  2281.     unsigned short  reclen;         // Record length
  2282.     unsigned short  rectyp;         // S_GPROC16 or S_LPROC16
  2283.     unsigned long   pParent;        // pointer to the parent
  2284.     unsigned long   pEnd;           // pointer to this blocks end
  2285.     unsigned long   pNext;          // pointer to next symbol
  2286.     unsigned short  len;            // Proc length
  2287.     unsigned short  DbgStart;       // Debug start offset
  2288.     unsigned short  DbgEnd;         // Debug end offset
  2289.     CV_uoff16_t     off;            // offset of symbol
  2290.     unsigned short  seg;            // segment of symbol
  2291.     CV_typ_t        typind;         // Type index
  2292.     CV_PROCFLAGS    flags;          // Proc flags
  2293.     unsigned char   name[1];        // Length-prefixed name
  2294. } PROCSYM16;
  2295.  
  2296.  
  2297.  
  2298.  
  2299. typedef struct THUNKSYM16 {
  2300.     unsigned short  reclen;         // Record length
  2301.     unsigned short  rectyp;         // S_THUNK
  2302.     unsigned long   pParent;        // pointer to the parent
  2303.     unsigned long   pEnd;           // pointer to this blocks end
  2304.     unsigned long   pNext;          // pointer to next symbol
  2305.     CV_uoff16_t     off;            // offset of symbol
  2306.     unsigned short  seg;            // segment of symbol
  2307.     unsigned short  len;            // length of thunk
  2308.     unsigned char   ord;            // ordinal specifying type of thunk
  2309.     unsigned char   name[1];        // name of thunk
  2310.     unsigned char   variant[CV_ZEROLEN]; // variant portion of thunk
  2311. } THUNKSYM16;
  2312.  
  2313. typedef enum {
  2314.     THUNK_ORDINAL_NOTYPE,
  2315.     THUNK_ORDINAL_ADJUSTOR,
  2316.     THUNK_ORDINAL_VCALL,
  2317.     THUNK_ORDINAL_PCODE
  2318. } THUNK_ORDINAL;
  2319.  
  2320. typedef struct LABELSYM16 {
  2321.     unsigned short  reclen;         // Record length
  2322.     unsigned short  rectyp;         // S_LABEL16
  2323.     CV_uoff16_t     off;            // offset of symbol
  2324.     unsigned short  seg;            // segment of symbol
  2325.     CV_PROCFLAGS    flags;          // flags
  2326.     unsigned char   name[1];        // Length-prefixed name
  2327. } LABELSYM16;
  2328.  
  2329. typedef struct BLOCKSYM16 {
  2330.     unsigned short  reclen;         // Record length
  2331.     unsigned short  rectyp;         // S_BLOCK16
  2332.     unsigned long   pParent;        // pointer to the parent
  2333.     unsigned long   pEnd;           // pointer to this blocks end
  2334.     unsigned short  len;            // Block length
  2335.     CV_uoff16_t     off;            // offset of symbol
  2336.     unsigned short  seg;            // segment of symbol
  2337.     unsigned char   name[1];        // Length-prefixed name
  2338. } BLOCKSYM16;
  2339.  
  2340. typedef struct WITHSYM16 {
  2341.     unsigned short  reclen;         // Record length
  2342.     unsigned short  rectyp;         // S_WITH16
  2343.     unsigned long   pParent;        // pointer to the parent
  2344.     unsigned long   pEnd;           // pointer to this blocks end
  2345.     unsigned short  len;            // Block length
  2346.     CV_uoff16_t     off;            // offset of symbol
  2347.     unsigned short  seg;            // segment of symbol
  2348.     unsigned char   expr[1];        // Length-prefixed expression
  2349. } WITHSYM16;
  2350.  
  2351.  
  2352.  
  2353.  
  2354. typedef enum CEXM_MODEL_e {
  2355.     CEXM_MDL_table          = 0x00, // not executable
  2356.     CEXM_MDL_jumptable      = 0x01, // Compiler generated jump table
  2357.     CEXM_MDL_datapad        = 0x02, // Data padding for alignment
  2358.     CEXM_MDL_native         = 0x20, // native (actually not-pcode)
  2359.     CEXM_MDL_cobol          = 0x21, // cobol
  2360.     CEXM_MDL_codepad        = 0x22, // Code padding for alignment
  2361.     CEXM_MDL_code           = 0x23, // code
  2362.     CEXM_MDL_pcode          = 0x40, // pcode
  2363.     CEXM_MDL_pcode32Mac     = 0x41, // macintosh 32 bit pcode
  2364.     CEXM_MDL_pcode32MacNep  = 0x42  // macintosh 32 bit pcode native entry point
  2365. } CEXM_MODEL_e;
  2366.  
  2367. typedef enum CV_COBOL_e {
  2368.     CV_COBOL_dontstop,
  2369.     CV_COBOL_pfm,
  2370.     CV_COBOL_false,
  2371.     CV_COBOL_extcall
  2372. } CV_COBOL_e;
  2373.  
  2374. typedef struct CEXMSYM16 {
  2375.     unsigned short  reclen;         // Record length
  2376.     unsigned short  rectyp;         // S_CEXMODEL16
  2377.     CV_uoff16_t     off;            // offset of symbol
  2378.     unsigned short  seg;            // segment of symbol
  2379.     unsigned short  model;          // execution model
  2380.     union var16 {
  2381.         struct  {
  2382.             CV_uoff16_t pcdtable;   // offset to pcode function table
  2383.             CV_uoff16_t pcdspi;     // offset to segment pcode information
  2384.         } pcode;
  2385.         struct {
  2386.             unsigned short  subtype;   // see CV_COBOL_e above
  2387.             unsigned short  flag;
  2388.         } cobol;
  2389.     };
  2390. } CEXMSYM16;
  2391.  
  2392.  
  2393.  
  2394.  
  2395. typedef struct VPATHSYM16 {
  2396.     unsigned short  reclen;         // record length
  2397.     unsigned short  rectyp;         // S_VFTPATH16
  2398.     CV_uoff16_t     off;            // offset of virtual function table
  2399.     unsigned short  seg;            // segment of virtual function table
  2400.     CV_typ_t        root;           // type index of the root of path
  2401.     CV_typ_t        path;           // type index of the path record
  2402. } VPATHSYM16;
  2403.  
  2404.  
  2405.  
  2406.  
  2407. typedef struct REGREL16 {
  2408.     unsigned short  reclen;         // Record length
  2409.     unsigned short  rectyp;         // S_REGREL16
  2410.     CV_uoff16_t     off;            // offset of symbol
  2411.     unsigned short  reg;            // register index
  2412.     CV_typ_t        typind;         // Type index
  2413.     unsigned char   name[1];        // Length-prefixed name
  2414. } REGREL16;
  2415.  
  2416.  
  2417.  
  2418.  
  2419.  
  2420. typedef struct BPRELSYM32 {
  2421.     unsigned short  reclen;         // Record length
  2422.     unsigned short  rectyp;         // S_BPREL32
  2423.     CV_off32_t      off;            // BP-relative offset
  2424.     CV_typ_t        typind;         // Type index
  2425.     unsigned char   name[1];        // Length-prefixed name
  2426. } BPRELSYM32;
  2427.  
  2428. typedef struct DATASYM32 {
  2429.     unsigned short  reclen;         // Record length
  2430.     unsigned short  rectyp;         // S_LDATA32, S_GDATA32 or S_PUB32
  2431.     CV_uoff32_t     off;
  2432.     unsigned short  seg;
  2433.     CV_typ_t        typind;         // Type index
  2434.     unsigned char   name[1];        // Length-prefixed name
  2435. } DATASYM32;
  2436. typedef DATASYM32 PUBSYM32;
  2437.  
  2438.  
  2439.  
  2440. typedef struct PROCSYM32 {
  2441.     unsigned short  reclen;         // Record length
  2442.     unsigned short  rectyp;         // S_GPROC32 or S_LPROC32
  2443.     unsigned long   pParent;        // pointer to the parent
  2444.     unsigned long   pEnd;           // pointer to this blocks end
  2445.     unsigned long   pNext;          // pointer to next symbol
  2446.     unsigned long   len;            // Proc length
  2447.     unsigned long   DbgStart;       // Debug start offset
  2448.     unsigned long   DbgEnd;         // Debug end offset
  2449.     CV_uoff32_t     off;
  2450.     unsigned short  seg;
  2451.     CV_typ_t        typind;         // Type index
  2452.     CV_PROCFLAGS    flags;          // Proc flags
  2453.     unsigned char   name[1];        // Length-prefixed name
  2454. } PROCSYM32;
  2455.  
  2456.  
  2457.  
  2458.  
  2459. typedef struct THUNKSYM32 {
  2460.     unsigned short  reclen;         // Record length
  2461.     unsigned short  rectyp;         // S_THUNK32
  2462.     unsigned long   pParent;        // pointer to the parent
  2463.     unsigned long   pEnd;           // pointer to this blocks end
  2464.     unsigned long   pNext;          // pointer to next symbol
  2465.     CV_uoff32_t     off;
  2466.     unsigned short  seg;
  2467.     unsigned short  len;            // length of thunk
  2468.     unsigned char   ord;            // ordinal specifying type of thunk
  2469.     unsigned char   name[1];        // Length-prefixed name
  2470.     unsigned char   variant[CV_ZEROLEN]; // variant portion of thunk
  2471. } THUNKSYM32;
  2472.  
  2473.  
  2474.  
  2475.  
  2476. typedef struct LABELSYM32 {
  2477.     unsigned short  reclen;         // Record length
  2478.     unsigned short  rectyp;         // S_LABEL32
  2479.     CV_uoff32_t     off;
  2480.     unsigned short  seg;
  2481.     CV_PROCFLAGS    flags;          // flags
  2482.     unsigned char   name[1];        // Length-prefixed name
  2483. } LABELSYM32;
  2484.  
  2485.  
  2486. typedef struct BLOCKSYM32 {
  2487.     unsigned short  reclen;         // Record length
  2488.     unsigned short  rectyp;         // S_BLOCK32
  2489.     unsigned long   pParent;        // pointer to the parent
  2490.     unsigned long   pEnd;           // pointer to this blocks end
  2491.     unsigned long   len;            // Block length
  2492.     CV_uoff32_t     off;            // Offset in code segment
  2493.     unsigned short  seg;            // segment of label
  2494.     unsigned char   name[1];        // Length-prefixed name
  2495. } BLOCKSYM32;
  2496.  
  2497.  
  2498. typedef struct WITHSYM32 {
  2499.     unsigned short  reclen;         // Record length
  2500.     unsigned short  rectyp;         // S_WITH32
  2501.     unsigned long   pParent;        // pointer to the parent
  2502.     unsigned long   pEnd;           // pointer to this blocks end
  2503.     unsigned long   len;            // Block length
  2504.     CV_uoff32_t     off;            // Offset in code segment
  2505.     unsigned short  seg;            // segment of label
  2506.     unsigned char   expr[1];        // Length-prefixed expression string
  2507. } WITHSYM32;
  2508.  
  2509.  
  2510.  
  2511. typedef struct CEXMSYM32 {
  2512.     unsigned short  reclen;         // Record length
  2513.     unsigned short  rectyp;         // S_CEXMODEL32
  2514.     CV_uoff32_t     off;            // offset of symbol
  2515.     unsigned short  seg;            // segment of symbol
  2516.     unsigned short  model;          // execution model
  2517.     union var32 {
  2518.         struct  {
  2519.             CV_uoff32_t pcdtable;   // offset to pcode function table
  2520.             CV_uoff32_t pcdspi;     // offset to segment pcode information
  2521.         } pcode;
  2522.         struct {
  2523.             unsigned short  subtype;   // see CV_COBOL_e above
  2524.             unsigned short  flag;
  2525.         } cobol;
  2526.         struct {
  2527.             CV_uoff32_t calltableOff; // offset to function table
  2528.             unsigned short calltableSeg; // segment of function table
  2529.         } pcode32Mac;
  2530.     };
  2531. } CEXMSYM32;
  2532.  
  2533.  
  2534.  
  2535. typedef struct VPATHSYM32 {
  2536.     unsigned short  reclen;         // record length
  2537.     unsigned short  rectyp;         // S_VFTPATH32
  2538.     CV_uoff32_t     off;            // offset of virtual function table
  2539.     unsigned short  seg;            // segment of virtual function table
  2540.     CV_typ_t        root;           // type index of the root of path
  2541.     CV_typ_t        path;           // type index of the path record
  2542. } VPATHSYM32;
  2543.  
  2544.  
  2545.  
  2546.  
  2547.  
  2548. typedef struct REGREL32 {
  2549.     unsigned short  reclen;         // Record length
  2550.     unsigned short  rectyp;         // S_REGREL32
  2551.     CV_uoff32_t     off;            // offset of symbol
  2552.     unsigned short  reg;            // register index for symbol
  2553.     CV_typ_t        typind;         // Type index
  2554.     unsigned char   name[1];        // Length-prefixed name
  2555. } REGREL32, FAR * LPREGREL32;
  2556.  
  2557.  
  2558.  
  2559. typedef struct THREADSYM32 {
  2560.     unsigned short  reclen;         // record length
  2561.     unsigned short  rectyp;         // S_LTHREAD32 | S_GTHREAD32
  2562.     CV_uoff32_t     off;            // offset into thread storage
  2563.     unsigned short  seg;            // segment of thread storage
  2564.     CV_typ_t        typind;         // type index
  2565.     unsigned char   name[1];        // length prefixed name
  2566. } THREADSYM32;
  2567.  
  2568. typedef struct SLINK32 {
  2569.     unsigned short  reclen;         // record length
  2570.     unsigned short  rectyp;         // S_SLINK32
  2571.     unsigned long   framesize;      // frame size of parent procedure
  2572.     CV_off32_t      off;            // signed offset where the static link was saved relative to the value of reg
  2573.     unsigned short  reg;
  2574. } SLINK32, FAR * LPSLINK32;
  2575.  
  2576. typedef struct PROCSYMMIPS {
  2577.     unsigned short  reclen;         // Record length
  2578.     unsigned short  rectyp;         // S_GPROCMIPS or S_LPROCMIPS
  2579.     unsigned long   pParent;        // pointer to the parent
  2580.     unsigned long   pEnd;           // pointer to this blocks end
  2581.     unsigned long   pNext;          // pointer to next symbol
  2582.     unsigned long   len;            // Proc length
  2583.     unsigned long   DbgStart;       // Debug start offset
  2584.     unsigned long   DbgEnd;         // Debug end offset
  2585.     unsigned long   regSave;        // int register save mask
  2586.     unsigned long   fpSave;         // fp register save mask
  2587.     CV_uoff32_t     intOff;         // int register save offset
  2588.     CV_uoff32_t     fpOff;          // fp register save offset
  2589.     CV_uoff32_t     off;            // Symbol offset
  2590.     unsigned short  seg;            // Symbol segment
  2591.     CV_typ_t        typind;         // Type index
  2592.     unsigned char   retReg;         // Register return value is in
  2593.     unsigned char   frameReg;       // Frame pointer register
  2594.     unsigned char   name[1];        // Length-prefixed name
  2595. } PROCSYMMIPS, FAR *PROCPTRMIPS;
  2596.  
  2597.  
  2598. typedef struct REFSYM {
  2599.     unsigned short  reclen;     // Record length
  2600.     unsigned short  rectyp;     // S_PROCREF or S_DATAREF
  2601.     unsigned long   sumName;    // SUC of the name
  2602.     unsigned long   ibSym;          // Offset of actual symbol in $$Symbols
  2603.     unsigned short  imod;       // Module containing the actual symbol
  2604.     unsigned short  usFill;     // align this record
  2605. } REFSYM;
  2606.  
  2607. typedef struct ALIGNSYM {
  2608.     unsigned short  reclen;     // Record length
  2609.     unsigned short  rectyp;     // S_PROCREF or S_DATAREF
  2610. } ALIGNSYM;
  2611.  
  2612. //  generic block definition symbols
  2613. //  these are similar to the equivalent 16:16 or 16:32 symbols but
  2614. //  only define the length, type and linkage fields
  2615.  
  2616. typedef struct PROCSYM {
  2617.     unsigned short  reclen;         // Record length
  2618.     unsigned short  rectyp;         // S_GPROC16 or S_LPROC16
  2619.     unsigned long   pParent;        // pointer to the parent
  2620.     unsigned long   pEnd;           // pointer to this blocks end
  2621.     unsigned long   pNext;          // pointer to next symbol
  2622. } PROCSYM;
  2623.  
  2624.  
  2625. typedef struct THUNKSYM {
  2626.     unsigned short  reclen;         // Record length
  2627.     unsigned short  rectyp;         // S_THUNK
  2628.     unsigned long   pParent;        // pointer to the parent
  2629.     unsigned long   pEnd;           // pointer to this blocks end
  2630.     unsigned long   pNext;          // pointer to next symbol
  2631. } THUNKSYM;
  2632.  
  2633. typedef struct BLOCKSYM {
  2634.     unsigned short  reclen;         // Record length
  2635.     unsigned short  rectyp;         // S_BLOCK16
  2636.     unsigned long   pParent;        // pointer to the parent
  2637.     unsigned long   pEnd;           // pointer to this blocks end
  2638. } BLOCKSYM;
  2639.  
  2640.  
  2641. typedef struct WITHSYM {
  2642.     unsigned short  reclen;         // Record length
  2643.     unsigned short  rectyp;         // S_WITH16
  2644.     unsigned long   pParent;        // pointer to the parent
  2645.     unsigned long   pEnd;           // pointer to this blocks end
  2646. } WITHSYM;
  2647.  
  2648.  
  2649. typedef enum CV_HREG_e {
  2650.     //  Register set for the Intel 80x86 and ix86 processor series
  2651.     //  (plus PCODE registers)
  2652.  
  2653.     CV_REG_NONE     =   0,
  2654.     CV_REG_AL       =   1,
  2655.     CV_REG_CL       =   2,
  2656.     CV_REG_DL       =   3,
  2657.     CV_REG_BL       =   4,
  2658.     CV_REG_AH       =   5,
  2659.     CV_REG_CH       =   6,
  2660.     CV_REG_DH       =   7,
  2661.     CV_REG_BH       =   8,
  2662.     CV_REG_AX       =   9,
  2663.     CV_REG_CX       =  10,
  2664.     CV_REG_DX       =  11,
  2665.     CV_REG_BX       =  12,
  2666.     CV_REG_SP       =  13,
  2667.     CV_REG_BP       =  14,
  2668.     CV_REG_SI       =  15,
  2669.     CV_REG_DI       =  16,
  2670.     CV_REG_EAX      =  17,
  2671.     CV_REG_ECX      =  18,
  2672.     CV_REG_EDX      =  19,
  2673.     CV_REG_EBX      =  20,
  2674.     CV_REG_ESP      =  21,
  2675.     CV_REG_EBP      =  22,
  2676.     CV_REG_ESI      =  23,
  2677.     CV_REG_EDI      =  24,
  2678.     CV_REG_ES       =  25,
  2679.     CV_REG_CS       =  26,
  2680.     CV_REG_SS       =  27,
  2681.     CV_REG_DS       =  28,
  2682.     CV_REG_FS       =  29,
  2683.     CV_REG_GS       =  30,
  2684.     CV_REG_IP       =  31,
  2685.     CV_REG_FLAGS    =  32,
  2686.     CV_REG_EIP      =  33,
  2687.     CV_REG_EFLAGS   =  34,
  2688.     CV_REG_TEMP     =  40,          // PCODE Temp
  2689.     CV_REG_TEMPH    =  41,          // PCODE TempH
  2690.     CV_REG_QUOTE    =  42,          // PCODE Quote
  2691.     CV_REG_PCDR3    =  43,          // PCODE reserved
  2692.     CV_REG_PCDR4    =  44,          // PCODE reserved
  2693.     CV_REG_PCDR5    =  45,          // PCODE reserved
  2694.     CV_REG_PCDR6    =  46,          // PCODE reserved
  2695.     CV_REG_PCDR7    =  47,          // PCODE reserved
  2696.     CV_REG_CR0      =  80,          // CR0 -- control registers
  2697.     CV_REG_CR1      =  81,
  2698.     CV_REG_CR2      =  82,
  2699.     CV_REG_CR3      =  83,
  2700.     CV_REG_CR4      =  84,          // Pentium
  2701.     CV_REG_DR0      =  90,          // Debug register
  2702.     CV_REG_DR1      =  91,
  2703.     CV_REG_DR2      =  92,
  2704.     CV_REG_DR3      =  93,
  2705.     CV_REG_DR4      =  94,
  2706.     CV_REG_DR5      =  95,
  2707.     CV_REG_DR6      =  96,
  2708.     CV_REG_DR7      =  97,
  2709.     CV_REG_GDTR     =  110,
  2710.     CV_REG_GDTL     =  111,
  2711.     CV_REG_IDTR     =  112,
  2712.     CV_REG_IDTL     =  113,
  2713.     CV_REG_LDTR     =  114,
  2714.     CV_REG_TR       =  115,
  2715.  
  2716.     CV_REG_PSEUDO1  =  116,
  2717.     CV_REG_PSEUDO2  =  117,
  2718.     CV_REG_PSEUDO3  =  118,
  2719.     CV_REG_PSEUDO4  =  119,
  2720.     CV_REG_PSEUDO5  =  120,
  2721.     CV_REG_PSEUDO6  =  121,
  2722.     CV_REG_PSEUDO7  =  122,
  2723.     CV_REG_PSEUDO8  =  123,
  2724.     CV_REG_PSEUDO9  =  124,
  2725.  
  2726.     CV_REG_ST0      =  128,
  2727.     CV_REG_ST1      =  129,
  2728.     CV_REG_ST2      =  130,
  2729.     CV_REG_ST3      =  131,
  2730.     CV_REG_ST4      =  132,
  2731.     CV_REG_ST5      =  133,
  2732.     CV_REG_ST6      =  134,
  2733.     CV_REG_ST7      =  135,
  2734.     CV_REG_CTRL     =  136,
  2735.     CV_REG_STAT     =  137,
  2736.     CV_REG_TAG      =  138,
  2737.     CV_REG_FPIP     =  139,
  2738.     CV_REG_FPCS     =  140,
  2739.     CV_REG_FPDO     =  141,
  2740.     CV_REG_FPDS     =  142,
  2741.     CV_REG_ISEM     =  143,
  2742.     CV_REG_FPEIP    =  144,
  2743.     CV_REG_FPEDO    =  145,
  2744.  
  2745.     // registers for the 68K processors
  2746.  
  2747.     CV_R68_D0       =   0,
  2748.     CV_R68_D1       =   1,
  2749.     CV_R68_D2       =   2,
  2750.     CV_R68_D3       =   3,
  2751.     CV_R68_D4       =   4,
  2752.     CV_R68_D5       =   5,
  2753.     CV_R68_D6       =   6,
  2754.     CV_R68_D7       =   7,
  2755.     CV_R68_A0       =   8,
  2756.     CV_R68_A1       =   9,
  2757.     CV_R68_A2       =   10,
  2758.     CV_R68_A3       =   11,
  2759.     CV_R68_A4       =   12,
  2760.     CV_R68_A5       =   13,
  2761.     CV_R68_A6       =   14,
  2762.     CV_R68_A7       =   15,
  2763.     CV_R68_CCR      =   16,
  2764.     CV_R68_SR       =   17,
  2765.     CV_R68_USP      =   18,
  2766.     CV_R68_MSP      =   19,
  2767.     CV_R68_SFC      =   20,
  2768.     CV_R68_DFC      =   21,
  2769.     CV_R68_CACR     =   22,
  2770.     CV_R68_VBR      =   23,
  2771.     CV_R68_CAAR     =   24,
  2772.     CV_R68_ISP      =   25,
  2773.     CV_R68_PC       =   26,
  2774.     //reserved          27
  2775.     CV_R68_FPCR     =   28,
  2776.     CV_R68_FPSR     =   29,
  2777.     CV_R68_FPIAR    =   30,
  2778.     //reserved          31
  2779.     CV_R68_FP0      =   32,
  2780.     CV_R68_FP1      =   33,
  2781.     CV_R68_FP2      =   34,
  2782.     CV_R68_FP3      =   35,
  2783.     CV_R68_FP4      =   36,
  2784.     CV_R68_FP5      =   37,
  2785.     CV_R68_FP6      =   38,
  2786.     CV_R68_FP7      =   39,
  2787.     //reserved      40-50
  2788.     CV_R68_PSR      =   51,
  2789.     CV_R68_PCSR     =   52,
  2790.     CV_R68_VAL      =   53,
  2791.     CV_R68_CRP      =   54,
  2792.     CV_R68_SRP      =   55,
  2793.     CV_R68_DRP      =   56,
  2794.     CV_R68_TC       =   57,
  2795.     CV_R68_AC       =   58,
  2796.     CV_R68_SCC      =   59,
  2797.     CV_R68_CAL      =   60,
  2798.     CV_R68_TT0      =   61,
  2799.     CV_R68_TT1      =   62,
  2800.     //reserved      63
  2801.     CV_R68_BAD0     =   64,
  2802.     CV_R68_BAD1     =   65,
  2803.     CV_R68_BAD2     =   66,
  2804.     CV_R68_BAD3     =   67,
  2805.     CV_R68_BAD4     =   68,
  2806.     CV_R68_BAD5     =   69,
  2807.     CV_R68_BAD6     =   70,
  2808.     CV_R68_BAD7     =   71,
  2809.     CV_R68_BAC0     =   72,
  2810.     CV_R68_BAC1     =   73,
  2811.     CV_R68_BAC2     =   74,
  2812.     CV_R68_BAC3     =   75,
  2813.     CV_R68_BAC4     =   76,
  2814.     CV_R68_BAC5     =   77,
  2815.     CV_R68_BAC6     =   78,
  2816.     CV_R68_BAC7     =   79,
  2817.  
  2818.     // Register set for the MIPS 4000
  2819.  
  2820.     CV_M4_NOREG     =   CV_REG_NONE,
  2821.  
  2822.     CV_M4_IntZERO   =   10,      /* CPU REGISTER */
  2823.     CV_M4_IntAT     =   11,
  2824.     CV_M4_IntV0     =   12,
  2825.     CV_M4_IntV1     =   13,
  2826.     CV_M4_IntA0     =   14,
  2827.     CV_M4_IntA1     =   15,
  2828.     CV_M4_IntA2     =   16,
  2829.     CV_M4_IntA3     =   17,
  2830.     CV_M4_IntT0     =   18,
  2831.     CV_M4_IntT1     =   19,
  2832.     CV_M4_IntT2     =   20,
  2833.     CV_M4_IntT3     =   21,
  2834.     CV_M4_IntT4     =   22,
  2835.     CV_M4_IntT5     =   23,
  2836.     CV_M4_IntT6     =   24,
  2837.     CV_M4_IntT7     =   25,
  2838.     CV_M4_IntS0     =   26,
  2839.     CV_M4_IntS1     =   27,
  2840.     CV_M4_IntS2     =   28,
  2841.     CV_M4_IntS3     =   29,
  2842.     CV_M4_IntS4     =   30,
  2843.     CV_M4_IntS5     =   31,
  2844.     CV_M4_IntS6     =   32,
  2845.     CV_M4_IntS7     =   33,
  2846.     CV_M4_IntT8     =   34,
  2847.     CV_M4_IntT9     =   35,
  2848.     CV_M4_IntKT0    =   36,
  2849.     CV_M4_IntKT1    =   37,
  2850.     CV_M4_IntGP     =   38,
  2851.     CV_M4_IntSP     =   39,
  2852.     CV_M4_IntS8     =   40,
  2853.     CV_M4_IntRA     =   41,
  2854.     CV_M4_IntLO     =   42,
  2855.     CV_M4_IntHI     =   43,
  2856.  
  2857.     CV_M4_Fir       =   50,
  2858.     CV_M4_Psr       =   51,
  2859.  
  2860.     CV_M4_FltF0     =   60,      /* Floating point registers */
  2861.     CV_M4_FltF1     =   61,
  2862.     CV_M4_FltF2     =   62,
  2863.     CV_M4_FltF3     =   63,
  2864.     CV_M4_FltF4     =   64,
  2865.     CV_M4_FltF5     =   65,
  2866.     CV_M4_FltF6     =   66,
  2867.     CV_M4_FltF7     =   67,
  2868.     CV_M4_FltF8     =   68,
  2869.     CV_M4_FltF9     =   69,
  2870.     CV_M4_FltF10    =   70,
  2871.     CV_M4_FltF11    =   71,
  2872.     CV_M4_FltF12    =   72,
  2873.     CV_M4_FltF13    =   73,
  2874.     CV_M4_FltF14    =   74,
  2875.     CV_M4_FltF15    =   75,
  2876.     CV_M4_FltF16    =   76,
  2877.     CV_M4_FltF17    =   77,
  2878.     CV_M4_FltF18    =   78,
  2879.     CV_M4_FltF19    =   79,
  2880.     CV_M4_FltF20    =   80,
  2881.     CV_M4_FltF21    =   81,
  2882.     CV_M4_FltF22    =   82,
  2883.     CV_M4_FltF23    =   83,
  2884.     CV_M4_FltF24    =   84,
  2885.     CV_M4_FltF25    =   85,
  2886.     CV_M4_FltF26    =   86,
  2887.     CV_M4_FltF27    =   87,
  2888.     CV_M4_FltF28    =   88,
  2889.     CV_M4_FltF29    =   89,
  2890.     CV_M4_FltF30    =   90,
  2891.     CV_M4_FltF31    =   91,
  2892.     CV_M4_FltFsr    =   92,
  2893.  
  2894.  
  2895.     // Register set for the ALPHA AXP
  2896.  
  2897.     CV_ALPHA_NOREG  = CV_REG_NONE,
  2898.  
  2899.     CV_ALPHA_FltF0  =   10,         /* Floating point registers */
  2900.     CV_ALPHA_FltF1  =   11,
  2901.     CV_ALPHA_FltF2  =   12,
  2902.     CV_ALPHA_FltF3  =   13,
  2903.     CV_ALPHA_FltF4  =   14,
  2904.     CV_ALPHA_FltF5  =   15,
  2905.     CV_ALPHA_FltF6  =   16,
  2906.     CV_ALPHA_FltF7  =   17,
  2907.     CV_ALPHA_FltF8  =   18,
  2908.     CV_ALPHA_FltF9  =   19,
  2909.     CV_ALPHA_FltF10 =   20,
  2910.     CV_ALPHA_FltF11 =   21,
  2911.     CV_ALPHA_FltF12 =   22,
  2912.     CV_ALPHA_FltF13 =   23,
  2913.     CV_ALPHA_FltF14 =   24,
  2914.     CV_ALPHA_FltF15 =   25,
  2915.     CV_ALPHA_FltF16 =   26,
  2916.     CV_ALPHA_FltF17 =   27,
  2917.     CV_ALPHA_FltF18 =   28,
  2918.     CV_ALPHA_FltF19 =   29,
  2919.     CV_ALPHA_FltF20 =   30,
  2920.     CV_ALPHA_FltF21 =   31,
  2921.     CV_ALPHA_FltF22 =   32,
  2922.     CV_ALPHA_FltF23 =   33,
  2923.     CV_ALPHA_FltF24 =   34,
  2924.     CV_ALPHA_FltF25 =   35,
  2925.     CV_ALPHA_FltF26 =   36,
  2926.     CV_ALPHA_FltF27 =   37,
  2927.     CV_ALPHA_FltF28 =   38,
  2928.     CV_ALPHA_FltF29 =   39,
  2929.     CV_ALPHA_FltF30 =   40,
  2930.     CV_ALPHA_FltF31 =   41,
  2931.  
  2932.     CV_ALPHA_IntV0  =   42,   // Integer registers
  2933.     CV_ALPHA_IntT0  =   43,
  2934.     CV_ALPHA_IntT1  =   44,
  2935.     CV_ALPHA_IntT2  =   45,
  2936.     CV_ALPHA_IntT3  =   46,
  2937.     CV_ALPHA_IntT4  =   47,
  2938.     CV_ALPHA_IntT5  =   48,
  2939.     CV_ALPHA_IntT6  =   49,
  2940.     CV_ALPHA_IntT7  =   50,
  2941.     CV_ALPHA_IntS0  =   51,
  2942.     CV_ALPHA_IntS1  =   52,
  2943.     CV_ALPHA_IntS2  =   53,
  2944.     CV_ALPHA_IntS3  =   54,
  2945.     CV_ALPHA_IntS4  =   55,
  2946.     CV_ALPHA_IntS5  =   56,
  2947.     CV_ALPHA_IntFP  =   57,
  2948.     CV_ALPHA_IntA0  =   58,
  2949.     CV_ALPHA_IntA1  =   59,
  2950.     CV_ALPHA_IntA2  =   60,
  2951.     CV_ALPHA_IntA3  =   61,
  2952.     CV_ALPHA_IntA4  =   62,
  2953.     CV_ALPHA_IntA5  =   63,
  2954.     CV_ALPHA_IntT8  =   64,
  2955.     CV_ALPHA_IntT9  =   65,
  2956.     CV_ALPHA_IntT10 =   66,
  2957.     CV_ALPHA_IntT11 =   67,
  2958.     CV_ALPHA_IntRA  =   68,
  2959.     CV_ALPHA_IntT12 =   69,
  2960.     CV_ALPHA_IntAT  =   70,
  2961.     CV_ALPHA_IntGP  =   71,
  2962.     CV_ALPHA_IntSP  =   72,
  2963.     CV_ALPHA_IntZERO =  73,
  2964.  
  2965.  
  2966.     CV_ALPHA_Fpcr   =   74,   //  Control registers
  2967.     CV_ALPHA_Fir    =   75,
  2968.     CV_ALPHA_Psr    =   76,
  2969.     CV_ALPHA_FltFsr =   77,
  2970.     CV_ALPHA_SoftFpcr = 78,   //  Control registers
  2971.  
  2972.     // Register Set for Motorola/IBM PowerPC
  2973.  
  2974.     /*
  2975.     ** PowerPC General Registers ( User Level )
  2976.     */
  2977.     CV_PPC_GPR0   = 1,
  2978.     CV_PPC_GPR1   = 2,
  2979.     CV_PPC_GPR2   = 3,
  2980.     CV_PPC_GPR3   = 4,
  2981.     CV_PPC_GPR4   = 5,
  2982.     CV_PPC_GPR5   = 6,
  2983.     CV_PPC_GPR6   = 7,
  2984.     CV_PPC_GPR7   = 8,
  2985.     CV_PPC_GPR8   = 9,
  2986.     CV_PPC_GPR9   = 10,
  2987.     CV_PPC_GPR10  = 11,
  2988.     CV_PPC_GPR11  = 12,
  2989.     CV_PPC_GPR12  = 13,
  2990.     CV_PPC_GPR13  = 14,
  2991.     CV_PPC_GPR14  = 15,
  2992.     CV_PPC_GPR15  = 16,
  2993.     CV_PPC_GPR16  = 17,
  2994.     CV_PPC_GPR17  = 18,
  2995.     CV_PPC_GPR18  = 19,
  2996.     CV_PPC_GPR19  = 20,
  2997.     CV_PPC_GPR20  = 21,
  2998.     CV_PPC_GPR21  = 22,
  2999.     CV_PPC_GPR22  = 23,
  3000.     CV_PPC_GPR23  = 24,
  3001.     CV_PPC_GPR24  = 25,
  3002.     CV_PPC_GPR25  = 26,
  3003.     CV_PPC_GPR26  = 27,
  3004.     CV_PPC_GPR27  = 28,
  3005.     CV_PPC_GPR28  = 29,
  3006.     CV_PPC_GPR29  = 30,
  3007.     CV_PPC_GPR30  = 31,
  3008.     CV_PPC_GPR31  = 32,
  3009.  
  3010.     /*
  3011.     ** PowerPC Condition Register ( User Level )
  3012.     */
  3013.     CV_PPC_CR     = 33,
  3014.     CV_PPC_CR0    = 34,
  3015.     CV_PPC_CR1    = 35,
  3016.     CV_PPC_CR2    = 36,
  3017.     CV_PPC_CR3    = 37,
  3018.     CV_PPC_CR4    = 38,
  3019.     CV_PPC_CR5    = 39,
  3020.     CV_PPC_CR6    = 40,
  3021.     CV_PPC_CR7    = 41,
  3022.  
  3023.     /*
  3024.     ** PowerPC Floating Point Registers ( User Level )
  3025.     */
  3026.     CV_PPC_FPR0   = 42,
  3027.     CV_PPC_FPR1   = 43,
  3028.     CV_PPC_FPR2   = 44,
  3029.     CV_PPC_FPR3   = 45,
  3030.     CV_PPC_FPR4   = 46,
  3031.     CV_PPC_FPR5   = 47,
  3032.     CV_PPC_FPR6   = 48,
  3033.     CV_PPC_FPR7   = 49,
  3034.     CV_PPC_FPR8   = 50,
  3035.     CV_PPC_FPR9   = 51,
  3036.     CV_PPC_FPR10  = 52,
  3037.     CV_PPC_FPR11  = 53,
  3038.     CV_PPC_FPR12  = 54,
  3039.     CV_PPC_FPR13  = 55,
  3040.     CV_PPC_FPR14  = 56,
  3041.     CV_PPC_FPR15  = 57,
  3042.     CV_PPC_FPR16  = 58,
  3043.     CV_PPC_FPR17  = 59,
  3044.     CV_PPC_FPR18  = 60,
  3045.     CV_PPC_FPR19  = 61,
  3046.     CV_PPC_FPR20  = 62,
  3047.     CV_PPC_FPR21  = 63,
  3048.     CV_PPC_FPR22  = 64,
  3049.     CV_PPC_FPR23  = 65,
  3050.     CV_PPC_FPR24  = 66,
  3051.     CV_PPC_FPR25  = 67,
  3052.     CV_PPC_FPR26  = 68,
  3053.     CV_PPC_FPR27  = 69,
  3054.     CV_PPC_FPR28  = 70,
  3055.     CV_PPC_FPR29  = 71,
  3056.     CV_PPC_FPR30  = 72,
  3057.     CV_PPC_FPR31  = 73,
  3058.  
  3059.     /*
  3060.     ** PowerPC Floating Point Status and Control Register ( User Level )
  3061.     */
  3062.     CV_PPC_FPSCR  = 74,
  3063.  
  3064.     /*
  3065.     ** PowerPC Machine State Register ( Supervisor Level )
  3066.     */
  3067.     CV_PPC_MSR    = 75,
  3068.  
  3069.     /*
  3070.     ** PowerPC Segment Registers ( Supervisor Level )
  3071.     */
  3072.     CV_PPC_SR0    = 76,
  3073.     CV_PPC_SR1    = 77,
  3074.     CV_PPC_SR2    = 78,
  3075.     CV_PPC_SR3    = 79,
  3076.     CV_PPC_SR4    = 80,
  3077.     CV_PPC_SR5    = 81,
  3078.     CV_PPC_SR6    = 82,
  3079.     CV_PPC_SR7    = 83,
  3080.     CV_PPC_SR8    = 84,
  3081.     CV_PPC_SR9    = 85,
  3082.     CV_PPC_SR10   = 86,
  3083.     CV_PPC_SR11   = 87,
  3084.     CV_PPC_SR12   = 88,
  3085.     CV_PPC_SR13   = 89,
  3086.     CV_PPC_SR14   = 90,
  3087.     CV_PPC_SR15   = 91,
  3088.  
  3089.     /*
  3090.     ** For all of the special purpose registers add 100 to the SPR# that the
  3091.     ** Motorola/IBM documentation gives with the exception of any imaginary
  3092.     ** registers.
  3093.     */
  3094.  
  3095.     /*
  3096.     ** PowerPC Special Purpose Registers ( User Level )
  3097.     */
  3098.     CV_PPC_PC     = 99,     // PC (imaginary register)
  3099.  
  3100.     CV_PPC_MQ     = 100,    // MPC601
  3101.     CV_PPC_XER    = 101,
  3102.     CV_PPC_RTCU   = 104,    // MPC601
  3103.     CV_PPC_RTCL   = 105,    // MPC601
  3104.     CV_PPC_LR     = 108,
  3105.     CV_PPC_CTR    = 109,
  3106.  
  3107.     /*
  3108.     ** PowerPC Special Purpose Registers ( Supervisor Level )
  3109.     */
  3110.     CV_PPC_DSISR  = 118,
  3111.     CV_PPC_DAR    = 119,
  3112.     CV_PPC_DEC    = 122,
  3113.     CV_PPC_SDR1   = 125,
  3114.     CV_PPC_SRR0   = 126,
  3115.     CV_PPC_SRR1   = 127,
  3116.     CV_PPC_SPRG0  = 372,
  3117.     CV_PPC_SPRG1  = 373,
  3118.     CV_PPC_SPRG2  = 374,
  3119.     CV_PPC_SPRG3  = 375,
  3120.     CV_PPC_ASR    = 280,    // 64-bit implementations only
  3121.     CV_PPC_EAR    = 382,
  3122.     CV_PPC_PVR    = 287,
  3123.     CV_PPC_BAT0U  = 628,
  3124.     CV_PPC_BAT0L  = 629,
  3125.     CV_PPC_BAT1U  = 630,
  3126.     CV_PPC_BAT1L  = 631,
  3127.     CV_PPC_BAT2U  = 632,
  3128.     CV_PPC_BAT2L  = 633,
  3129.     CV_PPC_BAT3U  = 634,
  3130.     CV_PPC_BAT3L  = 635,
  3131.     CV_PPC_DBAT0U = 636,
  3132.     CV_PPC_DBAT0L = 637,
  3133.     CV_PPC_DBAT1U = 638,
  3134.     CV_PPC_DBAT1L = 639,
  3135.     CV_PPC_DBAT2U = 640,
  3136.     CV_PPC_DBAT2L = 641,
  3137.     CV_PPC_DBAT3U = 642,
  3138.     CV_PPC_DBAT3L = 643,
  3139.  
  3140.     /*
  3141.     ** PowerPC Special Purpose Registers Implementation Dependent ( Supervisor Level )
  3142.     */
  3143.  
  3144.     /*
  3145.     ** Doesn't appear that IBM/Motorola has finished defining these.
  3146.     */
  3147.  
  3148.     CV_PPC_PMR0   = 1044,   // MPC620,
  3149.     CV_PPC_PMR1   = 1045,   // MPC620,
  3150.     CV_PPC_PMR2   = 1046,   // MPC620,
  3151.     CV_PPC_PMR3   = 1047,   // MPC620,
  3152.     CV_PPC_PMR4   = 1048,   // MPC620,
  3153.     CV_PPC_PMR5   = 1049,   // MPC620,
  3154.     CV_PPC_PMR6   = 1050,   // MPC620,
  3155.     CV_PPC_PMR7   = 1051,   // MPC620,
  3156.     CV_PPC_PMR8   = 1052,   // MPC620,
  3157.     CV_PPC_PMR9   = 1053,   // MPC620,
  3158.     CV_PPC_PMR10  = 1054,   // MPC620,
  3159.     CV_PPC_PMR11  = 1055,   // MPC620,
  3160.     CV_PPC_PMR12  = 1056,   // MPC620,
  3161.     CV_PPC_PMR13  = 1057,   // MPC620,
  3162.     CV_PPC_PMR14  = 1058,   // MPC620,
  3163.     CV_PPC_PMR15  = 1059,   // MPC620,
  3164.  
  3165.     CV_PPC_DMISS  = 1076,   // MPC603
  3166.     CV_PPC_DCMP   = 1077,   // MPC603
  3167.     CV_PPC_HASH1  = 1078,   // MPC603
  3168.     CV_PPC_HASH2  = 1079,   // MPC603
  3169.     CV_PPC_IMISS  = 1080,   // MPC603
  3170.     CV_PPC_ICMP   = 1081,   // MPC603
  3171.     CV_PPC_RPA    = 1082,   // MPC603
  3172.  
  3173.     CV_PPC_HID0   = 1108,   // MPC601, MPC603, MPC620
  3174.     CV_PPC_HID1   = 1109,   // MPC601
  3175.     CV_PPC_HID2   = 1110,   // MPC601, MPC603, MPC620 ( IABR )
  3176.     CV_PPC_HID3   = 1111,   // Not Defined
  3177.     CV_PPC_HID4   = 1112,   // Not Defined
  3178.     CV_PPC_HID5   = 1113,   // MPC601, MPC604, MPC620 ( DABR )
  3179.     CV_PPC_HID6   = 1114,   // Not Defined
  3180.     CV_PPC_HID7   = 1115,   // Not Defined
  3181.     CV_PPC_HID8   = 1116,   // MPC620 ( BUSCSR )
  3182.     CV_PPC_HID9   = 1117,   // MPC620 ( L2CSR )
  3183.     CV_PPC_HID10  = 1118,   // Not Defined
  3184.     CV_PPC_HID11  = 1119,   // Not Defined
  3185.     CV_PPC_HID12  = 1120,   // Not Defined
  3186.     CV_PPC_HID13  = 1121,   // MPC604 ( HCR )
  3187.     CV_PPC_HID14  = 1122,   // Not Defined
  3188.     CV_PPC_HID15  = 1123    // MPC601, MPC604, MPC620 ( PIR )
  3189.  
  3190.  
  3191. } CV_HREG_e;
  3192.  
  3193. #include <poppack.h>
  3194.  
  3195. #ifdef  __cplusplus
  3196. #pragma warning ( default: 4200 )
  3197. #endif
  3198.  
  3199. #endif /* CV_INFO_INCLUDED */
  3200.