From 36b7bd4ea062dbed30201a8c82c424f1036f7ef5 Mon Sep 17 00:00:00 2001 From: Peter Wang Date: Fri, 6 Jun 2008 02:18:07 +0000 Subject: [PATCH] Store call and answer patterns as terms in `.analysis' (and related) files and Branches: main Store call and answer patterns as terms in `.analysis' (and related) files and not strings. It's easier to convert complex patterns to/from terms than strings. Also change the module names and function-ids while we're at it. compiler/analysis.m: Replace the `to_string' typeclass with a `to_term' typeclass. Make call and answer patterns convert to/from terms instead of strings. compiler/analysis.file.m: Read/write terms for call and answer patterns. Read/write module names and function-ids with more natural syntax than the term representations of internal data structures. Bump the analysis file version number. Move some code around. Use promise_equivalent_solutions goals instead of promise_equivalent_solution_io. compiler/exception_analysis.m: compiler/structure_reuse.analysis.m: compiler/structure_sharing.analysis.m: compiler/tabling_analysis.m: compiler/trailing_analysis.m: compiler/unused_args.m: Conform to `to_term' typeclass interface. tests/analysis/ctgc/reuse_runtest.sh: tests/analysis/excp/excp_runtest.sh: tests/analysis/sharing/sharing_runtest.sh: tests/analysis/unused_args/unused_args_runtest.sh: Update test scripts for changed file formats. compiler/mercury_compile.m: Print verbose messages and report stats when reading in files for intermodule analysis. --- compiler/analysis.file.m | 291 +++++++++++------- compiler/analysis.m | 23 +- compiler/exception_analysis.m | 24 +- compiler/mercury_compile.m | 27 +- compiler/structure_reuse.analysis.m | 76 +++-- compiler/structure_sharing.analysis.m | 69 +++-- compiler/tabling_analysis.m | 30 +- compiler/trailing_analysis.m | 24 +- compiler/unused_args.m | 40 +-- tests/analysis/ctgc/reuse_runtest.sh | 64 ++-- tests/analysis/excp/excp_runtest.sh | 12 +- tests/analysis/sharing/sharing_runtest.sh | 24 +- .../unused_args/unused_args_runtest.sh | 48 +-- 13 files changed, 410 insertions(+), 342 deletions(-) diff --git a/compiler/analysis.file.m b/compiler/analysis.file.m index 1ab20fb26..33fd6236a 100644 --- a/compiler/analysis.file.m +++ b/compiler/analysis.file.m @@ -96,10 +96,6 @@ :- implementation. -:- import_module libs.compiler_util. -:- import_module parse_tree. % XXX unwanted dependency -:- import_module parse_tree.modules. % XXX unwanted dependency - :- import_module bool. :- import_module char. :- import_module exception. @@ -108,6 +104,12 @@ :- import_module term_io. :- import_module varset. +:- import_module libs.compiler_util. +:- import_module parse_tree. +:- import_module parse_tree.modules. % XXX unwanted dependency +:- import_module parse_tree.prog_io. +:- import_module parse_tree.prog_out. + %-----------------------------------------------------------------------------% % The format of an analysis result file is: @@ -115,6 +117,9 @@ % version_number. % analysis_name(analysis_version, func_id, call_pattern, answer_pattern, % result_status). +% +% where func_id = p(name, arity, mode_id). +% or func_id = f(name, arity, mode_id). % An .analysis_status file contains a single line, which is one of: % @@ -139,7 +144,7 @@ :- func version_number = int. -version_number = 5. +version_number = 6. :- func analysis_registry_suffix = string. @@ -159,6 +164,19 @@ request_suffix = ".request". %-----------------------------------------------------------------------------% +:- pred analysis_status_to_string(analysis_status, string). +:- mode analysis_status_to_string(in, out) is det. +:- mode analysis_status_to_string(out, in) is semidet. + +analysis_status_to_string(invalid, "invalid"). +analysis_status_to_string(suboptimal, "suboptimal"). +analysis_status_to_string(optimal, "optimal"). + +%-----------------------------------------------------------------------------% +% +% Reading +% + read_module_overall_status(Compiler, ModuleName, ModuleStatus, !IO) :- module_name_to_read_file_name(Compiler, ModuleName, analysis_registry_status_suffix, MaybeFileName, !IO), @@ -226,29 +244,6 @@ read_module_overall_status_2(FileName, ModuleStatus, !IO) :- "read_module_overall_status_2: " ++ io.error_message(IOError)) ). -write_module_overall_status(Info, ModuleName, Status, !IO) :- - module_name_to_write_file_name(Info ^ compiler, ModuleName, - analysis_registry_status_suffix, FileName, !IO), - io.open_output(FileName, OpenResult, !IO), - ( - OpenResult = ok(Stream), - ( - Status = optimal, - io.write_string(Stream, "optimal.\n", !IO) - ; - Status = suboptimal, - io.write_string(Stream, "suboptimal.\n", !IO) - ; - Status = invalid, - io.write_string(Stream, "invalid.\n", !IO) - ), - io.close_output(Stream, !IO) - ; - OpenResult = error(IOError), - unexpected(this_file, - "write_module_overall_status: " ++ io.error_message(IOError)) - ). - %-----------------------------------------------------------------------------% read_module_analysis_results(Info, ModuleName, ModuleResults, !IO) :- @@ -285,25 +280,18 @@ read_module_analysis_results_2(Compiler, AnalysisFileName, ModuleResults, io.set_input_stream(Stream, OldStream, !IO), check_analysis_file_version_number(!IO), - promise_only_solution_io( - (pred(Results2::out, !.IO::di, !:IO::uo) is cc_multi :- - try_io((pred(Results1::out, !.IO::di, !:IO::uo) is det :- - read_analysis_file_2(parse_result_entry(Compiler), - ModuleResults0, Results1, !IO) - ), Results2, !IO) - ), Results, !IO), + promise_equivalent_solutions [Results, !:IO] ( + try_io(read_analysis_file_2(parse_result_entry(Compiler), + ModuleResults0), Results, !IO) + ), + io.set_input_stream(OldStream, _, !IO), + io.close_input(Stream, !IO), ( Results = succeeded(ModuleResults) - ; - Results = failed, - ModuleResults = ModuleResults0 ; Results = exception(_), - % XXX Report error. - ModuleResults = ModuleResults0 - ), - io.set_input_stream(OldStream, _, !IO), - io.close_input(Stream, !IO) + rethrow(Results) + ) ; OpenResult = error(_), debug_msg((pred(!.IO::di, !:IO::uo) is det :- @@ -314,14 +302,6 @@ read_module_analysis_results_2(Compiler, AnalysisFileName, ModuleResults, ModuleResults = ModuleResults0 ). -:- pred analysis_status_to_string(analysis_status, string). -:- mode analysis_status_to_string(in, out) is det. -:- mode analysis_status_to_string(out, in) is semidet. - -analysis_status_to_string(invalid, "invalid"). -analysis_status_to_string(suboptimal, "suboptimal"). -analysis_status_to_string(optimal, "optimal"). - :- pred parse_result_entry(Compiler::in) `with_type` parse_entry(module_analysis_map(some_analysis_result)) `with_inst` parse_entry <= compiler(Compiler). @@ -331,17 +311,13 @@ parse_result_entry(Compiler, Term, Results0, Results) :- Term = term.functor(term.atom(AnalysisName), [VersionNumberTerm, FuncIdTerm, CallPatternTerm, AnswerPatternTerm, StatusTerm], _), - term_to_type(FuncIdTerm, FuncId), - CallPatternTerm = term.functor( - term.string(CallPatternString), [], _), - AnswerPatternTerm = term.functor( - term.string(AnswerPatternString), [], _), - StatusTerm = term.functor(term.string(StatusString), [], _), + StatusTerm = term.functor(term.atom(StatusString), [], _), analysis_type(_ : unit(Call), _ : unit(Answer)) = analyses(Compiler, AnalysisName), - CallPattern = from_string(CallPatternString) : Call, - AnswerPattern = from_string(AnswerPatternString) : Answer, + parse_func_id(FuncIdTerm, FuncId), + from_term(CallPatternTerm, CallPattern : Call), + from_term(AnswerPatternTerm, AnswerPattern : Answer), analysis_status_to_string(Status, StatusString) -> ( @@ -351,7 +327,7 @@ parse_result_entry(Compiler, Term, Results0, Results) :- -> Result = 'new some_analysis_result'(CallPattern, AnswerPattern, Status), - ( AnalysisResults0 = map.search(Results0, AnalysisName) -> + ( map.search(Results0, AnalysisName, AnalysisResults0) -> AnalysisResults1 = AnalysisResults0 ; AnalysisResults1 = map.init @@ -388,13 +364,12 @@ parse_request_entry(Compiler, Term, Requests0, Requests) :- Term = term.functor(atom("->"), [CallerModuleTerm, RHS], _), RHS = term.functor(atom(AnalysisName), [VersionNumberTerm, FuncIdTerm, CallPatternTerm], _), - term_to_type(CallerModuleTerm, CallerModule), - term_to_type(FuncIdTerm, FuncId), - CallPatternTerm = term.functor( - term.string(CallPatternString), [], _), analysis_type(_ : unit(Call), _ : unit(Answer)) = analyses(Compiler, AnalysisName), - CallPattern = from_string(CallPatternString) : Call + + parse_module_name(CallerModuleTerm, CallerModule), + parse_func_id(FuncIdTerm, FuncId), + from_term(CallPatternTerm, CallPattern : Call) -> ( VersionNumber = analysis_version_number(_ : Call, _ : Answer), @@ -402,7 +377,7 @@ parse_request_entry(Compiler, Term, Requests0, Requests) :- term.integer(VersionNumber), [], _) -> Result = 'new analysis_request'(CallPattern, CallerModule), - ( AnalysisRequests0 = map.search(Requests0, AnalysisName) -> + ( map.search(Requests0, AnalysisName, AnalysisRequests0) -> AnalysisRequests1 = AnalysisRequests0 ; AnalysisRequests1 = map.init @@ -437,14 +412,14 @@ read_module_imdg(Info, ModuleName, ModuleEntries, !IO) :- parse_imdg_arc(Compiler, Term, Arcs0, Arcs) :- ( Term = term.functor(atom("->"), [DependentModuleTerm, ResultTerm], _), - term_to_type(DependentModuleTerm, DependentModule), ResultTerm = functor(atom(AnalysisName), [VersionNumberTerm, FuncIdTerm, CallPatternTerm], _), - term_to_type(FuncIdTerm, FuncId), - CallPatternTerm = functor(string(CallPatternString), [], _), analysis_type(_ : unit(Call), _ : unit(Answer)) = analyses(Compiler, AnalysisName), - CallPattern = from_string(CallPatternString) : Call + + parse_module_name(DependentModuleTerm, DependentModule), + parse_func_id(FuncIdTerm, FuncId), + from_term(CallPatternTerm, CallPattern : Call) -> ( VersionNumber = analysis_version_number(_ : Call, _ : Answer), @@ -452,7 +427,7 @@ parse_imdg_arc(Compiler, Term, Arcs0, Arcs) :- term.integer(VersionNumber), [], _) -> Arc = 'new imdg_arc'(CallPattern, DependentModule), - ( AnalysisArcs0 = map.search(Arcs0, AnalysisName) -> + ( map.search(Arcs0, AnalysisName, AnalysisArcs0) -> AnalysisArcs1 = AnalysisArcs0 ; AnalysisArcs1 = map.init @@ -477,6 +452,30 @@ parse_imdg_arc(Compiler, Term, Arcs0, Arcs) :- %-----------------------------------------------------------------------------% +:- pred parse_func_id(term::in, func_id::out) is semidet. + +parse_func_id(Term, FuncId) :- + Term = functor(atom(PF), [NameTerm, ArityTerm, ProcTerm], _), + ( + PF = "p", + PredOrFunc = pf_predicate + ; + PF = "f", + PredOrFunc = pf_function + ), + NameTerm = functor(atom(Name), [], _), + ArityTerm = functor(integer(Arity), [], _), + ProcTerm = functor(integer(ProcInt), [], _), + proc_id_to_int(ProcId, ProcInt), + FuncId = func_id(PredOrFunc, Name, Arity, ProcId). + +:- pred parse_module_name(term::in, module_name::out) is semidet. + +parse_module_name(Term, ModuleName) :- + sym_name_and_args(Term, ModuleName, []). + +%-----------------------------------------------------------------------------% + :- type parse_entry(T) == pred(term, T, T). :- inst parse_entry == (pred(in, in, out) is det). @@ -521,25 +520,22 @@ read_analysis_file(AnalysisFileName, ParseEntry, ModuleResults0, ModuleResults, ), !IO), io.set_input_stream(Stream, OldStream, !IO), - promise_only_solution_io( - (pred(R::out, di, uo) is cc_multi --> - try_io((pred(Results1::out, di, uo) is det --> - check_analysis_file_version_number, - read_analysis_file_2(ParseEntry, ModuleResults0, Results1) - ), R) - ), Result, !IO), + promise_equivalent_solutions [Result, !:IO] ( + try_io( + (pred(Results1::out, !.IO::di, !:IO::uo) is det :- + check_analysis_file_version_number(!IO), + read_analysis_file_2(ParseEntry, ModuleResults0, Results1, + !IO) + ), Result, !IO) + ), + io.set_input_stream(OldStream, _, !IO), + io.close_input(Stream, !IO), ( Result = succeeded(ModuleResults) - ; - Result = failed, - ModuleResults = ModuleResults0 ; Result = exception(_), - % XXX Report error. - ModuleResults = ModuleResults0 - ), - io.set_input_stream(OldStream, _, !IO), - io.close_input(Stream, !IO) + rethrow(Result) + ) ; OpenResult = error(_), debug_msg((pred(!.IO::di, !:IO::uo) is det :- @@ -581,6 +577,33 @@ read_analysis_file_2(ParseEntry, Results0, Results, !IO) :- ). %-----------------------------------------------------------------------------% +% +% Writing +% + +write_module_overall_status(Info, ModuleName, Status, !IO) :- + module_name_to_write_file_name(Info ^ compiler, ModuleName, + analysis_registry_status_suffix, FileName, !IO), + io.open_output(FileName, OpenResult, !IO), + ( + OpenResult = ok(Stream), + ( + Status = optimal, + io.write_string(Stream, "optimal.\n", !IO) + ; + Status = suboptimal, + io.write_string(Stream, "suboptimal.\n", !IO) + ; + Status = invalid, + io.write_string(Stream, "invalid.\n", !IO) + ), + io.close_output(Stream, !IO) + ; + OpenResult = error(IOError), + unexpected(this_file, + "write_module_overall_status: " ++ io.error_message(IOError)) + ). + %-----------------------------------------------------------------------------% write_module_analysis_results(Info, ModuleName, ModuleResults, !IO) :- @@ -602,14 +625,19 @@ write_result_entry(AnalysisName, FuncId, Result, !IO) :- Result = some_analysis_result(Call, Answer, Status), VersionNumber = analysis_version_number(Call, Answer), analysis_status_to_string(Status, StatusString), - term_io.write_term_nl(varset.init : varset, - functor(atom(AnalysisName), [ - functor(integer(VersionNumber), [], context_init), - type_to_term(FuncId), - functor(string(to_string(Call)), [], context_init), - functor(string(to_string(Answer)), [], context_init), - functor(string(StatusString), [], context_init) - ], context_init), !IO). + + io.write_string(AnalysisName, !IO), + io.write_char('(', !IO), + io.write_int(VersionNumber, !IO), + io.write_string(", ", !IO), + write_func_id(FuncId, !IO), + io.write_string(", ", !IO), + term_io.write_term(varset.init, to_term(Call), !IO), + io.write_string(", ", !IO), + term_io.write_term(varset.init, to_term(Answer), !IO), + io.write_string(", ", !IO), + io.write_string(StatusString, !IO), + io.write_string(").\n", !IO). %-----------------------------------------------------------------------------% @@ -679,17 +707,17 @@ write_request_entry(Compiler, AnalysisName, FuncId, Request, !IO) :- unexpected(this_file, "write_request_entry: unknown analysis type") ), - term_io.write_term_nl(varset.init : varset, - functor(atom("->"), [ - type_to_term(CallerModule), - CallTerm - ], context_init), !IO), - CallTerm = - functor(atom(AnalysisName), [ - functor(integer(VersionNumber), [], context_init), - type_to_term(FuncId), - functor(string(to_string(Call)), [], context_init) - ], context_init). + + write_module_name(CallerModule, !IO), + io.write_string(" -> ", !IO), + io.write_string(AnalysisName, !IO), + io.write_string("(", !IO), + io.write_int(VersionNumber, !IO), + io.write_string(", ", !IO), + write_func_id(FuncId, !IO), + io.write_string(", ", !IO), + term_io.write_term(varset.init, to_term(Call), !IO), + io.write_string(").\n", !IO). %-----------------------------------------------------------------------------% @@ -702,27 +730,51 @@ write_module_imdg(Info, ModuleName, ModuleEntries, !IO) :- `with_type` write_entry(imdg_arc) `with_inst` write_entry <= compiler(Compiler). -write_imdg_arc(Compiler, AnalysisName, FuncId, imdg_arc(Call, DependentModule), - !IO) :- +write_imdg_arc(Compiler, AnalysisName, FuncId, Arc, !IO) :- + Arc = imdg_arc(Call, DependentModule), ( analysis_type(_ : unit(Call), _ : unit(Answer)) = analyses(Compiler, AnalysisName) -> VersionNumber = analysis_version_number(_ : Call, _ : Answer) ; - unexpected(this_file, - "write_imdg_arc: unknown analysis type") + unexpected(this_file, "write_imdg_arc: unknown analysis type") ), - term_io.write_term_nl(varset.init : varset, - functor(atom("->"), [ - type_to_term(DependentModule), - ResultTerm - ], context_init), !IO), - ResultTerm = functor(atom(AnalysisName), [ - functor(integer(VersionNumber), [], context_init), - type_to_term(FuncId), - functor(string(to_string(Call)), [], context_init) - ], context_init). + + write_module_name(DependentModule, !IO), + io.write_string(" -> ", !IO), + io.write_string(AnalysisName, !IO), + io.write_char('(', !IO), + io.write_int(VersionNumber, !IO), + io.write_string(", ", !IO), + write_func_id(FuncId, !IO), + io.write_string(", ", !IO), + term_io.write_term(varset.init, to_term(Call), !IO), + io.write_string(").\n", !IO). + +%-----------------------------------------------------------------------------% + +:- pred write_func_id(func_id::in, io::di, io::uo) is det. + +write_func_id(func_id(PredOrFunc, Name, Arity, ProcId), !IO) :- + ( + PredOrFunc = pf_predicate, + io.write_string("p(", !IO) + ; + PredOrFunc = pf_function, + io.write_string("f(", !IO) + ), + term_io.quote_atom(Name, !IO), + io.write_string(", ", !IO), + io.write_int(Arity, !IO), + io.write_string(", ", !IO), + io.write_int(proc_id_to_int(ProcId), !IO), + io.write_char(')', !IO). + +:- pred write_module_name(module_name::in, io::di, io::uo) is det. + +write_module_name(ModuleName, !IO) :- + write_sym_name(ModuleName, !IO). %-----------------------------------------------------------------------------% @@ -789,6 +841,7 @@ write_analysis_file_4(WriteEntry, AnalysisName, FuncId, FuncResultList, !IO) :- ), FuncResultListSorted, !IO). %-----------------------------------------------------------------------------% +%-----------------------------------------------------------------------------% empty_request_file(Info, ModuleName, !IO) :- module_name_to_write_file_name(Info ^ compiler, ModuleName, request_suffix, diff --git a/compiler/analysis.m b/compiler/analysis.m index 8ceb725bf..c26c246e3 100644 --- a/compiler/analysis.m +++ b/compiler/analysis.m @@ -33,6 +33,7 @@ :- import_module list. :- import_module maybe. :- import_module set. +:- import_module term. :- import_module unit. %-----------------------------------------------------------------------------% @@ -107,12 +108,12 @@ :- typeclass call_pattern(FuncInfo, Call) <= (partial_order(FuncInfo, Call), - to_string(Call)) + to_term(Call)) where []. :- typeclass answer_pattern(FuncInfo, Answer) <= (partial_order(FuncInfo, Answer), - to_string(Answer)) + to_term(Answer)) where []. :- type analysis_result(Call, Answer) @@ -130,9 +131,9 @@ pred equivalent(FuncInfo::in, T::in, T::in) is semidet ]. -:- typeclass to_string(S) where [ - func to_string(S) = string, - func from_string(string) = S is semidet +:- typeclass to_term(S) where [ + func to_term(S) = term, + pred from_term(term::in, S::out) is semidet ]. :- type no_func_info @@ -146,7 +147,7 @@ :- instance call_pattern(no_func_info, any_call). :- instance partial_order(no_func_info, any_call). -:- instance to_string(any_call). +:- instance to_term(any_call). % The status of a module or a specific analysis result. % @@ -442,9 +443,13 @@ semidet_succeed ) ]. -:- instance to_string(any_call) where [ - to_string(any_call) = "", - from_string("") = any_call +:- instance to_term(any_call) where [ + ( to_term(any_call) = Term :- + Term = term.functor(atom("any"), [], context_init) + ), + ( from_term(Term, any_call) :- + Term = term.functor(atom("any"), [], _) + ) ]. %-----------------------------------------------------------------------------% diff --git a/compiler/exception_analysis.m b/compiler/exception_analysis.m index 91b9aca33..284ee2c18 100644 --- a/compiler/exception_analysis.m +++ b/compiler/exception_analysis.m @@ -120,7 +120,7 @@ :- instance analysis(no_func_info, any_call, exception_analysis_answer). :- instance partial_order(no_func_info, exception_analysis_answer). :- instance answer_pattern(no_func_info, exception_analysis_answer). -:- instance to_string(exception_analysis_answer). +:- instance to_term(exception_analysis_answer). %----------------------------------------------------------------------------% %----------------------------------------------------------------------------% @@ -1017,20 +1017,22 @@ exception_status_more_precise_than(throw_conditional, may_throw(_)). exception_status_more_precise_than(may_throw(type_exception), may_throw(user_exception)). -:- instance to_string(exception_analysis_answer) where [ - func(to_string/1) is answer_to_string, - func(from_string/1) is answer_from_string +:- instance to_term(exception_analysis_answer) where [ + func(to_term/1) is answer_to_term, + pred(from_term/2) is answer_from_term ]. -:- func answer_to_string(exception_analysis_answer) = string. +:- func answer_to_term(exception_analysis_answer) = term. -answer_to_string(Answer) = String :- +answer_to_term(Answer) = Term :- Answer = exception_analysis_answer(Status), - exception_status_to_string(Status, String). + exception_status_to_string(Status, String), + Term = term.functor(atom(String), [], context_init). -:- func answer_from_string(string) = exception_analysis_answer is semidet. +:- pred answer_from_term(term::in, exception_analysis_answer::out) is semidet. -answer_from_string(String) = exception_analysis_answer(Status) :- +answer_from_term(Term, exception_analysis_answer(Status)) :- + Term = term.functor(atom(String), [], _), exception_status_to_string(Status, String). :- pred exception_status_to_string(exception_status, string). @@ -1040,9 +1042,9 @@ answer_from_string(String) = exception_analysis_answer(Status) :- exception_status_to_string(will_not_throw, "will_not_throw"). exception_status_to_string(throw_conditional, "conditional"). exception_status_to_string(may_throw(type_exception), - "may_throw(type_exception)"). + "may_throw_type_exception"). exception_status_to_string(may_throw(user_exception), - "may_throw(user_exception)"). + "may_throw_user_exception"). %----------------------------------------------------------------------------% % diff --git a/compiler/mercury_compile.m b/compiler/mercury_compile.m index 2eb5703b2..3cbf2c447 100644 --- a/compiler/mercury_compile.m +++ b/compiler/mercury_compile.m @@ -1521,14 +1521,15 @@ mercury_compile(Module, NestedSubModules, FindTimestampFiles, output_trans_opt_file(HLDS21, !DumpInfo, !IO), FactTableObjFiles = [] ; MakeAnalysisRegistry = yes -> - prepare_intermodule_analysis(HLDS21, HLDS22, !IO), + prepare_intermodule_analysis(Verbose, Stats, HLDS21, HLDS22, !IO), output_analysis_file(HLDS22, !DumpInfo, !IO), FactTableObjFiles = [] ; MakeXmlDocumentation = yes -> xml_documentation(HLDS21, !IO), FactTableObjFiles = [] ; - maybe_prepare_intermodule_analysis(HLDS21, HLDS22, !IO), + maybe_prepare_intermodule_analysis(Verbose, Stats, HLDS21, HLDS22, + !IO), mercury_compile_after_front_end(NestedSubModules, FindTimestampFiles, MaybeTimestamps, ModuleName, HLDS22, FactTableObjFiles, !DumpInfo, !IO) @@ -1545,22 +1546,25 @@ mercury_compile(Module, NestedSubModules, FindTimestampFiles, FactTableObjFiles = [] ). -:- pred maybe_prepare_intermodule_analysis(module_info::in, module_info::out, - io::di, io::uo) is det. +:- pred maybe_prepare_intermodule_analysis(bool::in, bool::in, + module_info::in, module_info::out, io::di, io::uo) is det. -maybe_prepare_intermodule_analysis(!HLDS, !IO) :- +maybe_prepare_intermodule_analysis(Verbose, Stats, !HLDS, !IO) :- globals.io_lookup_bool_option(intermodule_analysis, IntermodAnalysis, !IO), ( IntermodAnalysis = yes, - prepare_intermodule_analysis(!HLDS, !IO) + prepare_intermodule_analysis(Verbose, Stats, !HLDS, !IO) ; IntermodAnalysis = no ). -:- pred prepare_intermodule_analysis(module_info::in, module_info::out, - io::di, io::uo) is det. +:- pred prepare_intermodule_analysis(bool::in, bool::in, + module_info::in, module_info::out, io::di, io::uo) is det. + +prepare_intermodule_analysis(Verbose, Stats, !HLDS, !IO) :- + maybe_write_string(Verbose, "% Preparing for intermodule analysis...\n", + !IO), -prepare_intermodule_analysis(!HLDS, !IO) :- module_info_get_all_deps(!.HLDS, ModuleNames), globals.io_lookup_accumulating_option(local_module_id, LocalModulesList, @@ -1571,7 +1575,10 @@ prepare_intermodule_analysis(!HLDS, !IO) :- module_info_get_analysis_info(!.HLDS, AnalysisInfo0), analysis.prepare_intermodule_analysis(ModuleNames, LocalModuleNames, AnalysisInfo0, AnalysisInfo, !IO), - module_info_set_analysis_info(AnalysisInfo, !HLDS). + module_info_set_analysis_info(AnalysisInfo, !HLDS), + + maybe_write_string(Verbose, "% done.\n", !IO), + maybe_report_stats(Stats, !IO). :- pred mercury_compile_after_front_end(list(module_name)::in, find_timestamp_file_names::in(find_timestamp_file_names), diff --git a/compiler/structure_reuse.analysis.m b/compiler/structure_reuse.analysis.m index a30fb1bf8..a69bf886e 100644 --- a/compiler/structure_reuse.analysis.m +++ b/compiler/structure_reuse.analysis.m @@ -81,11 +81,11 @@ :- instance call_pattern(structure_reuse_func_info, structure_reuse_call). :- instance partial_order(structure_reuse_func_info, structure_reuse_call). -:- instance to_string(structure_reuse_call). +:- instance to_term(structure_reuse_call). :- instance answer_pattern(structure_reuse_func_info, structure_reuse_answer). :- instance partial_order(structure_reuse_func_info, structure_reuse_answer). -:- instance to_string(structure_reuse_answer). +:- instance to_term(structure_reuse_answer). %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% @@ -122,8 +122,8 @@ :- import_module map. :- import_module maybe. :- import_module set. -:- import_module string. :- import_module svmap. +:- import_module term. %-----------------------------------------------------------------------------% @@ -796,14 +796,14 @@ analysis_name = "structure_reuse". equivalent(_, Call, Call) ]. -:- instance to_string(structure_reuse_call) where [ - ( to_string(structure_reuse_call(List)) = String :- - Strs = list.map(string.from_int, List), - String = string.join_list(" ", Strs) +:- instance to_term(structure_reuse_call) where [ + ( to_term(Call) = Term :- + Call = structure_reuse_call(NoClobbers), + type_to_term(NoClobbers, Term) ), - ( from_string(String) = structure_reuse_call(List) :- - Strs = string.words(String), - List = list.map(string.det_to_int, Strs) + ( from_term(Term, Call) :- + term_to_type(Term, NoClobbers), + Call = structure_reuse_call(NoClobbers) ) ]. @@ -852,52 +852,48 @@ analysis_name = "structure_reuse". ) ]. -:- instance to_string(structure_reuse_answer) where [ - func(to_string/1) is reuse_answer_to_string, - func(from_string/1) is reuse_answer_from_string +:- instance to_term(structure_reuse_answer) where [ + func(to_term/1) is reuse_answer_to_term, + pred(from_term/2) is reuse_answer_from_term ]. -:- func reuse_answer_to_string(structure_reuse_answer) = string. +:- func reuse_answer_to_term(structure_reuse_answer) = term. -reuse_answer_to_string(Answer) = String :- +reuse_answer_to_term(Answer) = Term :- ( Answer = structure_reuse_answer_no_reuse, - String = "no_reuse" + Term = term.functor(atom("no_reuse"), [], term.context_init) ; Answer = structure_reuse_answer_unconditional, - String = "uncond" + Term = term.functor(atom("uncond"), [], term.context_init) ; Answer = structure_reuse_answer_conditional(HeadVars, Types, ReuseAs), ReuseDomain = to_structure_reuse_domain(ReuseAs), - String = string({HeadVars, Types, ReuseDomain}) + type_to_term(HeadVars, HeadVarsTerm), + type_to_term(Types, TypesTerm), + type_to_term(ReuseDomain, ReuseDomainTerm), + Term = term.functor(atom("cond"), + [HeadVarsTerm, TypesTerm, ReuseDomainTerm], term.context_init) ). -:- func reuse_answer_from_string(string::in) = - (structure_reuse_answer::out) is det. +:- pred reuse_answer_from_term(term::in, structure_reuse_answer::out) + is semidet. -reuse_answer_from_string(String) = Answer :- - ( String = "no_reuse" -> +reuse_answer_from_term(Term, Answer) :- + ( + Term = functor(atom("no_reuse"), [], _), Answer = structure_reuse_answer_no_reuse - ; String = "uncond" -> + ; + Term = functor(atom("uncond"), [], _), Answer = structure_reuse_answer_unconditional ; - % XXX this is ugly. Later we should move to writing call and answer - % patterns in analysis files as terms rather than strings which will - % clean this up. - StringStop = String ++ ".", - io.read_from_string("", StringStop, string.length(StringStop), Res, - posn(0, 0, 0), _Posn), - ( - Res = ok({HeadVars, Types, ReuseDomain}), - ReuseAs = from_structure_reuse_domain(ReuseDomain), - Answer = structure_reuse_answer_conditional(HeadVars, Types, - ReuseAs) - ; - ( Res = eof - ; Res = error(_, _) - ), - unexpected(this_file, "reuse_answer_from_string: " ++ String) - ) + Term = functor(atom("cond"), + [HeadVarsTerm, TypesTerm, ReuseDomainTerm], _), + term_to_type(HeadVarsTerm, HeadVars), + term_to_type(TypesTerm, Types), + term_to_type(ReuseDomainTerm, ReuseDomain), + ReuseAs = from_structure_reuse_domain(ReuseDomain), + Answer = structure_reuse_answer_conditional(HeadVars, Types, ReuseAs) ). %-----------------------------------------------------------------------------% diff --git a/compiler/structure_sharing.analysis.m b/compiler/structure_sharing.analysis.m index 7c695e022..560103ccb 100644 --- a/compiler/structure_sharing.analysis.m +++ b/compiler/structure_sharing.analysis.m @@ -52,13 +52,13 @@ :- instance call_pattern(structure_sharing_func_info, structure_sharing_call). :- instance partial_order(structure_sharing_func_info, structure_sharing_call). -:- instance to_string(structure_sharing_call). +:- instance to_term(structure_sharing_call). :- instance answer_pattern(structure_sharing_func_info, structure_sharing_answer). :- instance partial_order(structure_sharing_func_info, structure_sharing_answer). -:- instance to_string(structure_sharing_answer). +:- instance to_term(structure_sharing_answer). %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% @@ -994,9 +994,13 @@ analysis_name = "structure_sharing". equivalent(_, Call, Call) ]. -:- instance to_string(structure_sharing_call) where [ - to_string(structure_sharing_call) = "", - from_string("") = structure_sharing_call +:- instance to_term(structure_sharing_call) where [ + ( to_term(structure_sharing_call) = Term :- + Term = term.functor(atom("any"), [], context_init) + ), + ( from_term(Term, structure_sharing_call) :- + Term = term.functor(atom("any"), [], _) + ) ]. :- instance answer_pattern(structure_sharing_func_info, @@ -1050,51 +1054,48 @@ structure_sharing_answer_to_sharing_as(Answer) = SharingAs :- Answer = structure_sharing_answer_real(_, _, SharingAs) ). -:- instance to_string(structure_sharing_answer) where [ - func(to_string/1) is sharing_answer_to_string, - func(from_string/1) is sharing_answer_from_string +:- instance to_term(structure_sharing_answer) where [ + func(to_term/1) is sharing_answer_to_term, + pred(from_term/2) is sharing_answer_from_term ]. -:- func sharing_answer_to_string(structure_sharing_answer) = string. +:- func sharing_answer_to_term(structure_sharing_answer) = term. -sharing_answer_to_string(Answer) = String :- +sharing_answer_to_term(Answer) = Term :- ( Answer = structure_sharing_answer_bottom, - String = "b" + Term = term.functor(atom("b"), [], context_init) ; Answer = structure_sharing_answer_top, - String = "t" + Term = term.functor(atom("t"), [], context_init) ; Answer = structure_sharing_answer_real(HeadVars, Types, SharingAs), SharingDomain = to_structure_sharing_domain(SharingAs), - String = string({HeadVars, Types, SharingDomain}) + type_to_term(HeadVars, HeadVarsTerm), + type_to_term(Types, TypesTerm), + type_to_term(SharingDomain, SharingDomainTerm), + Term = term.functor(atom("sharing"), + [HeadVarsTerm, TypesTerm, SharingDomainTerm], context_init) ). -:- func sharing_answer_from_string(string::in) = - (structure_sharing_answer::out) is det. +:- pred sharing_answer_from_term(term::in, structure_sharing_answer::out) + is semidet. -sharing_answer_from_string(String) = Answer :- - ( String = "b" -> +sharing_answer_from_term(Term, Answer) :- + ( + Term = term.functor(atom("b"), [], _), Answer = structure_sharing_answer_bottom - ; String = "t" -> + ; + Term = term.functor(atom("t"), [], _), Answer = structure_sharing_answer_top ; - % XXX this is ugly. Later we should move to writing call and answer - % patterns in analysis files as terms rather than strings which will - % clean this up. - StringStop = String ++ ".", - io.read_from_string("", StringStop, string.length(StringStop), Res, - posn(0, 0, 0), _Posn), - ( - Res = ok({HeadVars, Types, SharingDomain}), - SharingAs = from_structure_sharing_domain(SharingDomain), - Answer = structure_sharing_answer_real(HeadVars, Types, SharingAs) - ; - ( Res = eof - ; Res = error(_, _) - ), - unexpected(this_file, "sharing_answer_from_string: " ++ String) - ) + Term = term.functor(atom("sharing"), + [HeadVarsTerm, TypesTerm, SharingDomainTerm], _), + term_to_type(HeadVarsTerm, HeadVars), + term_to_type(TypesTerm, Types), + term_to_type(SharingDomainTerm, SharingDomain), + SharingAs = from_structure_sharing_domain(SharingDomain), + Answer = structure_sharing_answer_real(HeadVars, Types, SharingAs) ). %-----------------------------------------------------------------------------% diff --git a/compiler/tabling_analysis.m b/compiler/tabling_analysis.m index 59ddf400c..4e8c9115d 100644 --- a/compiler/tabling_analysis.m +++ b/compiler/tabling_analysis.m @@ -79,7 +79,7 @@ :- instance analysis(no_func_info, any_call, mm_tabling_analysis_answer). :- instance partial_order(no_func_info, mm_tabling_analysis_answer). :- instance answer_pattern(no_func_info, mm_tabling_analysis_answer). -:- instance to_string(mm_tabling_analysis_answer). +:- instance to_term(mm_tabling_analysis_answer). %----------------------------------------------------------------------------% %----------------------------------------------------------------------------% @@ -920,24 +920,26 @@ mm_tabling_status_more_precise_than(mm_tabled_will_not_call, mm_tabling_status_more_precise_than(mm_tabled_conditional, mm_tabled_may_call). -:- instance to_string(mm_tabling_analysis_answer) where [ - func(to_string/1) is mm_tabling_analysis_answer_to_string, - func(from_string/1) is mm_tabling_analysis_answer_from_string +:- instance to_term(mm_tabling_analysis_answer) where [ + func(to_term/1) is mm_tabling_analysis_answer_to_term, + pred(from_term/2) is mm_tabling_analysis_answer_from_term ]. -:- func mm_tabling_analysis_answer_to_string(mm_tabling_analysis_answer) - = string. +:- func mm_tabling_analysis_answer_to_term(mm_tabling_analysis_answer) + = term. -mm_tabling_analysis_answer_to_string(mm_tabling_analysis_answer(Status)) - = Str :- - mm_tabling_status_to_string(Status, Str). +mm_tabling_analysis_answer_to_term(Answer) = Term :- + Answer = mm_tabling_analysis_answer(Status), + mm_tabling_status_to_string(Status, String), + Term = term.functor(atom(String), [], context_init). -:- func mm_tabling_analysis_answer_from_string(string) = - mm_tabling_analysis_answer is semidet. +:- pred mm_tabling_analysis_answer_from_term(term::in, + mm_tabling_analysis_answer::out) is semidet. -mm_tabling_analysis_answer_from_string(Str) - = mm_tabling_analysis_answer(Status) :- - mm_tabling_status_to_string(Status, Str). +mm_tabling_analysis_answer_from_term(Term, Answer) :- + Term = term.functor(atom(String), [], _), + mm_tabling_status_to_string(Status, String), + Answer = mm_tabling_analysis_answer(Status). :- pred mm_tabling_status_to_string(mm_tabling_status, string). :- mode mm_tabling_status_to_string(in, out) is det. diff --git a/compiler/trailing_analysis.m b/compiler/trailing_analysis.m index 123112baf..3c9c2fef8 100644 --- a/compiler/trailing_analysis.m +++ b/compiler/trailing_analysis.m @@ -77,7 +77,7 @@ :- instance analysis(no_func_info, any_call, trailing_analysis_answer). :- instance partial_order(no_func_info, trailing_analysis_answer). :- instance answer_pattern(no_func_info, trailing_analysis_answer). -:- instance to_string(trailing_analysis_answer). +:- instance to_term(trailing_analysis_answer). %----------------------------------------------------------------------------% %----------------------------------------------------------------------------% @@ -1160,21 +1160,23 @@ trailing_status_more_precise_than(trail_will_not_modify, trail_may_modify). trailing_status_more_precise_than(trail_will_not_modify, trail_conditional). trailing_status_more_precise_than(trail_conditional, trail_may_modify). -:- instance to_string(trailing_analysis_answer) where [ - func(to_string/1) is trailing_analysis_answer_to_string, - func(from_string/1) is trailing_analysis_answer_from_string +:- instance to_term(trailing_analysis_answer) where [ + func(to_term/1) is trailing_analysis_answer_to_term, + pred(from_term/2) is trailing_analysis_answer_from_term ]. -:- func trailing_analysis_answer_to_string(trailing_analysis_answer) = string. +:- func trailing_analysis_answer_to_term(trailing_analysis_answer) = term. -trailing_analysis_answer_to_string(trailing_analysis_answer(Status)) = Str :- - trailing_status_to_string(Status, Str). +trailing_analysis_answer_to_term(trailing_analysis_answer(Status)) = Term :- + trailing_status_to_string(Status, String), + Term = term.functor(atom(String), [], context_init). -:- func trailing_analysis_answer_from_string(string) = - trailing_analysis_answer is semidet. +:- pred trailing_analysis_answer_from_term(term::in, + trailing_analysis_answer::out) is semidet. -trailing_analysis_answer_from_string(Str) = trailing_analysis_answer(Status) :- - trailing_status_to_string(Status, Str). +trailing_analysis_answer_from_term(Term, trailing_analysis_answer(Status)) :- + Term = term.functor(atom(String), [], _), + trailing_status_to_string(Status, String). :- pred trailing_status_to_string(trailing_status, string). :- mode trailing_status_to_string(in, out) is det. diff --git a/compiler/unused_args.m b/compiler/unused_args.m index 34c100a81..8fa1a1d35 100644 --- a/compiler/unused_args.m +++ b/compiler/unused_args.m @@ -73,11 +73,11 @@ :- instance partial_order(unused_args_func_info, unused_args_call). :- instance call_pattern(unused_args_func_info, unused_args_call). -:- instance to_string(unused_args_call). +:- instance to_term(unused_args_call). :- instance partial_order(unused_args_func_info, unused_args_answer). :- instance answer_pattern(unused_args_func_info, unused_args_answer). -:- instance to_string(unused_args_answer). +:- instance to_term(unused_args_answer). %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% @@ -115,6 +115,7 @@ :- import_module set. :- import_module string. :- import_module svmap. +:- import_module term. :- import_module varset. %-----------------------------------------------------------------------------% @@ -187,13 +188,19 @@ analysis_name = "unused_args". :- instance call_pattern(unused_args_func_info, unused_args_call) where []. :- instance partial_order(unused_args_func_info, unused_args_call) where [ - (more_precise_than(_, _, _) :- semidet_fail), + ( more_precise_than(_, _, _) :- + semidet_fail + ), equivalent(_, Call, Call) ]. -:- instance to_string(unused_args_call) where [ - to_string(_) = "", - from_string(_) = unused_args_call +:- instance to_term(unused_args_call) where [ + ( to_term(unused_args_call) = Term :- + Term = term.functor(atom("any"), [], context_init) + ), + ( from_term(Term, unused_args_call) :- + Term = term.functor(atom("any"), [], _) + ) ]. :- instance answer_pattern(unused_args_func_info, unused_args_answer) where []. @@ -206,22 +213,15 @@ analysis_name = "unused_args". equivalent(_, Args, Args) ]. -:- instance to_string(unused_args_answer) where [ - func(to_string/1) is unused_args_answer_to_string, - func(from_string/1) is unused_args_answer_from_string +:- instance to_term(unused_args_answer) where [ + ( to_term(unused_args(Args)) = Term :- + type_to_term(Args, Term) + ), + ( from_term(Term, unused_args(Args)) :- + term_to_type(Term, Args) + ) ]. -:- func unused_args_answer_to_string(unused_args_answer) = string. - -unused_args_answer_to_string(unused_args(Args)) = - string.join_list(" ", list.map(int_to_string, Args)). - -:- func unused_args_answer_from_string(string) = unused_args_answer is semidet. - -unused_args_answer_from_string(String) = unused_args(Args) :- - Words = string.words(String), - list.map(string.to_int, Words, Args). - %-----------------------------------------------------------------------------% process_module(!ModuleInfo, !Specs, !IO) :- diff --git a/tests/analysis/ctgc/reuse_runtest.sh b/tests/analysis/ctgc/reuse_runtest.sh index a98afeab8..cf39299bc 100755 --- a/tests/analysis/ctgc/reuse_runtest.sh +++ b/tests/analysis/ctgc/reuse_runtest.sh @@ -15,9 +15,9 @@ rm -rf Mercury cat reuse_m3.m.ctgc > reuse_m3.m $MMCMAKE reuse_m1.analyse --analysis-repeat 0 || failed -check_result reuse_m1 "reuse.*main\".*\"\".*no_reuse" -check_result reuse_m2 "reuse.*fiddle2\".*\"\".*no_reuse" -check_result reuse_m3 "reuse.*fiddle3\".*\"\".*conditional_reuse" +check_result reuse_m1 "reuse.*main.*\[\].*no_reuse" +check_result reuse_m2 "reuse.*fiddle2.*\[\].*no_reuse" +check_result reuse_m3 "reuse.*fiddle3.*\[\].*conditional_reuse" check_statuses "optimal.suboptimal.optimal." check_no_requests @@ -25,43 +25,43 @@ check_no_requests $MMCMAKE reuse_m1.analyse --analysis-repeat 1 || failed -check_result reuse_m1 "_reuse.*main\".*\"\".*no_reuse" -check_result reuse_m2 "_reuse.*fiddle2\".*\"\".*conditional_reuse" -check_result reuse_m3 "_reuse.*fiddle3\".*\"\".*conditional_reuse" +check_result reuse_m1 "_reuse.*main.*\[\].*no_reuse" +check_result reuse_m2 "_reuse.*fiddle2.*\[\].*conditional_reuse" +check_result reuse_m3 "_reuse.*fiddle3.*\[\].*conditional_reuse" check_statuses "optimal.optimal.optimal." -check_request reuse_m2 "reuse_m1.*_reuse.*fiddle2.*\"1\"" -check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\"\"" -check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\"\"" +check_request reuse_m2 "reuse_m1.*_reuse.*fiddle2.*\[1\]" +check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\[\]" +check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\[\]" : Step 3 $MMCMAKE reuse_m1.analyse --analysis-repeat 1 || failed -check_result reuse_m1 "_reuse.*main\".*\"\".*no_reuse" -check_result reuse_m2 "_reuse.*fiddle2\".*\"\".*conditional_reuse" -check_result reuse_m2 "_reuse.*fiddle2\".*\"1\".*no_reuse" -check_result reuse_m3 "_reuse.*fiddle3\".*\"\".*conditional_reuse" -check_result reuse_m3 "_reuse.*fiddle3\".*\"1\".*conditional_reuse" +check_result reuse_m1 "_reuse.*main.*\[\].*no_reuse" +check_result reuse_m2 "_reuse.*fiddle2.*\[\].*conditional_reuse" +check_result reuse_m2 "_reuse.*fiddle2.*\[1\].*no_reuse" +check_result reuse_m3 "_reuse.*fiddle3.*\[\].*conditional_reuse" +check_result reuse_m3 "_reuse.*fiddle3.*\[1\].*conditional_reuse" check_statuses "optimal.suboptimal.optimal." check_no_requests -check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\"\"" -check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\"\"" +check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\[\]" +check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\[\]" : Step 4 $MMCMAKE reuse_m1.analyse --analysis-repeat 1 || failed -check_result reuse_m1 "_reuse.*main\".*\"\".*uncond" -check_result reuse_m2 "_reuse.*fiddle2\".*\"\".*conditional_reuse" -check_result reuse_m2 "_reuse.*fiddle2\".*\"1\".*conditional_reuse" -check_result reuse_m3 "_reuse.*fiddle3\".*\"\".*conditional_reuse" -check_result reuse_m3 "_reuse.*fiddle3\".*\"1\".*conditional_reuse" +check_result reuse_m1 "_reuse.*main.*\[\].*uncond" +check_result reuse_m2 "_reuse.*fiddle2.*\[\].*conditional_reuse" +check_result reuse_m2 "_reuse.*fiddle2.*\[1\].*conditional_reuse" +check_result reuse_m3 "_reuse.*fiddle3.*\[\].*conditional_reuse" +check_result reuse_m3 "_reuse.*fiddle3.*\[1\].*conditional_reuse" check_statuses "optimal.optimal.optimal." check_no_requests -check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\"\"" -check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\"1\"" -check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\"\"" -check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\"1\"" +check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\[\]" +check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\[1\]" +check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\[\]" +check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\[1\]" : Step 5 @@ -69,15 +69,15 @@ sleep 1 cat reuse_m3.m.no_ctgc > reuse_m3.m $MMCMAKE reuse_m1.analyse --analysis-repeat 1 || failed -check_result reuse_m1 "_reuse.*main\".*\"\".*no_reuse" -check_result reuse_m2 "_reuse.*fiddle2\".*\"\".*no_reuse" -check_result reuse_m2 "_reuse.*fiddle2\".*\"1\".*no_reuse" -check_result reuse_m3 "_reuse.*fiddle3\".*\"\".*no_reuse" -check_result reuse_m3 "_reuse.*fiddle3\".*\"1\".*no_reuse" +check_result reuse_m1 "_reuse.*main.*\[\].*no_reuse" +check_result reuse_m2 "_reuse.*fiddle2.*\[\].*no_reuse" +check_result reuse_m2 "_reuse.*fiddle2.*\[1\].*no_reuse" +check_result reuse_m3 "_reuse.*fiddle3.*\[\].*no_reuse" +check_result reuse_m3 "_reuse.*fiddle3.*\[1\].*no_reuse" check_statuses "optimal.optimal.optimal." check_no_requests -check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\"\"" -check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\"\"" +check_imdg reuse_m2 "reuse_m1.*reuse.*fiddle2.*\[\]" +check_imdg reuse_m3 "reuse_m2.*reuse.*fiddle3.*\[\]" : Succeeded diff --git a/tests/analysis/excp/excp_runtest.sh b/tests/analysis/excp/excp_runtest.sh index d2716f676..6401e9b11 100755 --- a/tests/analysis/excp/excp_runtest.sh +++ b/tests/analysis/excp/excp_runtest.sh @@ -15,9 +15,9 @@ rm -rf Mercury cat excp_m1.m.no_exception > excp_m1.m $MMCMAKE excp_m1.analyse --analysis-repeat 0 || failed -check_result excp_m1 'exception.*aaa.*may_throw(user_exception)' +check_result excp_m1 'exception.*aaa.*may_throw_user_exception' check_result excp_m1 'exception.*aaa2.*will_not_throw' -check_result excp_m2 'exception.*bbb.*may_throw(user_exception)' +check_result excp_m2 'exception.*bbb.*may_throw_user_exception' check_result excp_m3 'exception.*ccc.*will_not_throw' check_statuses 'suboptimal.suboptimal.optimal.' check_no_requests @@ -42,10 +42,10 @@ sleep 1 cat excp_m1.m.exception > excp_m1.m $MMCMAKE excp_m1.analyse --analysis-repeat 0 || failed -check_result excp_m1 'exception.*aaa.*may_throw(user_exception)' -check_result excp_m1 'exception.*aaa2.*may_throw(user_exception)' -check_result excp_m2 'exception.*bbb.*may_throw(user_exception)' -check_result excp_m3 'exception.*ccc.*may_throw(user_exception)' +check_result excp_m1 'exception.*aaa.*may_throw_user_exception' +check_result excp_m1 'exception.*aaa2.*may_throw_user_exception' +check_result excp_m2 'exception.*bbb.*may_throw_user_exception' +check_result excp_m3 'exception.*ccc.*may_throw_user_exception' check_statuses 'optimal.optimal.optimal.' check_no_requests diff --git a/tests/analysis/sharing/sharing_runtest.sh b/tests/analysis/sharing/sharing_runtest.sh index efc2045a3..59f69711f 100755 --- a/tests/analysis/sharing/sharing_runtest.sh +++ b/tests/analysis/sharing/sharing_runtest.sh @@ -15,10 +15,10 @@ rm -rf Mercury cat sharing_m1.m.no_share > sharing_m1.m $MMCMAKE sharing_m1.analyse --analysis-repeat 0 || failed -check_result sharing_m1 'sharing.*aaa.*"t"' -check_result sharing_m1 'sharing.*aaa2.*"b"' -check_result sharing_m2 'sharing.*bbb.*"t"' -check_result sharing_m3 'sharing.*ccc.*"b"' +check_result sharing_m1 'sharing.*aaa.* t,' +check_result sharing_m1 'sharing.*aaa2.* b,' +check_result sharing_m2 'sharing.*bbb.* t,' +check_result sharing_m3 'sharing.*ccc.* b,' check_statuses 'suboptimal.suboptimal.optimal.' check_no_requests @@ -26,10 +26,10 @@ check_no_requests $MMCMAKE sharing_m1.analyse --analysis-repeat 3 || failed -check_result sharing_m1 'sharing.*aaa.*"b"' -check_result sharing_m1 'sharing.*aaa2.*"b"' -check_result sharing_m2 'sharing.*bbb.*"b"' -check_result sharing_m3 'sharing.*ccc.*"b"' +check_result sharing_m1 'sharing.*aaa.* b,' +check_result sharing_m1 'sharing.*aaa2.* b,' +check_result sharing_m2 'sharing.*bbb.* b,' +check_result sharing_m3 'sharing.*ccc.* b,' check_statuses 'optimal.optimal.optimal.' check_no_requests check_imdg sharing_m2 'sharing_m1.*sharing.*bbb' @@ -55,10 +55,10 @@ sleep 1 cat sharing_m1.m.no_share > sharing_m1.m $MMCMAKE sharing_m1.analyse --analysis-repeat 3 || failed -check_result sharing_m1 'sharing.*aaa.*"b"' -check_result sharing_m1 'sharing.*aaa2.*"b"' -check_result sharing_m2 'sharing.*bbb.*"b"' -check_result sharing_m3 'sharing.*ccc.*"b"' +check_result sharing_m1 'sharing.*aaa.* b,' +check_result sharing_m1 'sharing.*aaa2.* b,' +check_result sharing_m2 'sharing.*bbb.* b,' +check_result sharing_m3 'sharing.*ccc.* b,' check_statuses 'optimal.optimal.optimal.' check_no_requests diff --git a/tests/analysis/unused_args/unused_args_runtest.sh b/tests/analysis/unused_args/unused_args_runtest.sh index 9ae45f0be..021131224 100755 --- a/tests/analysis/unused_args/unused_args_runtest.sh +++ b/tests/analysis/unused_args/unused_args_runtest.sh @@ -17,10 +17,10 @@ rm -rf Mercury cat ua_m1.m.no_unused_args > ua_m1.m $MMCMAKE ua_m1.analyse --analysis-repeat 0 || failed -check_result ua_m1 'aaa1.*"", ""' -check_result ua_m1 'aaa2.*"", ""' -check_result ua_m2 'bbb.*"", ""' -check_result ua_m3 'ccc.*"", ""' +check_result ua_m1 'aaa1.*\[\]' +check_result ua_m1 'aaa2.*\[\]' +check_result ua_m2 'bbb.*\[\]' +check_result ua_m3 'ccc.*\[\]' check_statuses 'suboptimal.suboptimal.optimal.' check_no_requests @@ -28,10 +28,10 @@ check_no_requests $MMCMAKE ua_m1.analyse --analysis-repeat 1 || failed -check_result ua_m1 'aaa1.*"", ""' -check_result ua_m1 'aaa2.*"", ""' -check_result ua_m2 'bbb.*"", ""' -check_result ua_m3 'ccc.*"", ""' +check_result ua_m1 'aaa1.*\[\]' +check_result ua_m1 'aaa2.*\[\]' +check_result ua_m2 'bbb.*\[\]' +check_result ua_m3 'ccc.*\[\]' check_statuses 'optimal.optimal.optimal.' check_no_requests check_imdg ua_m2 'ua_m1.*unused_args.*bbb' @@ -47,10 +47,10 @@ sleep 1 cat ua_m1.m.unused_args > ua_m1.m $MMCMAKE ua_m1.analyse --analysis-repeat 0 || failed -check_result ua_m1 'aaa1.*"", ""' -check_result ua_m1 'aaa2.*"", "1"' -check_result ua_m2 'bbb.*"", ""' -check_result ua_m3 'ccc.*"", ""' +check_result ua_m1 'aaa1.*\[\]' +check_result ua_m1 'aaa2.*\[1\]' +check_result ua_m2 'bbb.*\[\]' +check_result ua_m3 'ccc.*\[\]' check_statuses 'optimal.optimal.suboptimal.' check_no_requests check_imdg ua_m2 'ua_m1.*unused_args.*bbb' @@ -61,10 +61,10 @@ check_imdg ua_m1 'ua_m3.*unused_args.*aaa2' $MMCMAKE ua_m1.analyse --analysis-repeat 1 || failed -check_result ua_m1 'aaa1.*"", ""' -check_result ua_m1 'aaa2.*"", "1"' -check_result ua_m2 'bbb.*"", ""' -check_result ua_m3 'ccc.*"", "1"' +check_result ua_m1 'aaa1.*\[\]' +check_result ua_m1 'aaa2.*\[1\]' +check_result ua_m2 'bbb.*\[\]' +check_result ua_m3 'ccc.*\[1\]' check_statuses 'optimal.suboptimal.optimal.' check_no_requests @@ -72,10 +72,10 @@ check_no_requests $MMCMAKE ua_m1.analyse --analysis-repeat 2 || failed -check_result ua_m1 'aaa1.*"", "1"' -check_result ua_m1 'aaa2.*"", "1"' -check_result ua_m2 'bbb.*"", "1"' -check_result ua_m3 'ccc.*"", "1"' +check_result ua_m1 'aaa1.*\[1\]' +check_result ua_m1 'aaa2.*\[1\]' +check_result ua_m2 'bbb.*\[1\]' +check_result ua_m3 'ccc.*\[1\]' check_statuses 'optimal.optimal.optimal.' check_no_requests @@ -88,10 +88,10 @@ sleep 1 cat ua_m1.m.no_unused_args > ua_m1.m $MMCMAKE ua_m1.analyse --analysis-repeat 0 || failed -check_result ua_m1 'aaa1.*"", ""' -check_result ua_m1 'aaa2.*"", ""' -check_result ua_m2 'bbb.*"", ""' -check_result ua_m3 'ccc.*"", ""' +check_result ua_m1 'aaa1.*\[\]' +check_result ua_m1 'aaa2.*\[\]' +check_result ua_m2 'bbb.*\[\]' +check_result ua_m3 'ccc.*\[\]' check_statuses 'optimal.optimal.optimal.' check_no_requests