scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

syms.h (4004B)


      1 /*
      2  * This file is inspired in:
      3  *	- the book "Understanding and using COFF"
      4  *	- the book "UNIX System V 386 R3.2 Programmers guide, Vol 2"
      5  */
      6 
      7 /* Special n_scnum values */
      8 #define N_TV         -3
      9 #define N_DEBUG      -2
     10 #define N_ABS        -1
     11 #define N_UNDEF       0
     12 #define N_SCNUM(x)   ((x) > 0)
     13 
     14 /* basic types */
     15 #define T_NULL        0
     16 #define T_VOID        1
     17 #define T_CHAR        2
     18 #define T_SHORT       3
     19 #define T_INT         4
     20 #define T_LONG        5
     21 #define T_FLOAT       6
     22 #define T_DOUBLE      7
     23 #define T_STRUCT      8
     24 #define T_UNION       9
     25 #define T_ENUM       10
     26 #define T_MOE        11
     27 #define T_UCHAR      12
     28 #define T_USHORT     13
     29 #define T_UINT       14
     30 #define T_ULONG      15
     31 #define T_LNGDBL     16
     32 
     33 /* derivated types */
     34 #define DT_NON       0
     35 #define DT_PTR       1
     36 #define DT_FCN       2
     37 #define DT_ARY       3
     38 
     39 #define SYMNMLEN   8
     40 #define FILNMLEN  14
     41 
     42 #define SYMENT  struct syment
     43 #define SYMESZ  18
     44 
     45 #define AUXENT  union auxent
     46 #define AUXESZ  18
     47 
     48 #define n_name       _n._n_name
     49 #define n_zeroes     _n._n_n._n_zeroes
     50 #define n_offset     _n._n_n._n_offset
     51 #define n_nptr       _n._n_nptr[1]
     52 
     53 #define E_FILNMLEN 18
     54 #define DIMNUM     4
     55 
     56 struct syment {
     57 	union {
     58 		char _n_name[SYMNMLEN];  /* symbol name */
     59 		struct {
     60 			long _n_zeroes;  /* if _n_name[0-3] == 0 */
     61 			long _n_offset;  /* offset into string table */
     62 		} _n_n;
     63 		char *_n_nptr[2];        /* allows overlaying */
     64 	} _n;
     65 	unsigned long n_value;           /* value of symbol */
     66 	short n_scnum;                   /* section number */
     67 	unsigned short n_type;           /* type and derived type */
     68 	char n_sclass;                   /* storage class */
     69 	char n_numaux;                   /* number of aux. entries */
     70 };
     71 
     72 #define x_fname    _x_file._x_fname
     73 #define x_zeroes   _x_file._x_n._x_zeroes
     74 #define x_offset   _x_file._x_n._x_offset
     75 #define x_tagndx   _x_sym._x_tagndx
     76 #define x_lnno     _x_sym._x_misc._x_lnsz._x_lnno
     77 #define x_size     _x_sym._x_misc._x_lnsz._x_size
     78 #define x_fsize    _x_sym._x_misc._x_fsize
     79 #define x_lnnoptr  _x_sym._x_fcnary._x_fcn._x_lnnoptr
     80 #define x_endndx   _x_sym._x_fcnary._x_fcn._x_endndx
     81 #define x_dimen    _x_sym._x_fcnary._x_ary._x_dimen
     82 #define x_tvndx    _x_sym._x_tvndx
     83 #define x_scnlen   _x_scn._x_scnlen
     84 #define x_nreloc   _x_scn._x_nreloc
     85 #define x_nlinno   _x_scn._x_nlinno
     86 #define x_checksum _x_scn._x_checksum
     87 #define x_associated _x_scn._x_associated
     88 #define x_comdat   _x_scn._x_comdat
     89 #define x_tvfill   _x_tv._x_tvfill
     90 #define x_tvlen    _x_tv._x_tvlen
     91 #define x_tvran    _x_tv._x_tvran
     92 
     93 union auxent {
     94 	union {
     95 		char _x_fname[E_FILNMLEN]; /* file name */
     96 		struct {
     97 			long _x_zeroes; /* if _x_fname[0-3] == 0 */
     98 			long _x_offset; /* offset into string table */
     99 		} _x_n;
    100 	} _x_file;
    101 
    102 	struct {
    103 		long _x_tagndx;	/* str, un, or enum tag indx */
    104 		union {
    105 			struct {
    106 				unsigned short _x_lnno;	/* declaration line number */
    107 				unsigned short _x_size;	/* str, union, array size */
    108 			} _x_lnsz;
    109 			long _x_fsize; /* size of function */
    110 		} _x_misc;
    111 
    112 		union {
    113 			struct {             /* if ISFCN, tag, or .bb */
    114 				long _x_lnnoptr;  /* ptr to fcn line # */
    115 				long _x_endndx;   /* entry ndx past block end */
    116 			} _x_fcn;
    117 			struct {             /* if ISARY, up to 4 dimen. */
    118 				unsigned short _x_dimen[DIMNUM];
    119 			} _x_ary;
    120 		} _x_fcnary;
    121 
    122 		unsigned short _x_tvndx;		/* tv index */
    123 	} _x_sym;
    124 
    125 	struct {
    126 		long _x_scnlen;                /* section length */
    127 		unsigned short _x_nreloc;      /* number of relocation entries */
    128 		unsigned short _x_nlinno;      /* number of line numbers */
    129 		unsigned long _x_checksum;     /* section COMDAT checksum         */
    130 		unsigned short _x_associated;  /* COMDAT associated section index */
    131 		unsigned char _x_comdat;       /* COMDAT selection number         */
    132 	} _x_scn;
    133 
    134 	struct {	   /* info about .tv section (in auxent of symbol .tv)) */
    135 		long _x_tvfill;	             /* tv fill value */
    136 		unsigned short _x_tvlen;     /* length of .tv */
    137 		unsigned short _x_tvran[2];  /* tv range */
    138 	} _x_tv;
    139 };