Adding debug option for showing the linearized instruction. Index: sparse/lib.c =================================================================== --- sparse.orig/lib.c 2007-02-02 16:57:04.000000000 -0800 +++ sparse/lib.c 2007-02-02 17:06:51.000000000 -0800 @@ -190,6 +190,9 @@ int Waddress_space = 1; int Wenum_mismatch = 1; int Wdo_while = 1; int Wuninitialized = 1; + +int dbg_entry; + int preprocess_only; char *include; @@ -237,14 +240,6 @@ static char **handle_switch_E(char *arg, return next; } -static char **handle_switch_v(char *arg, char **next) -{ - do { - verbose++; - } while (*++arg == 'v'); - return next; -} - static char **handle_switch_I(char *arg, char **next) { char *path = arg+1; @@ -352,14 +347,14 @@ enum { }; -static char **handle_switch_W(char *arg, char **next) +static char **handle_onoff_switch(char *arg, char **next, const struct warning warnings[], int n) { int flag = WARNING_ON; char *p = arg + 1; unsigned i; if (!strcmp(p, "all")) { - for (i = 0; i < sizeof(warnings) / sizeof(warnings[0]); i++) { + for (i = 0; i < n; i++) { if (*warnings[i].flag != WARNING_FORCE_OFF) *warnings[i].flag = WARNING_ON; } @@ -373,7 +368,7 @@ static char **handle_switch_W(char *arg, flag = WARNING_FORCE_OFF; } - for (i = 0; i < sizeof(warnings) / sizeof(warnings[0]); i++) { + for (i = 0; i < n; i++) { if (!strcmp(p,warnings[i].name)) { *warnings[i].flag = flag; return next; @@ -381,26 +376,65 @@ static char **handle_switch_W(char *arg, } // Unknown. + return NULL; +} + +static char **handle_switch_W(char *arg, char **next) +{ + char ** ret = handle_onoff_switch(arg, next, warnings, sizeof warnings/sizeof warnings[0]); + if (ret) + return ret; + + // Unknown. return next; } -static void handle_switch_W_finalize(void) +static struct warning debugs[] = { + { "entry", &dbg_entry}, +}; + + +static char **handle_switch_v(char *arg, char **next) +{ + char ** ret = handle_onoff_switch(arg, next, debugs, sizeof debugs/sizeof debugs[0]); + if (ret) + return ret; + + // Unknown. + do { + verbose++; + } while (*++arg == 'v'); + return next; +} + + +static void handle_onoff_switch_finalize(const struct warning warnings[], int n) { unsigned i; - for (i = 0; i < sizeof(warnings) / sizeof(warnings[0]); i++) { + for (i = 0; i < n; i++) { if (*warnings[i].flag == WARNING_FORCE_OFF) *warnings[i].flag = WARNING_OFF; } } +static void handle_switch_W_finalize(void) +{ + handle_onoff_switch_finalize(warnings, sizeof(warnings) / sizeof(warnings[0])); +} + +static void handle_switch_v_finalize(void) +{ + handle_onoff_switch_finalize(debugs, sizeof(debugs) / sizeof(debugs[0])); +} + static char **handle_switch_U(char *arg, char **next) { const char *name = arg + 1; add_pre_buffer ("#undef %s\n", name); return next; } - + static char **handle_switch_O(char *arg, char **next) { int level = 1; @@ -661,6 +695,7 @@ struct symbol_list *sparse_initialize(in add_ptr_list_notag(filelist, arg); } handle_switch_W_finalize(); + handle_switch_v_finalize(); list = NULL; if (!ptr_list_empty(filelist)) { Index: sparse/lib.h =================================================================== --- sparse.orig/lib.h 2007-02-02 16:57:04.000000000 -0800 +++ sparse/lib.h 2007-02-02 17:06:51.000000000 -0800 @@ -97,6 +97,8 @@ extern int Wcast_truncate; extern int Wdo_while; extern int Wuninitialized; +extern int dbg_entry; + extern void declare_builtin_functions(void); extern void create_builtin_stream(void); extern struct symbol_list *sparse_initialize(int argc, char **argv, struct string_list **files); Index: sparse/sparse.c =================================================================== --- sparse.orig/sparse.c 2007-02-02 16:57:04.000000000 -0800 +++ sparse/sparse.c 2007-02-02 17:06:51.000000000 -0800 @@ -264,8 +264,12 @@ static void check_symbols(struct symbol_ expand_symbol(sym); ep = linearize_symbol(sym); - if (ep) + if (ep) { + if (dbg_entry) + show_entry(ep); + check_context(ep); + } } END_FOR_EACH_PTR(sym); }