The effect of this flag is to dump the IR just after the linearization, before any simplification, and to stop further processing if '=only' is given as argument. The motivation of this flag is of course for debugging, to be able to inspect the raw result of the linearization, undisturbed by an simplification. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- lib.c | 22 ++++++++++++++++++++++ lib.h | 2 ++ linearize.c | 6 ++++++ sparse.1 | 7 +++++++ 4 files changed, 37 insertions(+) diff --git a/lib.c b/lib.c index 272d2c88a..f5e4860a6 100644 --- a/lib.c +++ b/lib.c @@ -250,6 +250,8 @@ int Wvla = 1; int dbg_entry = 0; int dbg_dead = 0; +int fdump_linearize; + int preprocess_only; static enum { STANDARD_C89, @@ -645,12 +647,32 @@ static char **handle_switch_ftabstop(char *arg, char **next) return next; } +static char **handle_switch_fdump(char *arg, char **next) +{ + if (!strncmp(arg, "linearize", 9)) { + if (arg[6] == '\0') + fdump_linearize = 1; + else if (!strcmp(arg+9, "=only")) + fdump_linearize = 2; + else + goto err; + } + + /* ignore others flags */ + return next; + +err: + die("error: unknown flag \"-fdump-%s\"", arg); +} + static char **handle_switch_f(char *arg, char **next) { arg++; if (!strncmp(arg, "tabstop=", 8)) return handle_switch_ftabstop(arg+8, next); + if (!strncmp(arg, "dump-", 5)) + return handle_switch_fdump(arg+5, next); /* handle switches w/ arguments above, boolean and only boolean below */ diff --git a/lib.h b/lib.h index 134e56040..fb612d154 100644 --- a/lib.h +++ b/lib.h @@ -136,6 +136,8 @@ extern int Wvla; extern int dbg_entry; extern int dbg_dead; +extern int fdump_linearize; + extern int arch_m64; extern void declare_builtin_functions(void); diff --git a/linearize.c b/linearize.c index 2f850fb7e..61c804333 100644 --- a/linearize.c +++ b/linearize.c @@ -2171,6 +2171,12 @@ static struct entrypoint *linearize_fn(struct symbol *sym, struct symbol *base_t add_one_insn(ep, insn); } + if (fdump_linearize) { + if (fdump_linearize == 2) + return ep; + show_entry(ep); + } + /* * Do trivial flow simplification - branches to * branches, kill dead basicblocks etc diff --git a/sparse.1 b/sparse.1 index 85d6e646b..525d3ded5 100644 --- a/sparse.1 +++ b/sparse.1 @@ -344,6 +344,13 @@ Look for system headers in the multiarch subdirectory \fIdir\fR. The \fIdir\fR name would normally take the form of the target's normalized GNU triplet. (e.g. i386-linux-gnu). . +.SH DEBUG OPTIONS +.TP +.B \-fdump-linearize[=only] +Dump the IR code of a function directly after its linearization, +before any simplifications is made. If the argument \fB=only\fR is +also given no further processing is done on the function. +. .SH OTHER OPTIONS .TP .B \-ftabstop=WIDTH -- 2.12.0 -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html