CVINFO.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:101k
源码类别:

Windows编程

开发平台:

Visual C++

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