PR modula2/113836 gm2 does not dump gimple or quadruples to a file

This patch completes the implementation of dumping the intermediate forms
to file.  It implements the filtering on symbol rules.  Filtering can be
performed through the full text name (given to the GCC tree) or qualified
modula-2 symbol or filename:qualident.

gcc/ChangeLog:

	PR modula2/113836
	* doc/gm2.texi (Compiler options): Add -fm2-debug-trace=,
	-fm2-dump, -fm2-dump-decl=, -fm2-dump-gimple=, -fm2-dump-quad=
	and -fm2-dump-filter=.

gcc/m2/ChangeLog:

	PR modula2/113836
	* gm2-compiler/M2AsmUtil.def: Remove export qualified and
	unused import.
	* gm2-compiler/M2LangDump.mod (AddRuleTextDump): New procedure.
	(AddRuleScopeQualidentDump): Add warning check against unmatched
	rule.
	(GenQualidentSymString): New procedure function.
	(IdentQualidentMatch): New procedure function.
	(IsRuleFilenameMatch): New procedure function.
	(CheckRuleMatch): New procedure function.
	(AddRuleFilenameDump): New procedure function.
	* gm2-gcc/m2misc.cc (m2misc_warning_m2_dump_filter): New function.
	* gm2-gcc/m2misc.def (warning_m2_dump_filter): New procedure.
	* gm2-gcc/m2misc.h (m2misc_warning_m2_dump_filter): New prototype.
	* gm2-gcc/m2pp.cc (VERBOSE_TYPE_DESC): New define.
	(m2pp_identifier): Define out verbose type info.
	(m2pp_constructor): Define out verbose type info.
	(m2pp_assignment): Define out verbose type info.
	* gm2-lang.cc (ENABLE_M2DUMP_ALL): Remove.
	* lang.opt (fm2-dump): Add.
	(fm2-dump-decl=): Add.
	(fm2-dump-gimple=): Add.
	(fm2-dump-quad=): Add.
	(fm2-dump-filter=): Add.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
This commit is contained in:
Gaius Mulley 2024-05-02 13:16:07 +01:00
parent 4bb21b5cd7
commit 43dc4302b4
9 changed files with 224 additions and 24 deletions

View file

@ -466,10 +466,39 @@ this option forces the use of the static version.
@c Modula-2 Joined
@c set all location values to a specific value (internal switch)
@c fm2-debug-trace=
@c Modula-2 Joined
@c turn on trace debugging using a comma separated list:
@c line,token,quad,all.
@item -fm2-debug-trace=
turn on trace debugging using a comma separated list:
@samp{line,token,quad,all}. This is an internal command line option.
@item -fm2-dump=
enable dumping of modula-2 internal representation of data structures
using a comma separated list. The list can contain:
@samp{quad,gimple,decl,all}.
@item -fm2-dump-decl=@file{filestem}
dump the modula-2 representation of a symbol to the @file{filestem}
specified. This option only takes effect if the
@samp{-fm2-dump-filter} is specified.
@item -fm2-dump-gimple=@file{filestem}
dump modula-2 gimple representation to the @file{filestem} specified.
@item -fm2-dump-quad=@file{filestem}
dump quadruple representation to the @file{filestem} specified.
@item -fm2-dump-filter=@samp{rules}
filter the language dumps @samp{-fdump-lang-decl},
@samp{-fdump-lang-gimple} and@samp{-fdump-lang-quad}
on @samp{rules}. @samp{rules} must be a comma
separated list which can take three forms: the full decl textual name
of a procedure, @samp{[libname.]module.ident} or
@samp{[filename:]module.ident}. This is an internal command line
option. Currently it only filters on procedure names and regexp
matching is not implemented. Three examples of its use following
the previous forms could be:
@code{-fm2-dump-filter=_M2_hello_init},
@code{-fm2-dump-filter=m2pim.StrIO.WriteString} and
@code{-fm2-dump-filter=StrLib.mod:StrIO.WriteString}.
@item -fm2-g
improve the debugging experience for new programmers at the expense
@ -487,7 +516,7 @@ specify the module mangled prefix name for all modules in the
following include paths.
@item -fm2-pathnameI
for internal use only: used by the driver to copy the user facing -I
for internal use only: used by the driver to copy the user facing @samp{-I}
option.
@item -fm2-plugin

View file

@ -29,9 +29,7 @@ DEFINITION MODULE M2AsmUtil ;
to their equivalent representation in ASM format.
*)
FROM DynamicStrings IMPORT String ;
FROM NameKey IMPORT Name ;
EXPORT QUALIFIED GetFullSymName, GetFullScopeAsmName ;
(*

View file

@ -31,7 +31,7 @@ FROM DynamicStrings IMPORT String, Length, InitString, Mark, Slice, EqualArray,
FROM SymbolTable IMPORT NulSym,
GetSymName, GetLibName,
GetScope, GetModuleScope, GetMainModule, GetDeclaredMod,
GetLocalSym,
GetLocalSym, FinalSymbol,
IsInnerModule,
IsVar,
IsProcedure,
@ -43,15 +43,17 @@ FROM SymbolTable IMPORT NulSym,
FROM M2Options IMPORT GetM2DumpFilter, GetDumpDir, GetDumpQuadFilename,
GetDumpDeclFilename, GetDumpGimpleFilename ;
FROM M2AsmUtil IMPORT GetFullSymName ;
FROM M2GCCDeclare IMPORT IncludeDumpSymbol ;
FROM FormatStrings IMPORT Sprintf0, Sprintf1 ;
FROM NameKey IMPORT Name, GetKey, MakeKey, makekey, KeyToCharStar, NulName ;
FROM SymbolConversion IMPORT Gcc2Mod, Mod2Gcc ;
FROM SymbolConversion IMPORT Gcc2Mod, Mod2Gcc, GccKnowsAbout ;
FROM M2AsmUtil IMPORT GetFullScopeAsmName ;
FROM M2LexBuf IMPORT FindFileNameFromToken ;
FROM M2Printf IMPORT fprintf0, fprintf1, printf0, printf1, printf2 ;
FROM M2Error IMPORT InternalError ;
FROM M2Batch IMPORT Get ;
FROM m2misc IMPORT warning_m2_dump_filter ;
FROM StrLib IMPORT StrLen ;
FROM libc IMPORT printf ;
@ -147,12 +149,27 @@ END CloseDumpDecl ;
(*
AddRuleTextDump -
AddRuleTextDump - filter on the textual name given to GCC.
*)
PROCEDURE AddRuleTextDump (rule: String) ;
VAR
sym : CARDINAL ;
key : Name ;
seenMatch: BOOLEAN ;
BEGIN
sym := 1 ;
seenMatch := FALSE ;
key := makekey (string (rule)) ;
WHILE sym <= FinalSymbol () DO
IF IsProcedure (sym) AND (key = GetFullSymName (sym))
THEN
IncludeDumpSymbol (sym) ;
seenMatch := TRUE
END ;
INC (sym)
END ;
CheckRuleMatch (seenMatch, rule)
END AddRuleTextDump ;
@ -183,8 +200,10 @@ BEGIN
END ;
idstr := Slice (rule, start, 0) ;
sym := GetLocalSym (modsym, makekey (string (idstr))) ;
IF sym # NulSym
IF sym = NulSym
THEN
CheckRuleMatch (FALSE, rule)
ELSE
IncludeDumpSymbol (sym)
END
END AddRuleScopeQualidentDump ;
@ -227,18 +246,133 @@ BEGIN
END AddRuleScopeDump ;
(*
GenQualidentSymString - returns the qualified sym string (including
any nested procedure and modules).
*)
PROCEDURE GenQualidentSymString (sym: CARDINAL) : String ;
VAR
identstr,
qualidentstr: String ;
BEGIN
qualidentstr := InitStringCharStar (KeyToCharStar (GetSymName (sym))) ;
WHILE GetScope (sym) # NulSym DO
sym := GetScope (sym) ;
identstr := InitStringCharStar (KeyToCharStar (GetSymName (sym))) ;
ConCatChar (identstr, '.') ;
qualidentstr := ConCat (identstr, Mark (qualidentstr))
END ;
RETURN qualidentstr
END GenQualidentSymString ;
(*
IdentQualidentMatch - return TRUE if sym name matches symstr.
*)
PROCEDURE IdentQualidentMatch (sym: CARDINAL; symstr: String) : BOOLEAN ;
VAR
success : BOOLEAN ;
qualidentstr: String ;
BEGIN
qualidentstr := GenQualidentSymString (sym) ;
success := Equal (qualidentstr, symstr) ;
qualidentstr := KillString (qualidentstr) ;
RETURN success
END IdentQualidentMatch ;
(*
IsRuleFilenameMatch - return TRUE if rule matches sym.
*)
PROCEDURE IsRuleFilenameMatch (rule: String; sym: CARDINAL) : BOOLEAN ;
VAR
fname,
modstr,
symstr,
filename: String ;
tokenno : CARDINAL ;
dot,
colon : INTEGER ;
success : BOOLEAN ;
BEGIN
tokenno := GetDeclaredMod (sym) ;
filename := FindFileNameFromToken (tokenno, 0) ;
fname := NIL ;
symstr := NIL ;
modstr := NIL ;
success := FALSE ;
colon := Index (rule, ':', 0) ;
IF colon > 0
THEN
fname := Slice (rule, 0, colon) ;
IF Equal (fname, filename)
THEN
IF INTEGER (Length (rule)) > colon
THEN
symstr := Slice (rule, colon + 1, 0) ;
dot := ReverseIndex (symstr, '.', -1) ;
IF dot >= 0
THEN
success := IdentQualidentMatch (sym, symstr)
ELSE
success := GetSymName (sym) = makekey (string (symstr))
END
END
END
END ;
fname := KillString (fname) ;
modstr := KillString (modstr) ;
symstr := KillString (symstr) ;
RETURN success
END IsRuleFilenameMatch ;
(*
CheckRuleMatch - issue a warning if seenMatch is FALSE and this is the first time
the rule is matched.
*)
PROCEDURE CheckRuleMatch (seenMatch: BOOLEAN; rule: String) ;
VAR
message: String ;
BEGIN
IF (NoOfDeclDumps = 1) AND (NOT seenMatch)
THEN
message := InitString ("no symbol matching: %qs has been found when applying the dump filter") ;
warning_m2_dump_filter (string (message), string (rule));
END
END CheckRuleMatch ;
(*
AddRuleFilenameDump -
*)
PROCEDURE AddRuleFilenameDump (rule: String) ;
VAR
sym : CARDINAL ;
seenMatch: BOOLEAN ;
BEGIN
sym := 1 ;
seenMatch := FALSE ;
WHILE sym <= FinalSymbol () DO
IF IsProcedure (sym) AND IsRuleFilenameMatch (rule, sym)
THEN
IncludeDumpSymbol (sym) ;
seenMatch := TRUE
END ;
INC (sym)
END ;
CheckRuleMatch (seenMatch, rule)
END AddRuleFilenameDump ;
(*
AddRuleSymToDump -
AddRuleSymToDump - call appropriate sub rule. FileName if : present.
Scope if . present otherwise assume a text rule.
*)
PROCEDURE AddRuleSymToDump (rule: String) ;

View file

@ -23,6 +23,7 @@ along with GNU Modula-2; see the file COPYING3. If not see
#include "../m2-tree.h"
#include "tree-iterator.h"
#include "opts.h"
#define m2misc_c
#include "m2block.h"
@ -70,3 +71,12 @@ m2misc_printStmt (void)
if (m2block_cur_stmt_list () != NULL)
debug_tree (m2block_cur_stmt_list ());
}
/* warning_m2_dump_filter issue a warning relating to the
-fm2_dump_filter=rule option. */
void
m2misc_warning_m2_dump_filter (const char *message, const char *rule)
{
warning (OPT_fm2_dump_filter_, message, rule);
}

View file

@ -24,10 +24,9 @@ DEFINITION MODULE FOR "C" m2misc ;
FROM m2tree IMPORT Tree ;
FROM SYSTEM IMPORT ADDRESS ;
PROCEDURE DebugTree (t: Tree) ;
PROCEDURE error (message: ARRAY OF CHAR) ;
PROCEDURE cerror (message: ADDRESS) ;
PROCEDURE warning_m2_dump_filter (message, rule: ADDRESS) ;
END m2misc.

View file

@ -41,6 +41,7 @@ EXTERN void m2misc_printStmt (void);
EXTERN void m2misc_DebugTreeChain (tree t);
EXTERN void m2misc_cerror (const char *message);
EXTERN void m2misc_error (const char *message);
EXTERN void m2misc_warning_m2_dump_filter (const char *message, const char *rule);
#undef EXTERN
#endif /* m2misc_h. */

View file

@ -35,6 +35,12 @@ along with GNU Modula-2; see the file COPYING3. If not see
#include "m2pp.h"
#define GM2
/* VERBOSE_TYPE_DESC enables type descriptions to be generated in the
assignment and during variable declarations. It generates
moderately ugly output, although the assignment type information
can be useful when tracking down non gimple complient trees (during
assignment). */
#undef VERBOSE_TYPE_DESC
const char *m2pp_dump_description[M2PP_DUMP_END] =
{
@ -898,6 +904,7 @@ m2pp_identifier (pretty *s, tree t)
else
snprintf (name, 100, "D_%u", DECL_UID (t));
m2pp_print (s, name);
#ifdef VERBOSE_TYPE_DESC
if (TREE_TYPE (t) != NULL_TREE)
{
m2pp_needspace (s);
@ -905,12 +912,11 @@ m2pp_identifier (pretty *s, tree t)
m2pp_needspace (s);
m2pp_simple_type (s, TREE_TYPE (t));
m2pp_needspace (s);
#if 0
m2pp_type_lowlevel (s, TREE_TYPE (t));
m2pp_needspace (s);
#endif
m2pp_print (s, "*)");
}
#endif
}
}
}
@ -1842,11 +1848,13 @@ m2pp_constructor (pretty *s, tree t)
m2pp_print (s, ", ");
}
m2pp_print (s, "}");
#ifdef VERBOSE_TYPE_DESC
m2pp_print (s, "(* type: ");
setindent (s, getindent (s) + 8);
m2pp_type (s, TREE_TYPE (t));
setindent (s, getindent (s) - 8);
m2pp_print (s, " *)\n");
#endif
}
/* m2pp_complex_expr handle GCC complex_expr tree. */
@ -2569,15 +2577,20 @@ m2pp_assignment (pretty *s, tree t)
int o;
m2pp_begin (s);
#ifdef VERBOSE_TYPE_DESC
/* Print the types of des and expr. */
m2pp_print (s, "(*");
m2pp_needspace (s);
m2pp_type (s, TREE_TYPE (TREE_OPERAND (t, 0)));
m2pp_needspace (s);
m2pp_print (s, ":=");
m2pp_needspace (s);
m2pp_type (s, TREE_TYPE (TREE_OPERAND (t, 1)));
m2pp_needspace (s);
m2pp_print (s, ";\n");
m2pp_print (s, ";");
m2pp_needspace (s);
m2pp_print (s, "*)\n");
#endif
/* Print the assignment statement. */
m2pp_designator (s, TREE_OPERAND (t, 0));
m2pp_needspace (s);

View file

@ -42,8 +42,6 @@ Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include "convert.h"
#include "rtegraph.h"
#undef ENABLE_M2DUMP_ALL
static void write_globals (void);
static int insideCppArgs = FALSE;
@ -521,7 +519,6 @@ gm2_langhook_handle_option (
case OPT_fm2_debug_trace_:
M2Options_SetM2DebugTraceFilter (value, arg);
return 1;
#ifdef ENABLE_M2DUMP_ALL
case OPT_fm2_dump_:
return M2Options_SetM2Dump (value, arg);
case OPT_fm2_dump_decl_:
@ -536,7 +533,6 @@ gm2_langhook_handle_option (
case OPT_fm2_dump_filter_:
M2Options_SetM2DumpFilter (value, arg);
return 1;
#endif
case OPT_Wall:
M2Options_SetWall (value);
return 1;

View file

@ -134,6 +134,26 @@ fm2-debug-trace=
Modula-2 Joined
turn on internal debug tracing for quad,token,line,all (internal switch)
fm2-dump=
Modula-2 Joined
dump Modula-2 internal intemediate representation specified by: all,quad,decl,gimple
fm2-dump-decl=
Modula-2 Joined
dump Modula-2 decls to the filename stem specified
fm2-dump-gimple=
Modula-2 Joined
dump Modula-2 gimple to the filename stem specified
fm2-dump-quad=
Modula-2 Joined
dump Modula-2 quads to the filename stem specified
fm2-dump-filter=
Modula-2 Joined
filter the language dump using a comma separated list of procedures and modules
fm2-g
Modula-2
generate extra nops to improve debugging, producing an instruction for every code related keyword