Home | History | Annotate | Line # | Download | only in lint2
lint2.h revision 1.21
      1  1.21    rillig /* $NetBSD: lint2.h,v 1.21 2021/12/22 14:49:11 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.21    rillig 	bool	t_const:1;	/* constant */
     43  1.21    rillig 	bool	t_volatile:1;	/* volatile */
     44  1.21    rillig 	bool	t_vararg:1;	/* function has variable number of arguments */
     45  1.21    rillig 	bool	t_is_enum:1;
     46  1.21    rillig 	bool	t_proto:1;	/* this is a prototype */
     47  1.21    rillig 	bool	t_istag:1;	/* tag with _t_tag valid */
     48  1.21    rillig 	bool	t_istynam:1;	/* tag with _t_tynam valid */
     49  1.21    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.21    rillig 	bool	a_zero:1;	/* argument is 0 */
     87  1.21    rillig 	bool	a_pcon:1;	/* msb of argument is not set */
     88  1.21    rillig 	bool	a_ncon:1;	/* msb of argument is set */
     89  1.21    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.17    rillig 	unsigned 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.17    rillig 	unsigned short p_line;	/* line number in p_src */
    102  1.17    rillig 	unsigned short p_isrc;	/* index of (included) file */
    103  1.17    rillig 	unsigned short p_iline;	/* line number in p_iline */
    104   1.6     lukem } pos_t;
    105   1.1       cgd 
    106  1.19    rillig /* Used for definitions and declarations. */
    107   1.1       cgd typedef	struct sym {
    108   1.1       cgd 	struct {
    109   1.1       cgd 		pos_t	s_pos;		/* pos of def./decl. */
    110  1.18    rillig #if !defined(lint) && !defined(DEBUG)
    111  1.17    rillig 		unsigned char s_def;	/* DECL, TDEF or DEF */
    112   1.1       cgd #else
    113   1.1       cgd 		def_t	s_def;
    114   1.6     lukem #endif
    115  1.21    rillig 		bool	s_function_has_return_value:1;
    116  1.21    rillig 		bool	s_inline:1;
    117  1.21    rillig 		bool	s_old_style_function:1;
    118  1.21    rillig 		bool	s_static:1;
    119  1.21    rillig 		bool	s_check_only_first_args:1;
    120  1.21    rillig 		bool	s_printflike:1;
    121  1.21    rillig 		bool	s_scanflike:1;
    122  1.19    rillig 		unsigned short s_type;
    123  1.19    rillig 		/* XXX: gap of 4 bytes on LP64 platforms */
    124  1.10    rillig 		struct	sym *s_next;	/* next symbol with same name */
    125   1.1       cgd 	} s_s;
    126  1.19    rillig 	/*
    127  1.19    rillig 	 * To save memory, the remaining members are only allocated if one of
    128  1.19    rillig 	 * s_check_only_first_args, s_printflike and s_scanflike is set.
    129  1.19    rillig 	 */
    130  1.19    rillig 	short	s_check_num_args;	/* if s_check_only_first_args */
    131  1.19    rillig 	short	s_printflike_arg;	/* if s_printflike */
    132  1.19    rillig 	short	s_scanflike_arg;	/* if s_scanflike */
    133   1.1       cgd } sym_t;
    134   1.1       cgd 
    135   1.1       cgd #define s_pos		s_s.s_pos
    136  1.19    rillig #define s_function_has_return_value s_s.s_function_has_return_value
    137  1.19    rillig #define s_old_style_function s_s.s_old_style_function
    138   1.8  christos #define s_inline	s_s.s_inline
    139   1.1       cgd #define s_static	s_s.s_static
    140   1.1       cgd #define s_def		s_s.s_def
    141  1.19    rillig #define s_check_only_first_args	s_s.s_check_only_first_args
    142  1.19    rillig #define s_printflike	s_s.s_printflike
    143  1.19    rillig #define s_scanflike	s_s.s_scanflike
    144   1.1       cgd #define s_type		s_s.s_type
    145  1.10    rillig #define s_next		s_s.s_next
    146   1.1       cgd 
    147   1.1       cgd /*
    148   1.9    rillig  * Used to store information about function calls.
    149   1.1       cgd  */
    150   1.1       cgd typedef	struct fcall {
    151   1.1       cgd 	pos_t	f_pos;		/* position of call */
    152  1.21    rillig 	bool	f_rused:1;	/* return value used */
    153  1.21    rillig 	bool	f_rdisc:1;	/* return value discarded (casted to void) */
    154  1.17    rillig 	unsigned short f_type;	/* types of expected return value and args */
    155   1.1       cgd 	arginf_t *f_args;	/* information about constant arguments */
    156  1.11    rillig 	struct	fcall *f_next;	/* next call of same function */
    157   1.1       cgd } fcall_t;
    158   1.1       cgd 
    159   1.1       cgd /*
    160   1.1       cgd  * Used to store information about usage of symbols other
    161   1.1       cgd  * than for function calls.
    162   1.1       cgd  */
    163   1.1       cgd typedef	struct usym {
    164   1.1       cgd 	pos_t	u_pos;		/* position */
    165  1.11    rillig 	struct	usym *u_next;	/* next usage */
    166   1.1       cgd } usym_t;
    167   1.1       cgd 
    168   1.1       cgd /*
    169   1.1       cgd  * hash table entry
    170   1.1       cgd  */
    171   1.1       cgd typedef	struct hte {
    172   1.1       cgd 	const	char *h_name;	/* name */
    173  1.21    rillig 	bool	h_used:1;	/* symbol is used */
    174  1.21    rillig 	bool	h_def:1;	/* symbol is defined */
    175  1.21    rillig 	bool	h_static:1;	/* static symbol */
    176   1.1       cgd 	sym_t	*h_syms;	/* declarations and definitions */
    177  1.10    rillig 	sym_t	**h_lsym;	/* points to s_next of last decl./def. */
    178   1.1       cgd 	fcall_t	*h_calls;	/* function calls */
    179  1.11    rillig 	fcall_t	**h_lcall;	/* points to f_next of last call */
    180   1.1       cgd 	usym_t	*h_usyms;	/* usage info */
    181  1.11    rillig 	usym_t	**h_lusym;	/* points to u_next of last usage info */
    182   1.1       cgd 	struct	hte *h_link;	/* next hte with same hash function */
    183  1.14    rillig 	struct  hte *h_hte;	/* pointer to other htes (for renames) */
    184   1.1       cgd } hte_t;
    185   1.1       cgd 
    186  1.15    rillig #include "externs2.h"
    187  1.15    rillig 
    188   1.1       cgd /* maps type indices into pointers to type structs */
    189  1.20    rillig INLINE_FUNC type_t *
    190  1.17    rillig TP(unsigned short type_id) {
    191  1.15    rillig 	/* force sequence point for newly parsed type_id */
    192  1.15    rillig 	return tlst[type_id];
    193  1.15    rillig }
    194