root/usr/src/head/syms.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*      Copyright (c) 1988 AT&T */
/*        All Rights Reserved   */


#ifndef _SYMS_H
#define _SYMS_H

/*              Storage Classes are defined in storclass.h  */
#include <storclass.h>

#ifdef  __cplusplus
extern "C" {
#endif

/*              Number of characters in a symbol name */
#define SYMNMLEN        8
/*              Number of characters in a file name */
#define FILNMLEN        14
/*              Number of array dimensions in auxiliary entry */
#define DIMNUM          4

struct syment
{
        union
        {
                char            _n_name[SYMNMLEN];      /* old COFF version */
                struct
                {
                        long    _n_zeroes;      /* new == 0 */
                        long    _n_offset;      /* offset into string table */
                } _n_n;
                char            *_n_nptr[2];    /* allows for overlaying */
        } _n;
        unsigned long           n_value;        /* value of symbol */
        short                   n_scnum;        /* section number */
        unsigned short          n_type;         /* type and derived type */
        char                    n_sclass;       /* storage class */
        char                    n_numaux;       /* number of aux. entries */
};

#define n_name          _n._n_name
#define n_nptr          _n._n_nptr[1]
#define n_zeroes        _n._n_n._n_zeroes
#define n_offset        _n._n_n._n_offset

/*
 * Relocatable symbols have a section number of the
 * section in which they are defined.  Otherwise, section
 * numbers have the following meanings:
 */
        /* undefined symbol */
#define N_UNDEF 0
        /* value of symbol is absolute */
#define N_ABS   -1
        /* special debugging symbol -- value of symbol is meaningless */
#define N_DEBUG -2
        /* indicates symbol needs transfer vector (preload) */
#define N_TV    (unsigned short)-3

        /* indicates symbol needs transfer vector (postload) */

#define P_TV    (unsigned short)-4

/*
 * The fundamental type of a symbol packed into the low
 * 4 bits of the word.
 */

#define _EF     ".ef"

#define T_NULL          0
#define T_ARG           1       /* function argument (only used by compiler) */
#define T_CHAR          2       /* character */
#define T_SHORT         3       /* short integer */
#define T_INT           4       /* integer */
#define T_LONG          5       /* long integer */
#define T_FLOAT         6       /* floating point */
#define T_DOUBLE        7       /* double word */
#define T_STRUCT        8       /* structure    */
#define T_UNION         9       /* union        */
#define T_ENUM          10      /* enumeration  */
#define T_MOE           11      /* member of enumeration */
#define T_UCHAR         12      /* unsigned character */
#define T_USHORT        13      /* unsigned short */
#define T_UINT          14      /* unsigned integer */
#define T_ULONG         15      /* unsigned long */

/*
 * derived types are:
 */

#define DT_NON          0       /* no derived type */
#define DT_PTR          1       /* pointer */
#define DT_FCN          2       /* function */
#define DT_ARY          3       /* array */

/*
 *   type packing constants
 */

#define N_BTMASK        017
#define N_TMASK         060
#define N_TMASK1        0300
#define N_TMASK2        0360
#define N_BTSHFT        4
#define N_TSHIFT        2

/*
 *   MACROS
 */

        /*   Basic Type of  x   */

#define BTYPE(x)  ((x) & N_BTMASK)

        /*   Is  x  a  pointer ?   */

#define ISPTR(x)  (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))

        /*   Is  x  a  function ?  */

#define ISFCN(x)  (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))

        /*   Is  x  an  array ?   */

#define ISARY(x)  (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))

        /* Is x a structure, union, or enumeration TAG? */

#define ISTAG(x)  ((x) == C_STRTAG || (x) == C_UNTAG || (x) == C_ENTAG)

#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(DT_PTR<<N_BTSHFT)|(x&N_BTMASK))

#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))

/*
 *      AUXILIARY ENTRY FORMAT
 */

union auxent
{
        struct
        {
                long            x_tagndx;       /* str, un, or enum tag indx */
                union
                {
                        struct
                        {
                                unsigned short  x_lnno; /* declaration line */
                                                        /* number */
                                unsigned short  x_size; /* str, union, array */
                                                        /* size */
                        } x_lnsz;
                        long    x_fsize;        /* size of function */
                } x_misc;
                union
                {
                        struct                  /* if ISFCN, tag, or .bb */
                        {
                                long    x_lnnoptr;      /* ptr to fcn line # */
                                long    x_endndx;       /* entry ndx past */
                                                        /* block end */
                        }       x_fcn;
                        struct                  /* if ISARY, up to 4 dimen. */
                        {
                                unsigned short  x_dimen[DIMNUM];
                        }       x_ary;
                }               x_fcnary;
                unsigned short  x_tvndx;                /* tv index */
        }       x_sym;
        struct
        {
                char    x_fname[FILNMLEN];
        }       x_file;
        struct
        {
                long            x_scnlen;       /* section length */
                unsigned short  x_nreloc;       /* number of reloc entries */
                unsigned short  x_nlinno;       /* number of line numbers */
        }       x_scn;

        struct
        {
                long            x_tvfill;       /* tv fill value */
                unsigned short  x_tvlen;        /* length of .tv */
                unsigned short  x_tvran[2];     /* tv range */
        }       x_tv;   /* info about .tv section (in auxent of symbol .tv)) */
};

#define SYMENT  struct syment
#define SYMESZ  18      /* sizeof(SYMENT) */

#define AUXENT  union auxent
#define AUXESZ  18      /* sizeof(AUXENT) */

/*      Defines for "special" symbols   */

#define _ETEXT  "etext"
#define _EDATA  "edata"
#define _END    "end"
#define _START  "_start"

#ifdef  __cplusplus
}
#endif

#endif  /* _SYMS_H */