Files
mercury/deep_profiler/mdprof_report_feedback.m
Zoltan Somogyi 0e41d41286 Make mdprof_create_feedback/feedback.m a package.
mdbcomp/feedback.feedback_info.m:
mdbcomp/feedback.m:
    Move all the contents of feedback.m other than include_module items
    into the new module feedback_info.m, leaving feedback.m a package.

mdbcomp/feedback.automatic_parallelism.m:
    Group the types exported by this module into groups of related types.

    Delete a totally unused type.

deep_profiler/Mmakefile:
slice/Mmakefile:
    Copy the new module.

compiler/check_options.m:
compiler/globals.m:
compiler/handle_options.m:
compiler/introduce_parallelism.m:
deep_profiler/autopar_reports.m:
deep_profiler/autopar_search_callgraph.m:
deep_profiler/mdprof_create_feedback.m:
deep_profiler/mdprof_report_feedback.m:
    Import the new module.
2025-07-25 18:52:31 +02:00

204 lines
6.8 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
% Copyright (C) 2011 The University of Melbourne.
% Copyright (C) 2013-2015, 2017, 2020-2021, 2025 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_report_feedback.m.
% Author: pbone.
%
% This module contains code for showing the contents of feedback files
% in a human-readable form.
%
%---------------------------------------------------------------------------%
:- module mdprof_report_feedback.
:- interface.
:- import_module io.
%---------------------------------------------------------------------------%
:- pred main(io::di, io::uo) is det.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- implementation.
:- import_module mdbcomp.
:- import_module mdbcomp.feedback.
:- import_module mdbcomp.feedback.feedback_info.
:- import_module mdprof_fb.
:- import_module mdprof_fb.automatic_parallelism.
:- import_module mdprof_fb.automatic_parallelism.autopar_reports.
:- import_module bool.
:- import_module char.
:- import_module getopt.
:- import_module int.
:- import_module library.
:- import_module list.
:- import_module map.
:- import_module maybe.
:- import_module string.
%---------------------------------------------------------------------------%
main(!IO) :-
io.progname_base("mdprof_report_feedback", ProgName, !IO),
io.command_line_arguments(Args0, !IO),
getopt.process_options(option_ops_multi(short, long, defaults),
Args0, Args, MaybeOptions),
io.stdout_stream(StdOut, !IO),
io.stderr_stream(StdErr, !IO),
(
MaybeOptions = ok(Options0),
post_process_options(ProgName, Options0, Options, !IO),
lookup_bool_option(Options, help, Help),
lookup_bool_option(Options, version, Version),
( if Version = yes then
write_version_message(StdOut, ProgName, !IO)
else if Help = yes then
write_help_message(StdOut, ProgName, !IO)
else
(
Args = [FeedbackFileName],
feedback.feedback_info.read_feedback_file(FeedbackFileName, no,
FeedbackResult, !IO),
(
FeedbackResult = ok(Feedback),
print_feedback_report(StdOut, Feedback, !IO)
;
FeedbackResult = error(FeedbackError),
feedback_read_error_message_string(FeedbackFileName,
FeedbackError, Message),
io.format(StdErr, "%s: %s\n",
[s(ProgName), s(Message)], !IO),
io.set_exit_status(1, !IO)
)
;
( Args = []
; Args = [_, _ | _]
),
write_help_message(StdErr, ProgName, !IO),
io.set_exit_status(1, !IO)
)
)
;
MaybeOptions = error(Error),
Msg = option_error_to_string(Error),
io.format(StdErr, "%s: error parsing options: %s\n",
[s(ProgName), s(Msg)], !IO),
write_help_message(StdErr, ProgName, !IO),
io.set_exit_status(1, !IO)
).
:- func help_message(string) = string.
help_message(ProgName) = HelpMessage :-
FormatStr =
"Usage: %s [options] <feedbackfile>
This command outputs a report that shows the contents of the named
feedback file in a human-readable form.
You may specify the following general options:
-h --help Generate this help message.
-V --version Report the program's version number.
-v --verbosity <0-4>
Generate messages. The higher the argument, the more
verbose the program becomes. 2 is recommended, and
is the default.
",
HelpMessage = string.format(FormatStr, [s(ProgName)]).
:- pred write_help_message(io.text_output_stream::in, string::in,
io::di, io::uo) is det.
write_help_message(OutputStream, ProgName, !IO) :-
io.write_string(OutputStream, help_message(ProgName), !IO).
:- pred write_version_message(io.text_output_stream::in, string::in,
io::di, io::uo) is det.
write_version_message(OutputStream, ProgName, !IO) :-
library.version(Version, Fullarch),
io.format(OutputStream, "%s: Mercury deep profiler\n",
[s(ProgName)], !IO),
io.format(OutputStream, "version: %s, on %s.\n",
[s(Version), s(Fullarch)], !IO).
%---------------------------------------------------------------------------%
%
% This section describes and processes command line options. Individual
% feedback information can be requested by the user, as well as options named
% after optimizations that may imply one or more feedback information types,
% which that optimization uses.
%
% Command line options.
%
:- type option
---> help
; version
; verbosity.
% TODO: Introduce an option to disable parallelisation of dependent
% conjunctions, or switch to the simple calculations for independent
% conjunctions.
:- pred short(char::in, option::out) is semidet.
short('h', help).
short('v', verbosity).
short('V', version).
:- pred long(string::in, option::out) is semidet.
long("help", help).
long("verbosity", verbosity).
long("version", version).
:- pred defaults(option::out, option_data::out) is multi.
defaults(help, bool(no)).
defaults(verbosity, int(2)).
defaults(version, bool(no)).
:- pred post_process_options(string::in,
option_table(option)::in, option_table(option)::out,
io::di, io::uo) is det.
post_process_options(ProgName, !Options, !IO) :-
lookup_int_option(!.Options, verbosity, VerbosityLevel),
io.stderr_stream(StdErr, !IO),
( if VerbosityLevel < 0 then
io.format(StdErr,
"%s: warning: verbosity level should not be negative.\n",
[s(ProgName)], !IO),
set_option(verbosity, int(0), !Options)
else if VerbosityLevel > 4 then
io.format(StdErr,
"%s: warning: verbosity level should not exceed 4.\n",
[s(ProgName)], !IO),
set_option(verbosity, int(4), !Options)
else
true
).
% Set the value of an option in the option table.
%
:- pred set_option(option::in, option_data::in,
option_table(option)::in, option_table(option)::out) is det.
set_option(Option, Value, !Options) :-
map.set(Option, Value, !Options).
%---------------------------------------------------------------------------%
:- end_module mdprof_report_feedback.
%---------------------------------------------------------------------------%