Home | History | Annotate | Line # | Download | only in lint2
lint2.h revision 1.14
      1  1.14    rillig /* $NetBSD: lint2.h,v 1.14 2021/04/10 18:36:27 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.14    rillig struct lint2_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.14    rillig 		struct	lint2_type **_t_args; /* list of argument types if
     65  1.14    rillig 					   this is a prototype */
     66   1.1       cgd 	} t_u;
     67  1.14    rillig 	struct	lint2_type *t_subt;	/* element type (if ARRAY),
     68  1.14    rillig 					   return type (if FUNC),
     69  1.14    rillig 					   target type (if PTR) */
     70   1.7  christos };
     71   1.1       cgd 
     72   1.3       cgd #define	t_dim		t_u._t_dim
     73   1.3       cgd #define	t_tag		t_u._t_tag
     74   1.3       cgd #define	t_tynam		t_u._t_tynam
     75   1.3       cgd #define	t_uniqpos	t_u._t_uniqpos
     76   1.3       cgd #define	t_args		t_u._t_args
     77   1.1       cgd 
     78   1.1       cgd /*
     79   1.1       cgd  * argument information
     80   1.1       cgd  *
     81   1.1       cgd  * Such a structure is created for each argument of a function call
     82   1.1       cgd  * which is an integer constant or a constant string.
     83   1.1       cgd  */
     84   1.1       cgd typedef	struct arginf {
     85   1.1       cgd 	int	a_num;		/* # of argument (1..) */
     86  1.12    rillig 	bool	a_zero : 1;	/* argument is 0 */
     87  1.12    rillig 	bool	a_pcon : 1;	/* msb of argument is not set */
     88  1.12    rillig 	bool	a_ncon : 1;	/* msb of argument is set */
     89  1.12    rillig 	bool	a_fmt : 1;	/* a_fstrg points to format string */
     90   1.1       cgd 	char	*a_fstrg;	/* format string */
     91  1.11    rillig 	struct	arginf *a_next;	/* information for next const. argument */
     92   1.1       cgd } arginf_t;
     93   1.1       cgd 
     94   1.1       cgd /*
     95   1.1       cgd  * Keeps information about position in source file.
     96   1.1       cgd  */
     97   1.1       cgd typedef	struct {
     98   1.1       cgd 	u_short	p_src;		/* index of name of translation unit
     99   1.1       cgd 				   (the name which was specified at the
    100   1.1       cgd 				   command line) */
    101   1.1       cgd 	u_short	p_line;		/* line number in p_src */
    102   1.1       cgd 	u_short	p_isrc;		/* index of (included) file */
    103   1.1       cgd 	u_short p_iline;	/* line number in p_iline */
    104   1.6     lukem } pos_t;
    105   1.1       cgd 
    106   1.1       cgd /*
    107   1.1       cgd  * Used for definitions and declarations
    108   1.1       cgd  *
    109   1.1       cgd  * To save memory, variable sized structures are used. If
    110   1.1       cgd  * all s_va, s_prfl and s_scfl are not set, the memory allocated
    111   1.1       cgd  * for a symbol is only large enough to keep the first member of
    112   1.1       cgd  * struct sym, s_s.
    113   1.1       cgd  */
    114   1.1       cgd typedef	struct sym {
    115   1.1       cgd 	struct {
    116   1.1       cgd 		pos_t	s_pos;		/* pos of def./decl. */
    117   1.1       cgd #ifndef lint
    118   1.1       cgd 		u_int	s_def : 3;	/* DECL, TDEF or DEF */
    119   1.1       cgd #else
    120   1.1       cgd 		def_t	s_def;
    121   1.6     lukem #endif
    122  1.12    rillig 		bool	s_rval : 1;	/* function has return value */
    123  1.12    rillig 		bool	s_inline : 1;	/* function is inline */
    124  1.12    rillig 		bool	s_osdef : 1;	/* old style function definition */
    125  1.12    rillig 		bool	s_static : 1;	/* symbol is static */
    126  1.12    rillig 		bool	s_va : 1;	/* check only first s_nva arguments */
    127  1.12    rillig 		bool	s_prfl : 1;	/* printflike */
    128  1.12    rillig 		bool	s_scfl : 1;	/* scanflike */
    129   1.1       cgd 		u_short	s_type;		/* type */
    130  1.10    rillig 		struct	sym *s_next;	/* next symbol with same name */
    131   1.1       cgd 	} s_s;
    132   1.1       cgd 	short	s_nva;
    133   1.1       cgd 	short	s_nprfl;
    134   1.1       cgd 	short	s_nscfl;
    135   1.1       cgd } sym_t;
    136   1.1       cgd 
    137   1.1       cgd #define s_pos		s_s.s_pos
    138   1.1       cgd #define s_rval		s_s.s_rval
    139   1.1       cgd #define s_osdef		s_s.s_osdef
    140   1.8  christos #define s_inline	s_s.s_inline
    141   1.1       cgd #define s_static	s_s.s_static
    142   1.1       cgd #define s_def		s_s.s_def
    143   1.1       cgd #define s_va		s_s.s_va
    144   1.1       cgd #define s_prfl		s_s.s_prfl
    145   1.1       cgd #define s_scfl		s_s.s_scfl
    146   1.1       cgd #define s_type		s_s.s_type
    147  1.10    rillig #define s_next		s_s.s_next
    148   1.1       cgd 
    149   1.1       cgd /*
    150   1.9    rillig  * Used to store information about function calls.
    151   1.1       cgd  */
    152   1.1       cgd typedef	struct fcall {
    153   1.1       cgd 	pos_t	f_pos;		/* position of call */
    154  1.12    rillig 	bool	f_rused : 1;	/* return value used */
    155  1.12    rillig 	bool	f_rdisc : 1;	/* return value discarded (casted to void) */
    156   1.1       cgd 	u_short	f_type;		/* types of expected return value and args */
    157   1.1       cgd 	arginf_t *f_args;	/* information about constant arguments */
    158  1.11    rillig 	struct	fcall *f_next;	/* next call of same function */
    159   1.1       cgd } fcall_t;
    160   1.1       cgd 
    161   1.1       cgd /*
    162   1.1       cgd  * Used to store information about usage of symbols other
    163   1.1       cgd  * than for function calls.
    164   1.1       cgd  */
    165   1.1       cgd typedef	struct usym {
    166   1.1       cgd 	pos_t	u_pos;		/* position */
    167  1.11    rillig 	struct	usym *u_next;	/* next usage */
    168   1.1       cgd } usym_t;
    169   1.1       cgd 
    170   1.1       cgd /*
    171   1.1       cgd  * hash table entry
    172   1.1       cgd  */
    173   1.1       cgd typedef	struct hte {
    174   1.1       cgd 	const	char *h_name;	/* name */
    175  1.12    rillig 	bool	h_used : 1;	/* symbol is used */
    176  1.12    rillig 	bool	h_def : 1;	/* symbol is defined */
    177  1.12    rillig 	bool	h_static : 1;	/* static symbol */
    178   1.1       cgd 	sym_t	*h_syms;	/* declarations and definitions */
    179  1.10    rillig 	sym_t	**h_lsym;	/* points to s_next of last decl./def. */
    180   1.1       cgd 	fcall_t	*h_calls;	/* function calls */
    181  1.11    rillig 	fcall_t	**h_lcall;	/* points to f_next of last call */
    182   1.1       cgd 	usym_t	*h_usyms;	/* usage info */
    183  1.11    rillig 	usym_t	**h_lusym;	/* points to u_next of last usage info */
    184   1.1       cgd 	struct	hte *h_link;	/* next hte with same hash function */
    185  1.14    rillig 	struct  hte *h_hte;	/* pointer to other htes (for renames) */
    186   1.1       cgd } hte_t;
    187   1.1       cgd 
    188   1.1       cgd /* maps type indices into pointers to type structs */
    189   1.1       cgd #define TP(idx)		(tlst[idx])
    190   1.1       cgd 
    191   1.1       cgd #include "externs2.h"
    192