[m-rev.] for review: feature set pragmas
Julien Fischer
juliensf at csse.unimelb.edu.au
Mon Dec 3 13:56:41 AEDT 2007
On Fri, 30 Nov 2007, Julien Fischer wrote:
> For review by anyone.
>
> Estimated hours taken: 8
> Branches: main
>
> Add a new pragma that allows dependencies on optional features of the
> compilation model to be checked by the compiler. The new pragma
> has the form
>
> :- pragma require_feature_set(<list_of_features>).
>
> where <list_of_features> is a list of optional compilation model features
> whose presence is required by the module containing the pragma.
>
> For example,
>
> :- pragma require_feature_set([trailing, double_prec_float, memo]).
>
> asserts that the module requires trailing, double precision floats and
> memoisation. The compiler will emit an error message if these features
> are not available in the current compilation grade. This is particularly
> helpful in cases like memoisation and parallel conjunction that are ignored
> by default in grades that do not support them.
>
> Fix a bug where we where not emitting a warning about memo and loopcheck
> pragmas being ignored in grades that use --highlevel-data.
>
> compiler/prog_item.m:
> Represent require_feature_set pragmas in the parse tree.
>
> compiler/prog_data.m:
> Add a type that represents optional features of the compilation
> model whose presence is required.
>
> compiler/prog_io_pragma.m:
> Parse the new pragma.
>
> Turn an if-then-else into a switch.
>
> compiler/add_pragma.m:
> Process require_feature_set pragmas and emit error messages
> concerning required features that are not supported by the
> compilation grade.
>
> compiler/globals.m:
> Add three predicates that check whether tabling, threads and
> parallel conjunctions are support by the current grade respectively.
> (Some of this code used to be in table_gen.m and dep_par_conj.m
> and has been moved here since it now called from more than one
> place).
>
> Fix a bug where we were not emitting a message about memo
> and loopcheck pragmas being ignored in grades where --highlevel-data
> was enabled.
>
> compiler/make_hlds_passes.m:
> compiler/mercury_to_mercury.m:
> Handle require_feature_set pragmas.
>
> compiler/module_qual.m:
> compiler/recompilation.version.m:
> compiler/dep_par_conj.m:
> compiler/table_gen.m:
> Conform to the above change.
>
> doc/reference_manual.texi:
> Document the new pragma.
>
> tests/invalid/Mmakefile:
> tests/invalid/Mercury.options:
> tests/invalid/conflicting_fs.{m,err_exp}
> tests/invalid/test_feature_set.{m,err_exp}:
> Test the new pragma.
I have modified this change to implement the `strict_sequential' feature
requested by Peter and Mark. There are a couple of other minor changes
to the way require_feature_set pragma interact with the module system.
Relative diff follows:
diff -u compiler/add_pragma.m compiler/add_pragma.m
--- compiler/add_pragma.m 30 Nov 2007 03:29:28 -0000
+++ compiler/add_pragma.m 3 Dec 2007 02:41:26 -0000
@@ -3734,14 +3734,22 @@
check_required_feature_set(FeatureSet, ImportStatus, Context, !ModuleInfo,
!Specs) :-
module_info_get_globals(!.ModuleInfo, Globals),
- set.fold(check_required_feature(Globals, ImportStatus, Context),
- FeatureSet, !Specs).
+ IsImported = status_is_imported(ImportStatus),
+ (
+ % `require_feature_set' pragmas are not included in interface files
+ % (including private interfaces) and so this case should not occur.
+ IsImported = yes,
+ unexpected(this_file, "imported require_feature_set pragma")
+ ;
+ IsImported = no,
+ set.fold(check_required_feature(Globals, Context), FeatureSet, !Specs)
+ ).
-:- pred check_required_feature(globals::in, import_status::in,
+:- pred check_required_feature(globals::in,
prog_context::in, required_feature::in,
list(error_spec)::in, list(error_spec)::out) is det.
-check_required_feature(Globals, _ImportStatus, Context, Feature, !Specs) :-
+check_required_feature(Globals, Context, Feature, !Specs) :-
(
Feature = reqf_concurrency,
current_grade_supports_concurrency(Globals, IsConcurrencySupported),
@@ -3849,6 +3857,26 @@
;
UseTrail = yes
)
+ ;
+ Feature = reqf_strict_sequential,
+ globals.lookup_bool_option(Globals, reorder_conj, ReorderConj),
+ globals.lookup_bool_option(Globals, reorder_disj, ReorderDisj),
+ globals.lookup_bool_option(Globals, fully_strict, FullyStrict),
+ (
+ ReorderConj = no,
+ ReorderDisj = no,
+ FullyStrict = yes
+ ->
+ true
+ ;
+ Pieces = [
+ words("Error: this module must be compiled using the"),
+ words("strict sequential semantics.")
+ ],
+ Msg = simple_msg(Context, [always(Pieces)]),
+ Spec = error_spec(severity_error, phase_parse_tree_to_hlds, [Msg]),
+ !:Specs = [Spec | !.Specs]
+ )
).
%----------------------------------------------------------------------------%
diff -u compiler/mercury_to_mercury.m compiler/mercury_to_mercury.m
--- compiler/mercury_to_mercury.m 29 Nov 2007 01:23:31 -0000
+++ compiler/mercury_to_mercury.m 3 Dec 2007 01:36:35 -0000
@@ -3787,6 +3787,8 @@
add_string("parallel_conj", !U).
mercury_format_required_feature(reqf_trailing, !U) :-
add_string("trailing", !U).
+mercury_format_required_feature(reqf_strict_sequential, !U) :-
+ add_string("strict_sequential", !U).
%-----------------------------------------------------------------------------%
diff -u compiler/prog_data.m compiler/prog_data.m
--- compiler/prog_data.m 28 Nov 2007 06:52:42 -0000
+++ compiler/prog_data.m 3 Dec 2007 01:31:26 -0000
@@ -635,7 +635,8 @@
; reqf_double_prec_float
; reqf_memo
; reqf_parallel_conj
- ; reqf_trailing.
+ ; reqf_trailing
+ ; reqf_strict_sequential.
%-----------------------------------------------------------------------------%
%
diff -u compiler/prog_io_pragma.m compiler/prog_io_pragma.m
--- compiler/prog_io_pragma.m 29 Nov 2007 02:32:33 -0000
+++ compiler/prog_io_pragma.m 3 Dec 2007 01:37:06 -0000
@@ -2746,6 +2746,7 @@
string_to_required_feature("memo", reqf_memo).
string_to_required_feature("parallel_conj", reqf_parallel_conj).
string_to_required_feature("trailing", reqf_trailing).
+string_to_required_feature("strict_sequential", reqf_strict_sequential).
%-----------------------------------------------------------------------------%
diff -u doc/reference_manual.texi doc/reference_manual.texi
--- doc/reference_manual.texi 30 Nov 2007 03:15:52 -0000
+++ doc/reference_manual.texi 3 Dec 2007 02:51:16 -0000
@@ -10428,7 +10428,7 @@
The University of Melbourne Mercury implementation supports a number
of optional compilation model features,
-such as @ref{Trailing} or @ref{Tabled evaluation},
+such as @ref{Trailing} or @ref{Tabled evaluation}.
Feature sets allow the programmer to assert that a module requires
the presence of one or more optional features in the compilation model.
These assertions can be made use a @samp{pragma require_feature_set}
@@ -10476,6 +10476,10 @@
This feature cannot be specified together with the @samp{parallel_conj}
feature.
+ at item @samp{strict_sequential}
+This feature specifes that a semantics that is equivalent to the strict
+sequential operational semantics must be used.
+
@end table
When a module containing a @samp{pragma require_feature_set} declaration
@@ -10486,6 +10490,9 @@
A @samp{pragma require_feature_set} may only occur in the implementation
section of a module.
+A @samp{pragma require_feature_set} affects only the the module in which
+it occurs; in particular it does not affect any sub-modules
+
If a module contains multiple @samp{pragma require_feature_set} declarations
then the implementation should emit an error if any of them specifies a
feature that is not supported by the compilation model.
--------------------------------------------------------------------------
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