Home | History | Annotate | Line # | Download | only in lint2
lint2.h revision 1.13
      1  1.13    rillig /* $NetBSD: lint2.h,v 1.13 2021/02/19 22:27:49 rillig Exp $ */
      2   1.2       cgd 
      3   1.1       cgd /*
      4   1.3       cgd  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
      5   1.1       cgd  * Copyright (c) 1994, 1995 Jochen Pohl
      6   1.1       cgd  * All Rights Reserved.
      7   1.1       cgd  *
      8   1.1       cgd  * Redistribution and use in source and binary forms, with or without
      9   1.1       cgd  * modification, are permitted provided that the following conditions
     10   1.1       cgd  * are met:
     11   1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     12   1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     13   1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     14   1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     15   1.1       cgd  *    documentation and/or other materials provided with the distribution.
     16   1.1       cgd  * 3. All advertising materials mentioning features or use of this software
     17   1.1       cgd  *    must display the following acknowledgement:
     18   1.1       cgd  *      This product includes software developed by Jochen Pohl for
     19   1.1       cgd  *	The NetBSD Project.
     20   1.1       cgd  * 4. The name of the author may not be used to endorse or promote products
     21   1.1       cgd  *    derived from this software without specific prior written permission.
     22   1.1       cgd  *
     23   1.1       cgd  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     24   1.1       cgd  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     25   1.1       cgd  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     26   1.1       cgd  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     27   1.1       cgd  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     28   1.1       cgd  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     29   1.1       cgd  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     30   1.1       cgd  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     31   1.1       cgd  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     32   1.1       cgd  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     33   1.1       cgd  */
     34   1.1       cgd 
     35   1.1       cgd #include "lint.h"
     36   1.1       cgd 
     37   1.1       cgd /*
     38   1.1       cgd  * Types are described by structures of type type_t.
     39   1.1       cgd  */
     40   1.7  christos struct type {
     41   1.1       cgd 	tspec_t	t_tspec;	/* type specifier */
     42  1.12    rillig 	bool	t_const : 1;	/* constant */
     43  1.12    rillig 	bool	t_volatile : 1;	/* volatile */
     44  1.12    rillig 	bool	t_vararg : 1;	/* function has variable number of arguments */
     45  1.13    rillig 	bool	t_is_enum : 1;
     46  1.12    rillig 	bool	t_proto : 1;	/* this is a prototype */
     47  1.12    rillig 	bool	t_istag : 1;	/* tag with _t_tag valid */
     48  1.12    rillig 	bool	t_istynam : 1;	/* tag with _t_tynam valid */
     49  1.12    rillig 	bool	t_isuniqpos : 1; /* tag with _t_uniqpos valid */
     50   1.1       cgd 	union {
     51   1.1       cgd 		int	_t_dim;		/* if the type is an ARRAY than this
     52   1.1       cgd 					   is the dimension of the array. */
     53   1.1       cgd 		struct	hte *_t_tag;	/* hash table entry of tag if
     54  1.13    rillig 					   t_is_enum, STRUCT or UNION */
     55   1.1       cgd 		struct	hte *_t_tynam;	/* hash table entry of typename if
     56  1.13    rillig 					   t_is_enum, STRUCT or UNION */
     57   1.3       cgd 		struct {
     58   1.3       cgd 			int p_line;
     59   1.3       cgd 			short p_file;
     60   1.3       cgd 			int p_uniq;
     61   1.3       cgd 		} _t_uniqpos;		/* unique position, for untagged
     62   1.3       cgd 					   untyped STRUCTs, UNIONS, and ENUMs,
     63   1.3       cgd 					   if t_isuniqpos */
     64   1.1       cgd 		struct	type **_t_args;	/* list of argument types if this
     65   1.1       cgd 					   is a prototype */
     66   1.1       cgd 	} t_u;
     67   1.1       cgd 	struct	type *t_subt;	/* indirected type (array element, pointed to
     68   1.1       cgd 				   type, type of return value) */
     69   1.7  christos };
     70   1.1       cgd 
     71   1.3       cgd #define	t_dim		t_u._t_dim
     72   1.3       cgd #define	t_tag		t_u._t_tag
     73   1.3       cgd #define	t_tynam		t_u._t_tynam
     74   1.3       cgd #define	t_uniqpos	t_u._t_uniqpos
     75   1.3       cgd #define	t_args		t_u._t_args
     76   1.1       cgd 
     77   1.1       cgd /*
     78   1.1       cgd  * argument information
     79   1.1       cgd  *
     80   1.1       cgd  * Such a structure is created for each argument of a function call
     81   1.1       cgd  * which is an integer constant or a constant string.
     82   1.1       cgd  */
     83   1.1       cgd typedef	struct arginf {
     84   1.1       cgd 	int	a_num;		/* # of argument (1..) */
     85  1.12    rillig 	bool	a_zero : 1;	/* argument is 0 */
     86  1.12    rillig 	bool	a_pcon : 1;	/* msb of argument is not set */
     87  1.12    rillig 	bool	a_ncon : 1;	/* msb of argument is set */
     88  1.12    rillig 	bool	a_fmt : 1;	/* a_fstrg points to format string */
     89   1.1       cgd 	char	*a_fstrg;	/* format string */
     90  1.11    rillig 	struct	arginf *a_next;	/* information for next const. argument */
     91   1.1       cgd } arginf_t;
     92   1.1       cgd 
     93   1.1       cgd /*
     94   1.1       cgd  * Keeps information about position in source file.
     95   1.1       cgd  */
     96   1.1       cgd typedef	struct {
     97   1.1       cgd 	u_short	p_src;		/* index of name of translation unit
     98   1.1       cgd 				   (the name which was specified at the
     99   1.1       cgd 				   command line) */
    100   1.1       cgd 	u_short	p_line;		/* line number in p_src */
    101   1.1       cgd 	u_short	p_isrc;		/* index of (included) file */
    102   1.1       cgd 	u_short p_iline;	/* line number in p_iline */
    103   1.6     lukem } pos_t;
    104   1.1       cgd 
    105   1.1       cgd /*
    106   1.1       cgd  * Used for definitions and declarations
    107   1.1       cgd  *
    108   1.1       cgd  * To save memory, variable sized structures are used. If
    109   1.1       cgd  * all s_va, s_prfl and s_scfl are not set, the memory allocated
    110   1.1       cgd  * for a symbol is only large enough to keep the first member of
    111   1.1       cgd  * struct sym, s_s.
    112   1.1       cgd  */
    113   1.1       cgd typedef	struct sym {
    114   1.1       cgd 	struct {
    115   1.1       cgd 		pos_t	s_pos;		/* pos of def./decl. */
    116   1.1       cgd #ifndef lint
    117   1.1       cgd 		u_int	s_def : 3;	/* DECL, TDEF or DEF */
    118   1.1       cgd #else
    119   1.1       cgd 		def_t	s_def;
    120   1.6     lukem #endif
    121  1.12    rillig 		bool	s_rval : 1;	/* function has return value */
    122  1.12    rillig 		bool	s_inline : 1;	/* function is inline */
    123  1.12    rillig 		bool	s_osdef : 1;	/* old style function definition */
    124  1.12    rillig 		bool	s_static : 1;	/* symbol is static */
    125  1.12    rillig 		bool	s_va : 1;	/* check only first s_nva arguments */
    126  1.12    rillig 		bool	s_prfl : 1;	/* printflike */
    127  1.12    rillig 		bool	s_scfl : 1;	/* scanflike */
    128   1.1       cgd 		u_short	s_type;		/* type */
    129  1.10    rillig 		struct	sym *s_next;	/* next symbol with same name */
    130   1.1       cgd 	} s_s;
    131   1.1       cgd 	short	s_nva;
    132   1.1       cgd 	short	s_nprfl;
    133   1.1       cgd 	short	s_nscfl;
    134   1.1       cgd } sym_t;
    135   1.1       cgd 
    136   1.1       cgd #define s_pos		s_s.s_pos
    137   1.1       cgd #define s_rval		s_s.s_rval
    138   1.1       cgd #define s_osdef		s_s.s_osdef
    139   1.8  christos #define s_inline	s_s.s_inline
    140   1.1       cgd #define s_static	s_s.s_static
    141   1.1       cgd #define s_def		s_s.s_def
    142   1.1       cgd #define s_va		s_s.s_va
    143   1.1       cgd #define s_prfl		s_s.s_prfl
    144   1.1       cgd #define s_scfl		s_s.s_scfl
    145   1.1       cgd #define s_type		s_s.s_type
    146  1.10    rillig #define s_next		s_s.s_next
    147   1.1       cgd 
    148   1.1       cgd /*
    149   1.9    rillig  * Used to store information about function calls.
    150   1.1       cgd  */
    151   1.1       cgd typedef	struct fcall {
    152   1.1       cgd 	pos_t	f_pos;		/* position of call */
    153  1.12    rillig 	bool	f_rused : 1;	/* return value used */
    154  1.12    rillig 	bool	f_rdisc : 1;	/* return value discarded (casted to void) */
    155   1.1       cgd 	u_short	f_type;		/* types of expected return value and args */
    156   1.1       cgd 	arginf_t *f_args;	/* information about constant arguments */
    157  1.11    rillig 	struct	fcall *f_next;	/* next call of same function */
    158   1.1       cgd } fcall_t;
    159   1.1       cgd 
    160   1.1       cgd /*
    161   1.1       cgd  * Used to store information about usage of symbols other
    162   1.1       cgd  * than for function calls.
    163   1.1       cgd  */
    164   1.1       cgd typedef	struct usym {
    165   1.1       cgd 	pos_t	u_pos;		/* position */
    166  1.11    rillig 	struct	usym *u_next;	/* next usage */
    167   1.1       cgd } usym_t;
    168   1.1       cgd 
    169   1.1       cgd /*
    170   1.1       cgd  * hash table entry
    171   1.1       cgd  */
    172   1.1       cgd typedef	struct hte {
    173   1.1       cgd 	const	char *h_name;	/* name */
    174  1.12    rillig 	bool	h_used : 1;	/* symbol is used */
    175  1.12    rillig 	bool	h_def : 1;	/* symbol is defined */
    176  1.12    rillig 	bool	h_static : 1;	/* static symbol */
    177   1.1       cgd 	sym_t	*h_syms;	/* declarations and definitions */
    178  1.10    rillig 	sym_t	**h_lsym;	/* points to s_next of last decl./def. */
    179   1.1       cgd 	fcall_t	*h_calls;	/* function calls */
    180  1.11    rillig 	fcall_t	**h_lcall;	/* points to f_next of last call */
    181   1.1       cgd 	usym_t	*h_usyms;	/* usage info */
    182  1.11    rillig 	usym_t	**h_lusym;	/* points to u_next of last usage info */
    183   1.1       cgd 	struct	hte *h_link;	/* next hte with same hash function */
    184   1.4       cgd 	struct  hte *h_hte;	/* pointer to other htes (for renames */
    185   1.1       cgd } hte_t;
    186   1.1       cgd 
    187   1.1       cgd /* maps type indices into pointers to type structs */
    188   1.1       cgd #define TP(idx)		(tlst[idx])
    189   1.1       cgd 
    190   1.1       cgd #include "externs2.h"
    191