[m-rev.] review: make source to source debugging available in any grade
Peter Ross
pro at missioncriticalit.com
Thu Jul 19 10:03:58 AEST 2012
Hi,
The following code makes a much more useful source to source debugger
for me in the csharp grade.
Note the ssdb is currently undocumented, so I haven't had to modify
much documentation.
===================================================================
Estimated hours taken: 4
Branches: main
Make source to source debugging available in any grade. This
is becuase ssdb doesn't require libraries to built with any
special extra information, so no need to an extra grade.
Also allow the user to specify different levels of tracing
in the ssdb engine.
README.ssdebug:
Document the new way to use source to source debugging.
compiler/globals.m:
compiler/handle_options.m:
compiler/options.m:
Add the ss_trace_level concept.
compiler/mercury_compile_middle_passes.m:
Always run the source to source debugging phase, as now the
ss_trace_level is used to control which procedures are traced.
compiler/module_imports.m:
If a module is traced then import the ssdb module.
compiler/prog_data.m:
compiler/simplify.m:
Remove code for handling the .ssdebug grade componennt.
compiler/ssdebug.m:
Handle the three different tracing levels. Note when a shallowly
traced procedure calls another procedure that procedure is traced, this
still has to be fixed.
compiler/trace_params.m:
Add the ss_trace_level concept.
doc/reference_manual.texi:
Remove .ssdebug from the manual.
Index: README.ssdebug
===================================================================
RCS file: /home/mercury1/repository/mercury/README.ssdebug,v
retrieving revision 1.7
diff -u -r1.7 README.ssdebug
--- README.ssdebug 4 Nov 2010 01:36:05 -0000 1.7
+++ README.ssdebug 18 Jul 2012 23:50:57 -0000
@@ -15,18 +15,27 @@
INSTALLATION
-To use the source-to-source debugger you must install grades containing the
-".ssdebug" grade component. One way to do this is to invoke configure
-with the option `--enable-ssdebug-grades'. This will add the grades
-hlc.gc.ssdebug, csharp.ssdebug and java.ssdebug to the set of library grades
-to install.
+To use the source-to-source debugger you must use `mmc --make' to compile your
+program. You need to set the option `--ssdb' and on at least one file set
+`--ss-trace' to be either shallow or deep.
+
-----------------------------------------------------------------------------
-THE .ssdebug GRADE COMPONENT
+TRACING LEVELS
+
+--ss-trace none
+ None of the module will cause trace events
-Compile your program in a grade with the ".ssdebug" grade component,
-e.g. java.ssdebug or hlc.gc.ssdebug.
+--ss-trace shallow
+ Predicates in the interface will generate events.
+
+--ss-trace deep
+ All predicates will generate events
+
+-----------------------------------------------------------------------------
+
+USING THE SOURCE TO SOURCE DEBUGGER
You may run the program as usual. To bring up the debugger prompt, set
the environment variable SSDB beforehand.
@@ -35,6 +44,9 @@
1: 1 1 CALL calculator.main
ssdb>
+If you set SSDB to be 0. Then you will need to explicitly enable the
+debugger later in your code by calling ssdb.enable_debugging/2.
+
As in mdb, the three numbers are the event number, call sequence number (CSN)
and the stack depth. Type "help" to show a list of commands. All commands act
like their mdb counterparts (with reduced functionality), except for `list'
Index: compiler/globals.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/globals.m,v
retrieving revision 1.105
diff -u -r1.105 globals.m
--- compiler/globals.m 15 Jan 2012 23:38:20 -0000 1.105
+++ compiler/globals.m 18 Jul 2012 23:50:58 -0000
@@ -223,7 +223,7 @@
:- pred globals_init(option_table::in, compilation_target::in, gc_method::in,
tags_method::in, termination_norm::in, termination_norm::in,
- trace_level::in, trace_suppress_items::in,
+ trace_level::in, trace_suppress_items::in, ss_trace_level::in,
may_be_thread_safe::in, c_compiler_type::in, csharp_compiler_type::in,
reuse_strategy::in,
maybe(il_version_number)::in, maybe(feedback_info)::in, env_type::in,
@@ -239,6 +239,7 @@
:- pred get_termination2_norm(globals::in, termination_norm::out) is det.
:- pred get_trace_level(globals::in, trace_level::out) is det.
:- pred get_trace_suppress(globals::in, trace_suppress_items::out) is det.
+:- pred get_ss_trace_level(globals::in, ss_trace_level::out) is det.
:- pred get_maybe_thread_safe(globals::in, may_be_thread_safe::out) is det.
:- pred get_c_compiler_type(globals::in, c_compiler_type::out) is det.
:- pred get_csharp_compiler_type(globals::in, csharp_compiler_type::out) is det.
@@ -256,6 +257,7 @@
:- pred set_tags_method(tags_method::in, globals::in, globals::out) is det.
:- pred set_trace_level(trace_level::in, globals::in, globals::out) is det.
:- pred set_trace_level_none(globals::in, globals::out) is det.
+:- pred set_ss_trace_level(ss_trace_level::in, globals::in, globals::out) is det.
:- pred set_maybe_feedback_info(maybe(feedback_info)::in,
globals::in, globals::out) is det.
@@ -569,6 +571,7 @@
g_termination2_norm :: termination_norm,
g_trace_level :: trace_level,
g_trace_suppress_items :: trace_suppress_items,
+ g_ss_trace_level :: ss_trace_level,
g_may_be_thread_safe :: bool,
g_c_compiler_type :: c_compiler_type,
g_csharp_compiler_type :: csharp_compiler_type,
@@ -581,12 +584,12 @@
globals_init(Options, Target, GC_Method, TagsMethod,
TerminationNorm, Termination2Norm, TraceLevel, TraceSuppress,
- MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
+ SSTraceLevel, MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
ReuseStrategy, MaybeILVersion,
MaybeFeedback, HostEnvType, TargetEnvType, Globals) :-
Globals = globals(Options, Target, GC_Method, TagsMethod,
TerminationNorm, Termination2Norm, TraceLevel, TraceSuppress,
- MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
+ SSTraceLevel, MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
ReuseStrategy, MaybeILVersion,
MaybeFeedback, HostEnvType, TargetEnvType).
@@ -598,6 +601,7 @@
get_termination2_norm(Globals, Globals ^ g_termination2_norm).
get_trace_level(Globals, Globals ^ g_trace_level).
get_trace_suppress(Globals, Globals ^ g_trace_suppress_items).
+get_ss_trace_level(Globals, Globals ^ g_ss_trace_level).
get_maybe_thread_safe(Globals, Globals ^ g_may_be_thread_safe).
get_c_compiler_type(Globals, Globals ^ g_c_compiler_type).
get_csharp_compiler_type(Globals, Globals ^ g_csharp_compiler_type).
@@ -635,6 +639,9 @@
set_trace_level_none(!Globals) :-
!Globals ^ g_trace_level := trace_level_none.
+set_ss_trace_level(SSTraceLevel, !Globals) :-
+ !Globals ^ g_ss_trace_level := SSTraceLevel.
+
set_maybe_feedback_info(MaybeFeedback, !Globals) :-
!Globals ^ g_maybe_feedback := MaybeFeedback.
Index: compiler/handle_options.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/handle_options.m,v
retrieving revision 1.383
diff -u -r1.383 handle_options.m
--- compiler/handle_options.m 17 Jul 2012 04:43:53 -0000 1.383
+++ compiler/handle_options.m 18 Jul 2012 23:50:58 -0000
@@ -216,14 +216,14 @@
Globals, !IO) :-
check_option_values(OptionTable0, OptionTable, Target, GC_Method,
TagsMethod, TermNorm, Term2Norm, TraceLevel, TraceSuppress,
- MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
+ SSTraceLevel, MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
ReuseStrategy, MaybeILVersion,
MaybeFeedbackInfo, HostEnvType, TargetEnvType, [], CheckErrors, !IO),
(
CheckErrors = [],
convert_options_to_globals(OptionTable, Target, GC_Method,
TagsMethod, TermNorm, Term2Norm, TraceLevel,
- TraceSuppress, MaybeThreadSafe, C_CompilerType,
+ TraceSuppress, SSTraceLevel, MaybeThreadSafe, C_CompilerType,
CSharp_CompilerType, ReuseStrategy,
MaybeILVersion, MaybeFeedbackInfo, HostEnvType, TargetEnvType,
[], Errors, Globals, !IO)
@@ -236,15 +236,15 @@
:- pred check_option_values(option_table::in, option_table::out,
compilation_target::out, gc_method::out, tags_method::out,
termination_norm::out, termination_norm::out, trace_level::out,
- trace_suppress_items::out, may_be_thread_safe::out,
+ trace_suppress_items::out, ss_trace_level::out, may_be_thread_safe::out,
c_compiler_type::out, csharp_compiler_type::out,
reuse_strategy::out, maybe(il_version_number)::out,
maybe(feedback_info)::out, env_type::out, env_type::out,
list(string)::in, list(string)::out, io::di, io::uo) is det.
check_option_values(!OptionTable, Target, GC_Method, TagsMethod,
- TermNorm, Term2Norm, TraceLevel, TraceSuppress, MaybeThreadSafe,
- C_CompilerType, CSharp_CompilerType,
+ TermNorm, Term2Norm, TraceLevel, TraceSuppress, SSTraceLevel,
+ MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
ReuseStrategy, MaybeILVersion, MaybeFeedbackInfo,
HostEnvType, TargetEnvType, !Errors, !IO) :-
map.lookup(!.OptionTable, target, Target0),
@@ -367,6 +367,17 @@
add_error("Invalid argument to option `--suppress-trace'.", !Errors)
),
+ map.lookup(!.OptionTable, ss_trace_level, SSTrace),
+ (
+ SSTrace = string(SSTraceStr),
+ ss_trace_level(SSTraceStr, SSTraceLevelPrime)
+ ->
+ SSTraceLevel = SSTraceLevelPrime
+ ;
+ SSTraceLevel = none,
+ add_error("Invalid argument to option `--ss-trace'.", !Errors)
+ ),
+
map.lookup(!.OptionTable, maybe_thread_safe_opt, MaybeThreadSafeOption),
(
MaybeThreadSafeOption = string(MaybeThreadSafeString),
@@ -592,20 +603,20 @@
:- pred convert_options_to_globals(option_table::in,
compilation_target::in, gc_method::in, tags_method::in,
termination_norm::in, termination_norm::in, trace_level::in,
- trace_suppress_items::in, may_be_thread_safe::in, c_compiler_type::in,
- csharp_compiler_type::in,
+ trace_suppress_items::in, ss_trace_level::in, may_be_thread_safe::in,
+ c_compiler_type::in, csharp_compiler_type::in,
reuse_strategy::in, maybe(il_version_number)::in, maybe(feedback_info)::in,
env_type::in, env_type::in, list(string)::in, list(string)::out,
globals::out, io::di, io::uo) is det.
convert_options_to_globals(OptionTable0, Target, GC_Method, TagsMethod0,
- TermNorm, Term2Norm, TraceLevel, TraceSuppress, MaybeThreadSafe,
- C_CompilerType, CSharp_CompilerType,
+ TermNorm, Term2Norm, TraceLevel, TraceSuppress, SSTraceLevel,
+ MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
ReuseStrategy, MaybeILVersion, MaybeFeedbackInfo,
HostEnvType, TargetEnvType, !Errors, !:Globals, !IO) :-
globals_init(OptionTable0, Target, GC_Method, TagsMethod0,
- TermNorm, Term2Norm, TraceLevel, TraceSuppress, MaybeThreadSafe,
- C_CompilerType, CSharp_CompilerType,
+ TermNorm, Term2Norm, TraceLevel, TraceSuppress, SSTraceLevel,
+ MaybeThreadSafe, C_CompilerType, CSharp_CompilerType,
ReuseStrategy, MaybeILVersion, MaybeFeedbackInfo,
HostEnvType, TargetEnvType, !:Globals),
@@ -3060,8 +3071,6 @@
[exec_trace - bool(yes), decl_debug - bool(yes)], no, yes).
grade_component_table("debug", comp_trace,
[exec_trace - bool(yes), decl_debug - bool(no)], no, yes).
-grade_component_table("ssdebug", comp_trace,
- [source_to_source_debug - bool(yes)], no, yes).
% Low (target) level debugging components.
grade_component_table("ll_debug", comp_lowlevel,
@@ -3125,7 +3134,6 @@
grade_start_values(pic_reg - bool(no)).
grade_start_values(exec_trace - bool(no)).
grade_start_values(decl_debug - bool(no)).
-grade_start_values(source_to_source_debug - bool(no)).
grade_start_values(extend_stacks_when_needed - bool(no)).
grade_start_values(stack_segments - bool(no)).
grade_start_values(use_regions - bool(no)).
Index: compiler/mercury_compile_middle_passes.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/mercury_compile_middle_passes.m,v
retrieving revision 1.17
diff -u -r1.17 mercury_compile_middle_passes.m
--- compiler/mercury_compile_middle_passes.m 13 Feb 2012 00:11:41 -0000 1.17
+++ compiler/mercury_compile_middle_passes.m 18 Jul 2012 23:50:58 -0000
@@ -859,11 +859,9 @@
maybe_ssdb(Verbose, Stats, !HLDS, !IO) :-
module_info_get_globals(!.HLDS, Globals),
- globals.lookup_bool_option(Globals, source_to_source_debug, SSDB),
globals.lookup_bool_option(Globals, force_disable_ssdebug,
ForceDisableSSDB),
(
- SSDB = yes,
ForceDisableSSDB = no
->
maybe_write_string(Verbose,
Index: compiler/module_imports.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/module_imports.m,v
retrieving revision 1.12
diff -u -r1.12 module_imports.m
--- compiler/module_imports.m 23 May 2011 05:08:08 -0000 1.12
+++ compiler/module_imports.m 18 Jul 2012 23:50:59 -0000
@@ -251,6 +251,7 @@
:- implementation.
+:- import_module libs.trace_params.
:- import_module libs.options.
:- import_module parse_tree.modules. % undesirable dependency
@@ -561,10 +562,12 @@
;
UseRegions = no
),
- globals.lookup_bool_option(Globals, source_to_source_debug, SSDB),
+ globals.get_ss_trace_level(Globals, SSTraceLevel),
globals.lookup_bool_option(Globals, force_disable_ssdebug, DisableSSDB),
(
- SSDB = yes,
+ ( SSTraceLevel = deep
+ ; SSTraceLevel = shallow
+ ),
DisableSSDB = no
->
!:UseDeps = [mercury_ssdb_builtin_module | !.UseDeps]
Index: compiler/options.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/options.m,v
retrieving revision 1.716
diff -u -r1.716 options.m
--- compiler/options.m 8 Jun 2012 15:36:59 -0000 1.716
+++ compiler/options.m 18 Jul 2012 23:50:59 -0000
@@ -234,6 +234,7 @@
; generate_mmc_make_module_dependencies
; assume_gmake
+ ; ss_trace_level
; trace_level
; trace_optimized
; trace_prof
@@ -1209,6 +1210,7 @@
generate_item_version_numbers - bool(no),
generate_mmc_make_module_dependencies - bool(no),
assume_gmake - bool(yes),
+ ss_trace_level - string("none"),
trace_level - string("default"),
trace_optimized - bool(no),
trace_prof - bool(no),
@@ -2102,6 +2104,7 @@
long_option("generate-mmc-make-module-dependencies",
generate_mmc_make_module_dependencies).
long_option("generate-mmc-deps", generate_mmc_make_module_dependencies).
+long_option("ss-trace", ss_trace_level).
long_option("trace", trace_level).
long_option("trace-optimised", trace_optimized).
long_option("trace-optimized", trace_optimized).
@@ -3859,6 +3862,15 @@
"\twhen using Mmake. This is recommended when building a",
"\tlibrary for installation.",
+ "--ssdb",
+ "--ss-debug",
+ "--source-to-source-debug",
+ "\tLink the source to source debugging libraries into the",
+ "\tthe executable.",
+ "--ss-trace {none, shallow, deep}",
+ "\tThe trace level to use for source to source debugging of",
+ "\tthe given module.",
+
% "--trace decl" is not documented, because it is for backwards
% compatibility only. It is now equivalent to `--trace rep'.
% "--trace {minimum, shallow, deep, decl, rep, default}",
Index: compiler/prog_data.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/prog_data.m,v
retrieving revision 1.245
diff -u -r1.245 prog_data.m
--- compiler/prog_data.m 2 Jul 2012 01:16:36 -0000 1.245
+++ compiler/prog_data.m 18 Jul 2012 23:50:59 -0000
@@ -1304,7 +1304,6 @@
:- type trace_grade
---> trace_grade_debug
- ; trace_grade_ssdebug
; trace_grade_prof
; trace_grade_profdeep
; trace_grade_par
@@ -1363,7 +1362,6 @@
% If you update this, you also need to update the corresponding section
% of doc/reference_manual.texi.
parse_trace_grade_name("debug", trace_grade_debug).
-parse_trace_grade_name("ssdebug", trace_grade_ssdebug).
parse_trace_grade_name("prof", trace_grade_prof).
parse_trace_grade_name("profdeep", trace_grade_profdeep).
parse_trace_grade_name("par", trace_grade_par).
Index: compiler/simplify.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/simplify.m,v
retrieving revision 1.282
diff -u -r1.282 simplify.m
--- compiler/simplify.m 2 Jul 2012 01:16:37 -0000 1.282
+++ compiler/simplify.m 18 Jul 2012 23:51:00 -0000
@@ -2292,10 +2292,6 @@
Grade = trace_grade_debug,
globals.lookup_bool_option(Globals, exec_trace, Result)
;
- Grade = trace_grade_ssdebug,
- globals.lookup_bool_option(Globals, source_to_source_debug, Result)
- % XXX Should we take into account force_disable_ssdebug as well?
- ;
Grade = trace_grade_prof,
globals.lookup_bool_option(Globals, profile_calls, ProfCalls),
globals.lookup_bool_option(Globals, profile_time, ProfTime),
Index: compiler/ssdebug.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/ssdebug.m,v
retrieving revision 1.38
diff -u -r1.38 ssdebug.m
--- compiler/ssdebug.m 2 Jul 2012 01:16:37 -0000 1.38
+++ compiler/ssdebug.m 18 Jul 2012 23:51:01 -0000
@@ -201,6 +201,9 @@
:- import_module hlds.passes_aux.
:- import_module hlds.pred_table.
:- import_module hlds.quantification.
+:- import_module libs.
+:- import_module libs.globals.
+:- import_module libs.trace_params.
:- import_module mdbcomp.prim_data.
:- import_module parse_tree.builtin_lib_types.
:- import_module parse_tree.file_names.
@@ -220,9 +223,30 @@
%-----------------------------------------------------------------------------%
ssdebug_transform_module(!ModuleInfo, !IO) :-
- ssdebug_first_pass(!ModuleInfo),
- process_all_nonimported_procs(update_module(ssdebug_process_proc),
- !ModuleInfo).
+ module_info_ss_trace_level(!.ModuleInfo, SSTraceLevel),
+ (
+ SSTraceLevel = none,
+ true
+ ;
+ SSTraceLevel = shallow,
+ % In the shallow trace level we never enter the body of a procedures
+ % so no need to transform the library methods in the body.
+ process_all_nonimported_procs(
+ update_module(ssdebug_process_proc(SSTraceLevel)),
+ !ModuleInfo)
+ ;
+ SSTraceLevel = deep,
+ ssdebug_first_pass(!ModuleInfo),
+ process_all_nonimported_procs(
+ update_module(ssdebug_process_proc(SSTraceLevel)),
+ !ModuleInfo)
+ ).
+
+:- pred module_info_ss_trace_level(module_info::in, ss_trace_level::out) is det.
+
+module_info_ss_trace_level(ModuleInfo, SSTraceLevel) :-
+ module_info_get_globals(ModuleInfo, Globals),
+ globals.get_ss_trace_level(Globals, SSTraceLevel).
%-----------------------------------------------------------------------------%
%
@@ -478,10 +502,31 @@
% The main transformation.
%
-:- pred ssdebug_process_proc(pred_proc_id::in, proc_info::in, proc_info::out,
+:- pred ssdebug_process_proc(ss_trace_level::in,
+ pred_proc_id::in, proc_info::in, proc_info::out,
+ module_info::in, module_info::out) is det.
+
+ssdebug_process_proc(none, proc(_PredId, _ProcId), !ProcInfo, !ModuleInfo).
+ssdebug_process_proc(shallow, proc(PredId, ProcId), !ProcInfo, !ModuleInfo) :-
+ % Only transform the procedures in the interface
+ % XXX We still need to fix the ssdb so that events generated
+ % below the shallow call event aren't seen.
+ module_info_pred_info(!.ModuleInfo, PredId, PredInfo),
+ ( pred_info_is_exported(PredInfo) ->
+ ssdebug_process_proc_2(proc(PredId, ProcId), !ProcInfo, !ModuleInfo)
+ ;
+ true
+ ).
+ssdebug_process_proc(deep, proc(PredId, ProcId), !ProcInfo, !ModuleInfo) :-
+ % Transfrom all procedures
+ ssdebug_process_proc_2(proc(PredId, ProcId), !ProcInfo, !ModuleInfo).
+
+
+:- pred ssdebug_process_proc_2(
+ pred_proc_id::in, proc_info::in, proc_info::out,
module_info::in, module_info::out) is det.
-ssdebug_process_proc(proc(PredId, ProcId), !ProcInfo, !ModuleInfo) :-
+ssdebug_process_proc_2(proc(PredId, ProcId), !ProcInfo, !ModuleInfo) :-
proc_info_get_argmodes(!.ProcInfo, ArgModes),
( check_arguments_modes(!.ModuleInfo, ArgModes) ->
% We have different transformations for procedures of different
Index: compiler/trace_params.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/trace_params.m,v
retrieving revision 1.45
diff -u -r1.45 trace_params.m
--- compiler/trace_params.m 11 Jun 2012 03:13:22 -0000 1.45
+++ compiler/trace_params.m 18 Jul 2012 23:51:01 -0000
@@ -124,6 +124,16 @@
:- func encode_suppressed_events(trace_suppress_items) = int.
%-----------------------------------------------------------------------------%
+
+:- type ss_trace_level
+ ---> none % No tracing of this module
+ ; shallow % Only trace the interface of this module
+ ; deep % Trace all procedures of this module
+ .
+
+:- pred ss_trace_level(string::in, ss_trace_level::out) is semidet.
+
+%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%
:- implementation.
@@ -655,3 +665,12 @@
port_number(port_disj_later) = 13.
port_number(port_switch) = 14.
port_number(port_user) = 15.
+
+%-----------------------------------------------------------------------------%
+
+ss_trace_level("none", none).
+ss_trace_level("shallow", shallow).
+ss_trace_level("deep", deep).
+
+%-----------------------------------------------------------------------------%
+%-----------------------------------------------------------------------------%
Index: doc/reference_manual.texi
===================================================================
RCS file: /home/mercury1/repository/mercury/doc/reference_manual.texi,v
retrieving revision 1.473
diff -u -r1.473 reference_manual.texi
--- doc/reference_manual.texi 11 Jul 2012 04:01:00 -0000 1.473
+++ doc/reference_manual.texi 18 Jul 2012 23:51:01 -0000
@@ -9145,8 +9145,6 @@
@table @asis
@item @samp{debug}
True if the module is compiled with execution tracing enabled.
- at item @samp{ssdebug}
-True if the module is compiled with source-to-source debugging enabled.
@item @samp{prof}
True if the module is compiled with non-deep profiling enabled.
@item @samp{profdeep}
--------------------------------------------------------------------------
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