Commit Graph

62 Commits

Author SHA1 Message Date
Mark Brown
55d0d482c6 Provide a more uniform interface to the test directories.
Estimated hours taken: 9

Provide a more uniform interface to the test directories.  Before this
change, the tests directory as well as direct descendents had `runtests'
scripts to execute the tests.  These would run `mmake', which in turn
would recursively run `mmake' in any subdirectories.  The subdirectories
did not have their own `runtests' scripts.

This change adds a `runtests' script to those subdirectories that did
not have them before.  The scripts have the same meaning as they did
previously---run all tests in the current directory and below, and
return a status of 0 only if all tests pass.

The rationale for this change is so that each directory in the tests
is treated the same, regardless of whether it is a top-level
directory or not.  This means, for example, that any test directory can
be used as an argument to the `--test-dir' option to tools/bootcheck.

This change also links tests/general/accumulator into the automated
testing suite.

tests/README:
	Update comments.

tests/Mmake.common:
	Introduce new target dependencies.  Targets of the form
	`foo' depend on the targets `foo_local' and `foo_subdirs'.

tests/subdir_runtests:
	New script to recursively call runtests scripts in subdirectories.
	Most of the code for this script originally came from
	tests/runtests.

tests/shutdown:
tests/startup:
	Use `realclean_local' as a target instead of `realclean', since
	the subdirectories will be handled by other runtests scripts.

tests/runtests:
tests/debugger/runtests:
tests/general/runtests:
tests/hard_coded/runtests:
	Use the new script to run tests in the subdirectories, rather
	than doing a recursive mmake.  Make sure that non-zero return
	values are propagated upwards where appropriate.

tests/debugger/declarative/runtests:
tests/hard_coded/typeclasses/runtests:
tests/hard_coded/sub-modules/runtests:
	New scripts to handle running tests in the subdirectories.

tests/debugger/Mmakefile:
tests/general/Mmakefile:
tests/hard_coded/Mmakefile:
	Add `*_subdirs' targets that do a recursive Mmake.  Change the
	existing targets to `*_local' ones.

tests/warnings/Mmakefile:
	Manually add the extra dependencies, since this Mmakefile does
	not include tests/Mmake.common.
1999-07-12 06:26:05 +00:00
Tyson Dowd
eae3174a2c Add MR_TYPECTOR_REP_* to the type_ctor_info to describe the
Estimated hours taken: 30  (including debugging)

Add MR_TYPECTOR_REP_* to the type_ctor_info to describe the
representation of this type.

We want to do this because it allows us to check quickly to see
what kind of data representation is being used.  Previously this
information was spread throughout the type_ctor_layout and
type_ctor_functors data structures.  It was complex to interpret
and contained a lot of unnecessary duplication.

We can now omit data structures such as the type_ctor_layout in many
cases (it is only necessary for discriminated unions).  Because we rule
out some of the possible alternatives, the encodings used in the
type_ctor_layout can be simplified.  Also, the functors indicator in
type_ctor_functors can be removed, as it subsumed by this data
structure.

Use this representation in code that uses RTTI.

compiler/base_type_info.m:
	Add a missing alternative to the type_ctor_rep (this was a
	bug).

library/array.m:
library/builtin.m:
library/private_builtin.m:
runtime/mercury_bootstrap.c:
	Use MR_TYPECTOR_REP_* in the type_ctor_infos for builtin types.

library/std_util.m:
runtime/mercury_deep_copy_body.h:
runtime/mercury_tabling.c:
	Use MR_TYPECTOR_REP_* and MR_DISCUNION_TAG_* to dispatch on
	data representations.

	Also, fix a bug in deep_copy when copying floating point values.
	I'm not sure when this stopped working, or if this is exactly
	the right fix, but it is more correct than the previous code.

runtime/mercury_type_info.c:
runtime/mercury_type_info.h:
	Update code to use MR_TYPECTOR_REP_*.
	Use a struct for type_ctor_info.

tests/hard_coded/Mmakefile:
tests/hard_coded/deep_copy.m:
tests/hard_coded/deep_copy.exp:
	Add a test case for deep_copy.
1999-07-06 06:32:33 +00:00
Fergus Henderson
ec86c88404 Merge in the changes from the existential_types_2 branch.
Estimated hours taken: 4

Merge in the changes from the existential_types_2 branch.

This change adds support for mode re-ordering of code involving
existential types.  The change required modifying the order of the
compiler passes so that polymorphism comes before mode analysis,
so that mode analysis can check the modes of the `type_info' or
`typeclass_info' variables that polymorphism introduces, so that
it can thus re-order the code accordingly.

This change also includes some more steps towards making existential data
types work.  In particular, you should be able to declare existentially
typed data types, the compiler will generate appropriate unification
and compare/3 routines for them, and deconstruction unifications for them
should work OK.  However, currently there's no way to construct them
except via `pragam c_code', and we don't generate correct RTTI for them,
so you can't use `io__write' etc. on them.

library/private_builtin.m:
compiler/accumulator.m:
compiler/bytecode_gen.m:
compiler/check_typeclass.m:
compiler/clause_to_proc.m:
compiler/code_util.m:
compiler/common.m:
compiler/dead_proc_elim.m:
compiler/dependency_graph.m:
compiler/det_analysis.m:
compiler/det_report.m:
compiler/follow_code.m:
compiler/follow_vars.m:
compiler/goal_util.m:
compiler/higher_order.m:
compiler/hlds_goal.m:
compiler/hlds_out.m:
compiler/hlds_pred.m:
compiler/intermod.m:
compiler/lambda.m:
compiler/live_vars.m:
compiler/magic.m:
compiler/make_hlds.m:
compiler/mercury_compile.m:
compiler/mercury_to_c.m:
compiler/mode_errors.m:
compiler/mode_info.m:
compiler/mode_util.m:
compiler/modecheck_call.m:
compiler/modecheck_unify.m:
compiler/modes.m:
compiler/pd_cost.m:
compiler/polymorphism.m:
compiler/post_typecheck.m:
compiler/purity.m:
compiler/quantification.m:
compiler/rl_exprn.m:
compiler/rl_key.m:
compiler/simplify.m:
compiler/table_gen.m:
compiler/term_traversal.m:
compiler/type_util.m:
compiler/typecheck.m:
compiler/unify_gen.m:
compiler/unify_proc.m:
compiler/unique_modes.m:
compiler/unused_args.m:
compiler/notes/compiler_design.html:
doc/reference_manual.texi:
tests/hard_coded/typeclasses/Mmakefile:
tests/hard_coded/typeclasses/existential_data_types.m:
tests/hard_coded/typeclasses/existential_data_types.exp:
tests/warnings/simple_code.exp:
tests/hard_coded/Mmakefile:
tests/term/arit_exp.trans_opt_exp:
tests/term/associative.trans_opt_exp:
tests/term/pl5_2_2.trans_opt_exp:
tests/term/vangelder.trans_opt_exp:
tests/term/arit_exp.trans_opt_exp:
tests/term/associative.trans_opt_exp:
tests/term/pl5_2_2.trans_opt_exp:
tests/term/vangelder.trans_opt_exp:
tests/invalid/errors2.err_exp2:
tests/invalid/prog_io_erroneous.err_exp2:
tests/invalid/type_inf_loop.err_exp2:
tests/invalid/types.err_exp2:
tests/invalid/polymorphic_unification.err_exp:
tests/invalid/Mmakefile:
tests/warnings/simple_code.exp:
tests/debugger/queens.exp:
tests/hard_coded/Mmakefile:
tests/hard_coded/existential_reordering.m:
tests/hard_coded/existential_reordering.exp:
	Merge in the changes from the existential_types_2 branch.
1999-06-30 17:13:53 +00:00
Fergus Henderson
2c98328a0b Various changes to fix test case failures in the existential_types_2
Estimated hours taken: 8

Various changes to fix test case failures in the existential_types_2
branch.

compiler/simplify.m:
	Delete a bogus sanity check that I had added, since the check
	was failing even in cases which made perfect sense.
	(This one was stopping the compiler from bootstrapping.)

	Delete an obsolete XXX comment about something that has already
	been fixed.

	When converting polymorphic complicated unifications into
	calls to unification procedures, we need to insert the
	type_info variables into the goal_info non-locals set.

compiler/simplify.m:
compiler/det_report.m:
	Fix a couple of old XXXs: issue warnings when optimizing away
	goals with determinism failure or det goals that have no outputs.
	This is needed to ensure that we still issue a warning for several
	of the goals in tests/warnings/simple_code.m.  The previous
	warnings were no longer being issued because this optimization was
	optimization away the relevant code before it could be warned about.

tests/warnings/simple_code.exp:
	Update to reflect the new warnings.

compiler/dependency_graph.m:
	Don't include imported modes of pseudo_imported predicates
	(i.e. (in,in) modes of unification predicates) in the dependency
	graph.  The treatment of pseudo_imported predicates in
	dependency_graph.m needs to match the way they are treated
	by polymorphism.m and other parts of the compiler.

compiler/polymorphism.m:
	Update the headvars field of the proc_info for imported procedures
	to include the type_info variables.  This is necessary because
	some parts of the compiler (e.g. unused_args.m) depend on the
	headvars field being valid even for imported procedures.

	Also fix a bug introduced in my changes to polymorphism.m -- I was
	passing down the wrong HeadVars to polymorphism__produce_existq_tvars.

compiler/post_typecheck.m:
compiler/purity.m:
	Ensure that we always bind any unbound type variables to `void'
	before running polymorphism, even if there were type errors.
	This avoids some internal errors in polymorphism.m.

compiler/mercury_compile.m:
	Fix a formatting error in one of the progress messages.

compiler/modes.m:
compiler/unique_modes.m:
	Ensure that mode analysis always stops analysing things once the
	instmap becomes unreachable.  It already did this for conjunctions,
	most of the time, but there were several other cases
	(if-then-elses and switches) where it did not.
	The aim of this change is to stop mode inference from creating
	modes for procedures with initial insts `not_reached'.

compiler/modecheck_unify.m:
	Handle the case where an unification is initially inferred as
	a non-complicated unification, and then gets re-modechecked
	with the instmap being unreachable.  The code here was assuming
	that a non-complicated unification can never get turned into
	a complicated unification on re-modechecking, but `not_reached'
	unifications where being classified as complicated.
	The above change to modes.m and unique_modes.m should avoid this
	situation, but I thought it was safest to fix the code here too,
	just in case.

compiler/modes.m:
compiler/modecheck_call.m:
compiler/mode_util.m:
	Pass the type down to normalise_inst and ensure that for type_info
	types, it never return a unique inst.  The aim is to stop mode
	inference from inferring unique modes for the type_info arguments
	introduce by polymorphism.m, since unique modes are never useful
	for those arguments, and allowing mode inference to infer
	unique modes for them leads to it inferring unnecessarily many modes.

	(Without this change, the test case tests/valid/uniq_mode_inf_bug.m
	fails, due to a bug in the existing mode inference stuff unrelated
	to my polymorphism / existential types changes.  The bug is that
	modecheck_queued_procs needs to run ordinary mode analysis to a
	fixpoint before running determinism analysis, etc.)

tests/hard_coded/Mmakefile:
	Fix a bug: compile lp.m with the same options as bigtest.m.
	Without this, bigtest was getting link errors due to unsatisfied
	symbols in lp.m.  The problem was due to bigtest.m being compiled
	with intermodule optimization, and lp.m being compiled without
	intermodule optimization.  This lead to bigtest.o containing
	inlined references to local routines in lp.m, but lp.o not exporting
	those symbols because intermodule optimization had not been enabled
	when it was compiled.
1999-06-12 00:50:56 +00:00
Simon Taylor
79dcbbef15 User-guided type specialization.
Estimated hours taken: 60

User-guided type specialization.

compiler/prog_data.m:
compiler/prog_io_pragma.m:
compiler/modules.m:
compiler/module_qual.m:
compiler/mercury_to_mercury.m:
	Handle `:- pragma type_spec'.

compiler/prog_io_pragma.m:
	Factor out some common code to parse predicate names with arguments.

compiler/hlds_module.m:
	Added a field to the module_sub_info to hold information about
	user-requested type specializations, filled in by make_hlds.m
	and not used by anything after higher_order.m.

compiler/make_hlds.m:
	For each `:- pragma type_spec' declaration, introduce a new predicate
	which just calls the predicate to be specialized with the
	specified argument types. This forces higher_order.m to produce
	the specialized versions.

compiler/higher_order.m:
	Process the user-requested type specializations first to ensure
	that they get the correct names.
	Allow partial matches against user-specified versions, e.g.
		map__lookup(map(int, list(int)), int, list(int)) matches
		map__lookup(map(int, V), int, V).
	Perform specialization where a typeclass constraint matches a
	known instance, but the construction of the typeclass_info is
	done in the calling module.
	Give slightly more informative progress messages.

compiler/dead_proc_elim.m:
	Remove specializations for dead procedures.

compiler/prog_io_util.m:
	Change the definition of the `maybe1' and `maybe_functor' types
	to avoid the need for copying to convert between `maybe1'
	and `maybe1(generic)'.
	Changed the interface of `make_pred_name_with_context' to allow
	creation of predicate names for type specializations which describe
	the type substitution.

compiler/make_hlds.m:
compiler/prog_io_pragma.m:
	Make the specification of pragma declarations in error
	messages consistent. (There are probably some more to
	be fixed elsewhere for termination and tabling).

compiler/intermod.m:
	Write type specialization pragmas for predicates declared
	in `.opt' files.

compiler/mercury_to_mercury.m:
	Export `mercury_output_item' for use by intermod.m.

compiler/options.m:
	Add an option `--user-guided-type-specialization' enabled
	with `-O2' or higher.

compiler/handle_options.m:
	`--type-specialization' implies `--user-guided-type-specialization'.

compiler/hlds_goal.m:
	Add predicates to construct constants. These are duplicated
	in several other places, I'll fix that as a separate change.

compiler/type_util.m:
	Added functions `int_type/0', `string_type/0', `float_type/0'
	and `char_type/0' which return the builtin types.
	These are duplicated in several other places,
	I'll fix that as a separate change.

library/private_builtin.m:
	Added `instance_constraint_from_typeclass_info/3' to extract
	the typeclass_infos for a constraint on an instance declaration.
	This is useful for specializing class method calls.
	Added `thread_safe' to various `:- pragma c_code's.
	Added `:- pragma inline' declarations for `builtin_compare_*', which
	are important for user-guided type specialization. (`builtin_unify_*'
	are simple enough to go in the `.opt' files automatically).

compiler/polymorphism.m:
	`instance_constraint_from_typeclass_info/3' does not need type_infos.
	Add `instance_constraint_from_typeclass_info/3' to the
	list of `typeclass_info_manipulator's which higher_order.m
	can interpret.

NEWS:
doc/reference_manual.texi:
doc/user_guide.texi
	Document the new pragma and option.

tests/invalid/Mmakefile:
tests/invalid/type_spec.m:
tests/invalid/type_spec.err_exp:
	Test error reporting for invalid type specializations.

tests/hard_coded/Mmakefile:
tests/invalid/type_spec.m:
tests/invalid/type_spec.exp:
	Test type specialization.
1999-04-23 01:03:51 +00:00
Fergus Henderson
3018d7abb2 Perform some minor simplifications in mode analysis,
Estimated hours taken: 1.5

Perform some minor simplifications in mode analysis,
so as to provide more information to unique mode analysis.
Previously unique_modes.m was reporting spurious errors
for tests/hard_coded/bidirectional.m, because modes.m
produced output containing a subgoal of the form
`disj([Goal, conj([disj([])]])' instead of just `Goal',
and the presence of a disjunction then caused unique mode
analysis to make overly conservative assumptions.

compiler/modes.m:
	Ensure that we do not produce singleton conjunctions or disjunctions.
	Also, if the result of mode checking a disjunct is a (nested)
	disjunction, then merge it with the containing disjunction.
	If the nested disjunction is the empty disjunction (fail),
	then this means it will be deleted.

tests/hard_coded/Mmakefile:
	Re-enable the test case bidirectional.m, since the compiler now
	accepts it, due to the above change.

tests/warnings/simple_code.m:
tests/warnings/simple_code.exp:
	Update this test case, because the above change meant that the
	compiler no longer issues the warning about "this disjunct can
	never succeed" in cases like this -- mode analysis will already
	have optimized it away, before we even get to simplify.m (which
	handles those kinds of warnings).  This warning is not as
	important as allowing bidirectional code.
1999-04-16 08:08:08 +00:00
Fergus Henderson
9e7ab444be Fix a bug in unique mode checking.
Estimated hours taken: 4

Fix a bug in unique mode checking.

compiler/unique_modes.m:
	Fix a bug reported by Serge Varennes
	<serge.varennes@detexis.thomson-csf.com>:
	we need to mark variables as `mostly_unique' rather
	than `unique' at all disjunctions, not just at model_non
	disjunctions, because model_semi and even model_det
	disjunctions can still have backtracking from one failing
	disjunct into the next disjunct.

	Also add a couple of comments.

tests/invalid/Mmakefile:
tests/invalid/uniq_modes.m:
tests/invalid/uniq_modes.err_exp:
	Add a regression test for this change.

tests/hard_coded/purity.m:
tests/hard_coded/cc_nondet_disj.m:
	Fix code that the compiler now rejects, due to the above change.
	The compiler is being a bit conservative to reject these cases,
	because the code won't actually violate unique-mode-correctness,
	but the conservatism here with disjunctions is similar to unique
	mode analysis's already existing conservatism with regard to
	if-then-elses, and the work-around for cases like this is easy,
	so I don't consider that to be a significant problem.

	The conservatism in question is that if it sees
	`{ test }, io__write_string("blah")' in a model_det/model_semi
	disjunct or in the condition of an if-then-else, it will report
	a unique mode error, since it doesn't realize that destructive
	update only occurs _after_ we have committed to this branch.

tests/hard_coded/Mmakefile:
	Disable the test case bidirectional.m, since the compiler now
	rejects it, due to the above change to unique_modes.m.
	The compiler is again being overly conservative in its analysis.
	The problem is similar to that in the two test cases above,
	unfortunately there is no easy work-around in this case.
	The compiler really ought to support this style of bidirectional
	code using unique modes, so I do consider this to be a significant
	problem, but the fix is a fair bit of work, so I will deal with
	that as a separate change.
1999-04-16 07:52:12 +00:00
Zoltan Somogyi
3bf462e0b7 Switch to a closure representation that includes runtime type and procedure id
Estimated hours taken: 36

Switch to a closure representation that includes runtime type and procedure id
information, so that closures can be copied, garbage collected, printed, etc.

This RTTI information is not yet used. Adding code to use it would be futile
until Tyson finishes his changes to the other RTTI data structures.

Note also that this change provides the information required for solving the
problem of trying to deep copy closures only for grades that include
--typeinfo-liveness. Providing this info for other grades is future work.

configure.in:
	Find out what the right way to refer to a variable-sized array
	at the end of a struct is.

runtime/mercury_ho_call.h:
	New file to define the structure of closures and macros for accessing
	closures.

runtime/Mmakefile:
	Add the new header file.

runtime/mercury_ho_call.c:
	Add an entry point to handle calls to new-style closures. The code
	to handle old-style closures, which was unnecessarily duplicated for
	each code model, stays until all the installed compilers use the new
	closure representation.

	Until that time, the new entry point will contain code to detect
	the use of old-style closures and invoke the old code instead.
	This allows stage1s compiled with old compilers to use the old style
	and stage2 to use the new style without any special tricks anywhere
	else.

	Add a new entry point to handle method calls of all code models.
	The old entry points, which had the same code, will also be deleted
	after this change has been bootstrapped.

runtime/mercury_calls.h:
	Remove the macros that call closures. Their interface sucked, they
	were not used, and their implementation is now out of date.

runtime/mercury_stack_layout.h:
	Add a new type, MR_Type_Param_Locns, for use by the C type
	representing closures. Since MR_Stack_Layout_Vars has a field,
	MR_slvs_tvars, which references a data structure identical
	in every way to MR_Type_Param_Locns, change the type of that field
	to this new type, instead of the previous cheat.

runtime/mercury_layout_util.h:
	Minor update to conform to the new type of the MR_slvs_tvars field.
	(This is the only use of that field in the system.)

runtime/mercury_type_info.h:
	Add new types MR_TypeInfo and MR_PseudoTypeInfo. For now, they
	are just Word, but later we can make them more accurate.
	In the meantime, we can refer to them instead of to Word,
	making code clearer. One such reference is now in mercury_ho_call.h.

compiler/notes/release_checklist.html:
	Add a reminder to remove the redundant code from mercury_ho_call.c
	after bootstrapping.

compiler/llds.m:
	Replace three code addresses for calling closures and another three
	for calling methods with one each.

compiler/call_gen.m:
compiler/dupelim.m:
compiler/opt_debug.m:
compiler/opt_util.m:
compiler/llds_out.m:
	Trivial updates in accordance with the change to llds.m

compiler/code_info.m:
	Move the code to handle layouts to continuation_info.m,
	since that's where it belongs. Leave only the code for picking
	up parameters from code_infos and for putting results back in there.

	Remove the redundant arguments of code_info__init, and extract
	them from ProcInfo, to make clear that they are related.

compiler/code_gen.m:
	Since we pass ProcInfo to code_info__init, don't pass its components.

compiler/continuation_info.m:
	Add the code moved from code_info.m, in a form which takes explicit
	arguments for things that used be hidden in the code_info.

	Add new code, closely related to the moved code, that creates
	layout info from a procedure's argument info, rather than from a
	(part of) the current code generator state. This way, it can be
	invoked from places that don't have a code_info for the procedure
	for which they want to generate layouts. This is the case when
	we generate layouts for closures.

compiler/par_conj_gen.m:
compiler/trace.m:
	Minor changes required by the move of stuff from code_info to
	continuation_info.

compiler/stack_layout.m:
	Export some predicates for use by unify_gen.

compiler/unify_gen.m:
	Switch to creating new style closures, complete with layout info.

	Optimize the code for extending closures a bit. By copying the
	fixed words of the closure outside the loop, we avoid incurring
	the loop overhead twice.

compiler/code_util.m:
	Add a couple of utility predicates for continuation_info.m and
	unify_gen.m

library/benchmarking.m:
library/std_util.m:
	Refer to the new entry point for handling closures.

browser/dl.m:
	Use the new closure representation.

	Note that extras/dynamic_linking/dl.m, which is supposed to be
	the same as browser/dl.m but is not, should also be updated, but
	this will be handled later by Fergus.

tests/hard_coded/closure_extension.{m,exp}:
	A new test case to exercise the code for extending closures.

tests/hard_coded/Mmakefile:
	Enable the new test case.
1999-04-16 06:05:49 +00:00
Zoltan Somogyi
04659afd51 Fix a bug in nondet pragma C codes.
Estimated hours taken: 1

Fix a bug in nondet pragma C codes.

compiler/pragma_c_gen.m:
	Fix an off-by-one error that caused the C struct we define
	(to hold the items that must be saved from one success of a
	nondet pragma C code to the next) to start with the top word
	in the next lower nondet stack frame, instead of the word
	immediately after that. Therefore an assignment to the first
	field of the struct was clobbering the previous stack frame.

tests/hard_coded/nondet_c.{m,exp}:
	A new test case to check for this bug.

tests/hard_coded/Mmakefile:
	Enable the new test case.
1999-03-26 04:34:23 +00:00
Fergus Henderson
f6a879896d Fix a bug where copy/2 was returning bogus data when copying string literals.
Estimated hours taken: 2

Fix a bug where copy/2 was returning bogus data when copying string literals.

runtime/mercury_deep_copy_body.h:
	Change the code so that it doesn't assume that string literals
	must be aligned, since currently they aren't.

tests/hard_coded/Mmakefile:
tests/hard_coded/string_alignment_bug.m:
tests/hard_coded/string_alignment_bug.exp:
	Add a regression test.
1999-03-24 04:22:18 +00:00
Simon Taylor
d38f9f8bee Change the bit shift functions to perform checking to avoid
Estimated hours taken: 1

Change the bit shift functions to perform checking to avoid
implementation defined behaviour.

library/int.m:
	Add checking to `int:<<' and `int:>>'.
	Add `int:unchecked_left_shift' and `int:unchecked_right_shift'
	which do not perform any checking.

compiler/code_util.m:
	Replace `int:<<' and `int:>>' with `int:unchecked_left_shift' and
	`int:unchecked_right_shift' in the builtin table.

NEWS:
	Mention the changes to int.m.

tests/hard_coded/Mmakefile:
tests/hard_coded/shift_test.m:
tests/hard_coded/shift_test.exp:
	Test the shift functions.
1999-03-22 00:33:54 +00:00
Fergus Henderson
056e7b3eb3 Add a regression test to test three recently-fixed bugs
Estimated hours taken: 0.25

tests/hard_coded/Mmakefile:
tests/hard_coded/factt.m:
tests/hard_coded/factt_examples:
tests/hard_coded/factt.exp:
	Add a regression test to test three recently-fixed bugs
	related to fact tables:
		- duplicate C labels,
		- incorrect dependencies with --use-subdirs, and
		- undefined symbols due to passing the wrong arguments
		  to c2init.
1999-02-08 23:36:47 +00:00
Thomas Conway
a239a20aa7 mention the new test case.
Estimated hours taken: 0.2

tests/hard_coded/Mmakefile:
	mention the new test case.


tests/hard_coded/term_io_test.{m,inp,exp}:
	A new test case that reads terms from term_io_test.inp and
	writes them to stdout. At the moment this only tests a single
	bug[fix]: that pred expressions get quoted correctly when
	they contain commas in their RHS, but by adding cases to the
	.inp and .exp files, can be used to test various quoting/
	term_io features.
1998-11-13 05:32:12 +00:00
Fergus Henderson
4e1deba7a4 Disable the `var_not_found' test case, since we don't pass it --
Estimated hours taken: 0.25

tests/hard_coded/Mmakefile:
	Disable the `var_not_found' test case, since we don't pass it --
	dgj's recent change to polymorphism.m means that the compiler
	now reports `sorry, not implemented' for this test case.
	Previously it used to generated incorrect code that
	just coincidentally happened to work.
1998-11-10 07:37:29 +00:00
Fergus Henderson
f31b6aa167 Fix a bug in my previous change: the new subdirectory is
Estimated hours taken: 0.05

tests/hard_coded/Mmakefile:
	Fix a bug in my previous change: the new subdirectory is
	named `sub-modules', not `nested_mods'.
1998-11-09 03:54:40 +00:00
Fergus Henderson
4c9bf89e1f Change the documentation and test cases to reflect the fact that we
Estimated hours taken: 1

Change the documentation and test cases to reflect the fact that we
currently don't support parallel makes for nested modules.
(The comments in the write_depenency_file predicate in compiler/modules.m
explain why not.)

doc/reference_manual.texi:
	Update the list of bugs and limitations in the sub-modules chapter
	to say that we don't support parallel makes for nested modules.

tests/hard_coded/Mmakefile:
tests/hard_coded/nested*.m:
tests/hard_coded/parent*.m:
tests/hard_coded/sub-modules/Mmakefile:
tests/hard_coded/sub-modules/nested*:
tests/hard_coded/sub-modules/parent*:
	Move the sub-module test cases to a new subdirectory
	`tests/hard_coded/sub-modules'.  One reason for this is just
	to separate out the test cases for this feature, just as
	we do with the typeclass test cases.
	But the other reason is to ensure that the nested module test
	cases won't get built in parallel, since currently there are
	some problems with the Mmake rules for building nested modules
	that cause race conditions if you use parallel makes.
1998-11-09 03:53:08 +00:00
Fergus Henderson
ecb6edb717 Fix a bug with intermodule optimization of nested modules.
Estimated hours taken: 20

Fix a bug with intermodule optimization of nested modules.

Previously, the compiler used to just label any
predicates defined in a module containing sub-modules
as `exported', since they may be needed by the separately-compiled
sub-modules.  However, this is a little bit of a lie,
and it turns out that it doesn't work.  The fix is
to use a new status `exported_to_submodules' for this case.

compiler/prog_data.m:
	Add a new pseudo-declaration ":- private_interface",
	used to mark items in an ":- implementation" section
	that will be exported to submodules.

compiler/modules.m:
	Put declarations from modules containing sub-modules into
	`private_interface' sections rather than into `interface' sections.

compiler/hlds_pred.m:
	Add a new alternative `exported_to_submodules' to the
	`import_status' data type.  Add several new procedures
	for testing particular aspects of this type.

compiler/module_qual.m:
	Set the import_status of items in a `private_interface'
	section to `exported_to_submodules'.

compiler/intermod.m:
	Handle procedures with status `exported_to_submodules'
	specially.  Also reorganize the code here a bit to make
	it more maintainable.

compiler/base_type_info.m:
compiler/base_type_info.m:
compiler/base_typeclass_info.m:
compiler/code_util.m:
compiler/dead_proc_elim.m:
compiler/hlds_out.m:
compiler/make_hlds.m:
compiler/termination.m:
compiler/unused_args.m:
	Minor changes to reflect the above changes to data-structures;
	in particular, use the new procedures defined in hlds_pred.m
	instead of hard-coded tests.  In termination.m, the changes
	included deleting some error-checking code that didn't make
	much sense anymore when using the new procedures rather than
	using hard-coded tests.

tests/hard_coded/Mmakefile:
tests/hard_coded/nested_intermod.m:
tests/hard_coded/nested_intermod_main.m:
tests/hard_coded/nested_intermod_main.exp:
	Add a regression test for the bug mentioned above.
1998-11-02 09:49:17 +00:00
Fergus Henderson
17118fb52a Fix a bug which caused an internal compiler error for disjunctions
Estimated hours taken: 6

Fix a bug which caused an internal compiler error for disjunctions
in single-solution contexts with e.g. the first two disjuncts `det'
and third disjunct `cc_multi'.

compiler/det_analysis.m:
	In det_infer_disj, replace `at_most_many' with `at_most_many_cc'
	if in a single-solution context.  This is also done by det_infer_goal,
	but it needs to be done here too, to avoid calling error/1 in
	det_disjunction_maxsoln.

tests/hard_coded/Mmakefile:
tests/hard_coded/cc_multi_bug.m:
tests/hard_coded/cc_multi_bug.exp:
	Test case for the above-mentioned bug.
1998-10-23 18:40:39 +00:00
Fergus Henderson
6d88f700a7 Fix a couple of bugs related to pruning of impure goals with no output
Estimated hours taken: 1.5

Fix a couple of bugs related to pruning of impure goals with no output
variables.

compiler/det_analysis.m:
	Fix a bug: the compiler was automatically inserting pruning
	across impure goals with no output variables.  That should
	happen only for pure or semipure goals.  To prevent pruning
	in those cases, I changed it so that impure goals with no
	output variables are not considered single-solution contexts.

doc/reference_manual.texi:
	Document the above-mentioned change.

compiler/clause_to_proc.m:
	Fix a bug: when converting a bunch of clauses into a disjunction,
	clause_to_proc.m was not computing the proper purity annotation
	on the goal_info for the disjunction.

tests/hard_coded/Mmakefile:
tests/hard_coded/impure_prune.m:
tests/hard_coded/impure_prune.exp:
	A test case for the above-mentioned changes to det_analysis.m
	and clause_to_proc.m.
1998-10-20 15:07:07 +00:00
Fergus Henderson
2590cabbed Add a regression test for a mode analysis bug that resulted
Estimated hours taken: 0.5

tests/hard_coded/Mmakefile:
tests/hard_coded/var_not_found.m:
tests/hard_coded/var_not_found.exp:
	Add a regression test for a mode analysis bug that resulted
	in a var_not_found error during code generation.
	I don't if the bug was ever fixed, it just happened to
	go away for some unknown reason.
1998-10-01 07:41:26 +00:00
Fergus Henderson
96e4ba0986 Add a regression test for a bug that conway reported,
Estimated hours taken: 0.5

tests/hard_coded/Mmakefile:
tests/hard_coded/bigtest.m:
tests/hard_coded/lp.m:
tests/hard_coded/bigtest.exp:
        Add a regression test for a bug that conway reported,
	which appears to have already been fixed.
1998-10-01 07:10:11 +00:00
David Jeffery
7235409c11 A test case for the exist_q_tvar bug
Estimated hours taken: 0.2

hard_coded/existential_bound_tvar.m:
        A test case for the exist_q_tvar bug
hard_coded/existential_bound_tvar.exp:
        The expected output for the test case.
hard_coded/Mmakefile:
        Add the new test case.
1998-09-24 10:11:51 +00:00
Tyson Dowd
c2c4b9a6b6 Move merge_and_remove_dups from general to hard_coded, because
Estimated hours taken: 0.5

general/Mmakefile:
general/merge_and_remove_dups.exp:
general/merge_and_remove_dups.m:
hard_coded/Mmakefile:
hard_coded/merge_and_remove_dups.exp:
hard_coded/merge_and_remove_dups.m:
	Move merge_and_remove_dups from general to hard_coded, because
	NU-Prolog thinks the list of ints is a list of ASCII characters,
	and so outputs a different result.
1998-09-21 13:24:13 +00:00
Zoltan Somogyi
559d1ea5ce Fix a bug in value numbering reported by Simon.
Estimated hours taken: 1

Fix a bug in value numbering reported by Simon.

compiler/vn_block.m:
	Restore a previously commented block of code, whose job is to force
	the flushing of any stack slot that holds the saved value of a nondet
	control register or stack slot. The rationale for this code used
	to be the handling of cuts in nondet code; now it is the handling
	of hijackings.

tests/hard_coded.{m,exp}:
	A cut-down and inlined version of Simon's test case, which fails
	without the change to vn_block and succeeds with it.

tests/hard_coded/Mmakefile:
	Enable the new test case, and require that it be compiled with
	value numbering.
1998-08-26 07:52:01 +00:00
Zoltan Somogyi
ed063bcc00 Extend the new failure handling method to optionally preserve an invariant
Estimated hours taken: 30

Extend the new failure handling method to optionally preserve an invariant
required by accurate gc: always being able to tell with respect to what MR_sp
or MR_curfr to interpret the stackvars and framevars referred to by the label
whose address is the redoip slot of a nondet stack frame. This basically
requires limitations on the hijacking of redoip/redofr slot pairs.

compiler/notes/failure.html:
	Describe the new extension.

	Change the terminology to conform to what is used in the code.

compiler/llds.m:
	For each temporary frame on the nondet stack, specify the native
	stack of the procedure that created it. This is so that we know
	whether the temporary frame ought to have the fourth slot that
	specifies the right value of MR_sp. (The fourth slot is included
	only in temporary nondet stack frames created procedures that live
	on the det stack; procedures that live on the nondet stack never
	have any of their variables on the det stack.)

	Remove the modframe llds instruction, since it does not specify
	what frame's redoip slot it is assigning to. This is error-prone
	(see peephole.m below). We were not using modframe much anyway.

compiler/llds_out.m:
compiler/opt_debug.m:
	Emit either mktempframe or mkdettempframe depending on the new
	field in temp_frame.

compiler/code_info.m:
	Add a fourth item to the failure state, which states whether
	the top frame of the nondet stack may be hijacked. Initialize
	it from the option --allow-hijacks. If about to do a hijack
	but the failure state says no, create a temporary frame instead.

	Separate out the code for creating temporary frames, since it
	is now called from more than one place. Generalize the code
	to handle the new type of temp frame.

compiler/code_info.m:
compiler/ite_gen.m:
	Simplify the way we transmit information about the location
	of the address of the nondet stack frame in which the soft cut
	is performed from the start of the condition to its end.

	Remove the predicate code_info__maybe_push_temp_frame;
	its functionality is now achieved in code_info.m by disabling
	and restoring --allow-hijacks around the generation of code
	for the condition. This also allows us to get rid of the code
	that finds out whether the condition can do any hijacking.

compiler/opt_util.m:
	Rename next_modframe as next_assign_to_redoip, and add an additional
	argument that says which frame's redoip we are after.

compiler/peephole.m:
	Use the new argument of opt_util__next_assign_to_redoip to fix a bug
	where a mkframe of a temporary frame (which leaves curfr unchanged)
	that was followed a modframe (which assigns to the redoip of curfr)
	was incorrectly optimized (the assignment to the redoip slot was
	applied to the temporary frame, not the ordinary one).

compiler/*.m:
	Minor changes to accommodate the disappearance of modframe.

runtime/mercury_stacks.h:
	Add macros to support four-word temp frames on the nondet stack.

	Make the macros that access nondet stack frame slots start with MR_,
	while keeping (redefined) macros needed for backward compatibility.

	Remove the modframe macro.

	Fix a dangling reference to PREDNM instead of MR_PREDNM.

runtime/mercury_stack_trace.c:
	Modify the stack tracing code to allow for the new four-word temp
	frames.

	Use the new MR_ prefixed variants of the macros.

runtime/mercury_debug.h:
runtime/mercury_misc.[ch]:
	Remove references to modframe.

tests/general/complex_failure.{m,exp}:
	A new test case to tickle the various ways of handling nested
	disjunctions and if-then-elses in the new code generator.

tests/general/Mmakefile:
	Enable the new test case.

tests/{general,hard_coded}/space.{m,exp}:
	Move this test case from general to hard_coded. Although NU-Prolog
	can execute it, it does not give the same answers as Mercury due to
	a different default ordering and a difference in integer size (26-bit
	integers in NU-Prolog) that changes the behavior of the pseudo
	random-number generator.

tests/hard_coded/cycles2.exp:
	Add the missing .exp file for this existing test case.

tests/hard_coded/Mmakefile:
	Enable the old test cases cycles, cycles2 and space, since
	we now pass them.
1998-07-29 08:57:09 +00:00
Fergus Henderson
2dd14c4726 Delete some long obsolete references to `.mod' files.
Estimated hours taken: 0.25

tests/general/Mmakefile:
tests/hard_coded/Mmakefile:
tests/hard_coded/typeclasses/Mmakefile:
tests/misc_tests/Mmakefile:
	Delete some long obsolete references to `.mod' files.
1998-07-27 11:09:35 +00:00
Fergus Henderson
2181967d99 Implement some parts of the support for nested modules that I had
Estimated hours taken: 5

Implement some parts of the support for nested modules that I had
forgotten about.

compiler/modules.m:
	Allow the `:- interface' and `:- implementation' parts of
	nested modules to be separated.
	Check that `:- implementation' declarations for nested
	modules don't occur in the interface section of the parent module.

tests/hard_coded/nested3.m:
tests/hard_coded/nested3.exp:
tests/invalid/nested_impl_in_int.m:
tests/invalid/nested_impl_in_int.err_exp:
	Test cases for the above-mentioned feature.

tests/hard_coded/Mmakefile:
	Add `RM_C=:', so that the nested modules tests work with
	parallel makes, and then enable those tests.
1998-07-26 16:36:15 +00:00
Zoltan Somogyi
d1855187e5 Implement new methods of handling failures and the end points of branched
Estimated hours taken: 260

Implement new methods of handling failures and the end points of branched
control structures.

compiler/notes/failure.html:
	Fix an omission about the handling of resume_is_known in if-then-elses.
	(This omission lead to a bug in the implementation.)

	Optimize cuts across multi goals when curfr is known to be equal
	to maxfr.

	Clarify the wording in several places.

compiler/code_info.m:
	Completely rewrite the methods for handling failure.

	Separate the fields of code_info into three classes: those which
	do not change after initialization, those which record state that
	depends on where in the HLDS goal we are, and those which contain
	persistent data such as label and cell counters.

	Rename grab_code_info and slap_code_info as remember_position
	and reset_to_position, and add a wrapper around the remembered
	code_info to make it harder to make mistakes in its use.
	(Only the location-dependent fields of the remembered code_info
	are used, but putting only them into a separate data structure would
	result in more, not less, memory being allocated.)

	Gather the predicates that deal with handling branched control
	structures into a submodule.

	Reorder the declarations and definitions of access predicates
	to conform to the new order of fields.

	Reorder the declarations and definitions of the failure handling
	submodule to better reflect the separation of higher-level and
	lower-level predicates.

compiler/code_gen.m:
	Replace code_gen__generate_{det,semi,non}_goal_2 with a single
	predicate, since for most HLDS constructs the code here is the same
	anyway (the called preds check the code model when needed).

	Move classification of the various kinds of unifications to unify_gen,
	since that is where it belongs.

	Move responsibility for initializing the code generator's trace
	info to code_info.

	Move the generation of code for negations to ite_gen, since the
	handling of negations is a cut-down version of the handling of
	negations. This should make the required double maintenance easier,
	and more likely to happen.

compiler/disj_gen.m:
compiler/ite_gen.m:
	These are the two modules that handle most failures; they have
	undergone a significant rewrite. As part of this rewrite, factor
	out the remaining common code between model_non and model_{det,semi}
	goals.

compiler/unify_gen.m:
	Move classification of the various kinds of unifications here from
	code_gen. This allows us to keep several previously exported
	predicates private.

compiler/call_gen.m:
	Factor out some code that was common to ordinary calls, higher order
	calls and method calls. Move the common code that checks whether
	we are doing tracing to trace.m.

	Replace call_gen__generate_{det,semi,nondet}_builtin with a single
	predicate.

	Delete the commented out call_gen__generate_complicated_unify,
	since it will never be needed and in any case suffered from
	significant code rot.

compiler/llds.m:
	Change the mkframe instruction so that depending on one of its
	arguments, it can create either ordinary frames, or the cut-down
	frames used by the new failure handling algorithm (they have only
	three fixed fields: prevfr, redoip and redofr).

compiler/llds_out.m:
	Emit a #define MR_USE_REDOFR before including mercury_imp.h, to
	tell the runtime we are using the new failure handling scheme.
	This effectively changes the grade of the compiled module.

	Emit MR_stackvar and MR_framevar instead of detstackvar and framevar.
	This is a step towards cleaning up the name-space, and a step towards
	making both start numbering at 0. For the time being, the compiler
	internally still starts counting framevars at 0; the code in llds_out.m
	adds a +1 offset.

compiler/trace.m:
	Change the way trace info is initialized to fit in with the new
	requirements of code_info.m.

	Move the "are we tracing" check from the callers to the implementation
	of trace__prepare_for_call.

compiler/*.m:
	Minor changes in accordance with the major ones above.

compiler/options.m:
	Introduce a new option, allow_hijacks, which is set to "yes" by
	default. It is not used yet, but the idea is that when it is set to no,
	the code generator will not generate code that hijacks the nondet
	stack frame of another procedure invocation; instead, it will create
	a new temporary nondet stack frame. If the current procedure is
	model_non, it will have three fields: prevfr, redoip and redofr.
	If the current procedure is model_det or model_semi, it will have
	a fourth field that is set to the value of MR_sp. The idea is that
	the runtime system, which will be able to distinguish between
	ordinary frames (whose size is at least 5 words), 3-word and 4-word
	temporary frames, will now be able to use the redofr slots of
	all three kinds of frames and the fourth slot values of 4-word
	temporary frames as the addresses relative to which framevars
	and detstackvars respectively ought to be offset in stack layouts.

compiler/handle_options.m:
	Turn off allow_hijacks if the gc method is accurate.

runtime/mercury_stacks.h:
	Change the definitions for the nondet stack handling macros
	to accommodate the new nondet stack handling discipline.
	Define a new macro for creating temp nondet frames.

	Define MR_based_stackvar and MR_based_framevar (both of which start
	numbering slots at 1), and express other references, including
	MR_stackvar and MR_framevar and backward compatible definitions of
	detstackvar and framevar for hand-written C code, in terms of those
	two.

runtime/mercury_stack_trace.[ch]:
	Add a new function to print a dump of the fixed elements nondet stack,
	for debugging my changes. (The dump does not include variable values.)

runtime/mercury_trace_internal.c:
	Add a new undocumented command "D" for dumping the nondet stack
	(users should not know about this command, since the output is
	intelligible only to implementors).

	Add a new command "toggle_echo" that can cause the debugger to echo
	all commands. When the input to the debugger is redirected, this
	echo causes the output of the session to be much more readable.

runtime/mercury_wrapper.c:
	Save the address of the artificial bottom nondet stack frame,
	so that the new function in mercury_stack_trace.c can find out
	where to stop.

runtime/mercury_engine.c:
runtime/mercury_wrapper.c:
	Put MR_STACK_TRACE_THIS_MODULE at the tops of these modules, so that
	the labels they define (e.g. do_fail and global_success) are registered
	in the label table when their module initialization functions are
	called. This is necessary for a meaningful nondet stack dump.

runtime/mercury_grade.h:
	Add a new component to the grade string that specifies whether
	the code was compiled with the old or the new method of handling
	the nondet stack. This is important, because modules compiled
	with different nondet stack handling disciplines are not compatible.
	This component depends on whether MR_USE_REDOFR is defined or not.

runtime/mercury_imp.h:
	If MR_DISABLE_REDOFR is defined, undefine off MR_USE_REDOFR before
	including mercury_grade.h. This is to allow people to continue
	working on un-updated workspaces after this change is installed;
	they should put "EXTRA_CFLAGS = -DMR_DISABLE_REDOFR" into
	Mmake.stage.params. (This way their stage1 will use the new method
	of handling failure, while their stage2 2&3 will use the old one.)

	This change should be undone once all our workspaces have switched
	over to the new failure handling method.

tests/hard_coded/cut_test.{m,exp}:
	A new test case to tickle the various ways of handling cuts in the
	new code generator.

tests/hard_coded/Mmakefile:
	Enable the new test case.
1998-07-20 10:04:02 +00:00
Fergus Henderson
f781be28ba Disable duplicate call optimization, because it is buggy.
Estimated hours taken: 0.5

compiler/options.m:
	Disable duplicate call optimization, because it is buggy.
	(Also add a comment about options for internal use only.)

tests/hard_coded/Mmakefile:
tests/hard_coded/dupcall_types_bug.m:
tests/hard_coded/dupcall_types_bug.exp:
	Add a regression test for the bug in duplicate call optimization.
1998-06-22 01:06:40 +00:00
Fergus Henderson
c5f103392a Fix a problem reported by Dante Baldan <dba@info.fundp.ac.be>,
Estimated hours taken: 2

doc/reference_manual.texi:
compiler/make_hlds.m:
	Fix a problem reported by Dante Baldan <dba@info.fundp.ac.be>,
	where the use of `all [X] p(X) <=> q(X)' lead to spurious mode
	errors, due to failure to eliminate certain kinds of double
	negations: in particular, the compiler should convert
	negated conjunctions of negations into disjunctions.

tests/hard_coded/Mmakefile:
tests/hard_coded/quantifier.m:
tests/hard_coded/quantifier.exp:
	Add a regression test for the above change.
1998-06-12 07:05:44 +00:00
Simon Taylor
98c2fbf51b Bug fixes.
Estimated hours taken: 12

Bug fixes.

tests/term/arit_exp.m still fails with --intermodule-optimization
due to a slightly different (but correct) trans_opt file being produced.

compiler/simplify.m
	Don't produce singleton disjunctions, since the code generator
	barfs on them. Use a `some' instead.
	Test case: tests/general/partition.m compiled with --deforestation.

compiler/unused_args.m
	Deconstructions where the arguments included `any' insts were
	not being handled correctly, due to inst_matches_binding
	failing for any->any.
	Test case: extras/trailed_update/samples/vqueens.m at -O3.
	Don't warn about predicates from `.opt' files having unused
	arguments, because in most cases the warning will be generated
	when compiling the imported module.

compiler/higher_order.m
	Fix a bug that caused compiler/modules.m to be miscompiled at
	-O3 --intermodule-optimization, due to curried arguments for
	multiple known higher-order arguments being passed to a
	specialised version in the wrong order.
	Test case: tests/hard_coded/ho_order2.m

compiler/mercury_compile.m
	Call intermod__update_pred_import_status when compiling to
	C at the same stage of the compilation as the `.opt' file
	was written to ensure that the same information is being used.
	Test case: tests/hard_coded/rational_test.m compiled with
	--intermodule-optimization failed because of a link error.
	Make sure polymorphism has been run before doing unused argument
	checking with --errorcheck-only. Otherwise the argument indices
	read in from `.opt' files are incorrect.

compiler/intermod.m
	Use code_util__compiler_generated to test if a called predicate
	is compiler generated, rather than looking for a call_unify_context
	(function calls have a call_unify_context).
	Add a progress message for updating the import status of predicates
	exported to `.opt' files.
	Fix a bug where the unused_args pragmas read in from the current
	module's `.opt' file were given an import_status of `imported' rather
	than `opt_imported' resulting in an error message from make_hlds.m.

compiler/dead_proc_elim.m
	Ensure that predicates used by instance declarations and
	`:- pragma export's are not eliminated by the dead_pred_elim
	pass before typechecking.
	Test case: most of the typeclass tests compiled with
	--intermodule-optimization.

compiler/hlds_goal.m
	Remove obsolete comments about the modes of a higher-order
	unification being incorrect after polymorphism, since that
	was fixed months ago.

compiler/options.m
	Reenable deforestation.
	Enable --intermodule-optimization and --intermod-unused-args
	at -O5 so they get tested occasionally.

compiler/handle_options.m
	Disable deforestation if --typeinfo-liveness is set, since
	there are bugs in the folding code if extra typeinfos are
	added to a new predicate's arguments by hlds_pred__define_new_pred.
	Disable higher_order.m if --typeinfo-liveness is set, since
	higher_order.m currently does not pass all necessary typeinfos
	to specialised versions or update the typeinfo_varmap of
	specialised versions.
	Test case: tests/valid/agc_ho_pred.m

tests/hard_coded/ho_order2.m
tests/hard_coded/ho_order2.exp
	Test case for higher_order.m.

tools/test_mercury
	Added --intermod-unused-args to the options for murlibobo.

extras/trailed_update/{samples,tests}/Mmakefile
	Add "-I.." to MGNUCFLAGS so gcc can find unsafe.h which
	is #included in c_header_code read from unsafe.opt.
1998-06-03 00:44:04 +00:00
Fergus Henderson
731ae2051f Allow a predicate to have matching cc' and non-cc' modes.
Estimated hours taken: 3

Allow a predicate to have matching `cc' and `non-cc' modes.

compiler/det_analysis.m:
	If there is a call to a cc procedure in a non-cc context,
	then search for a mode of that predicate which is
	identical to the called mode except that it is not cc.
	If such a mode is found, use it, rather than reporting
	an error.

compiler/modecheck_call.m:
	Add predicate modes_are_identical_bar_cc, for use by
	det_analysis.m.

NEWS:
LIMITATIONS:
doc/reference_manual.texi:
	Document the new feature and delete documentation about the
	lack of this feature.

tests/hard_coded/Mmakefile:
tests/hard_coded/cc_and_non_cc_test.m:
tests/hard_coded/cc_and_non_cc_test.exp:
	Add a test case for the new feature.
1998-05-30 15:23:14 +00:00
Fergus Henderson
935fbfe36e Add Mmake support for nested sub-modules.
Estimated hours taken: 6

Add Mmake support for nested sub-modules.

compiler/mercury_compile.m:
compiler/modules.m:
compiler/intermod.m:
	Pass down the source file name to various places.
	Store the source file name in the module_imports data structure.
	In various places, use this source file name instead of assuming
	that the source file name can be obtained from the module name.

compiler/modules.m:
	Change the generated .d and .dep files to use the source file names.
	Add hard-coded rules in the .d files if the source file name does not
	match the form expected by the pattern rules in scripts/Mmake.rules.
	XXX unfortunately the rules don't work right for parallel makes of
	    nested modules

scripts/Mmake.rules:
	Add a comment saying that any changes here might need to
	be duplicated in compiler/modules.m.

tests/hard_coded/Mmakefile:
tests/hard_coded/nested.m:
tests/hard_coded/nested2.m:
tests/hard_coded/nested.exp:
tests/hard_coded/nested2.exp:
	Add a couple of test cases for nested modules (XXX not enabled,
	due to the above-mentioned problem with parallel makes).

doc/reference_manual.texi:
	Update the "implementation bugs and limitations" section.

NEWS:
	Update the news about nested modules.
1998-05-27 04:00:54 +00:00
Fergus Henderson
44a5c5b2f8 Make the code a little bit more readable:
Estimated hours taken: 6

compiler/mercury_to_mercury.m:
compiler/mode_errors.m:
	Make the code a little bit more readable:
	use specific types rather than `bool' in a few places.

compiler/mercury_to_mercury.m:
	Fix bugs in the generation of interface files where it was
	outputting certain graphic tokens incorrectly.  In particular,
	it was outputting things like `module:?' without any parentheses,
	space, or quotes to separate the `:' as module qualifier from
	the symbol name.

tests/hard_coded/Mmakefile:
tests/hard_coded/quoting_bug.m:
tests/hard_coded/quoting_bug_test.m:
tests/hard_coded/quoting_bug_test.exp:
	Add some tests for the above-mentioned bug fix.

tests/term/*.trans_opt_exp:
tests/misc_tests/pretty_print_test.exp:
	Update expected output for these tests to reflect the
	above changes.
1998-05-20 13:10:50 +00:00
Simon Taylor
be2b948764 Disable cycles.m since it triggers a bug in code generation
Estimated hours taken: 1

tests/hard_coded/Mmakefile
	Disable cycles.m since it triggers a bug in code generation
	for disjunctions when compiled in a non-GC grade with --deforestation.

tests/hard_coded/cycles2.m
	cycles.m expanded so that deforestation is not needed to produce
	the problem.
1998-05-04 05:15:50 +00:00
Fergus Henderson
2dcd79773b Add `--gc conservative' to the GRADEFLAGS settings for
Estimated hours taken: 0.25

tests/hard_coded/Mmakefile:
	Add `--gc conservative' to the GRADEFLAGS settings for
	integer_test and rational_test, since these test cases both use
	enough memory that they require some kind of GC -- without it
	the test fails because it runs out of heap space.
1998-04-17 20:47:24 +00:00
Bert Thompson
30ef37923c Moved tests of library/{integer,rational}.m from tests/general to
Estimated hours taken: 0.1

Moved tests of library/{integer,rational}.m from tests/general to
tests/hard_coded since the library modules and their tests cannot
be compiled under NU-Prolog.

general/Mmakefile:
general/.cvsignore:
	Removed references to integer_test and rational_test.
general/integer_test.m:
general/integer_test.exp:
general/rational_test.exp:
general/rational_test.m:
	File removed.
hard_coded/Mmakefile:
hard_coded/.cvsignore:
	Added references to integer_test and rational_test.
hard_coded/integer_test.m:
hard_coded/integer_test.exp:
hard_coded/rational_test.exp:
hard_coded/rational_test.m:
	File added.
1998-04-16 12:00:32 +00:00
Fergus Henderson
f00346033a Make another small fix to mmake.in and add more empty definitions for various
Estimated hours taken: 0.5

Make another small fix to mmake.in and add more empty definitions for various
Mmake variables to avoid spurious warnings.

scripts/mmake.in:
	Add `*clean*' to the patterns for which we do not
	pass `--warn-undefined-variables'.

scripts/Mmake.rules:
	When invoking make recursively, pass $(MFLAGS) rather than
	$(MAKEOVERRIDES).  This avoids a warning, and is probably the
	right thing to do anyway (I'm not sure why I used MAKEOVERRIDES
	in the first place).

boehm_gc/Mmakefile:
tests/hard_coded/Mmakefile:
	Add empty definition for `MMAKEFLAGS'.
1998-04-02 13:23:10 +00:00
Fergus Henderson
713349d3e6 Move the rtc_bug' test case from the general'
Estimated hours taken: 0.2

tests/general/Mmakefile:
tests/general/rtc_bug.m:
tests/general/rtc_bug.exp:
tests/general/.cvsignore:
tests/hard_coded/Mmakefile:
tests/hard_coded/rtc_bug.m:
tests/hard_coded/rtc_bug.exp:
tests/hard_coded/.cvsignore:
	Move the `rtc_bug' test case from the `general'
	directory to the `hard_coded' directory, since it doesn't
	work in Prolog.
1998-04-02 13:18:47 +00:00
Fergus Henderson
86d6c4398e Move the relation_test' test case from the general'
Estimated hours taken: 0.25

tests/general/Mmakefile:
tests/general/relation_test.m:
tests/general/relation_test.exp:
tests/hard_coded/Mmakefile:
tests/hard_coded/relation_test.m:
tests/hard_coded/relation_test.exp:
	Move the `relation_test' test case from the `general'
	directory to the `hard_coded' directory, since it doesn't
	work in Prolog.
1998-03-27 16:42:32 +00:00
Fergus Henderson
002ad1c8d8 Fix a bug in string__base_string_to_int:
Estimated hours taken: 1

library/string.m:
	Fix a bug in string__base_string_to_int:
	it was handling MININT incorrectly.

tests/hard_coded/Mmakefile:
tests/hard_coded/minint_bug.m:
tests/hard_coded/minint_bug.exp:
	Regression test.
1998-03-18 14:16:20 +00:00
Fergus Henderson
9308d1815a Change the `rev_arith.m' test so that it only tests
Estimated hours taken: 0.25

tests/hard_coded/Mmakefile:
tests/hard_coded/rev_arith.m:
tests/hard_coded/rev_arith.exp:
	Change the `rev_arith.m' test so that it only tests
	for the things which we actually support, and enable it.
1998-03-11 19:36:28 +00:00
Fergus Henderson
2823abbcac Move the common_type_cast' test from the general' directory
Estimated hours taken: 0.25

tests/general/Mmakefile:
tests/general/common_type_cast.m:
tests/general/common_type_cast.exp:
tests/hard_coded/Mmakefile:
tests/hard_coded/common_type_cast.m:
tests/hard_coded/common_type_cast.exp:
	Move the `common_type_cast' test from the `general' directory
	to the `hard_coded' directory.  The reason for this was that
	the output under Mercury is slightly different to the output
	under NU-Prolog (the difference being trailing zeroes on
	floating point numbers); moving the test to the `hard_coded'
	directory was the simplest way of fixing this.
1998-03-10 11:09:30 +00:00
Fergus Henderson
11d8161692 Add support for nested modules.
Estimated hours taken: 50

Add support for nested modules.

- module names may themselves be module-qualified
- modules may contain `:- include_module' declarations
  which name sub-modules
- a sub-module has access to all the declarations in the
  parent module (including its implementation section).

This support is not yet complete; see the BUGS and LIMITATIONS below.

LIMITATIONS
- source file names must match module names
	(just as they did previously)
- mmc doesn't allow path names on the command line any more
	(e.g. `mmc --make-int ../library/foo.m').
- import_module declarations must use the fully-qualified module name
- module qualifiers must use the fully-qualified module name
- no support for root-qualified module names
	(e.g. `:parent:child' instead of `parent:child').
- modules may not be physically nested (only logical nesting, via
  `include_module').

BUGS
- doesn't check that the parent module is imported/used before allowing
	import/use of its sub-modules.
- doesn't check that there is an include_module declaration in the
	parent for each module claiming to be a child of that parent
- privacy of private modules is not enforced

-------------------

NEWS:
	Mention that we support nested modules.

library/ops.m:
library/nc_builtin.nl:
library/sp_builtin.nl:
compiler/mercury_to_mercury.m:
	Add `include_module' as a new prefix operator.
	Change the associativity of `:' from xfy to yfx
	(since this made parsing module qualifiers slightly easier).

compiler/prog_data.m:
	Add new `include_module' declaration.
	Change the `module_name' and `module_specifier' types
	from strings to sym_names, so that module names can
	themselves be module qualified.

compiler/modules.m:
	Add predicates module_name_to_file_name/2 and
	file_name_to_module_name/2.
	Lots of changes to handle parent module dependencies,
	to create parent interface (`.int0') files, to read them in,
	to output correct dependencies information for them to the
	`.d' and `.dep' files, etc.
	Rewrite a lot of the code to improve the readability
	(add comments, use subroutines, better variable names).
	Also fix a couple of bugs:
	- generate_dependencies was using the transitive implementation
	  dependencies rather than the transitive interface dependencies
	  to compute the `.int3' dependencies when writing `.d' files
	  (this bug was introduced during crs's changes to support
	  `.trans_opt' files)
	- when creating the `.int' file, it was reading in the
	  interfaces for modules imported in the implementation section,
	  not just those in the interface section.
	  This meant that the compiler missed a lot of errors.

library/graph.m:
library/lexer.m:
library/term.m:
library/term_io.m:
library/varset.m:
compiler/*.m:
	Add `:- import_module' declarations to the interface needed
	by declarations in the interface.  (The previous version
	of the compiler did not detect these missing interface imports,
	due to the above-mentioned bug in modules.m.)

compiler/mercury_compile.m:
compiler/intermod.m:
	Change mercury_compile__maybe_grab_optfiles and
	intermod__grab_optfiles so that they grab the opt files for
	parent modules as well as the ones for imported modules.

compiler/mercury_compile.m:
	Minor changes to handle parent module dependencies.
	(Also improve the wording of the warning about trans-opt
	dependencies.)

compiler/make_hlds.m:
compiler/module_qual.m:
	Ignore `:- include_module' declarations.

compiler/module_qual.m:
	A couple of small changes to handle nested module names.

compiler/prog_out.m:
compiler/prog_util.m:
	Add new predicates string_to_sym_name/3 (prog_util.m) and
	sym_name_to_string/{2,3} (prog_out.m).

compiler/*.m:
	Replace many occurrences of `string' with `module_name'.
	Change code that prints out module names or converts
	them to strings or filenames to handle the fact that
	module names are now sym_names intead of strings.
	Also change a few places (e.g. in intermod.m, hlds_module.m)
	where the code assumed that any qualified symbol was
	fully-qualified.

compiler/prog_io.m:
compiler/prog_io_goal.m:
	Move sym_name_and_args/3, parse_qualified_term/4 and
	parse_qualified_term/5 preds from prog_io_goal.m to prog_io.m,
	since they are very similar to the parse_symbol_name/2 predicate
	already in prog_io.m.  Rewrite these predicates, both
	to improve maintainability, and to handle the newly
	allowed syntax (module-qualified module names).
	Rename parse_qualified_term/5 as `parse_implicit_qualified_term'.

compiler/prog_io.m:
	Rewrite the handling of `:- module' and `:- end_module'
	declarations, so that it can handle nested modules.
	Add code to parse `include_module' declarations.

compiler/prog_util.m:
compiler/*.m:
	Add new predicates mercury_public_builtin_module/1 and
	mercury_private_builtin_module/1 in prog_util.m.
	Change most of the hard-coded occurrences of "mercury_builtin"
	to call mercury_private_builtin_module/1 or
	mercury_public_builtin_module/1 or both.

compiler/llds_out.m:
	Add llds_out__sym_name_mangle/2, for mangling module names.

compiler/special_pred.m:
compiler/mode_util.m:
compiler/clause_to_proc.m:
compiler/prog_io_goal.m:
compiler/lambda.m:
compiler/polymorphism.m:
	Move the predicates in_mode/1, out_mode/1, and uo_mode/1
	from special_pred.m to mode_util.m, and change various
	hard-coded definitions to instead call these predicates.

compiler/polymorphism.m:
	Ensure that the type names `type_info' and `typeclass_info' are
	module-qualified in the generated code.  This avoids a problem
	where the code generated by polymorphism.m was not considered
	type-correct, due to the type `type_info' not matching
	`mercury_builtin:type_info'.

compiler/check_typeclass.m:
	Simplify the code for check_instance_pred and
	get_matching_instance_pred_ids.

compiler/mercury_compile.m:
compiler/modules.m:
	Disallow directory names in command-line arguments.

compiler/options.m:
compiler/handle_options.m:
compiler/mercury_compile.m:
compiler/modules.m:
	Add a `--make-private-interface' option.
	The private interface file `<module>.int0' contains
	all the declarations in the module; it is used for
	compiling sub-modules.

scripts/Mmake.rules:
scripts/Mmake.vars.in:
	Add support for creating `.int0' and `.date0' files
	by invoking mmc with `--make-private-interface'.

doc/user_guide.texi:
	Document `--make-private-interface' and the `.int0'
	and `.date0' file extensions.

doc/reference_manual.texi:
	Document nested modules.

util/mdemangle.c:
profiler/demangle.m:
	Demangle names with multiple module qualifiers.

tests/general/Mmakefile:
tests/general/string_format_test.m:
tests/general/string_format_test.exp:
tests/general/string__format_test.m:
tests/general/string__format_test.exp:
tests/general/.cvsignore:
	Change the `:- module string__format_test' declaration in
	`string__format_test.m' to `:- module string_format_test',
	because with the original declaration the `__' was taken
	as a module qualifier, which lead to an error message.
	Hence rename the file accordingly, to avoid the warning
	about file name not matching module name.

tests/invalid/Mmakefile:
tests/invalid/missing_interface_import.m:
tests/invalid/missing_interface_import.err_exp:
	Regression test to check that the compiler reports
	errors for missing `import_module' in the interface section.

tests/invalid/*.err_exp:
tests/warnings/unused_args_test.exp:
tests/warnings/unused_import.exp:
	Update the expected diagnostics output for the test cases to
	reflect a few minor changes to the warning messages.

tests/hard_coded/Mmakefile:
tests/hard_coded/parent.m:
tests/hard_coded/parent.child.m:
tests/hard_coded/parent.exp:
tests/hard_coded/parent2.m:
tests/hard_coded/parent2.child.m:
tests/hard_coded/parent2.exp:
	Two simple tests case for the use of nested modules with
	separate compilation.
1998-03-03 17:48:14 +00:00
Fergus Henderson
5f196b4f9b Fix a bug which caused the compiler to generate incorrect
Estimated hours taken: 0.75

compiler/modecheck_unify.m:
	Fix a bug which caused the compiler to generate incorrect
	code for the case where a function had the same name and arity
	as a data constructor (but a different return type),
	and the data constructor was used with an explicit module
	qualifier -- it incorrectly ignored the types and chose
	the function rather than the data constructor.

tests/hard_coded/Mmakefile:
tests/hard_coded/func_ctor_ambig.m:
tests/hard_coded/func_ctor_ambig.exp:
	Regression test.
1998-02-19 03:17:16 +00:00
Zoltan Somogyi
5e333f4424 Fix a bug that broke Tom's implementation of a random number generator at -O6.
Estimated hours taken: 3

Fix a bug that broke Tom's implementation of a random number generator at -O6.
The bug appeared only if value numbering is run for a second time after most
other low-level optimizations have been repeated several times. The problem
was that the first invocation of value numbering introduces a temp variable,
and the second one deletes the assignment to the temp variable because an
if_val with a liveness annotation comes between this assignment and the
first use of the temp variable.

compiler/livemap.m:
	When an if_val is preceded by a livevals annotation,
	do not replace the current liveness with the contents
	of the annotation. Instead, just include the contents
	of the annotation in the current set of live lvals.

tests/hard_coded/rnd.{m,exp}:
	Tom's test case.

tests/hard_coded/Mmakefile:
	Always run Tom's test case at -O6.
1998-02-18 03:24:46 +00:00
Fergus Henderson
9335ac4e70 Fix another bug in the handling of the `typeclasses'
Estimated hours taken: 0.25

tests/hard_coded/Mmakefile:
	Fix another bug in the handling of the `typeclasses'
	subdirectory: ensure that variables are quoted when
	passing them down to make subdirectories, so that it
	works for settings such as EXTRA_MCFLAGS="-O2 --opt-space"
	which contain embedded spaces.
1998-02-05 02:51:15 +00:00
Fergus Henderson
7788661dee Link the mode_choice' test with --no-strip', to
Estimated hours taken: 0.5

tests/hard_coded/Mmakefile:
	Link the `mode_choice' test with `--no-strip', to
	work around a probably bug in the Solaris linker.
1998-02-04 06:29:40 +00:00
Fergus Henderson
57797ed0eb Fix a couple of bugs introduced when dgj added a `typeclasses'
Estimated hours taken: 0.5

tests/hard_coded/Mmakefile:
	Fix a couple of bugs introduced when dgj added a `typeclasses'
	subdirectory:
	- ensure that `mmake clean' and `mmake realclean' recursively
	  clean the subdirectories
	- when recursively invoking the Mmakefiles in subdirectories,
	  make sure we pass down the values of the GRADE, EXTRA_CFLAGS
	  and EXTRA_MCFLAGS variables.
1998-02-04 04:36:57 +00:00
David Jeffery
94f3114b40 Remove typeclass_test_* from the Mmakefile, as these tests now reside
Estimated hours taken: 0.05

tests/hard_coded/Mmakefile:
	Remove typeclass_test_* from the Mmakefile, as these tests now reside
	in the tyepclasses directory.
1998-01-29 23:54:58 +00:00