aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2020-12-15 17:10:37 +0100
committerThomas Koenig <tkoenig@gcc.gnu.org>2020-12-15 17:10:37 +0100
commit662de36bf798c8c470b382015283fe3a439cdd8f (patch)
tree0900c00b3911e3d501b1224034e403f807575859
parent4e096e0ff8c428572353a519cdf8726ef3f70f73 (diff)
downloadgcc-662de36bf798c8c470b382015283fe3a439cdd8f.zip
gcc-662de36bf798c8c470b382015283fe3a439cdd8f.tar.gz
gcc-662de36bf798c8c470b382015283fe3a439cdd8f.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.
-rw-r--r--gcc/fortran/invoke.texi11
-rw-r--r--gcc/fortran/lang.opt4
-rw-r--r--gcc/fortran/trans.c42
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 96ed208..57b0264 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 025abe3..ca0b10c 100644
--- a/gcc/fortran/trans.c
+++ b/gcc/fortran/trans.c
@@ -73,6 +73,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
@@ -80,6 +119,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. */