mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-06 07:49:02 +00:00
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.
204 lines
6.8 KiB
Mathematica
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.
|
|
%---------------------------------------------------------------------------%
|