Module Name: src Committed By: rillig Date: Sun Jul 2 10:20:46 UTC 2023
Modified Files: src/usr.bin/xlint/lint1: debug.c decl.c externs1.h func.c lex.c Log Message: lint: extend debug logging for declaration levels Indent the debug logging according to the declaration level. Since there are a few cases where the enclosing declaration levels are modified, log the whole declaration level stack whenever a level begins or ends. To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.43 src/usr.bin/xlint/lint1/debug.c cvs rdiff -u -r1.334 -r1.335 src/usr.bin/xlint/lint1/decl.c cvs rdiff -u -r1.185 -r1.186 src/usr.bin/xlint/lint1/externs1.h cvs rdiff -u -r1.161 -r1.162 src/usr.bin/xlint/lint1/func.c cvs rdiff -u -r1.164 -r1.165 src/usr.bin/xlint/lint1/lex.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/xlint/lint1/debug.c diff -u src/usr.bin/xlint/lint1/debug.c:1.42 src/usr.bin/xlint/lint1/debug.c:1.43 --- src/usr.bin/xlint/lint1/debug.c:1.42 Sun Jul 2 08:16:19 2023 +++ src/usr.bin/xlint/lint1/debug.c Sun Jul 2 10:20:45 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.42 2023/07/02 08:16:19 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.43 2023/07/02 10:20:45 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: debug.c,v 1.42 2023/07/02 08:16:19 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.43 2023/07/02 10:20:45 rillig Exp $"); #endif #include <stdlib.h> @@ -393,8 +393,8 @@ debug_sym(const char *prefix, const sym_ debug_printf("%s", suffix); } -void -debug_dinfo(const decl_level *dl) +static void +debug_decl_level(const decl_level *dl) { debug_print_indent(); @@ -446,11 +446,18 @@ debug_dinfo(const decl_level *dl) sym != NULL; sym = sym->s_next) debug_sym(" func_proto_sym(", sym, ")"); debug_printf("\n"); +} - if (dl->d_enclosing != NULL) { - debug_indent_inc(); - debug_dinfo(dl->d_enclosing); - debug_indent_dec(); +void +debug_dcs(bool all) +{ + int prev_indentation = debug_indentation; + for (const decl_level *dl = dcs; dl != NULL; dl = dl->d_enclosing) { + debug_decl_level(dl); + if (!all) + return; + debug_indentation++; } + debug_indentation = prev_indentation; } #endif Index: src/usr.bin/xlint/lint1/decl.c diff -u src/usr.bin/xlint/lint1/decl.c:1.334 src/usr.bin/xlint/lint1/decl.c:1.335 --- src/usr.bin/xlint/lint1/decl.c:1.334 Sun Jul 2 09:40:25 2023 +++ src/usr.bin/xlint/lint1/decl.c Sun Jul 2 10:20:45 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: decl.c,v 1.334 2023/07/02 09:40:25 rillig Exp $ */ +/* $NetBSD: decl.c,v 1.335 2023/07/02 10:20:45 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: decl.c,v 1.334 2023/07/02 09:40:25 rillig Exp $"); +__RCSID("$NetBSD: decl.c,v 1.335 2023/07/02 10:20:45 rillig Exp $"); #endif #include <sys/param.h> @@ -71,7 +71,7 @@ static bool prototypes_compatible(const static bool matches_no_arg_function(const type_t *, bool *); static bool check_old_style_definition(sym_t *, sym_t *); static bool check_prototype_declaration(sym_t *, sym_t *); -static sym_t *new_style_function(sym_t *); +static void check_prototype_parameters(sym_t *); static void old_style_function(sym_t *, sym_t *); static void declare_external_in_block(sym_t *); static bool check_init(sym_t *); @@ -520,19 +520,20 @@ begin_declaration_level(decl_level_kind dl->d_kind = kind; dl->d_last_dlsym = &dl->d_first_dlsym; dcs = dl; - debug_step("%s(%s)", __func__, decl_level_kind_name(kind)); + debug_enter(); + debug_dcs(true); } void end_declaration_level(void) { - decl_level *dl; - debug_step("%s(%s)", __func__, decl_level_kind_name(dcs->d_kind)); + debug_dcs(true); + debug_leave(); - lint_assert(dcs->d_enclosing != NULL); - dl = dcs; + decl_level *dl = dcs; dcs = dl->d_enclosing; + lint_assert(dcs != NULL); switch (dl->d_kind) { case DLK_STRUCT: @@ -576,7 +577,7 @@ end_declaration_level(void) /* FALLTHROUGH */ case DLK_PROTO_PARAMS: /* usage of arguments will be checked by end_function() */ - rmsyms(dl->d_first_dlsym); + symtab_remove_level(dl->d_first_dlsym); break; case DLK_EXTERN: /* there is nothing around an external declarations */ @@ -1213,7 +1214,7 @@ sym_t * add_pointer(sym_t *decl, qual_ptr *p) { - debug_dinfo(dcs); + debug_dcs(false); type_t **tpp = &decl->s_type; while (*tpp != NULL && *tpp != dcs->d_type) @@ -1283,7 +1284,7 @@ sym_t * add_array(sym_t *decl, bool dim, int n) { - debug_dinfo(dcs); + debug_dcs(false); type_t **tpp = &decl->s_type; while (*tpp != NULL && *tpp != dcs->d_type) @@ -1317,7 +1318,7 @@ add_function(sym_t *decl, sym_t *args) { debug_enter(); - debug_dinfo(dcs); + debug_dcs(true); debug_sym("decl: ", decl, "\n"); #ifdef DEBUG for (const sym_t *arg = args; arg != NULL; arg = arg->s_next) @@ -1328,7 +1329,9 @@ add_function(sym_t *decl, sym_t *args) if (!allow_c90) /* function prototypes are illegal in traditional C */ warning(270); - args = new_style_function(args); + check_prototype_parameters(args); + if (args != NULL && args->s_type->t_tspec == VOID) + args = NULL; } else old_style_function(decl, args); @@ -1372,12 +1375,13 @@ add_function(sym_t *decl, sym_t *args) dcs->d_prototype, args, dcs->d_vararg); debug_step("add_function: '%s'", type_name(decl->s_type)); + debug_dcs(true); debug_leave(); return decl; } -static sym_t * -new_style_function(sym_t *args) +static void +check_prototype_parameters(sym_t *args) { for (sym_t *sym = dcs->d_first_dlsym; @@ -1397,10 +1401,6 @@ new_style_function(sym_t *args) arg->s_type = gettyp(INT); } } - - if (args == NULL || args->s_type->t_tspec == VOID) - return NULL; - return args; } static void Index: src/usr.bin/xlint/lint1/externs1.h diff -u src/usr.bin/xlint/lint1/externs1.h:1.185 src/usr.bin/xlint/lint1/externs1.h:1.186 --- src/usr.bin/xlint/lint1/externs1.h:1.185 Sat Jul 1 09:31:55 2023 +++ src/usr.bin/xlint/lint1/externs1.h Sun Jul 2 10:20:45 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: externs1.h,v 1.185 2023/07/01 09:31:55 rillig Exp $ */ +/* $NetBSD: externs1.h,v 1.186 2023/07/02 10:20:45 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -90,7 +90,7 @@ void clean_up_after_error(void); sym_t *pushdown(const sym_t *); sym_t *mktempsym(type_t *); void rmsym(sym_t *); -void rmsyms(sym_t *); +void symtab_remove_level(sym_t *); void inssym(int, sym_t *); void freeyyv(void *, int); int yylex(void); @@ -122,7 +122,7 @@ const char *decl_level_kind_name(decl_le const char *scl_name(scl_t); const char *symt_name(symt_t); const char *tqual_name(tqual_t); -void debug_dinfo(const decl_level *); +void debug_dcs(bool); void debug_node(const tnode_t *); void debug_type(const type_t *); void debug_sym(const char *, const sym_t *, const char *); @@ -138,7 +138,7 @@ void debug_leave_func(const char *); #define debug_leave() debug_leave_func(__func__) #else #define debug_noop() do { } while (false) -#define debug_dinfo(d) debug_noop() +#define debug_dcs(all) debug_noop() #define debug_sym(p, sym, s) debug_noop() #define debug_symtab() debug_noop() #define debug_node(tn) debug_noop() Index: src/usr.bin/xlint/lint1/func.c diff -u src/usr.bin/xlint/lint1/func.c:1.161 src/usr.bin/xlint/lint1/func.c:1.162 --- src/usr.bin/xlint/lint1/func.c:1.161 Sat Jul 1 09:31:55 2023 +++ src/usr.bin/xlint/lint1/func.c Sun Jul 2 10:20:45 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: func.c,v 1.161 2023/07/01 09:31:55 rillig Exp $ */ +/* $NetBSD: func.c,v 1.162 2023/07/02 10:20:45 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: func.c,v 1.161 2023/07/01 09:31:55 rillig Exp $"); +__RCSID("$NetBSD: func.c,v 1.162 2023/07/02 10:20:45 rillig Exp $"); #endif #include <stdlib.h> @@ -421,7 +421,7 @@ end_function(void) */ lint_assert(dcs->d_enclosing == NULL); lint_assert(dcs->d_kind == DLK_EXTERN); - rmsyms(dcs->d_func_proto_syms); + symtab_remove_level(dcs->d_func_proto_syms); /* must be set on level 0 */ set_reached(true); Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.164 src/usr.bin/xlint/lint1/lex.c:1.165 --- src/usr.bin/xlint/lint1/lex.c:1.164 Fri Jun 30 21:39:54 2023 +++ src/usr.bin/xlint/lint1/lex.c Sun Jul 2 10:20:45 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.164 2023/06/30 21:39:54 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.165 2023/07/02 10:20:45 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: lex.c,v 1.164 2023/06/30 21:39:54 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.165 2023/07/02 10:20:45 rillig Exp $"); #endif #include <ctype.h> @@ -1403,14 +1403,13 @@ rmsym(sym_t *sym) * given symbol. */ void -rmsyms(sym_t *syms) +symtab_remove_level(sym_t *syms) { - sym_t *sym; /* Note the use of s_level_next instead of s_symtab_next. */ - for (sym = syms; sym != NULL; sym = sym->s_level_next) { + for (sym_t *sym = syms; sym != NULL; sym = sym->s_level_next) { if (sym->s_block_level != -1) { - debug_step("rmsyms '%s' %s '%s'", + debug_step("symtab_remove_level '%s' %s '%s'", sym->s_name, symt_name(sym->s_kind), type_name(sym->s_type)); symtab_remove(sym);