[m-rev.] diff: remove two old modules
Zoltan Somogyi
zs at csse.unimelb.edu.au
Thu Jan 27 14:04:42 AEDT 2011
Paul and I discussed this a while ago.
Zoltan.
deep_profiler/old_query.m:
deep_profiler/old_html_format.m:
Remove these modules. We have used their replacements without trouble
for a long while now.
deep_profiler/query.m:
Remove the code that used to invoke those modules.
cvs diff: Diffing .
Index: autopar_search_callgraph.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/deep_profiler/autopar_search_callgraph.m,v
retrieving revision 1.1
diff -u -b -r1.1 autopar_search_callgraph.m
--- autopar_search_callgraph.m 27 Jan 2011 02:53:46 -0000 1.1
+++ autopar_search_callgraph.m 27 Jan 2011 02:55:58 -0000
@@ -6,7 +6,7 @@
% Public License - see the file COPYING in the Mercury distribution.
%-----------------------------------------------------------------------------%
%
-% File: mdprof_fb.automatic_parallelism.m.
+% File: autopar_search_callgraph.m
% Author: pbone.
%
% This module contains the code for analysing deep profiles of programs in
Index: old_html_format.m
===================================================================
RCS file: old_html_format.m
diff -N old_html_format.m
--- old_html_format.m 11 Oct 2010 00:49:24 -0000 1.9
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,2251 +0,0 @@
-%-----------------------------------------------------------------------------%
-% vim: ft=mercury ts=4 sw=4 et
-%-----------------------------------------------------------------------------%
-% Copyright (C) 2001-2002, 2004-2010 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: old_html_format.m.
-%
-% This module contains code that helps old_query.m generate HTML.
-% The approach whose implementation it forms a part of has been superseded,
-% so it shouldn't be actively modified in the future.
-%
-%-----------------------------------------------------------------------------%
-
-:- module old_html_format.
-:- interface.
-
-:- import_module measurements.
-:- import_module profile.
-:- import_module query.
-:- import_module top_procs.
-
-:- import_module bool.
-:- import_module list.
-:- import_module unit.
-
-%-----------------------------------------------------------------------------%
-
-:- func table_start(preferences) = string.
-:- func table_end(preferences) = string.
-
-:- func page_banner(cmd, preferences) = string.
-:- func page_footer(cmd, preferences, deep) = string.
-
-:- func toggle_cost_criteria_in_top_procs_cmd(preferences, deep, display_limit,
- cost_kind, include_descendants, measurement_scope) = string.
-
-:- func criteria_to_description(order_criteria) = string.
-:- func cost_criteria_to_description(cost_kind, include_descendants,
- measurement_scope) = string.
-
-:- type id_fields
- ---> source_proc
- ; rank_module
- ; rank_proc
- ; proc.
-
-:- type totals_disposition
- ---> totals_meaningful
- ; totals_not_meaningful.
-
-:- type header_wrap_func == (func(string, order_criteria) = string).
-
-:- func fields_header(preferences, id_fields, totals_disposition,
- header_wrap_func) = string.
-
-:- func header_row(string, preferences, id_fields, totals_disposition)
- = string.
-:- func separator_row(preferences, id_fields, totals_disposition)
- = string.
-
-:- type sub_lines(T)
- ---> sub_lines(
- sub_line_type :: T,
- sub_line_list :: list(line_group(T, unit))
- ).
-
-:- type one_id ---> one_id.
-:- type two_id ---> two_id.
-
-:- type one_id_sub_lines == sub_lines(one_id).
-:- type two_id_sub_lines == sub_lines(two_id).
-
-:- type one_id_line == line_group(one_id, unit).
-:- type two_id_line == line_group(two_id, unit).
-:- type one_id_line_group == line_group(one_id, one_id_sub_lines).
-:- type two_id_line_group == line_group(two_id, two_id_sub_lines).
-:- type one_two_id_line_group == line_group(one_id, two_id_sub_lines).
-
- % This function takes a context description (which may be empty) and a
- % HTML string describing all fields in a row but the first, and returns
- % the HTML for the full row.
- %
-:- func add_context(string, line_group(one_id, LL)) = line_group(two_id, LL).
-
- % This adds the context from the line group to the HTML as the first field
- % of the resulting line group.
- %
-:- func add_self_context(line_group(one_id, LL)) = line_group(two_id, LL).
-
-:- func add_ranks(list(line_group(one_id, LL))) = list(line_group(two_id, LL)).
-
-:- func line_to_one_id_subline_group(line_group(FL, unit))
- = line_group(FL, one_id_sub_lines).
-
-:- func line_to_two_id_subline_group(line_group(FL, unit))
- = line_group(FL, two_id_sub_lines).
-
-:- func one_id_line_to_html(preferences, deep, totals_disposition,
- one_id_line) = string.
-:- func one_id_line_group_to_html(preferences, deep, totals_disposition,
- one_id_line_group) = string.
-:- func two_id_line_to_html(preferences, deep, totals_disposition,
- two_id_line) = string.
-:- func two_id_line_group_to_html(preferences, deep, totals_disposition,
- two_id_line_group) = string.
-
-:- func own_and_desc_to_html(own_prof_info, inherit_prof_info,
- preferences, deep, totals_disposition) = string.
-
-:- pred lookup_ticks_per_sec(profile_stats::in, int::out, bool::out) is det.
-
-:- func proc_dynamic_name(deep, proc_dynamic_ptr) = string.
-:- func proc_static_name(deep, proc_static_ptr) = string.
-
-:- pred proc_dynamic_context(deep::in, proc_dynamic_ptr::in,
- string::out, int::out) is det.
-:- pred proc_static_context(deep::in, proc_static_ptr::in,
- string::out, int::out) is det.
-:- pred call_site_context(deep::in, call_site_static_ptr::in,
- string::out, int::out) is det.
-
-:- pred proc_static_to_line_group_info(preferences::in, deep::in,
- proc_static_ptr::in, string::out, int::out, string::out, string::out)
- is det.
-:- func proc_static_to_html_ref(preferences, deep, proc_static_ptr) = string.
-:- func module_name_to_html_ref(preferences, deep, string) = string.
-:- func clique_ptr_to_html_ref(preferences, deep, string, clique_ptr) = string.
-:- func deep_cmd_pref_to_url(preferences, deep, cmd) = string.
-
-:- func plural(int) = string.
-
-%-----------------------------------------------------------------------------%
-%-----------------------------------------------------------------------------%
-
-:- implementation.
-
-:- import_module measurement_units.
-:- import_module html_format. % for escape_break_html_string
-
-:- import_module float.
-:- import_module int.
-:- import_module maybe.
-:- import_module require.
-:- import_module string.
-
-%-----------------------------------------------------------------------------%
-%
-% Deprecated html_format code.
-%
-
-page_banner(_Cmd, Pref) =
- "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN""\n" ++
- """http://www.w3.org/TR/html4/strict.dtd"">\n" ++
- "<HTML>\n" ++
- "<HEAD>\n" ++
- "<TITLE>Page created by the Mercury Deep Profiler.</TITLE>\n" ++
- banner_style(Pref) ++
- "</HEAD>\n" ++
- "<BODY>\n".
-
-:- func banner_style(preferences) = string.
-
-banner_style(Pref) = HTML :-
- Fields = Pref ^ pref_fields,
-
- some [!GroupNum] (
- !:GroupNum = 0,
- IdStyle = string.format(" TD.id { %s }\n",
- [s(select_colgroup_background(Pref, !.GroupNum))]),
- !:GroupNum = !.GroupNum + 1,
- Fields = fields(PortFields, TimeFields, CallSeqsFields,
- AllocFields, MemoryFields),
- (
- PortFields = no_port,
- PortStyle = ""
- ;
- PortFields = port,
- PortStyle = string.format(" TD.port { %s }\n",
- [s(select_colgroup_background(Pref, !.GroupNum))]),
- !:GroupNum = !.GroupNum + 1
- ),
- (
- TimeFields = no_time,
- TimeStyle = ""
- ;
- ( TimeFields = ticks
- ; TimeFields = time
- ; TimeFields = ticks_and_time
- ; TimeFields = time_and_percall
- ; TimeFields = ticks_and_time_and_percall
- ),
- TimeStyle = string.format(" TD.time { %s }\n",
- [s(select_colgroup_background(Pref, !.GroupNum))]),
- !:GroupNum = !.GroupNum + 1
- ),
- (
- CallSeqsFields = no_callseqs,
- CallSeqsStyle = ""
- ;
- ( CallSeqsFields = callseqs
- ; CallSeqsFields = callseqs_and_percall
- ),
- CallSeqsStyle = string.format(" TD.callseqs { %s }\n",
- [s(select_colgroup_background(Pref, !.GroupNum))]),
- !:GroupNum = !.GroupNum + 1
- ),
- (
- AllocFields = no_alloc,
- AllocStyle = ""
- ;
- ( AllocFields = alloc
- ; AllocFields = alloc_and_percall
- ),
- AllocStyle = string.format(" TD.alloc { %s }\n",
- [s(select_colgroup_background(Pref, !.GroupNum))]),
- !:GroupNum = !.GroupNum + 1
- ),
- (
- MemoryFields = no_memory,
- MemoryStyle = ""
- ;
- ( MemoryFields = memory(_)
- ; MemoryFields = memory_and_percall(_)
- ),
- MemoryStyle = string.format(" TD.memory { %s }\n",
- [s(select_colgroup_background(Pref, !.GroupNum))])
- )
- ),
- ButtonStyle = " A.button { margin: 5px; text-decoration: none; }\n",
- HTML =
- "<STYLE TYPE=""text/css"">\n" ++
- IdStyle ++
- PortStyle ++
- TimeStyle ++
- CallSeqsStyle ++
- AllocStyle ++
- MemoryStyle ++
- ButtonStyle ++
- "</STYLE>\n".
-
-:- func select_colgroup_background(preferences, int) = string.
-
-select_colgroup_background(Pref, N) = HTML :-
- (
- Pref ^ pref_colour = colour_column_groups,
- ( N /\ 1 = 0 ->
- Background = even_background
- ;
- Background = odd_background
- ),
- string.format("background: %s", [s(Background)], HTML)
- ;
- Pref ^ pref_colour = do_not_colour_column_groups,
- HTML = ""
- ).
-
-:- func even_background = string.
-
-even_background = "rgb(255, 255, 240)".
-
-:- func odd_background = string.
-
-odd_background = "rgb(240, 240, 255)".
-
-%-----------------------------------------------------------------------------%
-
-table_start(Pref) = HTML :-
- (
- Pref ^ pref_box = do_not_box_tables,
- HTML = "\n<TABLE width=100%>\n"
- ;
- Pref ^ pref_box = box_tables,
- HTML = "\n<TABLE width=100% border=1>\n"
- ).
-
-table_end(_) = "</TABLE>\n".
-
-%-----------------------------------------------------------------------------%
-
-page_footer(Cmd, Pref, Deep) =
- "<p>\n" ++
- footer_pref_toggles(Cmd, Pref, Deep) ++
- "<br>\n" ++
- string.format("<A CLASS=""button"" HREF=""%s"">[Menu]</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, deep_cmd_menu))]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">[Restart]</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, deep_cmd_restart))]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">[Quit]</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, deep_cmd_quit))]) ++
- "</BODY>\n" ++
- "</HTML>\n".
-
-:- func footer_pref_toggles(cmd, preferences, deep) = string.
-
-footer_pref_toggles(Cmd, Pref, Deep) = AllToggles :-
- RelevantToggles = command_relevant_toggles(Cmd),
- ( list.member(toggle_fields, RelevantToggles) ->
- FieldToggle = footer_field_toggle(Cmd, Pref, Deep)
- ;
- FieldToggle = ""
- ),
- ( list.member(toggle_ancestor_limit, RelevantToggles) ->
- AncestorToggle =
- footer_ancestor_toggle(Cmd, Pref, Deep) ++
- "<br>\n"
- ;
- AncestorToggle = ""
- ),
- ( list.member(toggle_order_criteria, RelevantToggles) ->
- OrderToggle =
- footer_order_criteria_toggle(Cmd, Pref, Deep) ++
- "<br>\n"
- ;
- OrderToggle = ""
- ),
- ( list.member(toggle_summarize, RelevantToggles) ->
- SummarizeToggle = footer_summarize_toggle(Cmd, Pref, Deep)
- ;
- SummarizeToggle = ""
- ),
- ( list.member(toggle_contour, RelevantToggles) ->
- ContourToggle = footer_contour_toggle(Cmd, Pref, Deep)
- ;
- ContourToggle = ""
- ),
- ( list.member(toggle_time_format, RelevantToggles) ->
- TimeFormatToggle = footer_time_format_toggle(Cmd, Pref, Deep)
- ;
- TimeFormatToggle = ""
- ),
- ( list.member(toggle_colour, RelevantToggles) ->
- ColourToggle = footer_colour_toggle(Cmd, Pref, Deep)
- ;
- ColourToggle = ""
- ),
- ( list.member(toggle_box, RelevantToggles) ->
- BoxToggle = footer_box_toggle(Cmd, Pref, Deep)
- ;
- BoxToggle = ""
- ),
- ( list.member(toggle_inactive_modules, RelevantToggles) ->
- InactiveModuleToggle = footer_inactive_modules_toggle(Cmd, Pref, Deep)
- ;
- InactiveModuleToggle = ""
- ),
- ( list.member(toggle_inactive_procs, RelevantToggles) ->
- InactiveProcsToggle = footer_inactive_procs_toggle(Cmd, Pref, Deep)
- ;
- InactiveProcsToggle = ""
- ),
- AllToggles =
- FieldToggle ++
- AncestorToggle ++
- OrderToggle ++
- SummarizeToggle ++
- ContourToggle ++
- TimeFormatToggle ++
- ColourToggle ++
- BoxToggle ++
- InactiveModuleToggle ++
- InactiveProcsToggle.
-
-%-----------------------------------------------------------------------------%
-
-:- type toggle_kind
- ---> toggle_fields
- ; toggle_box
- ; toggle_colour
- ; toggle_ancestor_limit
- ; toggle_summarize
- ; toggle_order_criteria
- ; toggle_contour
- ; toggle_time_format
- ; toggle_inactive_modules
- ; toggle_inactive_procs.
-
-:- func command_relevant_toggles(cmd) = list(toggle_kind).
-
-command_relevant_toggles(deep_cmd_quit) = [].
-command_relevant_toggles(deep_cmd_restart) = [].
-command_relevant_toggles(deep_cmd_timeout(_)) = [].
-command_relevant_toggles(deep_cmd_menu) = [].
-command_relevant_toggles(deep_cmd_root(_)) =
- % The clique_ptr doesn't matter.
- command_relevant_toggles(deep_cmd_clique(clique_ptr(1))).
-command_relevant_toggles(deep_cmd_clique(_)) =
- [toggle_fields, toggle_box, toggle_colour, toggle_ancestor_limit,
- toggle_summarize, toggle_order_criteria, toggle_time_format].
-command_relevant_toggles(deep_cmd_proc(_)) =
- [toggle_fields, toggle_box, toggle_colour, toggle_summarize,
- toggle_order_criteria, toggle_time_format].
-command_relevant_toggles(deep_cmd_proc_callers(_, _, _, _, _)) =
- [toggle_fields, toggle_box, toggle_colour, toggle_order_criteria,
- toggle_contour, toggle_time_format].
-command_relevant_toggles(deep_cmd_program_modules) =
- [toggle_fields, toggle_box, toggle_colour, toggle_order_criteria,
- toggle_time_format, toggle_inactive_modules].
-command_relevant_toggles(deep_cmd_module(_)) =
- [toggle_fields, toggle_box, toggle_colour, toggle_order_criteria,
- toggle_time_format, toggle_inactive_procs].
-command_relevant_toggles(deep_cmd_top_procs(_, _, _, _)) =
- [toggle_fields, toggle_box, toggle_colour, toggle_time_format].
-command_relevant_toggles(deep_cmd_dump_proc_static(_)) = [].
-command_relevant_toggles(deep_cmd_dump_proc_dynamic(_)) = [].
-command_relevant_toggles(deep_cmd_dump_call_site_static(_)) = [].
-command_relevant_toggles(deep_cmd_dump_call_site_dynamic(_)) = [].
-command_relevant_toggles(deep_cmd_dump_clique(_)) = [].
-command_relevant_toggles(deep_cmd_call_site_dynamic_var_use(_)) = [].
-command_relevant_toggles(Cmd) = [] :-
- ( Cmd = deep_cmd_static_procrep_coverage(_)
- ; Cmd = deep_cmd_dynamic_procrep_coverage(_)
- ; Cmd = deep_cmd_module_getter_setters(_)
- ; Cmd = deep_cmd_clique_recursive_costs(_)
- ; Cmd = deep_cmd_recursion_types_frequency
- ),
- error("unexpected command in command_relevant_toggles").
-
-:- func footer_field_toggle(cmd, preferences, deep) = string.
-
-footer_field_toggle(Cmd, Pref, Deep) = HTML :-
- Fields = Pref ^ pref_fields,
- ( Fields ^ port_fields = no_port ->
- Port1Toggle = ""
- ;
- Port1Fields = Fields ^ port_fields := no_port,
- Port1Pref = Pref ^ pref_fields := Port1Fields,
- Port1Msg = "[No port counts]",
- Port1Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Port1Pref, Deep, Cmd)), s(Port1Msg)])
- ),
- ( Fields ^ port_fields = port ->
- Port2Toggle = ""
- ;
- Port2Fields = Fields ^ port_fields := port,
- Port2Pref = Pref ^ pref_fields := Port2Fields,
- Port2Msg = "[Port counts]",
- Port2Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Port2Pref, Deep, Cmd)), s(Port2Msg)])
- ),
- ( Fields ^ time_fields = no_time ->
- Time1Toggle = ""
- ;
- Time1Fields = Fields ^ time_fields := no_time,
- Time1Pref = Pref ^ pref_fields := Time1Fields,
- Time1Msg = "[No time info]",
- Time1Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Time1Pref, Deep, Cmd)), s(Time1Msg)])
- ),
- ( Fields ^ time_fields = ticks ->
- Time2Toggle = ""
- ;
- Time2Fields = Fields ^ time_fields := ticks,
- Time2Pref = Pref ^ pref_fields := Time2Fields,
- Time2Msg = "[Ticks]",
- Time2Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Time2Pref, Deep, Cmd)), s(Time2Msg)])
- ),
- ( Fields ^ time_fields = time ->
- Time3Toggle = ""
- ;
- Time3Fields = Fields ^ time_fields := time,
- Time3Pref = Pref ^ pref_fields := Time3Fields,
- Time3Msg = "[Times]",
- Time3Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Time3Pref, Deep, Cmd)), s(Time3Msg)])
- ),
- ( Fields ^ time_fields = ticks_and_time->
- Time4Toggle = ""
- ;
- Time4Fields = Fields ^ time_fields := ticks_and_time,
- Time4Pref = Pref ^ pref_fields := Time4Fields,
- Time4Msg = "[Ticks and times]",
- Time4Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Time4Pref, Deep, Cmd)), s(Time4Msg)])
- ),
- ( Fields ^ time_fields = time_and_percall ->
- Time5Toggle = ""
- ;
- Time5Fields = Fields ^ time_fields := time_and_percall,
- Time5Pref = Pref ^ pref_fields := Time5Fields,
- Time5Msg = "[Times and per-call times]",
- Time5Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Time5Pref, Deep, Cmd)), s(Time5Msg)])
- ),
- ( Fields ^ time_fields = ticks_and_time_and_percall ->
- Time6Toggle = ""
- ;
- Time6Fields = Fields ^ time_fields := ticks_and_time_and_percall,
- Time6Pref = Pref ^ pref_fields := Time6Fields,
- Time6Msg = "[Ticks and times and per-call times]",
- Time6Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Time6Pref, Deep, Cmd)), s(Time6Msg)])
- ),
- ( Fields ^ callseqs_fields = no_callseqs ->
- CallSeqs1Toggle = ""
- ;
- CallSeqs1Fields = Fields ^ callseqs_fields := no_callseqs,
- CallSeqs1Pref = Pref ^ pref_fields := CallSeqs1Fields,
- CallSeqs1Msg = "[No call sequence number info]",
- CallSeqs1Toggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(CallSeqs1Pref, Deep, Cmd)),
- s(CallSeqs1Msg)])
- ),
- ( Fields ^ callseqs_fields = callseqs ->
- CallSeqs2Toggle = ""
- ;
- CallSeqs2Fields = Fields ^ callseqs_fields := callseqs,
- CallSeqs2Pref = Pref ^ pref_fields := CallSeqs2Fields,
- CallSeqs2Msg = "[Call sequence numbers]",
- CallSeqs2Toggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(CallSeqs2Pref, Deep, Cmd)),
- s(CallSeqs2Msg)])
- ),
- ( Fields ^ callseqs_fields = callseqs_and_percall ->
- CallSeqs3Toggle = ""
- ;
- CallSeqs3Fields = Fields ^ callseqs_fields := callseqs_and_percall,
- CallSeqs3Pref = Pref ^ pref_fields := CallSeqs3Fields,
- CallSeqs3Msg = "[Call sequence numbers including per-call]",
- CallSeqs3Toggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(CallSeqs3Pref, Deep, Cmd)),
- s(CallSeqs3Msg)])
- ),
- ( Fields ^ alloc_fields = no_alloc ->
- Alloc1Toggle = ""
- ;
- Alloc1Fields = Fields ^ alloc_fields := no_alloc,
- Alloc1Pref = Pref ^ pref_fields := Alloc1Fields,
- Alloc1Msg = "[No allocations]",
- Alloc1Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Alloc1Pref, Deep, Cmd)), s(Alloc1Msg)])
- ),
- ( Fields ^ alloc_fields = alloc ->
- Alloc2Toggle = ""
- ;
- Alloc2Fields = Fields ^ alloc_fields := alloc,
- Alloc2Pref = Pref ^ pref_fields := Alloc2Fields,
- Alloc2Msg = "[Allocations]",
- Alloc2Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Alloc2Pref, Deep, Cmd)), s(Alloc2Msg)])
- ),
- ( Fields ^ alloc_fields = alloc_and_percall ->
- Alloc3Toggle = ""
- ;
- Alloc3Fields = Fields ^ alloc_fields := alloc_and_percall,
- Alloc3Pref = Pref ^ pref_fields := Alloc3Fields,
- Alloc3Msg = "[Allocations and per-call allocations]",
- Alloc3Toggle = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Alloc3Pref, Deep, Cmd)), s(Alloc3Msg)])
- ),
- ( Fields ^ memory_fields = no_memory ->
- Memory1Toggle = ""
- ;
- Memory1Fields = Fields ^ memory_fields := no_memory,
- Memory1Pref = Pref ^ pref_fields := Memory1Fields,
- Memory1Msg = "[No memory info]",
- Memory1Toggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Memory1Pref, Deep, Cmd)),
- s(Memory1Msg)])
- ),
- ( Fields ^ memory_fields = memory(units_words) ->
- Memory2Toggle = ""
- ;
- Memory2Fields = Fields ^ memory_fields := memory(units_words),
- Memory2Pref = Pref ^ pref_fields := Memory2Fields,
- Memory2Msg = "[Words]",
- Memory2Toggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Memory2Pref, Deep, Cmd)),
- s(Memory2Msg)])
- ),
- ( Fields ^ memory_fields = memory(units_bytes) ->
- Memory3Toggle = ""
- ;
- Memory3Fields = Fields ^ memory_fields := memory(units_bytes),
- Memory3Pref = Pref ^ pref_fields := Memory3Fields,
- Memory3Msg = "[Bytes]",
- Memory3Toggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Memory3Pref, Deep, Cmd)),
- s(Memory3Msg)])
- ),
- ( Fields ^ memory_fields = memory_and_percall(units_words) ->
- Memory4Toggle = ""
- ;
- Memory4Fields = Fields ^ memory_fields :=
- memory_and_percall(units_words),
- Memory4Pref = Pref ^ pref_fields := Memory4Fields,
- Memory4Msg = "[Words and per-call words]",
- Memory4Toggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Memory4Pref, Deep, Cmd)),
- s(Memory4Msg)])
- ),
- ( Fields ^ memory_fields = memory_and_percall(units_bytes) ->
- Memory5Toggle = ""
- ;
- Memory5Fields = Fields ^ memory_fields :=
- memory_and_percall(units_bytes),
- Memory5Pref = Pref ^ pref_fields := Memory5Fields,
- Memory5Msg = "[Bytes and per-call bytes]",
- Memory5Toggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Memory5Pref, Deep, Cmd)),
- s(Memory5Msg)])
- ),
- ( Fields = default_fields(Deep) ->
- DefaultToggle = ""
- ;
- DefaultMsg = "[Restore defaults]",
- DefaultPref = Pref ^ pref_fields := default_fields(Deep),
- DefaultToggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(DefaultPref, Deep, Cmd)),
- s(DefaultMsg)])
- ),
- HTML =
- "<strong>Toggle fields:</strong>\n" ++
- DefaultToggle ++
- "<br>\n" ++
- Port1Toggle ++ Port2Toggle ++
- "<br>\n" ++
- Time1Toggle ++ Time2Toggle ++ Time3Toggle ++
- Time4Toggle ++ Time5Toggle ++ Time6Toggle ++
- "<br>\n" ++
- CallSeqs1Toggle ++ CallSeqs2Toggle ++ CallSeqs3Toggle ++
- "<br>\n" ++
- Alloc1Toggle ++ Alloc2Toggle ++ Alloc3Toggle ++
- "<br>\n" ++
- Memory1Toggle ++ Memory2Toggle ++ Memory3Toggle ++
- Memory4Toggle ++ Memory5Toggle ++
- "<br>\n".
-
-:- func footer_ancestor_toggle(cmd, preferences, deep) = string.
-
-footer_ancestor_toggle(Cmd, Pref, Deep) = HTML :-
- (
- Pref ^ pref_anc = no,
- Display1 = yes,
- Display2 = yes,
- Msg1 = "[One ancestor]",
- Pref1 = Pref ^ pref_anc := yes(1),
- Msg2 = "[Two ancestors]",
- Pref2 = Pref ^ pref_anc := yes(2),
- Msg3 = "[Three ancestors]",
- Pref3 = Pref ^ pref_anc := yes(3),
- Msg4 = "[Five ancestors]",
- Pref4 = Pref ^ pref_anc := yes(5),
- Msg5 = "[Ten ancestors]",
- Pref5 = Pref ^ pref_anc := yes(10)
- ;
- Pref ^ pref_anc = yes(OldAncestorLimit),
- ( OldAncestorLimit > 2 ->
- Display1 = yes
- ;
- Display1 = no
- ),
- ( OldAncestorLimit > 1 ->
- Display2 = yes
- ;
- Display2 = no
- ),
- Msg1 = "[Halve ancestors]",
- Pref1 = Pref ^ pref_anc := yes(OldAncestorLimit // 2),
- Msg2 = "[Remove an ancestor]",
- Pref2 = Pref ^ pref_anc := yes(OldAncestorLimit - 1),
- Msg3 = "[Add an ancestor]",
- Pref3 = Pref ^ pref_anc := yes(OldAncestorLimit + 1),
- Msg4 = "[Double ancestors]",
- Pref4 = Pref ^ pref_anc := yes(OldAncestorLimit * 2),
- Msg5 = "[Unlimited ancestors]",
- Pref5 = Pref ^ pref_anc := no
- ),
- Toggle1 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref1, Deep, Cmd)), s(Msg1)]),
- Toggle2 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref2, Deep, Cmd)), s(Msg2)]),
- Toggle3 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref3, Deep, Cmd)), s(Msg3)]),
- Toggle4 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref4, Deep, Cmd)), s(Msg4)]),
- Toggle5 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref5, Deep, Cmd)), s(Msg5)]),
- (
- Display1 = yes,
- MaybeToggle1 = Toggle1
- ;
- Display1 = no,
- MaybeToggle1 = ""
- ),
- (
- Display2 = yes,
- MaybeToggle2 = Toggle2
- ;
- Display2 = no,
- MaybeToggle2 = ""
- ),
- HTML =
- "<strong>Toggle ancestors:</strong><br />\n" ++
- MaybeToggle1 ++ MaybeToggle2 ++ Toggle3 ++ Toggle4 ++ Toggle5.
-
-:- func footer_box_toggle(cmd, preferences, deep) = string.
-
-footer_box_toggle(Cmd, Pref, Deep) = HTML :-
- (
- Pref ^ pref_box = do_not_box_tables,
- Pref1 = Pref ^ pref_box := box_tables,
- Msg1 = "[Box]"
- ;
- Pref ^ pref_box = box_tables,
- Pref1 = Pref ^ pref_box := do_not_box_tables,
- Msg1 = "[Unbox]"
- ),
- HTML = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref1, Deep, Cmd)), s(Msg1)]).
-
-:- func footer_colour_toggle(cmd, preferences, deep) = string.
-
-footer_colour_toggle(Cmd, Pref, Deep) = HTML :-
- (
- Pref ^ pref_colour = do_not_colour_column_groups,
- Pref1 = Pref ^ pref_colour := colour_column_groups,
- Msg1 = "[Colour column groups]"
- ;
- Pref ^ pref_colour = colour_column_groups,
- Pref1 = Pref ^ pref_colour := do_not_colour_column_groups,
- Msg1 = "[Fade column groups]"
- ),
- HTML = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref1, Deep, Cmd)), s(Msg1)]).
-
-:- func footer_summarize_toggle(cmd, preferences, deep) = string.
-
-footer_summarize_toggle(Cmd, Pref, Deep) = HTML :-
- (
- Pref ^ pref_summarize = summarize_ho_call_sites,
- Pref1 = Pref ^ pref_summarize := do_not_summarize_ho_call_sites,
- Msg1 = "[Expand higher order calls]"
- ;
- Pref ^ pref_summarize = do_not_summarize_ho_call_sites,
- Pref1 = Pref ^ pref_summarize := summarize_ho_call_sites,
- Msg1 = "[Summarize higher order calls]"
- ),
- HTML = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref1, Deep, Cmd)), s(Msg1)]).
-
-:- func footer_contour_toggle(cmd, preferences, deep) = string.
-
-footer_contour_toggle(Cmd, Pref, Deep) = HTML :-
- (
- Pref ^ pref_contour = do_not_apply_contour_exclusion,
- Pref1 = Pref ^ pref_contour := apply_contour_exclusion,
- Msg1 = "[Apply contour exclusion]"
- ;
- Pref ^ pref_contour = apply_contour_exclusion,
- Pref1 = Pref ^ pref_contour := do_not_apply_contour_exclusion,
- Msg1 = "[Don't apply contour exclusion]"
- ),
- HTML = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref1, Deep, Cmd)), s(Msg1)]).
-
-:- func footer_time_format_toggle(cmd, preferences, deep) = string.
-
-footer_time_format_toggle(Cmd, Pref, Deep) = HTML :-
- TimeFields = Pref ^ pref_fields ^ time_fields,
- (
- ( TimeFields = no_time
- ; TimeFields = ticks
- ),
- ToggleTimeFormat = no
- ;
- ( TimeFields = time
- ; TimeFields = ticks_and_time
- ; TimeFields = time_and_percall
- ; TimeFields = ticks_and_time_and_percall
- ),
- ToggleTimeFormat = yes
- ),
- (
- ToggleTimeFormat = no,
- HTML = ""
- ;
- ToggleTimeFormat = yes,
- (
- Pref ^ pref_time = no_scale,
- Pref1 = Pref ^ pref_time := scale_by_millions,
- Msg1 = "[Time in s, us]",
- Pref2 = Pref ^ pref_time := scale_by_thousands,
- Msg2 = "[Time in s, ms, us, ns]"
- ;
- Pref ^ pref_time = scale_by_millions,
- Pref1 = Pref ^ pref_time := no_scale,
- Msg1 = "[Time in s]",
- Pref2 = Pref ^ pref_time := scale_by_thousands,
- Msg2 = "[Time in s, ms, us, ns]"
- ;
- Pref ^ pref_time = scale_by_thousands,
- Pref1 = Pref ^ pref_time := no_scale,
- Msg1 = "[Time in s]",
- Pref2 = Pref ^ pref_time := scale_by_millions,
- Msg2 = "[Time in s, us]"
- ),
- HTML =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref1, Deep, Cmd)), s(Msg1)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref2, Deep, Cmd)), s(Msg2)])
- ).
-
-%-----------------------------------------------------------------------------%
-
-:- func footer_order_criteria_toggle(cmd, preferences, deep) = string.
-
-footer_order_criteria_toggle(Cmd, Pref, Deep) =
- toggle_criteria(Pref ^ pref_criteria,
- update_criteria_in_prefs(Pref, Deep, Cmd),
- update_cost_criteria_in_prefs(Pref, Deep, Cmd)).
-
-toggle_cost_criteria_in_top_procs_cmd(Pref, Deep, Limit,
- CostKind, InclDesc, Scope) =
- toggle_cost_criteria(CostKind, InclDesc, Scope,
- update_cost_criteria_in_top_procs_cmd(Pref, Deep, Limit)).
-
-%-----------------------------------------------------------------------------%
-
-:- type update_criteria_func == (func(order_criteria) = string).
-
-:- type update_cost_criteria_func ==
- (func(cost_kind, include_descendants, measurement_scope) = string).
-
-:- func toggle_criteria(order_criteria,
- update_criteria_func, update_cost_criteria_func) = string.
-
-toggle_criteria(Criteria, UpdateCriteria, UpdateCostCriteria) = HTML :-
- (
- Criteria = by_context,
- Criteria1 = by_name,
- Msg1 = "[Sort by name]",
- Criteria2 =
- by_cost(default_cost_kind, default_incl_desc, default_scope),
- Msg2 = "[Sort by cost]"
- ;
- Criteria = by_name,
- Criteria1 = by_context,
- Msg1 = "[Sort by context]",
- Criteria2 =
- by_cost(default_cost_kind, default_incl_desc, default_scope),
- Msg2 = "[Sort by cost]"
- ;
- Criteria = by_cost(_, _, _),
- Criteria1 = by_context,
- Msg1 = "[Sort by context]",
- Criteria2 = by_name,
- Msg2 = "[Sort by name]"
- ),
- Toggle1 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(Criteria1)), s(Msg1)]),
- Toggle2 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(Criteria2)), s(Msg2)]),
- (
- Criteria = by_cost(CostKind, InclDesc, Scope),
- ToggleRest = toggle_cost_criteria(CostKind, InclDesc, Scope,
- UpdateCostCriteria)
- ;
- ( Criteria = by_context
- ; Criteria = by_name
- ),
- ToggleRest = ""
- ),
- HTML = "<strong>Toggle ordering criteria:</strong><br />\n" ++
- Toggle1 ++ Toggle2 ++ ToggleRest.
-
-:- func toggle_cost_criteria(cost_kind, include_descendants, measurement_scope,
- update_cost_criteria_func) = string.
-
-toggle_cost_criteria(CostKind, InclDesc, Scope, UpdateCriteria) = Toggles :-
- (
- ( CostKind = cost_redos
- ; CostKind = cost_time
- ; CostKind = cost_callseqs
- ; CostKind = cost_allocs
- ; CostKind = cost_words
- ),
- MsgCalls = "[Sort by calls]",
- ToggleCalls = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(cost_calls, InclDesc, Scope)), s(MsgCalls)])
- ;
- CostKind = cost_calls,
- ToggleCalls = ""
- ),
- (
- ( CostKind = cost_calls
- ; CostKind = cost_time
- ; CostKind = cost_callseqs
- ; CostKind = cost_allocs
- ; CostKind = cost_words
- ),
- MsgRedos = "[Sort by redos]",
- ToggleRedos = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(cost_redos, InclDesc, Scope)), s(MsgRedos)])
- ;
- CostKind = cost_redos,
- ToggleRedos = ""
- ),
- (
- ( CostKind = cost_calls
- ; CostKind = cost_redos
- ; CostKind = cost_callseqs
- ; CostKind = cost_allocs
- ; CostKind = cost_words
- ),
- MsgTime = "[Sort by time]",
- ToggleTime = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(cost_time, InclDesc, Scope)), s(MsgTime)])
- ;
- CostKind = cost_time,
- ToggleTime = ""
- ),
- (
- ( CostKind = cost_calls
- ; CostKind = cost_redos
- ; CostKind = cost_time
- ; CostKind = cost_allocs
- ; CostKind = cost_words
- ),
- MsgCallSeqs = "[Sort by call sequence numbers]",
- ToggleCallSeqs =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(cost_callseqs, InclDesc, Scope)),
- s(MsgCallSeqs)])
- ;
- CostKind = cost_callseqs,
- ToggleCallSeqs = ""
- ),
- (
- ( CostKind = cost_calls
- ; CostKind = cost_redos
- ; CostKind = cost_time
- ; CostKind = cost_callseqs
- ; CostKind = cost_words
- ),
- MsgAllocs = "[Sort by allocations]",
- ToggleAllocs =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(cost_allocs, InclDesc, Scope)),
- s(MsgAllocs)])
- ;
- CostKind = cost_allocs,
- ToggleAllocs = ""
- ),
- (
- ( CostKind = cost_calls
- ; CostKind = cost_redos
- ; CostKind = cost_time
- ; CostKind = cost_callseqs
- ; CostKind = cost_allocs
- ),
- MsgWords = "[Sort by words]",
- ToggleWords = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(cost_words, InclDesc, Scope)), s(MsgWords)])
- ;
- CostKind = cost_words,
- ToggleWords = ""
- ),
- (
- InclDesc = self,
- MsgDesc = "[Include descendants]",
- ToggleDesc = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(CostKind, self_and_desc, Scope)), s(MsgDesc)])
- ;
- InclDesc = self_and_desc,
- MsgDesc = "[Exclude descendants]",
- ToggleDesc = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(CostKind, self, Scope)), s(MsgDesc)])
- ),
- (
- Scope = per_call,
- MsgScope = "[Count overall cost]",
- ToggleScope = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(CostKind, InclDesc, overall)), s(MsgScope)])
- ;
- Scope = overall,
- MsgScope = "[Count per-call cost]",
- ToggleScope = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(UpdateCriteria(CostKind, InclDesc, per_call)), s(MsgScope)])
- ),
- Toggles = ToggleCalls ++ ToggleRedos ++ ToggleTime ++ ToggleCallSeqs ++
- ToggleAllocs ++ ToggleWords ++
- "\n<br>\n" ++ ToggleDesc ++ ToggleScope.
-
-%-----------------------------------------------------------------------------%
-%
-% Toggles to control showing/hiding inactive modules/procedures
-%
-
-:- func footer_inactive_modules_toggle(cmd, preferences, deep) = string.
-
-footer_inactive_modules_toggle(Cmd, Pref0, Deep) = HTML :-
- Pref0 ^ pref_inactive = inactive_items(CallsSites, Procs, Modules),
- (
- Modules = inactive_show,
- Msg = "[Hide inactive modules]",
- Pref = Pref0 ^ pref_inactive :=
- inactive_items(CallsSites, Procs, inactive_hide)
- ;
- Modules = inactive_hide,
- Msg = "[Show inactive modules]",
- Pref = Pref0 ^ pref_inactive :=
- inactive_items(CallsSites, Procs, inactive_show)
- ),
- HTML = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, Cmd)), s(Msg)]).
-
-:- func footer_inactive_procs_toggle(cmd, preferences, deep) = string.
-
-footer_inactive_procs_toggle(Cmd, Pref0, Deep) = HTML :-
- Pref0 ^ pref_inactive = inactive_items(CallsSites, Procs, Modules),
- (
- Procs = inactive_show,
- Msg = "[Hide inactive procedures]",
- Pref = Pref0 ^ pref_inactive :=
- inactive_items(CallsSites, inactive_hide, Modules)
- ;
- Procs = inactive_hide,
- Msg = "[Show inactive procedures]",
- Pref = Pref0 ^ pref_inactive :=
- inactive_items(CallsSites, inactive_show, Modules)
- ),
- HTML = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, Cmd)), s(Msg)]).
-
-%-----------------------------------------------------------------------------%
-
-:- func update_criteria_in_prefs(preferences, deep, cmd, order_criteria)
- = string.
-
-update_criteria_in_prefs(Pref0, Deep, Cmd, Criteria) = HTML :-
- Pref = Pref0 ^ pref_criteria := Criteria,
- HTML = deep_cmd_pref_to_url(Pref, Deep, Cmd).
-
-:- func update_cost_criteria_in_prefs(preferences, deep, cmd,
- cost_kind, include_descendants, measurement_scope) = string.
-
-update_cost_criteria_in_prefs(Pref0, Deep, Cmd, CostKind, InclDesc, Scope)
- = HTML :-
- Pref = Pref0 ^ pref_criteria := by_cost(CostKind, InclDesc, Scope),
- HTML = deep_cmd_pref_to_url(Pref, Deep, Cmd).
-
-:- func update_cost_criteria_in_top_procs_cmd(preferences, deep, display_limit,
- cost_kind, include_descendants, measurement_scope) = string.
-
-update_cost_criteria_in_top_procs_cmd(Pref, Deep, Limit,
- CostKind, InclDesc, Scope) = HTML :-
- Cmd = deep_cmd_top_procs(Limit, CostKind, InclDesc, Scope),
- HTML = deep_cmd_pref_to_url(Pref, Deep, Cmd).
-
-%-----------------------------------------------------------------------------%
-
-criteria_to_description(by_context) = "ordered by context".
-criteria_to_description(by_name) = "ordered by name".
-criteria_to_description(by_cost(CostKind, InclDesc, Scope)) =
- cost_criteria_to_description(CostKind, InclDesc, Scope).
-
-cost_criteria_to_description(CostKind, InclDesc, Scope) = Desc :-
- Desc =
- "ordered by " ++
- incl_desc_to_description(InclDesc) ++ " " ++
- cost_kind_to_description(CostKind) ++ " " ++
- scope_to_description(Scope).
-
-:- func cost_kind_to_description(cost_kind) = string.
-
-cost_kind_to_description(cost_calls) = "number of calls".
-cost_kind_to_description(cost_redos) = "number of redos".
-cost_kind_to_description(cost_time) = "time".
-cost_kind_to_description(cost_callseqs) = "call sequence numbers".
-cost_kind_to_description(cost_allocs) = "memory allocations".
-cost_kind_to_description(cost_words) = "words allocated".
-
-:- func incl_desc_to_description(include_descendants) = string.
-
-incl_desc_to_description(self) = "self".
-incl_desc_to_description(self_and_desc) = "total".
-
-:- func scope_to_description(measurement_scope) = string.
-
-scope_to_description(per_call) = "per call".
-scope_to_description(overall) = "overall".
-
-%-----------------------------------------------------------------------------%
-
-% The predicates banner_style, fields_header, table_width and
-% own_and_desc_to_html all make decisions about what columns each row
-% in the table will have. They therefore have similar control structures,
-% and a change in one may require changes in the others as well.
-
-fields_header(Pref, IdFields, TotalsDisp, WrapFunc) = HTML :-
- Fields = Pref ^ pref_fields,
- ProcName = WrapFunc("Procedure", by_name),
- ModuleName = WrapFunc("Module", by_name),
-
- some [!FirstRow, !SecondRow] (
- (
- IdFields = source_proc,
- Source = WrapFunc("Source", by_context),
- !:FirstRow =
- "<TR>\n" ++
- string.format("<TH ALIGN=LEFT ROWSPAN=2>%s\n", [s(Source)]) ++
- string.format("<TH ALIGN=LEFT ROWSPAN=2>%s\n", [s(ProcName)])
- ;
- IdFields = rank_proc,
- !:FirstRow =
- "<TR>\n" ++
- "<TH ALIGN=LEFT ROWSPAN=2>Rank\n" ++
- string.format("<TH ALIGN=LEFT ROWSPAN=2>%s\n", [s(ProcName)])
- ;
- IdFields = rank_module,
- !:FirstRow =
- "<TR>\n" ++
- "<TH ALIGN=LEFT ROWSPAN=2>Rank\n" ++
- string.format("<TH ALIGN=LEFT ROWSPAN=2>%s\n", [s(ModuleName)])
- ;
- IdFields = proc,
- !:FirstRow =
- "<TR>\n" ++
- string.format("<TH ALIGN=LEFT ROWSPAN=2>%s\n", [s(ProcName)])
- ),
- !:SecondRow = "<TR>\n",
-
- ShowPortCounts = show_port_counts(Fields),
- (
- ShowPortCounts = yes,
- Calls = WrapFunc("Calls", by_cost(cost_calls, self, overall)),
- Redos = WrapFunc("Redos", by_cost(cost_redos, self, overall)),
- !:FirstRow = !.FirstRow ++
- "<TH COLSPAN=5>Port counts\n",
- !:SecondRow = !.SecondRow ++
- string.format("<TH ALIGN=RIGHT>%s\n", [s(Calls)]) ++
- "<TH ALIGN=RIGHT>Exits\n" ++
- "<TH ALIGN=RIGHT>Fails\n" ++
- string.format("<TH ALIGN=RIGHT>%s\n", [s(Redos)]) ++
- "<TH ALIGN=RIGHT>Excps\n"
- ;
- ShowPortCounts = no
- ),
-
- ShowQuanta = show_quanta(Fields),
- (
- ShowQuanta = yes,
- TicksSelfOverall = WrapFunc("Self",
- by_cost(cost_time, self, overall)),
- TicksSelfHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(TicksSelfOverall)]),
- TicksSelfFields = 1
- ;
- ShowQuanta = no,
- TicksSelfHeading = "",
- TicksSelfFields = 0
- ),
- ShowTimes = show_times(Fields),
- (
- ShowTimes = yes,
- ( show_quanta(Fields) = yes ->
- TimeSelfOverall = WrapFunc("Time",
- by_cost(cost_time, self, overall))
- ;
- TimeSelfOverall = WrapFunc("Self",
- by_cost(cost_time, self, overall))
- ),
- TimeSelfHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(TimeSelfOverall)]),
- TimeSelfFields = 1
- ;
- ShowTimes = no,
- TimeSelfHeading = "",
- TimeSelfFields = 0
- ),
- ( ( ShowQuanta = yes ; ShowTimes = yes ) ->
- TimeSelfPercentHeading = "<TH ALIGN=RIGHT>%\n",
- TimeSelfPercentFields = 1
- ;
- TimeSelfPercentHeading = "",
- TimeSelfPercentFields = 0
- ),
- ShowTimesPerCall = show_times_per_call(Fields),
- (
- ShowTimesPerCall = yes,
- TimeSelfPerCall = WrapFunc("/call",
- by_cost(cost_time, self, per_call)),
- TimeSelfPerCallHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(TimeSelfPerCall)]),
- TimeSelfPerCallFields = 1
- ;
- ShowTimesPerCall = no,
- TimeSelfPerCallHeading = "",
- TimeSelfPerCallFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowQuanta = yes ->
- TicksTotalOverall = WrapFunc("Total",
- by_cost(cost_time, self_and_desc, overall)),
- TicksTotalHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(TicksTotalOverall)]),
- TicksTotalFields = 1
- ;
- TicksTotalHeading = "",
- TicksTotalFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowTimes = yes ->
- ( show_quanta(Fields) = yes ->
- TimeTotalOverall = WrapFunc("Time",
- by_cost(cost_time, self_and_desc, overall))
- ;
- TimeTotalOverall = WrapFunc("Total",
- by_cost(cost_time, self_and_desc, overall))
- ),
- TimeTotalHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(TimeTotalOverall)]),
- TimeTotalFields = 1
- ;
- TimeTotalHeading = "",
- TimeTotalFields = 0
- ),
- (
- TotalsDisp = totals_meaningful,
- ( ShowQuanta = yes ; ShowTimes = yes )
- ->
- TimeTotalPercentHeading = "<TH ALIGN=RIGHT>%\n",
- TimeTotalPercentFields = 1
- ;
- TimeTotalPercentHeading = "",
- TimeTotalPercentFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowTimesPerCall = yes ->
- TimeTotalPerCall = WrapFunc("/call",
- by_cost(cost_time, self_and_desc, per_call)),
- TimeTotalPerCallHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(TimeTotalPerCall)]),
- TimeTotalPerCallFields = 1
- ;
- TimeTotalPerCallHeading = "",
- TimeTotalPerCallFields = 0
- ),
- TimeFields =
- TicksSelfFields + TimeSelfFields +
- TimeSelfPercentFields + TimeSelfPerCallFields +
- TicksTotalFields + TimeTotalFields +
- TimeTotalPercentFields + TimeTotalPerCallFields,
- !:SecondRow = !.SecondRow ++
- TicksSelfHeading ++ TimeSelfHeading ++
- TimeSelfPercentHeading ++ TimeSelfPerCallHeading ++
- TicksTotalHeading ++ TimeTotalHeading ++
- TimeTotalPercentHeading ++ TimeTotalPerCallHeading,
- (
- ShowQuanta = yes,
- ShowTimes = yes,
- !:FirstRow = !.FirstRow ++
- string.format("<TH COLSPAN=%d>Clock ticks and times\n",
- [i(TimeFields)])
- ;
- ShowQuanta = yes,
- ShowTimes = no,
- !:FirstRow = !.FirstRow ++
- string.format("<TH COLSPAN=%d>Clock ticks\n", [i(TimeFields)])
- ;
- ShowQuanta = no,
- ShowTimes = yes,
- !:FirstRow = !.FirstRow ++
- string.format("<TH COLSPAN=%d>Time\n", [i(TimeFields)])
- ;
- ShowQuanta = no,
- ShowTimes = no
- ),
-
- ShowCallSeqs = show_callseqs(Fields),
- (
- ShowCallSeqs = yes,
- CallSeqsSelfOverall = WrapFunc("Self",
- by_cost(cost_callseqs, self, overall)),
- CallSeqsSelfHeading =
- string.format("<TH ALIGN=RIGHT>%s\n",
- [s(CallSeqsSelfOverall)]) ++
- "<TH ALIGN=RIGHT>%\n",
- CallSeqsSelfFields = 2
- ;
- ShowCallSeqs = no,
- CallSeqsSelfHeading = "",
- CallSeqsSelfFields = 0
- ),
- ShowCallSeqsPerCall = show_callseqs_per_call(Fields),
- (
- ShowCallSeqsPerCall = yes,
- CallSeqsSelfPerCall = WrapFunc("/call",
- by_cost(cost_callseqs, self, per_call)),
- CallSeqsSelfPerCallHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(CallSeqsSelfPerCall)]),
- CallSeqsSelfPerCallFields = 1
- ;
- ShowCallSeqsPerCall = no,
- CallSeqsSelfPerCallHeading = "",
- CallSeqsSelfPerCallFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowCallSeqs = yes ->
- CallSeqsTotalOverall = WrapFunc("Total",
- by_cost(cost_callseqs, self_and_desc, overall)),
- CallSeqsTotalHeading =
- string.format("<TH ALIGN=RIGHT>%s\n",
- [s(CallSeqsTotalOverall)]) ++
- "<TH ALIGN=RIGHT>%\n",
- CallSeqsTotalFields = 2
- ;
- CallSeqsTotalHeading = "",
- CallSeqsTotalFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowCallSeqsPerCall = yes ->
- CallSeqsTotalPerCall = WrapFunc("/call",
- by_cost(cost_callseqs, self_and_desc, per_call)),
- CallSeqsTotalPerCallHeading =
- string.format("<TH ALIGN=RIGHT>%s\n",
- [s(CallSeqsTotalPerCall)]),
- CallSeqsTotalPerCallFields = 1
- ;
- CallSeqsTotalPerCallHeading = "",
- CallSeqsTotalPerCallFields = 0
- ),
- CallSeqsFields =
- CallSeqsSelfFields + CallSeqsSelfPerCallFields +
- CallSeqsTotalFields + CallSeqsTotalPerCallFields,
- !:SecondRow = !.SecondRow ++
- CallSeqsSelfHeading ++ CallSeqsSelfPerCallHeading ++
- CallSeqsTotalHeading ++ CallSeqsTotalPerCallHeading,
- (
- ShowCallSeqs = yes,
- !:FirstRow = !.FirstRow ++
- string.format("<TH COLSPAN=%d>Call sequence numbers\n",
- [i(CallSeqsFields)])
- ;
- ShowCallSeqs = no
- ),
-
- ShowAlloc = show_alloc(Fields),
- (
- ShowAlloc = yes,
- AllocsSelfOverall = WrapFunc("Self",
- by_cost(cost_allocs, self, overall)),
- AllocsSelfHeading =
- string.format("<TH ALIGN=RIGHT>%s\n",
- [s(AllocsSelfOverall)]) ++
- "<TH ALIGN=RIGHT>%\n",
- AllocsSelfFields = 2
- ;
- ShowAlloc = no,
- AllocsSelfHeading = "",
- AllocsSelfFields = 0
- ),
- ShowAllocPerCall = show_alloc_per_call(Fields),
- (
- ShowAllocPerCall = yes,
- AllocsSelfPerCall = WrapFunc("/call",
- by_cost(cost_allocs, self, per_call)),
- AllocsSelfPerCallHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(AllocsSelfPerCall)]),
- AllocsSelfPerCallFields = 1
- ;
- ShowAllocPerCall = no,
- AllocsSelfPerCallHeading = "",
- AllocsSelfPerCallFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowAlloc = yes ->
- AllocsTotalOverall = WrapFunc("Total",
- by_cost(cost_allocs, self_and_desc, overall)),
- AllocsTotalHeading =
- string.format("<TH ALIGN=RIGHT>%s\n",
- [s(AllocsTotalOverall)]) ++
- "<TH ALIGN=RIGHT>%\n",
- AllocsTotalFields = 2
- ;
- AllocsTotalHeading = "",
- AllocsTotalFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowAllocPerCall = yes ->
- AllocsTotalPerCall = WrapFunc("/call",
- by_cost(cost_allocs, self_and_desc, per_call)),
- AllocsTotalPerCallHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(AllocsTotalPerCall)]),
- AllocsTotalPerCallFields = 1
- ;
- AllocsTotalPerCallHeading = "",
- AllocsTotalPerCallFields = 0
- ),
- AllocsFields =
- AllocsSelfFields + AllocsSelfPerCallFields +
- AllocsTotalFields + AllocsTotalPerCallFields,
- !:SecondRow = !.SecondRow ++
- AllocsSelfHeading ++ AllocsSelfPerCallHeading ++
- AllocsTotalHeading ++ AllocsTotalPerCallHeading,
- (
- ShowAlloc = yes,
- !:FirstRow = !.FirstRow ++
- string.format("<TH COLSPAN=%d>Memory allocations\n",
- [i(AllocsFields)])
- ;
- ShowAlloc = no
- ),
-
- ShowMemory = show_memory(Fields),
- (
- ShowMemory = yes(_),
- MemorySelfOverall = WrapFunc("Self",
- by_cost(cost_words, self, overall)),
- MemorySelfHeading =
- string.format("<TH ALIGN=RIGHT>%s\n",
- [s(MemorySelfOverall)]) ++
- "<TH ALIGN=RIGHT>%\n",
- MemorySelfFields = 2
- ;
- ShowMemory = no,
- MemorySelfHeading = "",
- MemorySelfFields = 0
- ),
- ShowMemoryPerCall = show_memory_per_call(Fields),
- (
- ShowMemoryPerCall = yes(_),
- MemorySelfPerCall = WrapFunc("/call",
- by_cost(cost_words, self, per_call)),
- MemorySelfPerCallHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(MemorySelfPerCall)]),
- MemorySelfPerCallFields = 1
- ;
- ShowMemoryPerCall = no,
- MemorySelfPerCallHeading = "",
- MemorySelfPerCallFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowMemory = yes(_) ->
- MemoryTotalOverall = WrapFunc("Total",
- by_cost(cost_words, self_and_desc, overall)),
- MemoryTotalHeading =
- string.format("<TH ALIGN=RIGHT>%s\n",
- [s(MemoryTotalOverall)]) ++
- "<TH ALIGN=RIGHT>%\n",
- MemoryTotalFields = 2
- ;
- MemoryTotalHeading = "",
- MemoryTotalFields = 0
- ),
- ( TotalsDisp = totals_meaningful, ShowMemoryPerCall = yes(_) ->
- MemoryTotalPerCall = WrapFunc("/call",
- by_cost(cost_words, self_and_desc, per_call)),
- MemoryTotalPerCallHeading =
- string.format("<TH ALIGN=RIGHT>%s\n", [s(MemoryTotalPerCall)]),
- MemoryTotalPerCallFields = 1
- ;
- MemoryTotalPerCallHeading = "",
- MemoryTotalPerCallFields = 0
- ),
- MemoryFields =
- MemorySelfFields + MemorySelfPerCallFields +
- MemoryTotalFields + MemoryTotalPerCallFields,
- !:SecondRow = !.SecondRow ++
- MemorySelfHeading ++ MemorySelfPerCallHeading ++
- MemoryTotalHeading ++ MemoryTotalPerCallHeading,
- (
- ShowMemory = yes(Units),
- (
- Units = units_words,
- !:FirstRow = !.FirstRow ++
- string.format("<TH COLSPAN=%d>Memory words\n",
- [i(MemoryFields)])
- ;
- Units = units_bytes,
- !:FirstRow = !.FirstRow ++
- string.format("<TH COLSPAN=%d>Memory bytes\n",
- [i(MemoryFields)])
- )
- ;
- ShowMemory = no
- ),
- HTML =
- "<THEAD>\n" ++
- !.FirstRow ++
- !.SecondRow ++
- "<TBODY>\n" ++
- separator_row(Pref, IdFields, TotalsDisp)
- ).
-
-%-----------------------------------------------------------------------------%
-
-header_row(Heading, Pref, IdFields, TotalsDisp) = Separator :-
- Separator = string.format("<TR><TD COLSPAN=%d>%s</TD></TR>\n",
- [i(table_width(Pref, IdFields, TotalsDisp)), s(Heading)]).
-
-separator_row(Pref, IdFields, TotalsDisp) = Separator :-
- Separator = string.format("<TR><TD COLSPAN=%d></TD></TR>\n",
- [i(table_width(Pref, IdFields, TotalsDisp))]).
-
-:- func table_width(preferences, id_fields, totals_disposition) = int.
-
-table_width(Pref, IdFields, TotalsDisp) = Width :-
- Fields = Pref ^ pref_fields,
- (
- IdFields = source_proc,
- Id = 2
- ;
- IdFields = rank_module,
- Id = 2
- ;
- IdFields = rank_proc,
- Id = 2
- ;
- IdFields = proc,
- Id = 1
- ),
- (
- Fields ^ port_fields = no_port,
- Port = 0
- ;
- Fields ^ port_fields = port,
- Port = 5
- ),
- (
- Fields ^ time_fields = no_time,
- Time = 0
- ;
- Fields ^ time_fields = ticks,
- Time = 2
- ;
- Fields ^ time_fields = time,
- Time = 2
- ;
- Fields ^ time_fields = ticks_and_time,
- Time = 3
- ;
- Fields ^ time_fields = time_and_percall,
- Time = 3
- ;
- Fields ^ time_fields = ticks_and_time_and_percall,
- Time = 4
- ),
- (
- Fields ^ callseqs_fields = no_callseqs,
- CallSeqs = 0
- ;
- Fields ^ callseqs_fields = callseqs,
- CallSeqs = 2
- ;
- Fields ^ callseqs_fields = callseqs_and_percall,
- CallSeqs = 3
- ),
- (
- Fields ^ alloc_fields = no_alloc,
- Alloc = 0
- ;
- Fields ^ alloc_fields = alloc,
- Alloc = 2
- ;
- Fields ^ alloc_fields = alloc_and_percall,
- Alloc = 3
- ),
- (
- Fields ^ memory_fields = no_memory,
- Memory = 0
- ;
- Fields ^ memory_fields = memory(_),
- Memory = 2
- ;
- Fields ^ memory_fields = memory_and_percall(_),
- Memory = 3
- ),
- (
- TotalsDisp = totals_meaningful,
- Width = Id + Port + Time * 2 + CallSeqs * 2 + Alloc * 2 + Memory * 2
- ;
- TotalsDisp = totals_not_meaningful,
- Width = Id + Port + Time + CallSeqs + Alloc + Memory
- ).
-
-%-----------------------------------------------------------------------------%
-
-add_context(Context, LineGroup0) = LineGroup :-
- LineGroup0 =
- line_group(FileName, LineNumber, Name, Own, Desc, HTML0, LaterLines),
- HTML = string.format("<TD CLASS=id>%s</TD>%s",
- [s(Context), s(HTML0)]),
- LineGroup =
- line_group(FileName, LineNumber, Name, Own, Desc, HTML, LaterLines).
-
-add_self_context(LineGroup0) = LineGroup :-
- LineGroup0 =
- line_group(FileName, LineNumber, Name, Own, Desc, HTML0, LaterLines),
- HTML = string.format("<TD CLASS=id>%s:%d</TD>%s",
- [s(FileName), i(LineNumber), s(HTML0)]),
- LineGroup =
- line_group(FileName, LineNumber, Name, Own, Desc, HTML, LaterLines).
-
-add_ranks(LineGroups0) = add_ranks_2(1, LineGroups0).
-
-:- func add_ranks_2(int, list(line_group(one_id, LL)))
- = list(line_group(two_id, LL)).
-
-add_ranks_2(_Rank, []) = [].
-add_ranks_2(Rank, [LineGroup0 | LineGroups0]) = [LineGroup | LineGroups] :-
- LineGroup0 =
- line_group(FileName, LineNumber, Name, Own, Desc, HTML0, LaterLines),
- HTML = string.format("<TD CLASS=id>%d</TD>%s", [i(Rank), s(HTML0)]),
- LineGroup =
- line_group(FileName, LineNumber, Name, Own, Desc, HTML, LaterLines),
- LineGroups = add_ranks_2(Rank + 1, LineGroups0).
-
-line_to_one_id_subline_group(LineGroup0) = LineGroup :-
- LineGroup0 =
- line_group(FileName, LineNumber, Name, Own, Desc, HTML, unit),
- LineGroup =
- line_group(FileName, LineNumber, Name, Own, Desc, HTML,
- sub_lines(one_id, [])).
-
-line_to_two_id_subline_group(LineGroup0) = LineGroup :-
- LineGroup0 = line_group(FileName, LineNumber, Name, Own, Desc,
- HTML, unit),
- LineGroup = line_group(FileName, LineNumber, Name, Own, Desc,
- HTML, sub_lines(two_id, [])).
-
-%-----------------------------------------------------------------------------%
-
-one_id_line_to_html(Pref, Deep, TotalsDisp, LineGroup) =
- "<TR>\n" ++
- LineGroup ^ group_first_line_id ++
- own_and_desc_to_html(LineGroup ^ group_own, LineGroup ^ group_desc,
- Pref, Deep, TotalsDisp) ++
- "</TR>\n".
-
-one_id_line_group_to_html(Pref, Deep, TotalsDisp, LineGroup) =
- "<TR>\n" ++
- LineGroup ^ group_first_line_id ++
- own_and_desc_to_html(LineGroup ^ group_own, LineGroup ^ group_desc,
- Pref, Deep, TotalsDisp) ++
- "</TR>\n" ++
- string.append_list(
- list.map(one_id_line_to_html(Pref, Deep, TotalsDisp),
- LineGroup ^ group_later_lines ^ sub_line_list)).
-
-two_id_line_to_html(Pref, Deep, TotalsDisp, LineGroup) =
- "<TR>\n" ++
- LineGroup ^ group_first_line_id ++
- own_and_desc_to_html(LineGroup ^ group_own, LineGroup ^ group_desc,
- Pref, Deep, TotalsDisp) ++
- "</TR>\n".
-
-two_id_line_group_to_html(Pref, Deep, TotalsDisp, LineGroup) =
- "<TR>\n" ++
- LineGroup ^ group_first_line_id ++
- own_and_desc_to_html(LineGroup ^ group_own, LineGroup ^ group_desc,
- Pref, Deep, TotalsDisp) ++
- "</TR>\n" ++
- string.append_list(
- list.map(two_id_line_to_html(Pref, Deep, TotalsDisp),
- LineGroup ^ group_later_lines ^ sub_line_list)).
-
-%-----------------------------------------------------------------------------%
-
-own_and_desc_to_html(Own, Desc, Pref, Deep, TotalsDisp) = HTML :-
- add_own_to_inherit(Own, Desc) = OwnPlusDesc,
- Root = root_total_info(Deep),
- Calls = calls(Own),
- Exits = exits(Own),
- Fails = fails(Own),
- Redos = redos(Own),
- Excps = excps(Own),
-
- OwnQuanta = quanta(Own),
- TotalQuanta = inherit_quanta(OwnPlusDesc),
- RootQuanta = inherit_quanta(Root),
- OwnQuantaProp = percentage(OwnQuanta, RootQuanta),
- TotalQuantaProp = percentage(TotalQuanta, RootQuanta),
-
- OwnCallSeqs = callseqs(Own),
- TotalCallSeqs = inherit_callseqs(OwnPlusDesc),
- RootCallSeqs = inherit_callseqs(Root),
- OwnCallSeqsProp = percentage(OwnCallSeqs, RootCallSeqs),
- TotalCallSeqsProp = percentage(TotalCallSeqs, RootCallSeqs),
-
- OwnAllocs = allocs(Own),
- TotalAllocs = inherit_allocs(OwnPlusDesc),
- RootAllocs = inherit_allocs(Root),
- OwnAllocProp = percentage(OwnAllocs, RootAllocs),
- TotalAllocProp = percentage(TotalAllocs, RootAllocs),
-
- OwnWords = words(Own),
- TotalWords = inherit_words(OwnPlusDesc),
- RootWords = inherit_words(Root),
- OwnMemoryProp = percentage(OwnWords, RootWords),
- TotalMemoryProp = percentage(TotalWords, RootWords),
-
- Fields = Pref ^ pref_fields,
-
- ShowPortCounts = show_port_counts(Fields),
- (
- ShowPortCounts = yes,
- PortHTML =
- string.format("<TD CLASS=port ALIGN=RIGHT>%s</TD>\n",
- [s(commas(Calls))]) ++
- string.format("<TD CLASS=port ALIGN=RIGHT>%s</TD>\n",
- [s(commas(Exits))]) ++
- string.format("<TD CLASS=port ALIGN=RIGHT>%s</TD>\n",
- [s(commas(Fails))]) ++
- string.format("<TD CLASS=port ALIGN=RIGHT>%s</TD>\n",
- [s(commas(Redos))]) ++
- string.format("<TD CLASS=port ALIGN=RIGHT>%s</TD>\n",
- [s(commas(Excps))])
- ;
- ShowPortCounts = no,
- PortHTML = ""
- ),
-
- ShowQuanta = show_quanta(Fields),
- (
- ShowQuanta = yes,
- QuantaSelfHTML =
- string.format("<TD CLASS=time ALIGN=RIGHT>%s</TD>\n",
- [s(commas(OwnQuanta))]),
- QuantaTotalHTML =
- string.format("<TD CLASS=time ALIGN=RIGHT>%s</TD>\n",
- [s(commas(TotalQuanta))])
- ;
- ShowQuanta = no,
- QuantaSelfHTML = "",
- QuantaTotalHTML = ""
- ),
- ShowTimes = show_times(Fields),
- (
- ShowTimes = yes,
- TimeSelfHTML =
- string.format("<TD CLASS=time ALIGN=RIGHT>%s</TD>\n",
- [s(overall_time(Pref, Deep, OwnQuanta))]),
- TimeTotalHTML =
- string.format("<TD CLASS=time ALIGN=RIGHT>%s</TD>\n",
- [s(overall_time(Pref, Deep, TotalQuanta))])
- ;
- ShowTimes = no,
- TimeSelfHTML = "",
- TimeTotalHTML = ""
- ),
- ShowTimeFraction = bool.or(ShowQuanta, ShowTimes),
- (
- ShowTimeFraction = yes,
- QuantaPropSelfHTML =
- string.format("<TD CLASS=time ALIGN=RIGHT>%s</TD>\n",
- [s(OwnQuantaProp)]),
- QuantaPropTotalHTML =
- string.format("<TD CLASS=time ALIGN=RIGHT>%s</TD>\n",
- [s(TotalQuantaProp)])
- ;
- ShowTimeFraction = no,
- QuantaPropSelfHTML = "",
- QuantaPropTotalHTML = ""
- ),
- ShowTimesPerCall = show_times_per_call(Fields),
- (
- ShowTimesPerCall = yes,
- TimePerCallSelfHTML =
- string.format("<TD CLASS=time ALIGN=RIGHT>%s</TD>\n",
- [s(per_call_time(Pref, Deep, OwnQuanta, Calls))]),
- TimePerCallTotalHTML =
- string.format("<TD CLASS=time ALIGN=RIGHT>%s</TD>\n",
- [s(per_call_time(Pref, Deep, TotalQuanta, Calls))])
- ;
- ShowTimesPerCall = no,
- TimePerCallSelfHTML = "",
- TimePerCallTotalHTML = ""
- ),
-
- ShowCallSeqs = show_callseqs(Fields),
- (
- ShowCallSeqs = yes,
- CallSeqsSelfHTML =
- string.format("<TD CLASS=callseqs ALIGN=RIGHT>%s</TD>\n",
- [s(commas(OwnCallSeqs))]),
- CallSeqsTotalHTML =
- string.format("<TD CLASS=callseqs ALIGN=RIGHT>%s</TD>\n",
- [s(commas(TotalCallSeqs))]),
- CallSeqsPropSelfHTML =
- string.format("<TD CLASS=callseqs ALIGN=RIGHT>%s</TD>\n",
- [s(OwnCallSeqsProp)]),
- CallSeqsPropTotalHTML =
- string.format("<TD CLASS=callseqs ALIGN=RIGHT>%s</TD>\n",
- [s(TotalCallSeqsProp)])
- ;
- ShowCallSeqs = no,
- CallSeqsSelfHTML = "",
- CallSeqsTotalHTML = "",
- CallSeqsPropSelfHTML = "",
- CallSeqsPropTotalHTML = ""
- ),
- ShowCallSeqsPerCall = show_callseqs_per_call(Fields),
- (
- ShowCallSeqsPerCall = yes,
- ( Calls = 0 ->
- OwnCallSeqsPerCall = "N/A",
- TotalCallSeqsPerCall = "N/A"
- ;
- OwnCallSeqsPerCall =
- one_decimal_fraction(float(OwnCallSeqs) / float(Calls)),
- TotalCallSeqsPerCall =
- one_decimal_fraction(float(TotalCallSeqs) / float(Calls))
- ),
- CallSeqsPerCallSelfHTML =
- string.format("<TD CLASS=callseqs ALIGN=RIGHT>%s</TD>\n",
- [s(OwnCallSeqsPerCall)]),
- CallSeqsPerCallTotalHTML =
- string.format("<TD CLASS=callseqs ALIGN=RIGHT>%s</TD>\n",
- [s(TotalCallSeqsPerCall)])
- ;
- ShowCallSeqsPerCall = no,
- CallSeqsPerCallSelfHTML = "",
- CallSeqsPerCallTotalHTML = ""
- ),
-
- ShowAlloc = show_alloc(Fields),
- (
- ShowAlloc = yes,
- AllocSelfHTML =
- string.format("<TD CLASS=alloc ALIGN=RIGHT>%s</TD>\n",
- [s(commas(OwnAllocs))]) ++
- string.format("<TD CLASS=alloc ALIGN=RIGHT>%s</TD>\n",
- [s(OwnAllocProp)]),
- AllocTotalHTML =
- string.format("<TD CLASS=alloc ALIGN=RIGHT>%s</TD>\n",
- [s(commas(TotalAllocs))]) ++
- string.format("<TD CLASS=alloc ALIGN=RIGHT>%s</TD>\n",
- [s(TotalAllocProp)])
- ;
- ShowAlloc = no,
- AllocSelfHTML = "",
- AllocTotalHTML = ""
- ),
- ShowAllocPerCall = show_alloc_per_call(Fields),
- (
- ShowAllocPerCall = yes,
- AllocPerCallSelfHTML =
- string.format("<TD CLASS=alloc ALIGN=RIGHT>%s</TD>\n",
- [s(count_per_call(OwnAllocs, Calls))]),
- AllocPerCallTotalHTML =
- string.format("<TD CLASS=alloc ALIGN=RIGHT>%s</TD>\n",
- [s(count_per_call(TotalAllocs, Calls))])
- ;
- ShowAllocPerCall = no,
- AllocPerCallSelfHTML = "",
- AllocPerCallTotalHTML = ""
- ),
-
- ShowMemory = show_memory(Fields),
- (
- ShowMemory = yes(Unit),
- (
- Unit = units_words,
- OwnMemory = OwnWords,
- TotalMemory = TotalWords
- ;
- Unit = units_bytes,
- WordSize = Deep ^ profile_stats ^ prs_deep_flags
- ^ df_bytes_per_int,
- OwnMemory = OwnWords * WordSize,
- TotalMemory = TotalWords * WordSize
- )
- ;
- ShowMemory = no,
- % These values won't be used.
- OwnMemory = 0,
- TotalMemory = 0
- ),
- (
- ShowMemory = yes(_),
- MemorySelfHTML =
- string.format("<TD CLASS=memory ALIGN=RIGHT>%s</TD>\n",
- [s(commas(OwnMemory))]) ++
- string.format("<TD CLASS=memory ALIGN=RIGHT>%s</TD>\n",
- [s(OwnMemoryProp)]),
- MemoryTotalHTML =
- string.format("<TD CLASS=memory ALIGN=RIGHT>%s</TD>\n",
- [s(commas(TotalMemory))]) ++
- string.format("<TD CLASS=memory ALIGN=RIGHT>%s</TD>\n",
- [s(TotalMemoryProp)])
- ;
- ShowMemory = no,
- MemorySelfHTML = "",
- MemoryTotalHTML = ""
- ),
- ShowMemoryPerCall = show_memory_per_call(Fields),
- (
- ShowMemoryPerCall = yes(_),
- MemoryPerCallSelfHTML =
- string.format("<TD CLASS=memory ALIGN=RIGHT>%s</TD>\n",
- [s(count_per_call(OwnMemory, Calls))]),
- MemoryPerCallTotalHTML =
- string.format("<TD CLASS=memory ALIGN=RIGHT>%s</TD>\n",
- [s(count_per_call(TotalMemory, Calls))])
- ;
- ShowMemoryPerCall = no,
- MemoryPerCallSelfHTML = "",
- MemoryPerCallTotalHTML = ""
- ),
-
- (
- TotalsDisp = totals_meaningful,
- HTML =
- PortHTML ++
-
- QuantaSelfHTML ++
- TimeSelfHTML ++
- QuantaPropSelfHTML ++
- TimePerCallSelfHTML ++
- QuantaTotalHTML ++
- TimeTotalHTML ++
- QuantaPropTotalHTML ++
- TimePerCallTotalHTML ++
-
- CallSeqsSelfHTML ++
- CallSeqsPropSelfHTML ++
- CallSeqsPerCallSelfHTML ++
- CallSeqsTotalHTML ++
- CallSeqsPropTotalHTML ++
- CallSeqsPerCallTotalHTML ++
-
- AllocSelfHTML ++
- AllocPerCallSelfHTML ++
- AllocTotalHTML ++
- AllocPerCallTotalHTML ++
-
- MemorySelfHTML ++
- MemoryPerCallSelfHTML ++
- MemoryTotalHTML ++
- MemoryPerCallTotalHTML
- ;
- TotalsDisp = totals_not_meaningful,
- HTML =
- PortHTML ++
-
- QuantaSelfHTML ++
- TimeSelfHTML ++
- QuantaPropSelfHTML ++
- TimePerCallSelfHTML ++
-
- CallSeqsSelfHTML ++
- CallSeqsPropSelfHTML ++
- CallSeqsPerCallSelfHTML ++
-
- AllocSelfHTML ++
- AllocPerCallSelfHTML ++
-
- MemorySelfHTML ++
- MemoryPerCallSelfHTML
- ).
-
-%-----------------------------------------------------------------------------%
-
-:- func overall_time(preferences, deep, int) = string.
-
-overall_time(Pref, Deep, Quanta) = TimeStr :-
- lookup_ticks_per_sec(Deep ^ profile_stats, TicksPerSec, _Assumed),
- % We display Time as seconds, with two digits after the decimal point.
- % This is the most we can do, given clock granularity.
- Time = float(Quanta) / float(TicksPerSec),
- TimeStr = format_time(Pref, Time).
-
-:- func per_call_time(preferences, deep, int, int) = string.
-
-per_call_time(Pref, Deep, Quanta, Calls) = TimeStr :-
- lookup_ticks_per_sec(Deep ^ profile_stats, TicksPerSec, _Assumed),
- % We display Time as seconds, with two digits after the decimal point.
- % This is the most we can do, given clock granularity.
- Time = float(Quanta) / float(TicksPerSec),
- ( Calls \= 0 ->
- TimePerCall = Time / float(Calls)
- ;
- TimePerCall = 0.0
- ),
- TimeStr = format_time(Pref, TimePerCall).
-
-:- func format_time(preferences, float) = string.
-
-format_time(Pref, Time) = TimeStr :-
- (
- Pref ^ pref_time = no_scale,
- TimeStr0 = four_decimal_fraction(Time),
- Unit = "s"
- ;
- Pref ^ pref_time = scale_by_millions,
- ( Time >= 0.001 ->
- ScaledTime = Time,
- Unit = "s"
- ;
- ScaledTime = 1000000.0 * Time,
- Unit = "us"
- ),
- TimeStr0 = four_decimal_fraction(ScaledTime)
- ;
- Pref ^ pref_time = scale_by_thousands,
- ( Time >= 1.0 ->
- ScaledTime = Time,
- Unit = "s"
- ; Time >= 0.001 ->
- ScaledTime = 1000.0 * Time,
- Unit = "ms"
- ; Time >= 0.000001 ->
- ScaledTime = 1000000.0 * Time,
- Unit = "us"
- ;
- ScaledTime = 1000000000.0 * Time,
- Unit = "ns"
- ),
- TimeStr0 = two_decimal_fraction(ScaledTime)
- ),
- TimeStr = TimeStr0 ++ Unit.
-
-:- func percentage(int, int) = string.
-
-percentage(Fraction, Whole) = PercentageStr :-
- ( Whole = 0 ->
- PercentageStr = "N/A"
- ;
- Percentage = 100.0 * float(Fraction) / float(Whole),
- PercentageStr = string.format("%5.2f", [f(Percentage)])
- ).
-
-lookup_ticks_per_sec(Stats, TicksPerSec, Assumed) :-
- TicksPerSec0 = Stats ^ prs_ticks_per_sec,
- ( TicksPerSec0 = 0 ->
- TicksPerSec = default_ticks_per_sec,
- Assumed = yes
- ;
- TicksPerSec = TicksPerSec0,
- Assumed = no
- ).
-
- % The number of ticks per sec to assume if the profiling data file does
- % not record the actual tick rate.
- %
-:- func default_ticks_per_sec = int.
-
-default_ticks_per_sec = 100.
-
-%-----------------------------------------------------------------------------%
-
-:- func count_per_call(int, int) = string.
-
-count_per_call(Count, Calls) =
- ( Calls = 0 ->
- two_decimal_fraction(0.0)
- ;
- two_decimal_fraction(float(Count) / float(Calls))
- ).
-
-%-----------------------------------------------------------------------------%
-
-:- func show_port_counts(fields) = bool.
-
-show_port_counts(Fields) = ShowPorts :-
- PortFields = Fields ^ port_fields,
- ( PortFields = no_port, ShowPorts = no
- ; PortFields = port, ShowPorts = yes
- ).
-
-:- func show_quanta(fields) = bool.
-
-show_quanta(Fields) = ShowQuanta :-
- TimeFields = Fields ^ time_fields,
- ( TimeFields = no_time, ShowQuanta = no
- ; TimeFields = ticks, ShowQuanta = yes
- ; TimeFields = time, ShowQuanta = no
- ; TimeFields = ticks_and_time, ShowQuanta = yes
- ; TimeFields = time_and_percall, ShowQuanta = no
- ; TimeFields = ticks_and_time_and_percall, ShowQuanta = yes
- ).
-
-:- func show_times(fields) = bool.
-
-show_times(Fields) = ShowTimes :-
- TimeFields = Fields ^ time_fields,
- ( TimeFields = no_time, ShowTimes = no
- ; TimeFields = ticks, ShowTimes = no
- ; TimeFields = time, ShowTimes = yes
- ; TimeFields = ticks_and_time, ShowTimes = yes
- ; TimeFields = time_and_percall, ShowTimes = yes
- ; TimeFields = ticks_and_time_and_percall, ShowTimes = yes
- ).
-
-:- func show_times_per_call(fields) = bool.
-
-show_times_per_call(Fields) = ShowTimesPerCall :-
- TimeFields = Fields ^ time_fields,
- ( TimeFields = no_time, ShowTimesPerCall = no
- ; TimeFields = ticks, ShowTimesPerCall = no
- ; TimeFields = time, ShowTimesPerCall = no
- ; TimeFields = ticks_and_time, ShowTimesPerCall = no
- ; TimeFields = time_and_percall, ShowTimesPerCall = yes
- ; TimeFields = ticks_and_time_and_percall, ShowTimesPerCall = yes
- ).
-
-:- func show_callseqs(fields) = bool.
-
-show_callseqs(Fields) = ShowCallSeqs :-
- CallSeqsField = Fields ^ callseqs_fields,
- ( CallSeqsField = no_callseqs, ShowCallSeqs = no
- ; CallSeqsField = callseqs, ShowCallSeqs = yes
- ; CallSeqsField = callseqs_and_percall, ShowCallSeqs = yes
- ).
-
-:- func show_callseqs_per_call(fields) = bool.
-
-show_callseqs_per_call(Fields) = ShowCallSeqsPerCall :-
- CallSeqsField = Fields ^ callseqs_fields,
- ( CallSeqsField = no_callseqs, ShowCallSeqsPerCall = no
- ; CallSeqsField = callseqs, ShowCallSeqsPerCall = no
- ; CallSeqsField = callseqs_and_percall, ShowCallSeqsPerCall = yes
- ).
-
-:- func show_alloc(fields) = bool.
-
-show_alloc(Fields) = ShowAlloc :-
- AllocFields = Fields ^ alloc_fields,
- ( AllocFields = no_alloc, ShowAlloc = no
- ; AllocFields = alloc, ShowAlloc = yes
- ; AllocFields = alloc_and_percall, ShowAlloc = yes
- ).
-
-:- func show_alloc_per_call(fields) = bool.
-
-show_alloc_per_call(Fields) = ShowPerAlloc :-
- AllocFields = Fields ^ alloc_fields,
- ( AllocFields = no_alloc, ShowPerAlloc = no
- ; AllocFields = alloc, ShowPerAlloc = no
- ; AllocFields = alloc_and_percall, ShowPerAlloc = yes
- ).
-
-:- func show_memory(fields) = maybe(memory_units).
-
-show_memory(Fields) = ShowMemory :-
- MemoryFields = Fields ^ memory_fields,
- ( MemoryFields = no_memory, ShowMemory = no
- ; MemoryFields = memory(Unit), ShowMemory = yes(Unit)
- ; MemoryFields = memory_and_percall(Unit), ShowMemory = yes(Unit)
- ).
-
-:- func show_memory_per_call(fields) = maybe(memory_units).
-
-show_memory_per_call(Fields) = ShowPerMemory :-
- MemoryFields = Fields ^ memory_fields,
- ( MemoryFields = no_memory, ShowPerMemory = no
- ; MemoryFields = memory(_Unit), ShowPerMemory = no
- ; MemoryFields = memory_and_percall(Unit), ShowPerMemory = yes(Unit)
- ).
-
-%-----------------------------------------------------------------------------%
-
-proc_dynamic_name(Deep, PDPtr) = Name :-
- deep_lookup_proc_dynamics(Deep, PDPtr, PD),
- PSPtr = PD ^ pd_proc_static,
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- Name = PS ^ ps_q_refined_id.
-
-proc_static_name(Deep, PSPtr) = Name :-
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- Name = PS ^ ps_q_refined_id.
-
-%-----------------------------------------------------------------------------%
-
-proc_dynamic_context(Deep, PDPtr, FileName, LineNumber) :-
- deep_lookup_proc_dynamics(Deep, PDPtr, PD),
- PSPtr = PD ^ pd_proc_static,
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- FileName = PS ^ ps_file_name,
- LineNumber = PS ^ ps_line_number.
-
-proc_static_context(Deep, PSPtr, FileName, LineNumber) :-
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- FileName = PS ^ ps_file_name,
- LineNumber = PS ^ ps_line_number.
-
-call_site_context(Deep, CSSPtr, FileName, LineNumber) :-
- deep_lookup_call_site_statics(Deep, CSSPtr, CSS),
- CSS = call_site_static(PSPtr, _SlotNum, _Kind, LineNumber, _GoalPath),
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- FileName = PS ^ ps_file_name.
-
-%-----------------------------------------------------------------------------%
-
-proc_static_to_line_group_info(Pref, Deep, PSPtr, FileName, LineNumber,
- Name, HTML) :-
- ( valid_proc_static_ptr(Deep, PSPtr) ->
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- FileName = PS ^ ps_file_name,
- LineNumber = PS ^ ps_line_number,
- Name = PS ^ ps_q_refined_id,
- HTML = proc_static_to_html_ref(Pref, Deep, PSPtr)
- ;
- FileName = "",
- LineNumber = 0,
- Name = "mercury_runtime",
- HTML = Name
- ).
-
-proc_static_to_html_ref(Pref, Deep, PSPtr) = HTML :-
- URL = deep_cmd_pref_to_url(Pref, Deep, deep_cmd_proc(PSPtr)),
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- ProcName = PS ^ ps_q_refined_id,
- HTML = string.format("<A HREF=""%s"">%s</A>",
- [s(URL), s(escape_break_html_string(ProcName))]).
-
-module_name_to_html_ref(Pref, Deep, ModuleName) = HTML :-
- URL = deep_cmd_pref_to_url(Pref, Deep, deep_cmd_module(ModuleName)),
- HTML = string.format("<A HREF=""%s"">%s</A>",
- [s(URL), s(escape_break_html_string(ModuleName))]).
-
-clique_ptr_to_html_ref(Pref, Deep, ProcName, CliquePtr) = HTML :-
- URL = deep_cmd_pref_to_url(Pref, Deep, deep_cmd_clique(CliquePtr)),
- HTML = string.format("<A HREF=""%s"">%s</A>",
- [s(URL), s(escape_break_html_string(ProcName))]).
-
-deep_cmd_pref_to_url(Pref, Deep, Cmd) =
- machine_datafile_cmd_pref_to_url(Deep ^ server_name_port,
- Deep ^ script_name, Deep ^ data_file_name, Cmd, Pref).
-
-%-----------------------------------------------------------------------------%
-
-plural(N) = Plural :-
- ( N = 1 ->
- Plural = ""
- ;
- Plural = "s"
- ).
-
-%-----------------------------------------------------------------------------%
-
-:- func machine_datafile_cmd_pref_to_url(string, string, string, cmd,
- preferences) = string.
-
-machine_datafile_cmd_pref_to_url(Machine, ScriptName, DeepFileName, Cmd,
- Preferences) =
- "http://" ++
- Machine ++
- ScriptName ++ "?" ++
- query_to_string(deep_query(yes(Cmd), DeepFileName, yes(Preferences))).
-
-%-----------------------------------------------------------------------------%
-:- end_module old_html_format.
-%-----------------------------------------------------------------------------%
Index: old_query.m
===================================================================
RCS file: old_query.m
diff -N old_query.m
--- old_query.m 13 Jan 2011 00:36:55 -0000 1.12
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,1888 +0,0 @@
-%-----------------------------------------------------------------------------%
-% vim: ft=mercury ts=4 sw=4 et
-%-----------------------------------------------------------------------------%
-% Copyright (C) 2001-2003, 2005-2011 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: query.m.
-% Authors: conway, zs.
-%
-% This module contains code to answer deep profiler queries by directly
-% generating HTML. This approach has been superseded by another (implemented in
-% create_report.m and display_report.m) that answers queries by first creating
-% a high level report, and then converting that report to a display structure
-% and finally to HTML. The code in this module is therefore present only as a
-% backup; it should not be actively modified.
-%
-%-----------------------------------------------------------------------------%
-
-:- module old_query.
-
-:- interface.
-
-:- import_module profile.
-:- import_module query.
-
-:- import_module io.
-
- % Old deep profiler cgi code. This should remain supported until all cmds
- % have been updated to use the data structures in report.m.
- %
-:- pred old_exec(cmd::in, preferences::in, deep::in, string::out,
- io::di, io::uo) is det.
-
-%-----------------------------------------------------------------------------%
-
-:- implementation.
-
-:- import_module apply_exclusion.
-:- import_module exclude.
-:- import_module html_format. % for escape_break_html_string
-:- import_module mdbcomp.
-:- import_module mdbcomp.goal_path.
-:- import_module mdbcomp.program_representation.
-:- import_module measurements.
-:- import_module old_html_format.
-:- import_module top_procs.
-
-:- import_module array.
-:- import_module assoc_list.
-:- import_module bool.
-:- import_module float.
-:- import_module int.
-:- import_module list.
-:- import_module map.
-:- import_module maybe.
-:- import_module pair.
-:- import_module require.
-:- import_module string.
-:- import_module unit.
-
-old_exec(deep_cmd_restart, _Pref, _Deep, _HTML, !IO) :-
- % Our caller is supposed to filter out restart commands.
- error("exec: found restart command").
-old_exec(deep_cmd_quit, _Pref, Deep, HTML, !IO) :-
- HTML = string.format(
- "<H3>Shutting down deep profile server for %s.</H3>\n",
- [s(Deep ^ data_file_name)]).
-old_exec(deep_cmd_timeout(TimeOut), _Pref, _Deep, HTML, !IO) :-
- HTML = string.format("<H3>Timeout set to %d minutes</H3>\n", [i(TimeOut)]).
-old_exec(Cmd, Pref, Deep, HTML, !IO) :-
- Cmd = deep_cmd_menu,
- HTML = generate_menu_page(Cmd, Pref, Deep).
-old_exec(Cmd, Pref, Deep, HTML, !IO) :-
- Cmd = deep_cmd_top_procs(Limit, CostKind, InclDesc, Scope),
- HTML = generate_top_procs_page(Cmd, Limit, CostKind, InclDesc, Scope,
- Pref, Deep).
-old_exec(deep_cmd_dump_proc_static(PSPtr), _Pref, Deep, HTML, !IO) :-
- HTML = generate_proc_static_debug_page(PSPtr, Deep).
-old_exec(deep_cmd_dump_proc_dynamic(PDPtr), _Pref, Deep, HTML, !IO) :-
- HTML = generate_proc_dynamic_debug_page(PDPtr, Deep).
-old_exec(deep_cmd_dump_call_site_static(CSSPtr), _Pref, Deep, HTML, !IO) :-
- HTML = generate_call_site_static_debug_page(CSSPtr, Deep).
-old_exec(deep_cmd_dump_call_site_dynamic(CSDPtr), _Pref, Deep, HTML, !IO) :-
- HTML = generate_call_site_dynamic_debug_page(CSDPtr, Deep).
-old_exec(Cmd, Pref, Deep, HTML, !IO) :-
- Cmd = deep_cmd_proc(PSPtr),
- ( valid_proc_static_ptr(Deep, PSPtr) ->
- HTML = generate_proc_page(Cmd, PSPtr, Pref, Deep)
- ;
- HTML =
- page_banner(Cmd, Pref) ++
- "There is no procedure with that number.\n" ++
- page_footer(Cmd, Pref, Deep)
- ).
-old_exec(Cmd, Pref, Deep, HTML, !IO) :-
- Cmd = deep_cmd_root(MaybePercent),
- deep_lookup_clique_index(Deep, Deep ^ root, RootCliquePtr),
- (
- MaybePercent = yes(Percent),
- HTML = chase_the_action(Cmd, RootCliquePtr, Pref, Deep, Percent)
- ;
- MaybePercent = no,
- generate_clique_page(Cmd, RootCliquePtr, Pref, Deep, HTML, 100, _)
- ).
-old_exec(Cmd, Pref, Deep, HTML, !IO) :-
- Cmd = deep_cmd_clique(CliquePtr),
- ( valid_clique_ptr(Deep, CliquePtr) ->
- generate_clique_page(Cmd, CliquePtr, Pref, Deep, HTML, 100, _)
- ;
- HTML =
- page_banner(Cmd, Pref) ++
- "There is no clique with that number.\n" ++
- page_footer(Cmd, Pref, Deep)
- ).
-old_exec(Cmd, Pref0, Deep, HTML, !IO) :-
- Cmd = deep_cmd_proc_callers(PSPtr, CallerGroups, BunchNum,
- _CallersPerBunch, Contour),
- Pref = Pref0 ^ pref_contour := Contour,
- ( valid_proc_static_ptr(Deep, PSPtr) ->
- generate_proc_callers_page(Cmd, PSPtr, CallerGroups, BunchNum,
- Pref, Deep, HTML, !IO)
- ;
- HTML =
- page_banner(Cmd, Pref) ++
- "There is no procedure with that number.\n" ++
- page_footer(Cmd, Pref, Deep)
- ).
-old_exec(Cmd, Pref, Deep, HTML, !IO) :-
- Cmd = deep_cmd_program_modules,
- HTML = generate_modules_page(Cmd, Pref, Deep).
-old_exec(Cmd, Pref, Deep, HTML, !IO) :-
- Cmd = deep_cmd_module(ModuleName),
- ( map.search(Deep ^ module_data, ModuleName, ModuleData) ->
- HTML = generate_module_page(Cmd, ModuleName, ModuleData, Pref, Deep)
- ;
- HTML =
- page_banner(Cmd, Pref) ++
- "There is no procedure with that number.\n" ++
- page_footer(Cmd, Pref, Deep)
- ).
-old_exec(deep_cmd_dump_clique(CliquePtr), _Pref, Deep, HTML, !IO) :-
- HTML = generate_clique_debug_page(CliquePtr, Deep).
-old_exec(Cmd, _, _, HTML, !IO) :-
- ( Cmd = deep_cmd_static_procrep_coverage(_)
- ; Cmd = deep_cmd_dynamic_procrep_coverage(_)
- ; Cmd = deep_cmd_call_site_dynamic_var_use(_)
- ; Cmd = deep_cmd_module_getter_setters(_)
- ; Cmd = deep_cmd_clique_recursive_costs(_)
- ; Cmd = deep_cmd_recursion_types_frequency
- ),
- format("old_query.m: %s is unsupported by old_exec\n", [s(string(Cmd))],
- HTML).
-
-%-----------------------------------------------------------------------------%
-
-:- func generate_proc_static_debug_page(proc_static_ptr, deep) = string.
-
-generate_proc_static_debug_page(PSPtr, Deep) = HTML :-
- ( valid_proc_static_ptr(Deep, PSPtr) ->
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- Refined = PS ^ ps_q_refined_id,
- Raw = PS ^ ps_raw_id,
- FileName = PS ^ ps_file_name,
- HTML =
- "<HTML>\n" ++
- Refined ++ " " ++ Raw ++ " " ++ FileName ++ " " ++
- string.int_to_string(array.max(PS ^ ps_sites)) ++
- "</HTML>\n"
- ;
- HTML =
- "<HTML>\n" ++
- "Invalid proc_static_ptr" ++
- "</HTML>\n"
- ).
-
-:- func generate_proc_dynamic_debug_page(proc_dynamic_ptr, deep) = string.
-
-generate_proc_dynamic_debug_page(PDPtr, Deep) = HTML :-
- ( valid_proc_dynamic_ptr(Deep, PDPtr) ->
- deep_lookup_proc_dynamics(Deep, PDPtr, PD),
- PSPtr = PD ^ pd_proc_static,
- PSPtr = proc_static_ptr(PSI),
- HTML =
- "<HTML>\n" ++
- string.format("proc_static %d, ", [i(PSI)]) ++
- array_slots_to_html(PD ^ pd_sites) ++
- "</HTML>\n"
- ;
- HTML =
- "<HTML>\n" ++
- "Invalid proc_dynamic_ptr" ++
- "</HTML>\n"
- ).
-
-:- func generate_call_site_static_debug_page(call_site_static_ptr, deep)
- = string.
-
-generate_call_site_static_debug_page(CSSPtr, Deep) = HTML :-
- ( valid_call_site_static_ptr(Deep, CSSPtr) ->
- deep_lookup_call_site_statics(Deep, CSSPtr, CSS),
- ContainerPtr = CSS ^ css_container,
- ContainerPtr = proc_static_ptr(Container),
- HTML =
- "<HTML>\n" ++
- string.int_to_string(Container) ++ " " ++
- string.int_to_string(CSS ^ css_slot_num) ++ " " ++
- string.int_to_string(CSS ^ css_line_num) ++ " " ++
- kind_and_callee_to_string(CSS ^ css_kind) ++ " " ++
- rev_goal_path_to_string(CSS ^ css_goal_path) ++
- "</HTML>\n"
- ;
- HTML =
- "<HTML>\n" ++
- "Invalid call_site_static_ptr" ++
- "</HTML>\n"
- ).
-
-:- func generate_call_site_dynamic_debug_page(call_site_dynamic_ptr, deep)
- = string.
-
-generate_call_site_dynamic_debug_page(CSDPtr, Deep) = HTML :-
- ( valid_call_site_dynamic_ptr(Deep, CSDPtr) ->
- deep_lookup_call_site_dynamics(Deep, CSDPtr, CSD),
- CSD ^ csd_caller = proc_dynamic_ptr(CallerPDI),
- CSD ^ csd_callee = proc_dynamic_ptr(CalleePDI),
- HTML =
- "<HTML>\n" ++
- string.int_to_string(CallerPDI) ++ " -> " ++
- string.int_to_string(CalleePDI) ++ ": " ++
- own_to_string(CSD ^ csd_own_prof) ++
- "</HTML>\n"
- ;
- HTML =
- "<HTML>\n" ++
- "Invalid call_site_dynamic_ptr" ++
- "</HTML>\n"
- ).
-
-:- func generate_clique_debug_page(clique_ptr, deep) = string.
-
-generate_clique_debug_page(CliquePtr, Deep) = HTML :-
- ( valid_clique_ptr(Deep, CliquePtr) ->
- deep_lookup_clique_parents(Deep, CliquePtr, ParentCSDPtr),
- ParentCSDPtr = call_site_dynamic_ptr(ParentCSDI),
- ParentStr = string.format("%d ->", [i(ParentCSDI)]),
- deep_lookup_clique_members(Deep, CliquePtr, Members),
- HTML =
- "<HTML>\n" ++
- ParentStr ++
- list.foldl(append_pdi_to_string, Members, "") ++
- "</HTML>\n"
- ;
- HTML =
- "<HTML>\n" ++
- "Invalid call_site_dynamic_ptr" ++
- "</HTML>\n"
- ).
-
-%-----------------------------------------------------------------------------%
-
-:- func array_slots_to_html(array(call_site_array_slot)) = string.
-
-array_slots_to_html(SlotArray) = HTML :-
- array.to_list(SlotArray, SlotList),
- list.foldl(append_slot_to_string, SlotList, "multi", HTML).
-
-:- pred append_slot_to_string(call_site_array_slot::in,
- string::in, string::out) is det.
-
-append_slot_to_string(Slot, Str0, Str) :-
- Str = Str0 ++ " " ++ array_slot_to_html(Slot).
-
-:- func array_slot_to_html(call_site_array_slot) = string.
-
-array_slot_to_html(slot_normal(CSDPtr)) = HTML :-
- CSDPtr = call_site_dynamic_ptr(CSDI),
- HTML = "normal " ++ string.int_to_string(CSDI).
-array_slot_to_html(slot_multi(_, CSDPtrArray)) = HTML :-
- array.to_list(CSDPtrArray, CSDPtrs),
- list.foldl(append_csdi_to_string, CSDPtrs, "", CSDI_HTML),
- list.length(CSDPtrs, CSDPtrCount),
- HTML = string.format("multi(%d): [", [i(CSDPtrCount)]) ++ CSDI_HTML ++ "]".
-
-:- pred append_csdi_to_string(call_site_dynamic_ptr::in,
- string::in, string::out) is det.
-
-append_csdi_to_string(call_site_dynamic_ptr(CSDI), Str0, Str) :-
- Str = Str0 ++ " " ++ string.int_to_string(CSDI).
-
-:- func append_pdi_to_string(proc_dynamic_ptr, string) = string.
-
-append_pdi_to_string(proc_dynamic_ptr(PDI), Str0) =
- Str0 ++ " " ++ string.int_to_string(PDI).
-
-:- func kind_and_callee_to_string(call_site_kind_and_callee) = string.
-
-kind_and_callee_to_string(normal_call_and_callee(proc_static_ptr(PSI),
- TypeSpec)) =
- "normal " ++ string.int_to_string(PSI) ++ " " ++ TypeSpec.
-kind_and_callee_to_string(special_call_and_no_callee) = "special_call".
-kind_and_callee_to_string(higher_order_call_and_no_callee) =
- "higher_order_call".
-kind_and_callee_to_string(method_call_and_no_callee) = "method_call".
-kind_and_callee_to_string(callback_and_no_callee) = "callback".
-
-%-----------------------------------------------------------------------------%
-
-:- func call_site_kind_and_callee_to_html(call_site_kind_and_callee) = string.
-
-call_site_kind_and_callee_to_html(normal_call_and_callee(_, _)) =
- "normal_call".
-call_site_kind_and_callee_to_html(special_call_and_no_callee) =
- "special_call".
-call_site_kind_and_callee_to_html(higher_order_call_and_no_callee) =
- "higher_order_call".
-call_site_kind_and_callee_to_html(method_call_and_no_callee) =
- "method_call".
-call_site_kind_and_callee_to_html(callback_and_no_callee) =
- "callback".
-
-%-----------------------------------------------------------------------------%
-
-:- func generate_menu_page(cmd, preferences, deep) = string.
-
-generate_menu_page(Cmd, Pref, Deep) = HTML :-
- ShouldDisplayTimes = should_display_times(Deep),
- HTML =
- page_banner(Cmd, Pref) ++
- "<p>\n" ++
- menu_text ++
- "<ul>\n" ++
- "<li>\n" ++
- menu_item(Deep, Pref, deep_cmd_root(no),
- "Exploring the call graph, starting at the root.") ++
- "<li>\n" ++
- menu_item(Deep, Pref, deep_cmd_root(yes(90)),
- "Exploring the call graph, starting at the action.") ++
- "<li>\n" ++
- menu_item(Deep, Pref, deep_cmd_program_modules,
- "Exploring the program module by module.") ++
- ( ShouldDisplayTimes = yes ->
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(rank_range(1, 100), cost_time,
- self, overall),
- "Top 100 most expensive procedures: time, self.") ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(rank_range(1, 100), cost_time,
- self_and_desc, overall),
- "Top 100 most expensive procedures: time, self+descendants.")
- ;
- ""
- ) ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(rank_range(1, 100), cost_callseqs,
- self, overall),
- "Top 100 most expensive procedures: callseqs, self.") ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(rank_range(1, 100), cost_callseqs,
- self_and_desc, overall),
- "Top 100 most expensive procedures: callseqs, self+descendants.") ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(rank_range(1, 100), cost_words, self, overall),
- "Top 100 most expensive procedures: words, self.") ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(rank_range(1, 100), cost_words, self_and_desc,
- overall),
- "Top 100 most expensive procedures: words, self+descendants.")
- ++
- ( ShouldDisplayTimes = yes ->
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_percent(0.1), cost_time, self,
- overall),
- "Procedures above 0.1% threshold: time, self.") ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_percent(1.0), cost_time,
- self_and_desc, overall),
- "Procedures above 1% threshold: time, self+descendants.") ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_value(100.0), cost_time,
- self_and_desc, overall),
- "Procedures above 1 second threshold: " ++
- "time, self+descendants.")
- ;
- ""
- ) ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_percent(0.1), cost_callseqs, self,
- overall),
- "Procedures above 0.1% threshold: callseqs, self.") ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_percent(1.0), cost_callseqs,
- self_and_desc, overall),
- "Procedures above 1% threshold: callseqs, self+descendants.")
- ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_value(1000000.0), cost_callseqs,
- self_and_desc, overall),
- "Procedures above 1,000,000 callseqs threshold: callseqs, " ++
- "self+descendants.")
- ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_percent(0.1), cost_words, self,
- overall),
- "Procedures above 0.1% threshold: words, self.") ++
- "<li>\n" ++
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_percent(1.0), cost_words,
- self_and_desc, overall),
- "Procedures above 1% threshold: words, self+descendants.")
- ++
- "<li>\n" ++
- % 2M words is chosen because it is 8MB on ia32
- menu_item(Deep, Pref,
- deep_cmd_top_procs(threshold_value(float(1024 * 1024 * 2)),
- cost_words, self_and_desc, overall),
- "Procedures above 2M words threshold: words, self+descendants.")
- ++
- "</ul>\n" ++
- "<p>\n" ++
- present_stats(Deep) ++
- page_footer(Cmd, Pref, Deep).
-
-:- func menu_text = string.
-
-menu_text =
- "You can start exploring the deep profile at the following points.\n".
-
-:- func menu_item(deep, preferences, cmd, string) = string.
-
-menu_item(Deep, Pref, Cmd, Text) =
- string.format("<A HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, Cmd)), s(Text)]).
-
-:- func present_stats(deep) = string.
-
-present_stats(Deep) = HTML :-
- Stats = Deep ^ profile_stats,
- lookup_ticks_per_sec(Stats, TicksPerSec, Assumed),
- (
- Assumed = yes,
- AssumedStr = " (assumed)"
- ;
- Assumed = no,
- AssumedStr = ""
- ),
- HTML =
- "<TABLE>\n" ++
- "<TR><TD ALIGN=left>Quanta per second:</TD>\n" ++
- string.format("<TD ALIGN=right>%d%s</TD></TR>\n",
- [i(TicksPerSec), s(AssumedStr)]) ++
- "<TR><TD ALIGN=left>Quanta in user code:</TD>\n" ++
- string.format("<TD ALIGN=right>%d</TD></TR>\n",
- [i(Stats ^ prs_user_quanta)]) ++
- "<TR><TD ALIGN=left>Quanta in instrumentation:</TD>\n" ++
- string.format("<TD ALIGN=right>%d</TD></TR>\n",
- [i(Stats ^ prs_instrument_quanta)]) ++
- "<TR><TD ALIGN=left>Call sequence numbers:</TD>\n" ++
- string.format("<TD ALIGN=right>%d</TD></TR>\n",
- [i(Stats ^ prs_num_callseqs)]) ++
- "<TR><TD ALIGN=left>CallSiteDynamic structures:</TD>\n" ++
- string.format("<TD ALIGN=right>%d</TD></TR>\n",
- [i(Stats ^ prs_num_csd)]) ++
- "<TR><TD ALIGN=left>ProcDynamic structures:</TD>\n" ++
- string.format("<TD ALIGN=right>%d</TD></TR>\n",
- [i(Stats ^ prs_num_pd)]) ++
- "<TR><TD ALIGN=left>CallSiteStatic structures:</TD>\n" ++
- string.format("<TD ALIGN=right>%d</TD></TR>\n",
- [i(Stats ^ prs_num_css)]) ++
- "<TR><TD ALIGN=left>ProcStatic structures:</TD>\n" ++
- string.format("<TD ALIGN=right>%d</TD></TR>\n",
- [i(Stats ^ prs_num_ps)]) ++
- "<TR><TD ALIGN=left>Cliques:</TD>\n" ++
- string.format("<TD ALIGN=right>%d</TD></TR>\n",
- [i(array.max(Deep ^ clique_members))]) ++
- "</TABLE>\n".
-
-%-----------------------------------------------------------------------------%
-
-:- func chase_the_action(cmd, clique_ptr, preferences, deep, int) = string.
-
-chase_the_action(Cmd, CliquePtr, Pref, Deep, Percent) = HTML :-
- generate_clique_page(Cmd, CliquePtr, Pref, Deep, HTML0,
- Percent, ActionPtrs),
- ( ActionPtrs = [ActionCliquePtr] ->
- HTML = chase_the_action(Cmd, ActionCliquePtr, Pref, Deep, Percent)
- ;
- HTML = HTML0
- ).
-
-%-----------------------------------------------------------------------------%
-
-:- pred generate_clique_page(cmd::in, clique_ptr::in, preferences::in,
- deep::in, string::out, int::in, list(clique_ptr)::out) is det.
-
-generate_clique_page(Cmd, CliquePtr, Pref, Deep, HTML, Percent, ActionPtrs) :-
- clique_to_html(Pref, Deep, CliquePtr, CliqueHTML, Percent, ActionPtrs),
- CliquePtr = clique_ptr(CliqueNum),
- HTML =
- page_banner(Cmd, Pref) ++
- string.format("<H3>Clique %d:</H3>\n", [i(CliqueNum)]) ++
- table_start(Pref) ++
- fields_header(Pref, source_proc, totals_meaningful,
- wrap_clique_links(CliquePtr, Pref, Deep)) ++
- CliqueHTML ++
- table_end(Pref) ++
- page_footer(Cmd, Pref, Deep).
-
-:- func generate_proc_page(cmd, proc_static_ptr, preferences, deep) = string.
-
-generate_proc_page(Cmd, PSPtr, Pref, Deep) =
- page_banner(Cmd, Pref) ++
- string.format("<H3>Summary of procedure %s:</H3>\n",
- [s(escape_html_string(proc_static_name(Deep, PSPtr)))]) ++
- table_start(Pref) ++
- fields_header(Pref, source_proc, totals_meaningful,
- wrap_proc_links(PSPtr, Pref, Deep)) ++
- proc_summary_to_html(Pref, Deep, PSPtr) ++
- table_end(Pref) ++
- "<p>\n" ++
- proc_summary_toggles_to_html(Pref, Deep, PSPtr) ++
- page_footer(Cmd, Pref, Deep).
-
-:- pred generate_proc_callers_page(cmd::in, proc_static_ptr::in,
- caller_groups::in, int::in, preferences::in, deep::in, string::out,
- io::di, io::uo) is det.
-
-generate_proc_callers_page(Cmd, PSPtr, CallerGroups, BunchNum, Pref, Deep,
- HTML, !IO) :-
- proc_callers_to_html(Pref, Deep, PSPtr, CallerGroups, BunchNum,
- MaybePage, !IO),
- (
- MaybePage = ok({IdFields, Heading, CallersHTML, Toggles}),
- HTML =
- page_banner(Cmd, Pref) ++
- Heading ++
- ( CallersHTML = "" ->
- ""
- ;
- table_start(Pref) ++
- fields_header(Pref, IdFields, totals_meaningful,
- wrap_proc_callers_links(PSPtr, CallerGroups, 1,
- Pref, Deep)) ++
- CallersHTML ++
- table_end(Pref) ++
- "<p>\n"
- ) ++
- Toggles ++
- page_footer(Cmd, Pref, Deep)
- ;
- MaybePage = error(Msg),
- HTML =
- string.format("<H3>%s</H3>\n", [s(Msg)])
- ).
-
-:- func generate_modules_page(cmd, preferences, deep) = string.
-
-generate_modules_page(Cmd, Pref, Deep) =
- page_banner(Cmd, Pref) ++
- "<H3>The modules of the program:</H3>\n" ++
- table_start(Pref) ++
- fields_header(Pref, rank_module, totals_not_meaningful,
- wrap_modules_links(Pref, Deep)) ++
- modules_to_html(Pref, Deep) ++
- table_end(Pref) ++
- page_footer(Cmd, Pref, Deep).
-
-:- func generate_module_page(cmd, string, module_data, preferences, deep)
- = string.
-
-generate_module_page(Cmd, ModuleName, ModuleData, Pref, Deep) = HTML :-
- module_to_html(Pref, Deep, ModuleName, ModuleData,
- IdFields, ModulesHTML),
- HTML =
- page_banner(Cmd, Pref) ++
- string.format("<H3>The procedures of module %s:</H3>\n",
- [s(ModuleName)]) ++
- table_start(Pref) ++
- fields_header(Pref, IdFields, totals_meaningful,
- wrap_module_links(ModuleName, Pref, Deep)) ++
- ModulesHTML ++
- table_end(Pref) ++
- page_footer(Cmd, Pref, Deep).
-
-:- func generate_top_procs_page(cmd, display_limit,
- cost_kind, include_descendants, measurement_scope,
- preferences, deep) = string.
-
-generate_top_procs_page(Cmd, Limit, CostKind, InclDesc0, Scope0, Pref, Deep)
- = HTML :-
- (
- CostKind = cost_calls,
- % Counting calls is incompatible both with self_and_desc
- % and per_call.
- InclDesc = self,
- Scope = overall
- ;
- ( CostKind = cost_redos
- ; CostKind = cost_time
- ; CostKind = cost_callseqs
- ; CostKind = cost_allocs
- ; CostKind = cost_words
- ),
- InclDesc = InclDesc0,
- Scope = Scope0
- ),
- MaybeTopPSIs = find_top_procs(CostKind, InclDesc, Scope, Limit, Deep),
- (
- MaybeTopPSIs = error(ErrorMessage),
- HTML =
- page_banner(Cmd, Pref) ++
- ErrorMessage ++ "\n" ++
- page_footer(Cmd, Pref, Deep)
- ;
- MaybeTopPSIs = ok(TopPSIs),
- ToggleLimitHTML = "",
- ToggleCostHTML = toggle_cost_criteria_in_top_procs_cmd(
- Pref, Deep, Limit, CostKind, InclDesc, Scope),
- Desc = cost_criteria_to_description(CostKind, InclDesc, Scope),
- Heading = string.format("<H3>Top procedures %s</H3>\n",
- [s(Desc)]),
- (
- TopPSIs = [],
- HTML =
- page_banner(Cmd, Pref) ++
- Heading ++ "<p>\n" ++
- "No procedures match the specification.\n" ++
- "<p>\n" ++
- ToggleLimitHTML ++
- ToggleCostHTML ++
- page_footer(Cmd, Pref, Deep)
- ;
- TopPSIs = [_ | _],
- TopProcs = list.filter_map(
- lookup_proc_total_to_html(Pref, Deep, no, ""),
- list.map(wrap_proc_static_ptr, TopPSIs)),
- RankedTopProcs = add_ranks(TopProcs),
- SummaryHTMLs = list.map(
- two_id_line_to_html(Pref, Deep, totals_meaningful),
- RankedTopProcs),
- HTML =
- page_banner(Cmd, Pref) ++
- Heading ++ "<p>\n" ++
- table_start(Pref) ++
- fields_header(Pref, rank_proc, totals_meaningful,
- wrap_top_procs_links(Limit, Pref, Deep)) ++
- string.append_list(SummaryHTMLs) ++
- table_end(Pref) ++
- "<p>\n" ++
- ToggleLimitHTML ++
- ToggleCostHTML ++
- page_footer(Cmd, Pref, Deep)
- )
- ).
-
-%-----------------------------------------------------------------------------%
-
-:- func modules_to_html(preferences, deep) = string.
-
-modules_to_html(Pref, Deep) = HTML :-
- map.to_assoc_list(Deep ^ module_data, ModulePairs0),
- list.filter(not_mercury_runtime, ModulePairs0, ModulePairs),
- ModuleLines = list.filter_map(module_summary_to_html(Pref, Deep),
- ModulePairs),
- SortedModuleLines = sort_line_groups(Pref ^ pref_criteria,
- ModuleLines),
- RankedModuleLines = add_ranks(SortedModuleLines),
- ModuleHTMLs = list.map(
- two_id_line_to_html(Pref, Deep, totals_not_meaningful),
- RankedModuleLines),
- HTML =
- separator_row(Pref, rank_module, totals_not_meaningful) ++
- string.append_list(ModuleHTMLs).
-
-:- pred not_mercury_runtime(pair(string, module_data)::in) is semidet.
-
-not_mercury_runtime(ModuleName - _) :-
- ModuleName \= "Mercury runtime".
-
-:- func module_summary_to_html(preferences, deep, pair(string, module_data))
- = one_id_line is semidet.
-
-module_summary_to_html(Pref, Deep, ModuleName - ModuleData) = LineGroup :-
- ModuleData = module_data(Own, Desc, _),
- not (
- Pref ^ pref_inactive ^ inactive_modules = inactive_hide,
- compute_is_active(Own) = is_not_active
- ),
- HTML = string.format("<TD><A HREF=""%s"">%s</A></TD>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, deep_cmd_module(ModuleName))),
- s(ModuleName)]),
- LineGroup = line_group(ModuleName, 0, ModuleName, Own, Desc, HTML, unit).
-
-%-----------------------------------------------------------------------------%
-
-:- pred module_to_html(preferences::in, deep::in, string::in, module_data::in,
- id_fields::out, string::out) is det.
-
-module_to_html(Pref, Deep, _ModuleName, ModuleData, IdHeaders, HTML) :-
- ModuleData = module_data(_Own, _Desc, PSPtrs),
- ProcLines = list.filter_map(lookup_proc_total_to_html(Pref, Deep, yes, ""),
- PSPtrs),
- Criteria = Pref ^ pref_criteria,
- SortedProcLines = sort_line_groups(Criteria, ProcLines),
- (
- Criteria = by_cost(_, _, _),
- IdHeaders = rank_proc,
- RankedProcLines = add_ranks(SortedProcLines)
- ;
- ( Criteria = by_name
- ; Criteria = by_context
- ),
- IdHeaders = source_proc,
- RankedProcLines = list.map(add_self_context, SortedProcLines)
- ),
- ProcHTMLs = list.map(two_id_line_to_html(Pref, Deep, totals_meaningful),
- RankedProcLines),
- HTML =
- separator_row(Pref, IdHeaders, totals_meaningful) ++
- string.append_list(ProcHTMLs).
-
-%-----------------------------------------------------------------------------%
-
-:- pred clique_to_html(preferences::in, deep::in, clique_ptr::in,
- string::out, int::in, list(clique_ptr)::out) is det.
-
-clique_to_html(Pref, Deep, CliquePtr, HTML, PerCent, ActionPtrs) :-
- (
- Pref ^ pref_anc = yes(AncestorLimit),
- RespectLimit = yes
- ;
- Pref ^ pref_anc = no,
- AncestorLimit = 0, % the value doesn't matter
- RespectLimit = no
- ),
- clique_ancestors_to_html(Pref, Deep,
- AncestorLimit, RespectLimit, CliquePtr, Ancestors, Cutoff),
- deep_lookup_clique_members(Deep, CliquePtr, PDPtrs),
- list.foldl(group_proc_dynamics_by_proc_static(Deep), PDPtrs,
- map.init, PStoPDsMap),
- map.to_assoc_list(PStoPDsMap, PStoPDsList0),
-
- deep_lookup_clique_parents(Deep, CliquePtr, EntryCSDPtr),
- ( valid_call_site_dynamic_ptr(Deep, EntryCSDPtr) ->
- deep_lookup_call_site_dynamics(Deep, EntryCSDPtr, EntryCSD),
- EntryPDPtr = EntryCSD ^ csd_callee,
- list.filter(proc_group_contains(EntryPDPtr), PStoPDsList0,
- EntryGroup, RestGroup),
- list.append(EntryGroup, RestGroup, PStoPDsList)
- ;
- PStoPDsList = PStoPDsList0
- ),
-
- list.map2(procs_in_clique_to_html(Pref, Deep, CliquePtr, PerCent),
- PStoPDsList, PDsStrs, ActionPtrLists),
- list.condense(ActionPtrLists, ActionPtrs),
- string.append_list(PDsStrs, ProcGroups),
- (
- Cutoff = yes,
- Heading = string.format("The %d closest ancestors:",
- [i(AncestorLimit)])
- ;
- Cutoff = no,
- Heading = "Ancestors:"
- ),
- HTML =
- header_row(Heading, Pref, source_proc, totals_meaningful) ++
- separator_row(Pref, source_proc, totals_meaningful) ++
- Ancestors ++
- separator_row(Pref, source_proc, totals_meaningful) ++
- header_row("Procedures of the clique:", Pref, source_proc,
- totals_meaningful) ++
- separator_row(Pref, source_proc, totals_meaningful) ++
- ProcGroups.
-
-:- pred proc_group_contains(proc_dynamic_ptr::in,
- pair(proc_static_ptr, list(proc_dynamic_ptr))::in) is semidet.
-
-proc_group_contains(EntryPDPtr, _ - PDPtrs) :-
- list.member(EntryPDPtr, PDPtrs).
-
-:- pred clique_ancestors_to_html(preferences::in, deep::in, int::in, bool::in,
- clique_ptr::in, string::out, bool::out) is det.
-
-clique_ancestors_to_html(Pref, Deep, AncestorLimit, RespectLimit, CliquePtr,
- HTML, Cutoff) :-
- deep_lookup_clique_parents(Deep, CliquePtr, EntryCSDPtr),
- ( valid_call_site_dynamic_ptr(Deep, EntryCSDPtr) ->
- deep_lookup_call_site_dynamics(Deep, EntryCSDPtr, EntryCSD),
- EntryPDPtr = EntryCSD ^ csd_caller,
- ( EntryPDPtr = Deep ^ root ->
- % We have reached the root.
- HTML = "",
- Cutoff = no
- ; RespectLimit = yes, AncestorLimit =< 0 ->
- HTML = "",
- Cutoff = yes
- ;
- deep_lookup_clique_index(Deep, EntryPDPtr, EntryCliquePtr),
- ThisLine = call_site_dynamic_to_html(Pref, Deep,
- ancestor_display, yes(EntryCliquePtr), EntryCSDPtr),
- ThisHTML = two_id_line_to_html(Pref, Deep, totals_meaningful,
- ThisLine),
- clique_ancestors_to_html(Pref, Deep, AncestorLimit - 1,
- RespectLimit, EntryCliquePtr, AncestorHTML, Cutoff),
- HTML = AncestorHTML ++ ThisHTML
- )
- ;
- % We have reached the parent of root.
- HTML = "",
- Cutoff = no
- ).
-
-:- pred group_proc_dynamics_by_proc_static(deep::in, proc_dynamic_ptr::in,
- map(proc_static_ptr, list(proc_dynamic_ptr))::in,
- map(proc_static_ptr, list(proc_dynamic_ptr))::out) is det.
-
-group_proc_dynamics_by_proc_static(Deep, PDPtr, PStoPDsMap0, PStoPDsMap) :-
- require(valid_proc_dynamic_ptr(Deep, PDPtr),
- "group_proc_dynamics_by_proc_static: invalid PDPtr"),
- deep_lookup_proc_dynamics(Deep, PDPtr, PD),
- PSPtr = PD ^ pd_proc_static,
- ( map.search(PStoPDsMap0, PSPtr, PSPDs0) ->
- PSPDs = [PDPtr | PSPDs0],
- map.det_update(PStoPDsMap0, PSPtr, PSPDs, PStoPDsMap)
- ;
- map.det_insert(PStoPDsMap0, PSPtr, [PDPtr], PStoPDsMap)
- ).
-
-:- pred procs_in_clique_to_html(preferences::in, deep::in, clique_ptr::in,
- int::in, pair(proc_static_ptr, list(proc_dynamic_ptr))::in,
- string::out, list(clique_ptr)::out) is det.
-
-procs_in_clique_to_html(Pref, Deep, CliquePtr, Percent, PSPtr - PDPtrs,
- HTML, ActionPtrs) :-
- (
- PDPtrs = [],
- HTML = "",
- ActionPtrs = []
- ;
- PDPtrs = [PDPtr],
- proc_in_clique_to_html(Pref, Deep, CliquePtr, Percent, PDPtr,
- HTML, ActionPtrs)
- ;
- PDPtrs = [_, _ | _],
- list.map(deep_lookup_pd_own(Deep), PDPtrs, ProcOwns),
- list.map(deep_lookup_pd_desc(Deep), PDPtrs, ProcDescs),
- ProcOwn = sum_own_infos(ProcOwns),
- ProcDesc = sum_inherit_infos(ProcDescs),
- ProcTotal = proc_total_to_two_id_line(Pref, Deep, yes, "summary ",
- PSPtr, ProcOwn, ProcDesc),
- list.map2(proc_in_clique_to_html(Pref, Deep, CliquePtr, Percent),
- PDPtrs, ComponentHTMLs, ActionPtrLists),
- list.condense(ActionPtrLists, ActionPtrs),
- string.append_list(ComponentHTMLs, ComponentHTML),
- HTML =
- separator_row(Pref, source_proc, totals_meaningful) ++
- two_id_line_to_html(Pref, Deep, totals_meaningful, ProcTotal) ++
- separator_row(Pref, source_proc, totals_meaningful) ++
- ComponentHTML
- ).
-
-:- pred proc_in_clique_to_html(preferences::in, deep::in, clique_ptr::in,
- int::in, proc_dynamic_ptr::in, string::out, list(clique_ptr)::out) is det.
-
-proc_in_clique_to_html(Pref, Deep, CliquePtr, Percent, PDPtr,
- HTML, ActionPtrs) :-
- ( valid_proc_dynamic_ptr(Deep, PDPtr) ->
- deep_lookup_pd_own(Deep, PDPtr, ProcOwn),
- deep_lookup_pd_desc(Deep, PDPtr, ProcDesc),
- deep_lookup_proc_dynamics(Deep, PDPtr, PD),
- PSPtr = PD ^ pd_proc_static,
- ProcTotal = proc_total_to_two_id_line(Pref, Deep, yes, "",
- PSPtr, ProcOwn, ProcDesc),
- child_call_sites(Deep ^ proc_dynamics, Deep ^ proc_statics,
- PDPtr, GroupPairs),
- ProcHTML =
- separator_row(Pref, source_proc, totals_meaningful) ++
- two_id_line_to_html(Pref, Deep, totals_meaningful, ProcTotal),
- (
- GroupPairs = [],
- HTML = ProcHTML,
- ActionPtrs = []
- ;
- GroupPairs = [_ | _],
- list.map2(call_site_clique_to_html(Pref, Deep, CliquePtr, Percent),
- GroupPairs, CallSiteLists, ActionPtrLists),
- list.condense(CallSiteLists, CallSites),
- list.condense(ActionPtrLists, ActionPtrs),
- SortedCallSites = sort_line_groups(Pref ^ pref_criteria,
- CallSites),
- BodyHTMLs = list.map(
- two_id_line_group_to_html(Pref, Deep, totals_meaningful),
- SortedCallSites),
- HTML = ProcHTML ++
- separator_row(Pref, source_proc, totals_meaningful) ++
- string.append_list(BodyHTMLs)
- )
- ;
- HTML = "",
- ActionPtrs = []
- ).
-
-:- pred child_call_sites(proc_dynamics::in, proc_statics::in,
- proc_dynamic_ptr::in,
- assoc_list(call_site_static_ptr, call_site_array_slot)::out) is det.
-
-child_call_sites(ProcDynamics, ProcStatics, PDPtr, PairedSlots) :-
- lookup_proc_dynamics(ProcDynamics, PDPtr, PD),
- PSPtr = PD ^ pd_proc_static,
- CSDArray = PD ^ pd_sites,
- lookup_proc_statics(ProcStatics, PSPtr, PS),
- CSSArray = PS ^ ps_sites,
- array.to_list(CSDArray, CSDSlots),
- array.to_list(CSSArray, CSSSlots),
- assoc_list.from_corresponding_lists(CSSSlots, CSDSlots, PairedSlots).
-
-%-----------------------------------------------------------------------------%
-
- % Fails if the procedure is inactive and the preferences say to
- % hide inactive procedures.
- %
-:- func lookup_proc_total_to_html(preferences, deep, bool, string,
- proc_static_ptr) = one_id_line is semidet.
-
-lookup_proc_total_to_html(Pref, Deep, Bold, Prefix, PSPtr) = LineGroup :-
- deep_lookup_ps_own(Deep, PSPtr, Own),
- not (
- Pref ^ pref_inactive ^ inactive_procs = inactive_hide,
- compute_is_active(Own) = is_not_active
- ),
- deep_lookup_ps_desc(Deep, PSPtr, Desc),
- LineGroup = proc_total_to_html(Pref, Deep, Bold, Prefix, PSPtr, Own, Desc).
-
-:- func lookup_proc_total_to_two_id_line(preferences, deep, bool, string,
- proc_static_ptr) = two_id_line.
-
-lookup_proc_total_to_two_id_line(Pref, Deep, Bold, Prefix, PSPtr)
- = LineGroup :-
- deep_lookup_ps_own(Deep, PSPtr, Own),
- deep_lookup_ps_desc(Deep, PSPtr, Desc),
- LineGroup = proc_total_to_two_id_line(Pref, Deep, Bold, Prefix,
- PSPtr, Own, Desc).
-
-:- func proc_total_to_html(preferences, deep, bool, string,
- proc_static_ptr, own_prof_info, inherit_prof_info) = one_id_line.
-
-proc_total_to_html(Pref, Deep, Bold, Prefix, PSPtr, Own, Desc)
- = LineGroup :-
- proc_total_to_html_base(Pref, Deep, 1, Bold, Prefix, PSPtr,
- FileName, LineNumber, ProcName, HTML),
- LineGroup = line_group(FileName, LineNumber, ProcName, Own, Desc, HTML,
- unit).
-
-:- func proc_total_to_two_id_line(preferences, deep, bool, string,
- proc_static_ptr, own_prof_info, inherit_prof_info) = two_id_line.
-
-proc_total_to_two_id_line(Pref, Deep, Bold, Prefix, PSPtr, Own, Desc)
- = LineGroup :-
- proc_total_to_html_base(Pref, Deep, 2, Bold, Prefix, PSPtr,
- FileName, LineNumber, ProcName, HTML),
- LineGroup = line_group(FileName, LineNumber, ProcName, Own, Desc, HTML,
- unit).
-
-:- pred proc_total_to_html_base(preferences::in, deep::in,
- int::in, bool::in, string::in, proc_static_ptr::in,
- string::out, int::out, string::out, string::out) is det.
-
-proc_total_to_html_base(Pref, Deep, Span, Bold, Prefix, PSPtr,
- FileName, LineNumber, ProcName, HTML) :-
- proc_static_to_line_group_info(Pref, Deep, PSPtr, FileName, LineNumber,
- ProcName, WrappedProcName),
- (
- Bold = no,
- BoldStart = "",
- BoldEnd = ""
- ;
- Bold = yes,
- BoldStart = "<B>",
- BoldEnd = "</B>"
- ),
- HTML = string.format("<TD CLASS=id COLSPAN=%d>%s%s%s%s</TD>\n",
- [i(Span), s(BoldStart), s(Prefix), s(WrappedProcName), s(BoldEnd)]).
-
-%-----------------------------------------------------------------------------%
-
-:- pred call_site_clique_to_html(preferences::in, deep::in,
- clique_ptr::in, int::in,
- pair(call_site_static_ptr, call_site_array_slot)::in,
- list(two_id_line_group)::out, list(clique_ptr)::out) is det.
-
-call_site_clique_to_html(Pref, Deep, CallerCliquePtr, Percent, Pair,
- LineGroups, ActionPtrs) :-
- Pair = CSSPtr - CallSiteArraySlot,
- deep_lookup_call_site_statics(Deep, CSSPtr, CSS),
- Kind = CSS ^ css_kind,
- ( Kind = normal_call_and_callee(_CalleePSPtr, _) ->
- (
- CallSiteArraySlot = slot_normal(CSDPtr0),
- CSDPtr = CSDPtr0
- ;
- CallSiteArraySlot = slot_multi(_, _),
- error("call_site_clique_to_html: normal_call error")
- ),
- normal_call_site_clique_to_html(Pref, Deep, CallerCliquePtr,
- CSDPtr, LineGroups, Percent, ActionPtrs)
- ;
- (
- CallSiteArraySlot = slot_multi(_, CSDPtrs0),
- array.to_list(CSDPtrs0, CSDPtrs)
- ;
- CallSiteArraySlot = slot_normal(_),
- error("call_site_clique_to_html: non-normal_call error")
- ),
- call_site_context(Deep, CSSPtr, FileName, LineNumber),
- multi_call_site_clique_to_html(Pref, Deep, FileName, LineNumber,
- Kind, CallerCliquePtr, CSDPtrs, LineGroups, Percent, ActionPtrs)
- ).
-
-:- func maybe_extract_action_clique(deep, clique_ptr, int,
- call_site_dynamic_ptr) = list(clique_ptr).
-
-maybe_extract_action_clique(Deep, CallerCliquePtr, Percent, CSDPtr)
- = ActionPtrs :-
- ( Percent > 100 ->
- ActionPtrs = []
- ;
- deep_lookup_call_site_dynamics(Deep, CSDPtr, CSD),
- deep_lookup_clique_index(Deep, CSD ^ csd_callee, CalleeCliquePtr),
- ( CalleeCliquePtr = CallerCliquePtr ->
- ActionPtrs = []
- ;
- deep_lookup_csd_desc(Deep, CSDPtr, CSDDesc),
- CSDOwn = CSD ^ csd_own_prof,
- CSDTotal = add_own_to_inherit(CSDOwn, CSDDesc),
- RootTotal = root_total_info(Deep),
- CSDCallSeqs = inherit_callseqs(CSDTotal),
- RootCallSeqs = inherit_callseqs(RootTotal),
- ( CSDCallSeqs * 100 > RootCallSeqs * Percent ->
- ActionPtrs = [CalleeCliquePtr]
- ;
- ActionPtrs = []
- )
- )
- ).
-
-:- pred normal_call_site_clique_to_html(preferences::in, deep::in,
- clique_ptr::in, call_site_dynamic_ptr::in,
- list(two_id_line_group)::out, int::in, list(clique_ptr)::out) is det.
-
-normal_call_site_clique_to_html(Pref, Deep, CallerCliquePtr, CSDPtr,
- LineGroups, Percent, ActionPtrs) :-
- ( valid_call_site_dynamic_ptr(Deep, CSDPtr) ->
- LineGroup = call_site_dynamic_to_html(Pref, Deep,
- downward_display, yes(CallerCliquePtr), CSDPtr),
- LineGroups = [line_to_two_id_subline_group(LineGroup)],
- ActionPtrs = maybe_extract_action_clique(Deep, CallerCliquePtr,
- Percent, CSDPtr)
- ;
- LineGroups = [],
- ActionPtrs = []
- ).
-
-:- pred multi_call_site_clique_to_html(preferences::in, deep::in,
- string::in, int::in, call_site_kind_and_callee::in, clique_ptr::in,
- list(call_site_dynamic_ptr)::in, list(two_id_line_group)::out,
- int::in, list(clique_ptr)::out) is det.
-
-multi_call_site_clique_to_html(Pref, Deep, FileName, LineNumber, Kind,
- CallerCliquePtr, CSDPtrs, LineGroups, Percent, ActionPtrs) :-
- ValidCSDPtrs = CSDPtrs,
- RawCallSiteName = call_site_kind_and_callee_to_html(Kind),
- CallSiteName = multi_call_site_add_suffix(Pref, RawCallSiteName,
- ValidCSDPtrs),
- SubLines = list.map(call_site_dynamic_to_html(Pref, Deep,
- downward_summary_display, yes(CallerCliquePtr)),
- ValidCSDPtrs),
- ActionPtrLists = list.map(
- maybe_extract_action_clique(Deep, CallerCliquePtr, Percent),
- ValidCSDPtrs),
- list.condense(ActionPtrLists, ActionPtrs),
- sum_line_group_measurements(SubLines, Own, Desc),
- SummaryHTML =
- string.format("<TD CLASS=id>%s:%d</TD>\n",
- [s(escape_break_html_string(FileName)), i(LineNumber)]) ++
-
- % NOTE: we don't escape HTML special characters for
- % 'CallSiteName' because it has already been done.
- string.format("<TD CLASS=id>%s</TD>\n", [s(CallSiteName)]),
- (
- Pref ^ pref_summarize = summarize_ho_call_sites,
- LineGroup = line_group(FileName, LineNumber, RawCallSiteName,
- Own, Desc, SummaryHTML, sub_lines(two_id, []))
- ;
- Pref ^ pref_summarize = do_not_summarize_ho_call_sites,
- LineGroup = line_group(FileName, LineNumber, RawCallSiteName,
- Own, Desc, SummaryHTML, sub_lines(two_id, SubLines))
- ),
- LineGroups = [LineGroup].
-
-%-----------------------------------------------------------------------------%
-
-:- func call_site_summary_to_html(preferences, deep,
- call_site_static_ptr) = two_id_line_group.
-
-call_site_summary_to_html(Pref, Deep, CSSPtr) = LineGroup :-
- deep_lookup_call_site_calls(Deep, CSSPtr, CallSiteCallMap),
- map.to_assoc_list(CallSiteCallMap, CallSiteCallList),
- deep_lookup_call_site_statics(Deep, CSSPtr, CSS),
- Kind = CSS ^ css_kind,
- CallerPSPtr = CSS ^ css_container,
- call_site_context(Deep, CSSPtr, FileName, LineNumber),
- ( Kind = normal_call_and_callee(CalleePSPtr, _) ->
- LineGroup0 = normal_call_site_summary_to_html(Pref, Deep,
- FileName, LineNumber, CallerPSPtr, CalleePSPtr, CallSiteCallList)
- ;
- LineGroup0 = multi_call_site_summary_to_html(Pref, Deep,
- FileName, LineNumber, Kind, CallerPSPtr, CallSiteCallList)
- ),
- CSSContext = string.format("%s:%d",
- [s(escape_break_html_string(FileName)), i(LineNumber)]),
- LineGroup = add_context(CSSContext, LineGroup0).
-
-:- func normal_call_site_summary_to_html(preferences, deep, string, int,
- proc_static_ptr, proc_static_ptr,
- assoc_list(proc_static_ptr, list(call_site_dynamic_ptr))) =
- one_two_id_line_group.
-
-normal_call_site_summary_to_html(Pref, Deep, FileName, LineNumber,
- CallerPSPtr, CalleePSPtr, CallSiteCallList) = LineGroup :-
- deep_lookup_proc_statics(Deep, CalleePSPtr, CalleePS),
- ProcName = CalleePS ^ ps_q_refined_id,
- (
- CallSiteCallList = [],
- Own = zero_own_prof_info,
- Desc = zero_inherit_prof_info,
- SummaryHTML =
- string.format("<TD CLASS=id>%s</TD>\n",
- [s(proc_static_to_html_ref(Pref, Deep, CalleePSPtr))]),
- LineGroup = line_group(FileName, LineNumber,
- ProcName, Own, Desc, SummaryHTML,
- sub_lines(two_id, []))
- ;
- CallSiteCallList = [CallSiteCall],
- CallSiteCall = CalleePSPtrFromCall - _,
- require(unify(CalleePSPtr, CalleePSPtrFromCall),
- "call_site_summary_to_html: callee mismatch"),
- LineGroup0 = call_site_summary_group_to_html(Pref, Deep,
- FileName, LineNumber, ProcName, CallerPSPtr, CallSiteCall),
- LineGroup = line_to_two_id_subline_group(LineGroup0)
- ;
- CallSiteCallList = [_, _ | _],
- error("normal_call_site_summary_to_html: too many procedures")
- ).
-
-:- func multi_call_site_summary_to_html(preferences, deep, string, int,
- call_site_kind_and_callee, proc_static_ptr,
- assoc_list(proc_static_ptr, list(call_site_dynamic_ptr))) =
- one_two_id_line_group.
-
-multi_call_site_summary_to_html(Pref, Deep, FileName, LineNumber, Kind,
- CallerPSPtr, CallSiteCallList) = LineGroup :-
- RawCallSiteName = call_site_kind_and_callee_to_html(Kind),
- CallSiteName = multi_call_site_add_suffix(Pref, RawCallSiteName,
- CallSiteCallList),
- SubLines = list.map(call_site_summary_group_to_html(Pref, Deep,
- FileName, LineNumber, RawCallSiteName, CallerPSPtr),
- CallSiteCallList),
- sum_line_group_measurements(SubLines, Own, Desc),
-
- % NOTE: we don't escape HTML special characters for
- % 'CallSiteName' because it has already been done.
- SummaryHTML =
- string.format("<TD CLASS=id>%s</TD>\n", [s(CallSiteName)]),
- (
- Pref ^ pref_summarize = summarize_ho_call_sites,
- LineGroup = line_group(FileName, LineNumber, RawCallSiteName,
- Own, Desc, SummaryHTML, sub_lines(two_id, []))
- ;
- Pref ^ pref_summarize = do_not_summarize_ho_call_sites,
- ContextSubLines = list.map(add_context(""), SubLines),
- LineGroup = line_group(FileName, LineNumber, RawCallSiteName,
- Own, Desc, SummaryHTML, sub_lines(two_id, ContextSubLines))
- ).
-
-:- func call_site_summary_group_to_html(preferences, deep,
- string, int, string, proc_static_ptr,
- pair(proc_static_ptr, list(call_site_dynamic_ptr))) = one_id_line.
-
-call_site_summary_group_to_html(Pref, Deep, FileName, LineNumber, ProcName,
- CallerPSPtr, PSPtr - CSDPtrs) = LineGroup :-
- list.foldl2(accumulate_csd_prof_info(Deep, CallerPSPtr), CSDPtrs,
- zero_own_prof_info, Own, zero_inherit_prof_info, Desc),
- HTML =
- string.format("<TD CLASS=id>%s</TD>\n",
- [s(proc_static_to_html_ref(Pref, Deep, PSPtr))]),
- LineGroup = line_group(FileName, LineNumber, ProcName,
- Own, Desc, HTML, unit).
-
-%-----------------------------------------------------------------------------%
-
-:- func multi_call_site_add_suffix(preferences, string, list(T)) = string.
-
-multi_call_site_add_suffix(Pref, RawCallSiteName, CallList) = CallSiteName :-
- (
- CallList = [],
- CallSiteName = RawCallSiteName ++ " (no calls made)"
- ;
- CallList = [_ | _],
- Summarize = Pref ^ pref_summarize,
- (
- Summarize = summarize_ho_call_sites,
- CallSiteName = RawCallSiteName ++ " (summary)"
- ;
- Summarize = do_not_summarize_ho_call_sites,
- CallSiteName = RawCallSiteName
- )
- ).
-
-%-----------------------------------------------------------------------------%
-
-:- pred process_call_site_dynamics_group(list(call_site_dynamic_ptr)::in,
- deep::in, proc_static_ptr::in,
- maybe(clique_ptr)::in, maybe(clique_ptr)::out,
- own_prof_info::in, own_prof_info::out,
- inherit_prof_info::in, inherit_prof_info::out) is det.
-
-process_call_site_dynamics_group([], _, _,
- MaybeCalleeCliquePtr, MaybeCalleeCliquePtr, Own, Own, Desc, Desc).
-process_call_site_dynamics_group([CSDPtr | CSDPtrs], Deep, CalleePSPtr,
- MaybeCalleeCliquePtr0, MaybeCalleeCliquePtr, Own0, Own, Desc0, Desc) :-
- deep_lookup_call_site_dynamics(Deep, CSDPtr, CSD),
- PDPtr = CSD ^ csd_callee,
- deep_lookup_proc_dynamics(Deep, PDPtr, PD),
- PSPtr = PD ^ pd_proc_static,
- require(unify(CalleePSPtr, PSPtr),
- "process_call_site_dynamics_group: callee mismatch"),
- deep_lookup_clique_index(Deep, PDPtr, CalleeCliquePtr),
- (
- MaybeCalleeCliquePtr0 = no,
- MaybeCalleeCliquePtr1 = yes(CalleeCliquePtr)
- ;
- MaybeCalleeCliquePtr0 = yes(PrevCalleeCliquePtr),
- MaybeCalleeCliquePtr1 = MaybeCalleeCliquePtr0,
- require(unify(PrevCalleeCliquePtr, CalleeCliquePtr),
- "process_call_site_dynamics_group: clique mismatch")
- ),
- deep_lookup_csd_own(Deep, CSDPtr, CSDOwn),
- deep_lookup_csd_desc(Deep, CSDPtr, CSDDesc),
- Own1 = add_own_to_own(Own0, CSDOwn),
- Desc1 = add_inherit_to_inherit(Desc0, CSDDesc),
- process_call_site_dynamics_group(CSDPtrs, Deep, CalleePSPtr,
- MaybeCalleeCliquePtr1, MaybeCalleeCliquePtr, Own1, Own, Desc1, Desc).
-
-:- pred accumulate_csd_prof_info(deep::in, proc_static_ptr::in,
- call_site_dynamic_ptr::in,
- own_prof_info::in, own_prof_info::out,
- inherit_prof_info::in, inherit_prof_info::out) is det.
-
-accumulate_csd_prof_info(Deep, CallerPSPtr, CSDPtr, Own0, Own, Desc0, Desc) :-
- deep_lookup_csd_own(Deep, CSDPtr, CSDOwn),
- deep_lookup_csd_desc(Deep, CSDPtr, CSDDesc),
- add_own_to_own(Own0, CSDOwn) = Own,
- add_inherit_to_inherit(Desc0, CSDDesc) = Desc1,
- deep_lookup_csd_comp_table(Deep, CSDPtr, CompTableArray),
- ( map.search(CompTableArray, CallerPSPtr, InnerTotal) ->
- Desc = subtract_inherit_from_inherit(InnerTotal, Desc1)
- ;
- Desc = Desc1
- ).
-
-:- func call_site_dynamic_to_html_with_caller(preferences, deep,
- call_site_display, call_site_dynamic_ptr) = two_id_line.
-
-call_site_dynamic_to_html_with_caller(Pref, Deep, Display, CSDPtr)
- = LineGroup :-
- deep_extract_csdptr_caller(Deep, CSDPtr, CallerPDPtr),
- deep_lookup_clique_index(Deep, CallerPDPtr, CallerClique),
- LineGroup = call_site_dynamic_to_html(Pref, Deep, Display,
- yes(CallerClique), CSDPtr).
-
-:- func call_site_dynamic_to_html(preferences, deep, call_site_display,
- maybe(clique_ptr), call_site_dynamic_ptr) = two_id_line.
-
-call_site_dynamic_to_html(Pref, Deep, CallSiteDisplay, MaybeCallerCliquePtr,
- CSDPtr) = LineGroup :-
- require(valid_call_site_dynamic_ptr(Deep, CSDPtr),
- "call_site_dynamic_to_html: invalid call_site_dynamic_ptr"),
- deep_lookup_call_site_dynamics(Deep, CSDPtr, CSD),
- CallerPDPtr = CSD ^ csd_caller,
- CalleePDPtr = CSD ^ csd_callee,
- CallSiteOwn = CSD ^ csd_own_prof,
- deep_lookup_csd_desc(Deep, CSDPtr, CallSiteDesc),
- deep_lookup_clique_index(Deep, CalleePDPtr, CalleeCliquePtr),
- call_site_dynamic_context(Deep, CSDPtr, FileName, LineNumber),
- Context = string.format("%s:%d",
- [s(escape_break_html_string(FileName)), i(LineNumber)]),
- HTML = call_to_html(Pref, Deep, CallSiteDisplay, Context,
- CallerPDPtr, CalleePDPtr, MaybeCallerCliquePtr, CalleeCliquePtr),
- ProcName = escape_break_html_string(proc_dynamic_name(Deep, CalleePDPtr)),
- LineGroup = line_group(FileName, LineNumber, ProcName,
- CallSiteOwn, CallSiteDesc, HTML, unit).
-
-%-----------------------------------------------------------------------------%
-
-:- type call_site_display
- ---> call_site_display(
- display_context :: call_site_context,
- display_proc_name :: call_site_proc_name,
- display_url :: url_with_proc_name,
- display_wrap :: wrap_with_url
- ).
-
-:- type call_site_context
- ---> call_context
- ; empty_context.
-
-:- type call_site_proc_name
- ---> caller_proc_name
- ; callee_proc_name.
-
-:- type url_with_proc_name
- ---> caller_clique
- ; callee_clique.
-
-:- type wrap_with_url
- ---> wrap_url_always
- ; wrap_url_if_cross_clique(assume_cross_clique)
- ; wrap_url_never.
-
-:- type assume_cross_clique
- ---> assume_cross_clique
- ; assume_within_clique.
-
-:- func ancestor_display = call_site_display.
-:- func downward_display = call_site_display.
-:- func downward_summary_display = call_site_display.
-
-ancestor_display =
- call_site_display(call_context, caller_proc_name, caller_clique,
- wrap_url_always).
-
-downward_display =
- call_site_display(call_context, callee_proc_name, callee_clique,
- wrap_url_if_cross_clique(assume_within_clique)).
-
-downward_summary_display =
- call_site_display(empty_context, callee_proc_name, callee_clique,
- wrap_url_if_cross_clique(assume_within_clique)).
-
-%-----------------------------------------------------------------------------%
-
-:- func call_to_html(preferences, deep, call_site_display, string,
- proc_dynamic_ptr, proc_dynamic_ptr, maybe(clique_ptr), clique_ptr)
- = string.
-
-call_to_html(Pref, Deep, CallSiteDisplay, CallContext,
- CallerPDPtr, CalleePDPtr,
- MaybeCallerCliquePtr, CalleeCliquePtr) = HTML :-
- (
- MaybeCallerCliquePtr = yes(CallerCliquePtr0),
- CallerCliquePtr = CallerCliquePtr0
- ;
- MaybeCallerCliquePtr = no,
- CallerCliquePtr = dummy_clique_ptr
- ),
- (
- CallSiteDisplay ^ display_context = call_context,
- Context = CallContext
- ;
- CallSiteDisplay ^ display_context = empty_context,
- Context = ""
- ),
- (
- CallSiteDisplay ^ display_proc_name = caller_proc_name,
- ProcName = proc_dynamic_name(Deep, CallerPDPtr)
- ;
- CallSiteDisplay ^ display_proc_name = callee_proc_name,
- ProcName = proc_dynamic_name(Deep, CalleePDPtr)
- ),
- (
- CallSiteDisplay ^ display_url = caller_clique,
- ChosenCliquePtr = CallerCliquePtr
- ;
- CallSiteDisplay ^ display_url = callee_clique,
- ChosenCliquePtr = CalleeCliquePtr
- ),
- WrappedProcName = string.format("<A HREF=""%s"">%s</A>",
- [s(deep_cmd_pref_to_url(Pref, Deep, deep_cmd_clique(ChosenCliquePtr))),
- s(escape_break_html_string(ProcName))]),
- (
- CallSiteDisplay ^ display_wrap = wrap_url_always,
- UsedProcName0 = WrappedProcName
- ;
- CallSiteDisplay ^ display_wrap = wrap_url_if_cross_clique(Assume),
- (
- MaybeCallerCliquePtr = yes(_),
- ( CallerCliquePtr \= CalleeCliquePtr ->
- UsedProcName0 = WrappedProcName
- ;
- UsedProcName0 = escape_break_html_string(ProcName)
- )
- ;
- MaybeCallerCliquePtr = no,
- (
- Assume = assume_cross_clique,
- UsedProcName0 = WrappedProcName
- ;
- Assume = assume_within_clique,
- UsedProcName0 = escape_break_html_string(ProcName)
- )
- )
- ;
- CallSiteDisplay ^ display_wrap = wrap_url_never,
- UsedProcName0 = escape_break_html_string(ProcName)
- ),
- (
- UsedProcName0 = WrappedProcName,
- valid_clique_ptr(Deep, ChosenCliquePtr)
- ->
- UsedProcName = UsedProcName0
- ;
- UsedProcName = escape_break_html_string(ProcName)
- ),
- HTML =
- string.format("<TD CLASS=id>%s</TD>\n", [s(Context)]) ++
- string.format("<TD CLASS=id>%s</TD>\n", [s(UsedProcName)]).
-
-%-----------------------------------------------------------------------------%
-
-:- pred call_site_dynamic_context(deep::in, call_site_dynamic_ptr::in,
- string::out, int::out) is det.
-
-call_site_dynamic_context(Deep, CSDPtr, FileName, LineNumber) :-
- deep_lookup_call_site_static_map(Deep, CSDPtr, CSSPtr),
- deep_lookup_call_site_statics(Deep, CSSPtr, CSS),
- PSPtr = CSS ^ css_container,
- LineNumber = CSS ^ css_line_num,
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- FileName = PS ^ ps_file_name.
-
-%-----------------------------------------------------------------------------%
-
-:- pred proc_callers_to_html(preferences::in, deep::in, proc_static_ptr::in,
- caller_groups::in, int::in,
- maybe_error({id_fields, string, string, string})::out,
- io::di, io::uo) is det.
-
-proc_callers_to_html(Pref, Deep, PSPtr, CallerGroups, BunchNum0, MaybePage,
- !IO) :-
- deep_lookup_proc_callers(Deep, PSPtr, CallerCSDPtrs),
- PrefContour = Pref ^ pref_contour,
- (
- PrefContour = do_not_apply_contour_exclusion,
- CallerCSDPtrPairs = list.map(pair_self, CallerCSDPtrs),
- MaybeErrorMsg = no
- ;
- PrefContour = apply_contour_exclusion,
- ExcludeFile = Deep ^ exclude_contour_file,
- ExcludeFile = exclude_file(_ExcludeFileName, ExcludeContents),
- (
- ExcludeContents = no_exclude_file,
- % There is no contour exclusion file, so do the same as for
- % do_not_apply_contour_exclusion.
- CallerCSDPtrPairs = list.map(pair_self, CallerCSDPtrs),
- MaybeErrorMsg = no
- ;
- ExcludeContents = unreadable_exclude_file(ErrorMsg),
- MaybeErrorMsg = yes(ErrorMsg ++ "\n<br>"),
- CallerCSDPtrPairs = list.map(pair_self, CallerCSDPtrs)
- ;
- ExcludeContents = readable_exclude_file(ExcludedModules, _Warn),
- CallerCSDPtrPairs = list.map(pair_contour(Deep, ExcludedModules),
- CallerCSDPtrs),
- MaybeErrorMsg = no
- )
- ),
- ProcName = proc_static_name(Deep, PSPtr),
- CmdSite = deep_cmd_proc_callers(PSPtr, group_by_call_site, 1, 100,
- PrefContour),
- CmdProc = deep_cmd_proc_callers(PSPtr, group_by_proc, 1, 100,
- PrefContour),
- CmdModule = deep_cmd_proc_callers(PSPtr, group_by_module, 1, 100,
- PrefContour),
- CmdClique = deep_cmd_proc_callers(PSPtr, group_by_clique, 1, 100,
- PrefContour),
- LinkSite = "[Group callers by call site]",
- LinkProc = "[Group callers by procedure]",
- LinkModule = "[Group callers by module]",
- LinkClique = "[Group callers by clique]",
- % Don't display more lines than BunchSize, to avoid quadratic behaviour
- % in Netscape.
- BunchSize = 100,
- (
- CallerGroups = group_by_call_site,
- GroupList = group_csds_by_call_site(Deep, CallerCSDPtrPairs),
- Lines = list.map(proc_callers_call_site_to_html(Pref, Deep, PSPtr),
- GroupList),
- SortedLines = sort_line_groups(Pref ^ pref_criteria, Lines),
- IdFields = source_proc,
- Entity = "call site",
- GroupToggles =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdProc)),
- s(LinkProc)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdModule)),
- s(LinkModule)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdClique)),
- s(LinkClique)])
- ;
- CallerGroups = group_by_proc,
- GroupList = group_csds_by_procedure(Deep, CallerCSDPtrPairs),
- Lines = list.map(proc_callers_proc_to_html(Pref, Deep, PSPtr),
- GroupList),
- SortedLines = sort_line_groups(Pref ^ pref_criteria, Lines),
- IdFields = source_proc,
- Entity = "procedure",
- GroupToggles =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdSite)),
- s(LinkSite)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdModule)),
- s(LinkModule)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdClique)),
- s(LinkClique)])
- ;
- CallerGroups = group_by_module,
- GroupList = group_csds_by_module(Deep, CallerCSDPtrPairs),
- RawLines = list.map(proc_callers_module_to_html(Pref, Deep, PSPtr),
- GroupList),
- SortedRawLines = sort_line_groups(Pref ^ pref_criteria, RawLines),
- SortedLines = add_ranks(SortedRawLines),
- IdFields = rank_module,
- Entity = "module",
- GroupToggles =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdSite)),
- s(LinkSite)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdProc)),
- s(LinkProc)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdClique)),
- s(LinkClique)])
- ;
- CallerGroups = group_by_clique,
- GroupList = group_csds_by_clique(Deep, CallerCSDPtrPairs),
- RawLines = list.map(proc_callers_clique_to_html(Pref, Deep, PSPtr),
- GroupList),
- SortedRawLines = sort_line_groups(Pref ^ pref_criteria, RawLines),
- SortedLines = add_ranks(SortedRawLines),
- IdFields = source_proc,
- Entity = "clique",
- GroupToggles =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdSite)),
- s(LinkSite)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdProc)),
- s(LinkProc)]) ++
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, CmdModule)),
- s(LinkModule)])
- ),
- % SortedLines may contain many thousand elements, and Netscape
- % chokes on the output unless we filter them or break them into chunks.
- % This simple limit device is temporary until we decide what filtering
- % and/or chunking mechanism we want to use.
- list.length(SortedLines, NumLines),
- select_line_bunch(NumLines, BunchNum0, BunchNum, BunchSize,
- SortedLines, DisplayedLines),
- Banner = proc_callers_banner(PSPtr, ProcName, Pref, Deep,
- NumLines, BunchSize, BunchNum, Entity),
- DisplayedHTMLs = list.map(
- two_id_line_to_html(Pref, Deep, totals_meaningful),
- DisplayedLines),
- HTML = string.append_list(DisplayedHTMLs),
- ( BunchNum > 1 ->
- FirstCmd = deep_cmd_proc_callers(PSPtr, CallerGroups, 1, 100,
- PrefContour),
- FirstLink = "First group",
- FirstToggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, FirstCmd)), s(FirstLink)])
- ;
- FirstToggle = ""
- ),
- ( BunchNum > 2 ->
- PrevCmd = deep_cmd_proc_callers(PSPtr, CallerGroups, BunchNum - 1, 100,
- PrefContour),
- PrevLink = "Previous group",
- PrevToggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, PrevCmd)), s(PrevLink)])
- ;
- PrevToggle = ""
- ),
- ( NumLines > BunchNum * BunchSize ->
- NextCmd = deep_cmd_proc_callers(PSPtr, CallerGroups, BunchNum + 1, 100,
- PrefContour),
- NextLink = "Next group",
- NextToggle =
- string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, NextCmd)), s(NextLink)])
- ;
- NextToggle = ""
- ),
- Toggles = GroupToggles ++ FirstToggle ++ PrevToggle ++ NextToggle,
- (
- MaybeErrorMsg = no,
- MaybePage = ok({IdFields, Banner, HTML, Toggles})
- ;
- MaybeErrorMsg = yes(Msg),
- MaybePage = error(Msg)
- ).
-
-:- pred select_line_bunch(int::in, int::in, int::out, int::in, list(T)::in,
- list(T)::out) is det.
-
-select_line_bunch(NumLines, BunchNum0, BunchNum, BunchSize,
- Lines, DisplayedLines) :-
- ToDelete = (BunchNum0 - 1) * BunchSize,
- (
- list.drop(ToDelete, Lines, RemainingLines0),
- RemainingLines0 = [_ | _]
- ->
- BunchNum = BunchNum0,
- RemainingLines = RemainingLines0,
- RemainingNumLines = NumLines - ToDelete
- ;
- BunchNum = 1,
- RemainingLines = Lines,
- RemainingNumLines = NumLines
- ),
- ( RemainingNumLines > BunchSize ->
- list.take_upto(BunchSize, RemainingLines, DisplayedLines)
- ;
- DisplayedLines = RemainingLines
- ).
-
-:- func proc_callers_banner(proc_static_ptr, string, preferences, deep,
- int, int, int, string) = string.
-
-proc_callers_banner(PSPtr, ProcName, Pref, Deep, NumLines, BunchSize, BunchNum,
- Parent) = HTML :-
- Cmd = deep_cmd_proc(PSPtr),
- WrappedProcName = string.format("<A HREF=""%s"">%s</A>",
- [s(deep_cmd_pref_to_url(Pref, Deep, Cmd)),
- s(escape_break_html_string(ProcName))]),
- ( NumLines = 0 ->
- HTML = string.format("<H3>There are no %ss calling %s</H3>",
- [s(Parent), s(WrappedProcName)])
- ; NumLines = 1 ->
- HTML = string.format("<H3>There is one %s calling %s:</H3>\n",
- [s(Parent), s(WrappedProcName)])
- ; NumLines =< BunchSize ->
- HTML = string.format("<H3>The %d %ss calling %s:</H3>",
- [i(NumLines), s(Parent), s(WrappedProcName)])
- ; BunchNum = 1 ->
- HTML = string.format(
- "<H3>There are %d %ss calling %s, showing first %d:</H3>",
- [i(NumLines), s(Parent), s(WrappedProcName), i(BunchSize)])
- ;
- First = (BunchNum - 1) * BunchSize + 1,
- Last0 = (BunchNum) * BunchSize,
- ( Last0 > NumLines ->
- Last = NumLines
- ;
- Last = Last0
- ),
- HTML = string.format(
- "<H3>There are %d %ss calling %s, showing %d to %d:</H3>",
- [i(NumLines), s(Parent), s(WrappedProcName), i(First), i(Last)])
- ).
-
-:- func proc_callers_call_site_to_html(preferences, deep, proc_static_ptr,
- pair(call_site_static_ptr, list(call_site_dynamic_ptr))) = two_id_line.
-
-proc_callers_call_site_to_html(Pref, Deep, CalleePSPtr, CSSPtr - CSDPtrs)
- = LineGroup :-
- call_site_context(Deep, CSSPtr, FileName, LineNumber),
- deep_lookup_call_site_statics(Deep, CSSPtr, CSS),
- CallerPSPtr = CSS ^ css_container,
- deep_lookup_proc_statics(Deep, CallerPSPtr, CallerPS),
- CallerProcName = CallerPS ^ ps_q_refined_id,
- compute_parent_csd_prof_info(Deep, CalleePSPtr, CSDPtrs, Own, Desc),
- HTML =
- string.format("<TD CLASS=id>%s:%d</TD>\n",
- [s(escape_break_html_string(FileName)), i(LineNumber)]) ++
- string.format("<TD CLASS=id>%s</TD>\n",
- [s(proc_static_to_html_ref(Pref, Deep, CallerPSPtr))]),
- LineGroup = line_group(FileName, LineNumber, CallerProcName,
- Own, Desc, HTML, unit).
-
-:- func proc_callers_proc_to_html(preferences, deep, proc_static_ptr,
- pair(proc_static_ptr, list(call_site_dynamic_ptr))) = two_id_line.
-
-proc_callers_proc_to_html(Pref, Deep, CalleePSPtr, CallerPSPtr - CSDPtrs)
- = LineGroup :-
- proc_static_context(Deep, CallerPSPtr, FileName, LineNumber),
- deep_lookup_proc_statics(Deep, CallerPSPtr, CallerPS),
- CallerProcName = CallerPS ^ ps_q_refined_id,
- compute_parent_csd_prof_info(Deep, CalleePSPtr, CSDPtrs, Own, Desc),
- HTML =
- string.format("<TD CLASS=id>%s:%d</TD>\n",
- [s(escape_break_html_string(FileName)), i(LineNumber)]) ++
- string.format("<TD CLASS=id>%s</TD>\n",
- [s(proc_static_to_html_ref(Pref, Deep, CallerPSPtr))]),
- LineGroup = line_group(FileName, LineNumber, CallerProcName,
- Own, Desc, HTML, unit).
-
-:- func proc_callers_module_to_html(preferences, deep, proc_static_ptr,
- pair(string, list(call_site_dynamic_ptr))) = one_id_line.
-
-proc_callers_module_to_html(Pref, Deep, CalleePSPtr, ModuleName - CSDPtrs)
- = LineGroup :-
- compute_parent_csd_prof_info(Deep, CalleePSPtr, CSDPtrs, Own, Desc),
- HTML = string.format("<TD CLASS=id>%s</TD>\n",
- [s(module_name_to_html_ref(Pref, Deep, ModuleName))]),
- % We don't have filename information for modules, and line numbers
- % are not meaningful for modules.
- LineGroup = line_group(ModuleName, 0, ModuleName,
- Own, Desc, HTML, unit).
-
-:- func proc_callers_clique_to_html(preferences, deep, proc_static_ptr,
- pair(clique_ptr, list(call_site_dynamic_ptr))) = one_id_line.
-
-proc_callers_clique_to_html(Pref, Deep, CalleePSPtr, CliquePtr - CSDPtrs)
- = LineGroup :-
- compute_parent_csd_prof_info(Deep, CalleePSPtr, CSDPtrs, Own, Desc),
- deep_lookup_clique_parents(Deep, CliquePtr, EntryCSDPtr),
- deep_lookup_call_site_dynamics(Deep, EntryCSDPtr, EntryCSD),
- EntryPDPtr = EntryCSD ^ csd_callee,
- proc_dynamic_context(Deep, EntryPDPtr, FileName, LineNumber),
- ProcName = proc_dynamic_name(Deep, EntryPDPtr),
- HTML = string.format("<TD CLASS=id>%s</TD>\n",
- [s(clique_ptr_to_html_ref(Pref, Deep, ProcName, CliquePtr))]),
- LineGroup = line_group(FileName, LineNumber, ProcName,
- Own, Desc, HTML, unit).
-
-%-----------------------------------------------------------------------------%
-
-:- func proc_summary_to_html(preferences, deep, proc_static_ptr) = string.
-
-proc_summary_to_html(Pref, Deep, PSPtr) = HTML :-
- SumHTML = two_id_line_to_html(Pref, Deep, totals_meaningful,
- lookup_proc_total_to_two_id_line(Pref, Deep, yes, "", PSPtr)),
- deep_lookup_proc_statics(Deep, PSPtr, PS),
- CSSPtrsArray = PS ^ ps_sites,
- array.to_list(CSSPtrsArray, CSSPtrs),
- CallSiteGroups = list.map(call_site_summary_to_html(Pref, Deep), CSSPtrs),
- SortedCallSiteGroups = sort_line_groups(Pref ^ pref_criteria,
- CallSiteGroups),
- BodyHTMLs = list.map(
- two_id_line_group_to_html(Pref, Deep, totals_meaningful),
- SortedCallSiteGroups),
- string.append_list(BodyHTMLs, BodyHTML0),
- (
- SortedCallSiteGroups = [],
- BodyHTML = BodyHTML0
- ;
- SortedCallSiteGroups = [_ | _],
- BodyHTML =
- BodyHTML0 ++
- separator_row(Pref, source_proc, totals_meaningful)
- ),
- HTML =
- SumHTML ++
- separator_row(Pref, source_proc, totals_meaningful) ++
- BodyHTML.
-
-:- func proc_summary_toggles_to_html(preferences, deep, proc_static_ptr)
- = string.
-
-proc_summary_toggles_to_html(Pref, Deep, PSPtr) = HTML :-
- PrefContour = Pref ^ pref_contour,
- Msg1 = "[Parent call sites]",
- Cmd1 = deep_cmd_proc_callers(PSPtr, group_by_call_site, 1, 100,
- PrefContour),
- Msg2 = "[Parent procedures]",
- Cmd2 = deep_cmd_proc_callers(PSPtr, group_by_proc, 1, 100, PrefContour),
- Msg3 = "[Parent modules]",
- Cmd3 = deep_cmd_proc_callers(PSPtr, group_by_module, 1, 100, PrefContour),
- Msg4 = "[Parent cliques]",
- Cmd4 = deep_cmd_proc_callers(PSPtr, group_by_clique, 1, 100, PrefContour),
- Link1 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, Cmd1)), s(Msg1)]),
- Link2 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, Cmd2)), s(Msg2)]),
- Link3 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, Cmd3)), s(Msg3)]),
- Link4 = string.format("<A CLASS=""button"" HREF=""%s"">%s</A>\n",
- [s(deep_cmd_pref_to_url(Pref, Deep, Cmd4)), s(Msg4)]),
- HTML =
- Link1 ++
- Link2 ++
- Link3 ++
- Link4.
-
-%-----------------------------------------------------------------------------%
-
-:- func wrap_clique_links(clique_ptr, preferences, deep, string,
- order_criteria) = string.
-
-wrap_clique_links(CliquePtr, Pref0, Deep, Str0, Criteria) = Str :-
- Cmd = deep_cmd_clique(CliquePtr),
- Pref = Pref0 ^ pref_criteria := Criteria,
- URL = deep_cmd_pref_to_url(Pref, Deep, Cmd),
- Str = string.format("<A HREF=%s>%s</A>",
- [s(URL), s(escape_break_html_string(Str0))]).
-
-:- func wrap_proc_links(proc_static_ptr, preferences, deep, string,
- order_criteria) = string.
-
-wrap_proc_links(PSPtr, Pref0, Deep, Str0, Criteria) = Str :-
- Cmd = deep_cmd_proc(PSPtr),
- Pref = Pref0 ^ pref_criteria := Criteria,
- URL = deep_cmd_pref_to_url(Pref, Deep, Cmd),
- Str = string.format("<A HREF=%s>%s</A>",
- [s(URL), s(escape_break_html_string(Str0))]).
-
-:- func wrap_proc_callers_links(proc_static_ptr, caller_groups, int,
- preferences, deep, string, order_criteria) = string.
-
-wrap_proc_callers_links(PSPtr, CallerGroups, BunchNum, Pref0, Deep,
- Str0, Criteria) = Str :-
- PrefContour = Pref0 ^ pref_contour,
- Cmd = deep_cmd_proc_callers(PSPtr, CallerGroups, BunchNum, 100,
- PrefContour),
- Pref = Pref0 ^ pref_criteria := Criteria,
- URL = deep_cmd_pref_to_url(Pref, Deep, Cmd),
- Str = string.format("<A HREF=%s>%s</A>",
- [s(URL), s(escape_break_html_string(Str0))]).
-
-:- func wrap_module_links(string, preferences, deep, string,
- order_criteria) = string.
-
-wrap_module_links(ModuleName, Pref0, Deep, Str0, Criteria) = Str :-
- Cmd = deep_cmd_module(ModuleName),
- Pref = Pref0 ^ pref_criteria := Criteria,
- URL = deep_cmd_pref_to_url(Pref, Deep, Cmd),
- Str = string.format("<A HREF=%s>%s</A>",
- [s(URL), s(escape_break_html_string(Str0))]).
-
-:- func wrap_modules_links(preferences, deep, string, order_criteria) = string.
-
-wrap_modules_links(Pref0, Deep, Str0, Criteria) = Str :-
- Cmd = deep_cmd_program_modules,
- Pref = Pref0 ^ pref_criteria := Criteria,
- URL = deep_cmd_pref_to_url(Pref, Deep, Cmd),
- Str = string.format("<A HREF=%s>%s</A>",
- [s(URL), s(escape_break_html_string(Str0))]).
-
-:- func wrap_top_procs_links(display_limit, preferences, deep, string,
- order_criteria) = string.
-
-wrap_top_procs_links(Limit, Pref, Deep, Str0, Criteria) = Str :-
- (
- Criteria = by_context,
- Str = Str0
- ;
- Criteria = by_name,
- Str = Str0
- ;
- Criteria = by_cost(CostKind, InclDesc, Scope),
- Cmd = deep_cmd_top_procs(Limit, CostKind, InclDesc, Scope),
- URL = deep_cmd_pref_to_url(Pref, Deep, Cmd),
- Str = string.format("<A HREF=%s>%s</A>",
- [s(URL), s(escape_break_html_string(Str0))])
- ).
Index: query.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/deep_profiler/query.m,v
retrieving revision 1.40
diff -u -b -r1.40 query.m
--- query.m 15 Dec 2010 06:30:34 -0000 1.40
+++ query.m 27 Jan 2011 02:58:13 -0000
@@ -367,7 +367,6 @@
:- import_module display_report.
:- import_module html_format.
:- import_module measurements.
-:- import_module old_query.
:- import_module report.
:- import_module util.
@@ -417,62 +416,6 @@
string::out, io::di, io::uo) is det.
exec(Cmd, Prefs, Deep, HTMLStr, !IO) :-
- % XXX While we are working on converting the deep profiler to use
- % the new report structures, we can use the presence or absence
- % of this file to tell mdprof_cgi which method we want to use at the
- % moment. Being able to switch quickly between pages generated by the
- % old and the new methods makes debugging easier.
- io.open_input("/tmp/old_deep_profiler", OpenResult, !IO),
- (
- OpenResult = ok(Stream),
- FileExists = yes,
- io.close_input(Stream, !IO)
- ;
- OpenResult = error(_),
- FileExists = no
- ),
- (
- ( Cmd = deep_cmd_quit
- ; Cmd = deep_cmd_restart
- ; Cmd = deep_cmd_timeout(_)
- ; Cmd = deep_cmd_menu
- ; Cmd = deep_cmd_root(_)
- ; Cmd = deep_cmd_clique(_)
- ; Cmd = deep_cmd_program_modules
- ; Cmd = deep_cmd_module(_)
- ; Cmd = deep_cmd_top_procs(_, _, _, _)
- ; Cmd = deep_cmd_proc(_)
- ; Cmd = deep_cmd_proc_callers(_, _, _, _, _)
- ; Cmd = deep_cmd_dump_proc_static(_)
- ; Cmd = deep_cmd_dump_proc_dynamic(_)
- ; Cmd = deep_cmd_dump_call_site_static(_)
- ; Cmd = deep_cmd_dump_call_site_dynamic(_)
- ; Cmd = deep_cmd_dump_clique(_)
- ),
- (
- FileExists = yes,
- old_exec(Cmd, Prefs, Deep, HTMLStr, !IO)
- ;
- FileExists = no,
- new_exec(Cmd, Prefs, Deep, HTMLStr, !IO)
- )
- ;
- ( Cmd = deep_cmd_static_procrep_coverage(_)
- ; Cmd = deep_cmd_dynamic_procrep_coverage(_)
- ; Cmd = deep_cmd_module_getter_setters(_)
- ; Cmd = deep_cmd_call_site_dynamic_var_use(_)
- ; Cmd = deep_cmd_clique_recursive_costs(_)
- ; Cmd = deep_cmd_recursion_types_frequency
- ),
- new_exec(Cmd, Prefs, Deep, HTMLStr, !IO)
- ).
-
- % Run the command through the new report generation code.
- %
-:- pred new_exec(cmd::in, preferences::in, deep::in, string::out,
- io::di, io::uo) is det.
-
-new_exec(Cmd, Prefs, Deep, HTMLStr, !IO) :-
( slow_cmd(Cmd) ->
create_and_memoize_report(Cmd, Deep, Report)
;
cvs diff: Diffing notes
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to: mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the reviews
mailing list