Files
mercury/profiler/atsort_callgraph.m
Zoltan Somogyi 06f81f1cf0 Add end_module declarations ...
.. to modules which did not yet have them.
2022-01-09 10:36:15 +11:00

123 lines
4.0 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
% Copyright (C) 1994-1997, 2005-2006 The University of Melbourne.
% This file may only be copied under the terms of the GNU General
% Public License - see the file COPYING in the Mercury distribution.
%---------------------------------------------------------------------------%
%
% File: atsort_callgraph.m.
% Main author: petdr.
%
% Takes a list of files which contains the callgraph of a Mercury module
% and approximately topologically sorts them to standard output.
%
% XXX This program uses the "relation" module. Since that module was deleted
% from the Mercury standard library several years ago, this program
% must have been nonfunctional for at least as long.
%
% Anyone who wants to make it work again will have make it use the digraph
% module instead of the relation module.
%
%---------------------------------------------------------------------------%
:- module atsort_callgraph.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- implementation.
:- import_module read.
:- import_module relation.
:- import_module set.
main(!IO) :-
io.command_line_arguments(Files, !IO),
relation.init(CallGraph0),
build_call_graph(Files, CallGraph0, CallGraph, !IO),
relation.atsort(CallGraph, Cliques),
list.reverse(Cliques, RevCliques),
print_cliques(RevCliques, !IO).
%---------------------------------------------------------------------------%
% Builds the call graph located in the *.prof files.
%
:- pred build_call_graph(list(string)::in,
relation(string)::in, relation(string)::out, io::di, io::uo) is det.
build_call_graph([], !CallGraph, !IO).
build_call_graph([File | Files], !CallGraph, !IO) :-
process_prof_file(File, !CallGraph, !IO),
build_call_graph(Files, !CallGraph, !IO).
% Puts all the Caller and Callee label pairs from File into the
% call graph relation.
%
:- pred process_prof_file(string::in,
relation(string)::in, relation(string)::out, io::di, io::uo) is det.
process_prof_file(File, !CallGraph, !IO) :-
io.see(File, Result, !IO),
(
Result = ok,
process_prof_file_2(!CallGraph, !IO),
io.seen(!IO)
;
Result = error(Error),
io.error_message(Error, ErrorMsg),
io.stderr_stream(StdErr, !IO),
io.write_strings(StdErr,
["atsort_callgraph: error opening file `",
File, "': ", ErrorMsg, "\n"], !IO)
).
:- pred process_prof_file_2(relation(string)::in, relation(string)::out,
io::di, io::uo) is det.
process_prof_file_2(!CallGraph, !IO) :-
maybe_read_label_name(MaybeLabelName, !IO),
(
MaybeLabelName = yes(CallerLabel),
read_label_name(CalleeLabel, !IO),
svrelation.add(CallerLabel, CalleeLabel, !CallGraph),
process_prof_file_2(!CallGraph, !IO)
;
MaybeLabelName = no
).
%---------------------------------------------------------------------------%
:- pred print_cliques(list(set(string))::in, io::di, io::uo) is det.
print_cliques([], !IO).
print_cliques([Clique | Cliques], !IO) :-
print_clique(Clique, !IO),
print_cliques(Cliques, !IO).
:- pred print_clique(set(string)::in, io::di, io::uo) is det.
print_clique(Clique, !IO) :-
set.to_sorted_list(Clique, CliqueList),
print_list(CliqueList, !IO).
:- pred print_list(list(string), io.state, io.state).
:- mode print_list(in, di, uo) is det.
print_list([], !IO).
print_list([C | Cs], !IO) :-
io.write_string(C, !IO),
io.write_string("\n", !IO),
print_list(Cs, !IO).
%---------------------------------------------------------------------------%
:- end_module atsort_callgraph.
%---------------------------------------------------------------------------%