Files
mercury/deep_profiler/mdprof_dump.m
Zoltan Somogyi 3aca14b385 Compile the Mercury system with --warn-unused-types.
configure.ac:
    Require the installed compiler to support that option.

STANDARD_MCFLAGS:
    Specify that option.

compiler/canonicalize_interface.m:
compiler/comp_unit_interface.m:
compiler/inst_user.m:
compiler/parse_module.m:
compiler/switch_util.m:
compiler/type_ctor_info.m:
deep_profiler/mdprof_dump.m:
library/digraph.m:
slice/mcov.m:
    Delete unused equivalence types that were picked up by the option.
2026-03-09 03:07:51 +11:00

193 lines
6.0 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
% Copyright (C) 2005-2006, 2008, 2011 The University of Melbourne.
% Copyright (C) 2015, 2017, 2020-2021, 2026 The Mercury team.
% This file may only be copied under the terms of the GNU General
% Public License - see the file COPYING in the Mercury distribution.
%---------------------------------------------------------------------------%
%
% File: mdprof_dump.m.
% Authors: juliensf, zs.
%
% This module is the main module of a tool for dumping out the contents
% of a deep profiling data file (Deep.data file) for the purpose of debugging
% the deep profiler or the part of the Mercury runtime that generates Deep.data
% files.
%
%---------------------------------------------------------------------------%
:- module mdprof_dump.
:- interface.
:- import_module io.
%---------------------------------------------------------------------------%
:- pred main(io::di, io::uo) is det.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- implementation.
:- import_module dump.
:- import_module read_profile.
:- import_module bool.
:- import_module char.
:- import_module getopt.
:- import_module list.
:- import_module maybe.
:- import_module string.
%---------------------------------------------------------------------------%
main(!IO) :-
io.progname_base("mdprof_dump", ProgName, !IO),
io.command_line_arguments(Args0, !IO),
OptionOps = option_ops_multi(short_option, long_option, defaults),
getopt.process_options(OptionOps, Args0, Args, MaybeOptions),
(
MaybeOptions = ok(Options),
getopt.lookup_bool_option(Options, help, NeedsHelp),
(
NeedsHelp = yes,
usage(ProgName, !IO)
;
NeedsHelp = no,
(
(
Args = [],
FileName = "Deep.data"
;
Args = [FileName]
),
% Process options, check that they make sense.
make_dump_options(Options, MaybeDumpOptions),
(
MaybeDumpOptions = yes(DumpOptions),
main_2(DumpOptions, FileName, !IO)
;
MaybeDumpOptions = no,
usage(ProgName, !IO)
)
;
Args = [_, _ | _],
usage(ProgName, !IO)
)
)
;
MaybeOptions = error(Error),
Msg = option_error_to_string(Error),
io.stderr_stream(StdErr, !IO),
io.format(StdErr, "%s: %s\n", [s(ProgName), s(Msg)], !IO),
io.set_exit_status(1, !IO)
).
:- pred main_2(dump_options::in, string::in, io::di, io::uo) is det.
main_2(DumpOptions, FileName, !IO) :-
read_call_graph(FileName, MaybeInitialDeep, !IO),
(
MaybeInitialDeep = ok(InitialDeep),
io.stdout_stream(StdOut, !IO),
dump_initial_deep(InitialDeep, DumpOptions, StdOut, !IO)
;
MaybeInitialDeep = error(Msg),
io.stderr_stream(StdErr, !IO),
io.format(StdErr, "Cannot read %s: %s\n",
[s(FileName), s(Msg)], !IO)
).
%---------------------------------------------------------------------------%
%
% Option processing
%
% Process options and the list of arrays to be dumped.
%
:- pred make_dump_options(option_table(option)::in, maybe(dump_options)::out)
is det.
make_dump_options(Options, MaybeDumpOptions) :-
getopt.lookup_accumulating_option(Options, dump_options, ArrayOptionStrs),
getopt.lookup_bool_option(Options, option_restrict, RestrictBool),
(
RestrictBool = yes,
Restrict = show_restricted_dump
;
RestrictBool = no,
Restrict = show_complete_dump
),
DumpOptions0 = default_dump_options ^ do_restricted := Restrict,
( if dump_array_options(ArrayOptionStrs, ArrayOptions) then
MaybeDumpOptions = yes(DumpOptions0 ^ do_arrays := ArrayOptions)
else
MaybeDumpOptions = no
).
:- type option
---> help
; dump_options
; option_restrict.
:- pred short_option(char::in, option::out) is semidet.
short_option('h', help).
short_option('D', dump_options).
short_option('r', option_restrict).
:- pred long_option(string::in, option::out) is semidet.
long_option("help", help).
long_option("dump-options", dump_options).
long_option("restrict", option_restrict).
:- pred defaults(option::out, option_data::out) is multi.
defaults(help, bool(no)).
defaults(dump_options, accumulating([])).
defaults(option_restrict, bool(no)).
%---------------------------------------------------------------------------%
:- pred usage(string::in, io::di, io::uo) is det.
usage(ProgName, !IO) :-
io.stderr_stream(StdErr, !IO),
io.format(StdErr, "Usage: %s [-h] [-D what] [filename]\n", [s(ProgName)],
!IO),
io.write_string(StdErr, options_description, !IO).
:- func options_description = string.
options_description =
"Options:\n" ++
"\t-h, --help\n" ++
"\t\tDisplay this message.\n" ++
"\t-r, --restrict\n" ++
"\t\tDo not dump proc and call-site statics that are\n" ++
"\t\tnot referenced from the proc dynamics\n" ++
"\t-D all\n" ++
"\t\tDump all arrays, (default).\n" ++
"\t-D csd\n" ++
"\t\tDump call-site dynamics.\n" ++
"\t-D pd\n" ++
"\t\tDump proc dynamics.\n" ++
"\t-D css\n" ++
"\t\tDump call-site statics.\n" ++
"\t-D ps\n" ++
"\t\tDump proc statics.\n" ++
"\nThe following options are unimplemented.\n" ++
"\t-D clique\n" ++
"\t\tDump information about cliques.\n" ++
"\t-D rev\n" ++
"\t\tDump reverse links.\n" ++
"\t-D prop\n" ++
"\t\tDump propagated measurement information.\n".
%---------------------------------------------------------------------------%
:- end_module mdprof_dump.
%---------------------------------------------------------------------------%