mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-18 19:03:45 +00:00
123 lines
4.0 KiB
Mathematica
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.
|
|
%---------------------------------------------------------------------------%
|