diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2020-12-15 17:10:37 +0100 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2020-12-16 21:41:03 +0100 |
commit | e3caaf97e6fbe6743d7d9c1a2ba3777eec86b5a1 (patch) | |
tree | 1f3c721e08f5517f3b66d7794cdc086c7ed73033 | |
parent | 00c6e637482ec236c588698a9502c0c12cc2d704 (diff) | |
download | gcc-e3caaf97e6fbe6743d7d9c1a2ba3777eec86b5a1.zip gcc-e3caaf97e6fbe6743d7d9c1a2ba3777eec86b5a1.tar.gz gcc-e3caaf97e6fbe6743d7d9c1a2ba3777eec86b5a1.tar.bz2 |
Add the -fdebug-aux-vars flag to debug variables generated by Fortran.
gcc/fortran/ChangeLog:
PR fortran/90207
* invoke.texi: Document -fdebug-aux-vars.
* lang.opt: Add -fdebug-aux-vars.
* trans.c (MAX_PREFIX_LEN): New macro.
(create_var_debug_raw): New function.
(gfc_create_var_np): Call create_var_debug_raw if
flag_debug_aux_vars is set.
(cherry picked from commit 662de36bf798c8c470b382015283fe3a439cdd8f)
-rw-r--r-- | gcc/fortran/invoke.texi | 11 | ||||
-rw-r--r-- | gcc/fortran/lang.opt | 4 | ||||
-rw-r--r-- | gcc/fortran/trans.c | 42 |
3 files changed, 56 insertions, 1 deletions
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index 8bdc8a6..069ccd3 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -160,7 +160,7 @@ and warnings}. @item Debugging Options @xref{Debugging Options,,Options for debugging your program or GNU Fortran}. @gccoptlist{-fbacktrace -fdump-fortran-optimized -fdump-fortran-original @gol --fdump-fortran-global -fdump-parse-tree -ffpe-trap=@var{list} @gol +-fdebug-aux-vars -fdump-fortran-global -fdump-parse-tree -ffpe-trap=@var{list} @gol -ffpe-summary=@var{list} } @@ -1219,6 +1219,15 @@ change between releases. This option may also generate internal compiler errors for features which have only recently been added. This option is deprecated; use @code{-fdump-fortran-original} instead. +@item -fdebug-aux-vars +@opindex @code{fdebug-aux-vars} +Renames internal variables created by the gfortran front end and makes +them accessible to a debugger. The name of the internal variables then +start with upper-case letters followed by an underscore. This option is +useful for debugging the compiler's code generation together with +@code{-fdump-tree-original} and enabling debugging of the executable +program by using @code{-g} or @code{-ggdb3}. + @item -fdump-fortran-global @opindex @code{fdump-fortran-global} Output a list of the global identifiers after translating into diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt index 063f006..b93da4e 100644 --- a/gcc/fortran/lang.opt +++ b/gcc/fortran/lang.opt @@ -452,6 +452,10 @@ fd-lines-as-comments Fortran RejectNegative Treat lines with 'D' in column one as comments. +fdebug-aux-vars +Fortran Var(flag_debug_aux_vars) +Issue debug information for compiler-generated auxiliary variables. + fdec Fortran Var(flag_dec) Enable all DEC language extensions. diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index f1c8f0e..aa30710 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -88,6 +88,45 @@ gfc_advance_chain (tree t, int n) return t; } +static int num_var; + +#define MAX_PREFIX_LEN 20 + +static tree +create_var_debug_raw (tree type, const char *prefix) +{ + /* Space for prefix + "_" + 10-digit-number + \0. */ + char name_buf[MAX_PREFIX_LEN + 1 + 10 + 1]; + tree t; + int i; + + if (prefix == NULL) + prefix = "gfc"; + else + gcc_assert (strlen (prefix) <= MAX_PREFIX_LEN); + + for (i = 0; prefix[i] != 0; i++) + name_buf[i] = gfc_wide_toupper (prefix[i]); + + snprintf (name_buf + i, sizeof (name_buf) - i, "_%d", num_var++); + + t = build_decl (input_location, VAR_DECL, get_identifier (name_buf), type); + + /* We want debug info for it. */ + DECL_IGNORED_P (t) = 0; + /* It should not be nameless. */ + DECL_NAMELESS (t) = 0; + + /* Make the variable writable. */ + TREE_READONLY (t) = 0; + + DECL_EXTERNAL (t) = 0; + TREE_STATIC (t) = 0; + TREE_USED (t) = 1; + + return t; +} + /* Creates a variable declaration with a given TYPE. */ tree @@ -95,6 +134,9 @@ gfc_create_var_np (tree type, const char *prefix) { tree t; + if (flag_debug_aux_vars) + return create_var_debug_raw (type, prefix); + t = create_tmp_var_raw (type, prefix); /* No warnings for anonymous variables. */ |