Estimated hours taken: 3
Branches: main
Clean up in unused module imports in the Mercury system detected
by --warn-unused-imports.
analysis/*.m:
browser/*.m:
deep_profiler/*.m:
compiler/*.m:
library/*.m:
mdbcomp/*.m:
profiler/*.m:
slice/*.m:
Remove unused module imports.
Fix some minor departures from our coding standards.
analysis/Mercury.options:
browser/Mercury.options:
deep_profiler/Mercury.options:
compiler/Mercury.options:
library/Mercury.options:
mdbcomp/Mercury.options:
profiler/Mercury.options:
slice/Mercury.options:
Set --no-warn-unused-imports for those modules that are used as
packages or otherwise break --warn-unused-imports, e.g. because they
contain predicates with both foreign and Mercury clauses and some of
the imports only depend on the latter.
Estimated hours taken: 18
Branches: main
Move the univ, maybe, pair and unit types from std_util into their own
modules. std_util still contains the general purpose higher-order programming
constructs.
library/std_util.m:
Move univ, maybe, pair and unit (plus any other related types
and procedures) into their own modules.
library/maybe.m:
New module. This contains the maybe and maybe_error types and
the associated procedures.
library/pair.m:
New module. This contains the pair type and associated procedures.
library/unit.m:
New module. This contains the types unit/0 and unit/1.
library/univ.m:
New module. This contains the univ type and associated procedures.
library/library.m:
Add the new modules.
library/private_builtin.m:
Update the declaration of the type_ctor_info struct for univ.
runtime/mercury.h:
Update the declaration for the type_ctor_info struct for univ.
runtime/mercury_mcpp.h:
runtime/mercury_hlc_types.h:
Update the definition of MR_Univ.
runtime/mercury_init.h:
Fix a comment: ML_type_name is now exported from type_desc.m.
compiler/mlds_to_il.m:
Update the the name of the module that defines univs (which are
handled specially by the il code generator.)
library/*.m:
compiler/*.m:
browser/*.m:
mdbcomp/*.m:
profiler/*.m:
deep_profiler/*.m:
Conform to the above changes. Import the new modules where they
are needed; don't import std_util where it isn't needed.
Fix formatting in lots of modules. Delete duplicate module
imports.
tests/*:
Update the test suite to confrom to the above changes.
Estimated hours taken: 4
Branches: main
Various cleanups for the modules in the compiler directory. The are
no changes to algorithms except the replacement of some if-then-elses
that would naturally be switches with switches and the replacement of
most of the calls to error/1.
compiler/*.m:
Convert calls to error/1 to calls to unexpected/2 or sorry/2 as
appropriate throughout most or the compiler.
Fix inaccurate assertion failure messages, e.g. identifying the
assertion failure as taking place in the wrong module.
Add :- end_module declarations.
Fix formatting problems and bring the positioning of comments
into line with our current coding standards.
Fix some overlong lines.
Convert some more modules to 4-space indentation. Fix some spots
where previous conversions to 4-space indentation have stuffed
the formatting of the code up.
Fix a bunch of typos in comments.
Use state variables in more places; use library predicates
from the sv* modules where appropriate.
Delete unnecessary and duplicate module imports.
Misc. other small cleanups.
Estimated hours taken: 8
Branches: main
compiler/*.m:
Rename the types 'type', 'inst' and 'mode' to 'mer_type', 'mer_inst'
and 'mer_mode'. This is to avoid the need to parenthesize these type
names in some contexts, and to prepare for the possibility of a parser
that considers those words to be reserved words.
Rename some other uses of those names (e.g. as item types in
recompilation.m).
Delete some redundant synonyms (prog_type, mercury_type) for mer_type.
Change some type names (e.g. mlds__type) and predicate names (e.g.
deforest__goal) to make them unique even without module qualification.
Rename the function symbols (e.g. pure, &) that need to be renamed
to avoid the need to parenthesize them. Make their replacement names
more expressive.
Convert some more modules to four space indentation.
Avoid excessively long lines, such as those resulting from the
automatic substitution of 'mer_type' for 'type'.
Estimated hours taken: lots
Branches: main
Add the first part of the new termination analyser. This includes most
of the argument size analyser and a simple termination checker - I'll
add a more extensive one as part of another diff. The one included here
is only a placeholder and is roughly equivalent to the one used by the
existing termination analyser.
The new analysis abstracts term size relationships over a domain of
(rational) convex constraints. The resulting size relationships are, in
many cases, more precise than we can obtain with the old analysis. This
means that we should be able to prove termination in more cases. The
tradeoff for this increased precision is that the new termination
analysis is slower than the old one. We should also be able to adapt
the new analyser to handle things like higher-order constructs and
intermodule mutual recursion more easily than the old one.
The code for writing termination2_info pragmas to .opt and .trans_opt
files is currently commented out. It will need to stay that way until
after this change bootstraps and after the tests/term directory as been
reworked (the .trans_opt_exp files need to updated and some new test
cases have to added - I'll do this as part of separate diff).
It isn't clear what the relationship between the new analyser and the
existing one should be, so at the moment they are as independent of each
other as possible.
compiler/termination2.m:
New file. Invokes the the other passes of the new analysis
and handles the output of termination2_info pragmas to .opt
and .trans_opt files.
XXX I've disabled the writing out of termination2_info
pragmas to the (transitive-)intermodule optimization files
until I've updated the test suite.
compiler/term_constr_data.m:
New file. Defines the main data structures used by the
new analysis.
compiler/term_constr_initial.m:
New file. Sets up information for builtin and compiler
generated procedures and processes information about
imported procedures. Also handles termination pragmas.
compiler/term_constr_build.m:
New file. Converts the HLDS representation of a procedure
into the abstract representation that we use during the rest
of the analysis.
compiler/term_constr_fixpoint.m:
New file. Perform a fixpoint calculation in order to derive
interargument size relationships for a procedure (in the
form of convex constraints).
compiler/term_constr_pass2.m:
New file. A rudimentary termination checker that is roughly
equivalent to what the existing termination analysis does.
This is just a placeholder.
compiler/term_constr_util.m:
New file. Utility predicates that are used by the above modules.
compiler/term_constr_errors.m:
New file. Equivalent to term_errors.m for the new analyser.
compiler/rat.m:
Provide rational numbers over fixed precision integers.
Originally committed on the termination2 branch.
compiler/lp_rational.m:
Provides the necessary machinery for manipulating systems
of linear constraints. Originally committed on the termination2
branch although most of this version is new. (Some bits of the
version on the termination2 branch are now in polyhedron.m).
The linear solver is essentially the one that is currently
in lp.m converted to use rationals rather than floats.
compiler/polyhedron.m:
New file. An ADT that provides convex polyhedra over the
rationals (or at least over rats). The abstraction barrier was
designed so that we could experiment with different representations
for the polyhedra.
compiler/term_norm:
Clean up the documentation of this module.
Make set_functor_info into a function.
Add a function for finding a lower bound on the weight of a functor.
compiler/trans_opt.m:
Output termination2_info pragmas in .trans_opt files.
compiler/transform_hlds.m:
Include the new termination analyser.
compiler/goal_form.m:
When checking whether a goal can loop or not use
information from the new termination analyser as well as
the old one.
compiler/globals.m:
compiler/handle_options:
compiler/options.m:
Add options to control the new analyser. The documentation
is currently commented out because the new analysis is still
a work-in-progress. It should be uncommented when the new
analysis is more mature.
XXX The user guide still needs to be updated.
compiler/hlds_out.m:
Add hlds_out.write_pred_proc_id/4.
compiler/hlds_pred.m:
Add a slot in the proc_sub_info structure for the
termination2_info structure.
compiler/rat.m:
Provide rational numbers over fixed precision integers.
compiler/lp_rational.m:
Provide the constraint machinery required by the analyser.
compiler/make_hlds.m:
Handle imports of termination2_info pragmas.
compiler/mercury_compile.m:
Run the new pass. Currently, we do this directly after
the old termination analysis pass.
compiler/mercury_to_mercury.m:
Add code to output termination2_info pragmas.
compiler/libs.m:
Include the rat, polyhedron and lp_rational modules.
compiler/prog_data.m:
Define the types necessary for termination2_info pragmas.
Change the cannot_loop constructor of the generic_termination_info
type so it has a polymorphic argument. The new analyser stores
information in it.
Fix some spelling errors in some of the comments
compiler/prog_io_pragma.m:
Parse termination2_info pragmas.
compiler/error_util.m:
Add function versions of sorry/2 and unexpected/2.
compiler/module_qual.m:
compiler/modules.m:
compiler/recompilation.version.m:
compiler/termination.m
compiler/term_pass2.m
compiler/term_util.m:
Minor changes to confrom to the above.