From c3f305bea1654d03a76a6dce99c298dce95a4e51 Mon Sep 17 00:00:00 2001 From: eck Date: Fri, 19 Oct 1990 11:21:43 +0000 Subject: [PATCH] fixed bug with undefined structs ceriel changed debugging information --- lang/cem/cemcom.ansi/ch3.c | 4 ++++ lang/cem/cemcom.ansi/code.c | 41 +++++++++++++++++++++++++---------- lang/cem/cemcom.ansi/declar.g | 5 +++++ lang/cem/cemcom.ansi/stack.c | 13 +++++++++-- 4 files changed, 49 insertions(+), 14 deletions(-) diff --git a/lang/cem/cemcom.ansi/ch3.c b/lang/cem/cemcom.ansi/ch3.c index 0b1d06297..9f9535216 100644 --- a/lang/cem/cemcom.ansi/ch3.c +++ b/lang/cem/cemcom.ansi/ch3.c @@ -195,6 +195,10 @@ ch3cast(expp, oper, tp) string2pointer(*expp); oldtp = (*expp)->ex_type; + if (oldtp->tp_size <= 0) { + expr_error(*expp,"incomplete type in expression"); + } + #ifndef NOBITFIELD if (oldtp->tp_fund == FIELD) { field2arith(expp); diff --git a/lang/cem/cemcom.ansi/code.c b/lang/cem/cemcom.ansi/code.c index e519df2fd..1d3f47cf3 100644 --- a/lang/cem/cemcom.ansi/code.c +++ b/lang/cem/cemcom.ansi/code.c @@ -31,7 +31,7 @@ #include "specials.h" #include "atw.h" #include "assert.h" -#include "file_info.h" +#include "LLlex.h" #ifdef LINT #include "l_lint.h" #endif LINT @@ -267,8 +267,12 @@ begin_proc(ds, idf) /* to be called when entering a procedure */ C_insertpart(pro_id = C_getid()); #endif if (is_struct_or_union(func_type->tp_fund)) { - C_df_dlb(func_res_label = data_label()); - C_bss_cst(func_size, (arith)0, 1); + if (func_size <= 0) { + error("unknown return type for function %s", name); + } else { + C_df_dlb(func_res_label = data_label()); + C_bss_cst(func_size, (arith)0, 1); + } } else func_res_label = 0; @@ -383,6 +387,9 @@ do_return() probably smarter than generating a direct return. Return sequences may be expensive. */ +#ifdef DBSYMTAB + if (options['g']) db_line(dot.tk_file, dot.tk_line); +#endif /* DBSYMTAB */ C_bra(return2_label); } @@ -444,7 +451,6 @@ code_declaration(idf, expr, lvl, sc) /* is this an allocating declaration? */ if ( (sc == 0 || sc == STATIC) && fund != FUNCTION - && size >= 0 ) def->df_alloc = ALLOC_SEEN; if (expr && def_sc == STATIC && sc == EXTERN) { @@ -609,8 +615,13 @@ bss(idf) stb_string(df, df->df_sc, idf->id_text); } #endif /* DBSYMTAB */ - C_df_dnam(idf->id_text); - C_bss_cst(ATW(df->df_type->tp_size), (arith)0, 1); + if (df->df_type->tp_size <= 0) { + error("size of %s unknown (\"%s\", line %d)" + , idf->id_text, df->df_file, df->df_line); + } else { + C_df_dnam(idf->id_text); + C_bss_cst(ATW(df->df_type->tp_size), (arith)0, 1); + } } formal_cvt(hasproto,df) @@ -655,7 +666,7 @@ code_expr(expr, val, code, tlbl, flbl) if (! options['L']) /* profiling */ C_lin((arith)(expr->ex_line)); #ifdef DBSYMTAB - if (options['g']) db_line(expr->ex_file, (int)expr->ex_line); + if (options['g']) db_line(expr->ex_file, (unsigned int)expr->ex_line); #endif EVAL(expr, val, code, tlbl, flbl); @@ -683,6 +694,9 @@ code_break() { register struct stmt_block *stmt_block = stmt_stack; +#ifdef DBSYMTAB + if (options['g']) db_line(dot.tk_file, dot.tk_line); +#endif /* DBSYMTAB */ if (stmt_block) C_bra(stmt_block->st_break); else @@ -700,6 +714,9 @@ code_continue() while (stmt_block) { if (stmt_block->st_continue) { +#ifdef DBSYMTAB + if (options['g']) db_line(dot.tk_file, dot.tk_line); +#endif /* DBSYMTAB */ C_bra(stmt_block->st_continue); return; } @@ -754,16 +771,16 @@ prc_exit() #ifdef DBSYMTAB db_line(file, line) - char *file; - int line; + char *file; + unsigned int line; { - static int oldline; + static unsigned oldline; static char *oldfile; if (file != oldfile || line != oldline) { - C_ms_std((char *) 0, N_SLINE, line); + C_ms_std((char *) 0, N_SLINE, (int) line); oldline = line; oldfile = file; } } -#endif +#endif /* DBSYMTAB */ diff --git a/lang/cem/cemcom.ansi/declar.g b/lang/cem/cemcom.ansi/declar.g index 07079b858..ed4b8e856 100644 --- a/lang/cem/cemcom.ansi/declar.g +++ b/lang/cem/cemcom.ansi/declar.g @@ -264,6 +264,11 @@ initializer(struct idf *idf; int sc;) #ifdef LINT change_state(idf, SET); #endif LINT +#ifdef DBSYMTAB + if (options['g'] && level >= L_LOCAL && expr) { + db_line(expr->ex_file, (int) expr->ex_line); + } +#endif /* DBSYMTAB */ if (autoagg) loc_init((struct expr *) 0, idf); else code_declaration(idf, expr, level, sc); diff --git a/lang/cem/cemcom.ansi/stack.c b/lang/cem/cemcom.ansi/stack.c index 94d766176..879bd5b25 100644 --- a/lang/cem/cemcom.ansi/stack.c +++ b/lang/cem/cemcom.ansi/stack.c @@ -59,9 +59,18 @@ stack_idf(idf, stl) struct idf *idf; register struct stack_level *stl; { - /* The identifier idf is inserted in the stack on level stl. + /* The identifier idf is inserted in the stack on level stl, + but only if it is not already present at this level. */ - register struct stack_entry *se = new_stack_entry(); + register struct stack_entry *se; + + se = stl->sl_entry; + while (se) { + if (se->se_idf == idf) return; + se = se->next; + } + + se = new_stack_entry(); /* link it into the stack level */ se->next = stl->sl_entry; -- 2.34.1