'-fwarn-missing-methods',
'-fwarn-duplicate-exports');
@MinusWOpts = (@StandardWarnings,
- '-fwarn-incomplete-patterns',
'-fwarn-unused-binds',
+ '-fwarn-unused-matches',
+ '-fwarn-incomplete-patterns',
'-fwarn-unused-imports');
@MinusWallOpts = (@MinusWOpts,
- '-fwarn-unused-matches',
'-fwarn-type-defaults',
'-fwarn-name-shadowing',
'-fwarn-missing-signatures');
# Cpp symbols defined when we're processing Haskell source.
@HsSourceCppOpts =
- ( "-D__HASKELL1__=$Haskell1Version"
+ ( "-D__HASKELL__=98"
+ , "-D__HASKELL1__=$Haskell1Version"
, "-D__GLASGOW_HASKELL__=$ProjectVersionInt"
, "-D__HASKELL98__"
, "-D__CONCURRENT_HASKELL__"
$USPLint = '';
$StgLint = '';
+# The SplitMarker is the string/character used to mark end of element
+# in import lists.
+$SplitMarker = ':';
@Import_dir = ('.'); #-i things
@Include_dir = ('.'); #-I things; other default(s) stuck on AFTER option processing
'-ffoldr-build-on',
'-fdo-eta-reduction',
- '-fdo-case-elim',
'-fdo-lambda-eta-expansion',
'-fcase-of-case',
'-fcase-merge',
'-fsimplify',
'[',
- '-finline-phase1', # Don't inline rule Ids till specialisation has bitten
-
-# APR 99: the stuff in this comment is now
-# handled by -finline-phase1
-#
-# I don't understand why we want -fessential-unfoldings-only here
-# If we have it, the following nasty thing happens:
-# f = E
-# g* = f
-# ...g...
-# where "*" means exported.
-# In the essential-unfoldings pass we still substitute f for g
-# but we don't substitute E for f first. So we get
-# f = E
-# g* = f
-# ...f...
-# The g=f will get reverse-substituted later, but it's untidy. --SLPJ
-#
-# SDM: Here's why it's necessary.
-#
-# If we unfold in the first pass before the specialiser is run
-# we miss opportunities for specialisation because eg. wrappers
-# have been inlined for specialisable functions.
-#
-# This shows up in PrelArr.lhs - the specialised instance for newArray
-# calls the generic rangeSize, because rangeSize is strict and is
-# replaced by its wrapper by the simplifier.
-# '-fessential-unfoldings-only',
-# '-fsimpl-uf-use-threshold0',
-
- '-fmax-simplifier-iterations2',
+ '-finline-phase0', # Don't inline anything till full laziness has bitten
+ # In particular, inlining wrappers inhibits floating
+ # e.g. ...(case f x of ...)...
+ # ==> ...(case (case x of I# x# -> fw x#) of ...)...
+ # ==> ...(case x of I# x# -> case fw x# of ...)...
+ # and now the redex (f x) isn't floatable any more
+ '-fmax-simplifier-iterations2',
']',
+ # Specialisation is best done before full laziness
+ # so that overloaded functions have all their dictionary lambdas manifest
($Oopt_DoSpecialise) ? ( $Oopt_DoSpecialise, ) : (),
+ '-ffull-laziness',
+ '-ffloat-inwards',
+
+# '-fsimplify',
+# '[',
+# # Run the simplifier before specialising, so that overloaded functions
+# # look like f = \d -> ...
+# # (Full laziness may lift out something hiding the \d
+# '-finline-phase1',
+# '-fmax-simplifier-iterations1',
+# ']',
- $Oopt_UsageSPInf, # infer usage information here in case we need it later.
- # (add more of these where you need them --KSW 1999-04)
'-fsimplify',
'[',
- $Oopt_MaxSimplifierIterations,
-
- # Still don't inline transformation rule Ids, to give the
- # rules a good chance to fire
- '-finline-phase1',
+ '-finline-phase1',
+ # Want to run with inline phase 1 after the specialiser to give
+ # maximum chance for fusion to work before we inline build/augment
+ # in phase 2. This made a difference in 'ansi' where an overloaded
+ # function wasn't inlined till too late.
+ $Oopt_MaxSimplifierIterations,
']',
- '-ffull-laziness',
-
- '-ffloat-inwards',
+ $Oopt_UsageSPInf, # infer usage information here in case we need it later.
+ # (add more of these where you need them --KSW 1999-04)
'-fsimplify',
'[',
- '-finline-phase2',
- $Oopt_MaxSimplifierIterations,
+ # Need inline-phase2 here so that build/augment get
+ # inlined. I found that spectral/hartel/genfft lost some useful
+ # strictness in the function sumcode' if augment is not inlined
+ # before strictness analysis runs
+
+ '-finline-phase2',
+ $Oopt_MaxSimplifierIterations,
']',
+
'-fstrictness',
- # '-fcpr-analyse',
+ '-fcpr-analyse',
'-fworker-wrapper',
'-fsimplify',
# No -finline-phase: allow all Ids to be inlined now
']',
+ '-fcse', # CSE must immediately follow a simplification pass, because it relies
+ # on the no-shadowing invariant. See comments at the top of CSE.lhs
+
+ '-ffull-laziness', # nofib/spectral/hartel/wang doubles in speed if you
+ # do full laziness late in the day. It only happens
+ # after fusion and other stuff, so the early pass doesn't
+ # catch it. For the record, the redex is
+ # f_el22 (f_el21 r_midblock)
'-ffloat-inwards',
# Case-liberation for -O2. This should be after
'-fsimplify',
'[',
$Oopt_MaxSimplifierIterations,
+ # No -finline-phase: allow all Ids to be inlined now
']',
# '-fstatic-args',
,'-u', "${uscore}PrelPack_unpackCString_closure"
,'-u', "${uscore}PrelException_stackOverflow_closure"
,'-u', "${uscore}PrelException_heapOverflow_closure"
+ ,'-u', "${uscore}PrelException_NonTermination_static_closure"
));
if (!$NoHaskellMain) {
unshift (@Ld_flags,'-u', "${uscore}PrelMain_mainIO_closure");
}
if (-f $hsc_out_c_stub) {
- &run_something("cp $hsc_out_c_stub $ofile_c_stub_target", 'Copy foreign export C stubs');
+ &run_something("rm -f $ofile_c_stub_target && echo '#include \"${ofile_h_stub_target}\"' > $ofile_c_stub_target && cat $hsc_out_c_stub >> $ofile_c_stub_target", 'Copy foreign export C stubs');
local ($hsc_out_s_stub);
local ($hsc_out_o_stub);
($ofile_s_stub_target = $ofile_c_stub_target) =~ s/\.(.*)$/\.s/;
local($ifile_root, $hsc_out, $hsc_hi, $hsc_out_c_stub, $hsc_out_h_stub, $going_interactive) = @_;
&makeHiMap() unless $HiMapDone;
- push(@HsC_flags, "-himap=$HiIncludeString");
+ push(@HsC_flags, "\"-himap=$HiIncludeString\"");
+ push(@HsC_flags, "\"-himap-sep=${SplitMarker}\"");
# here, we may produce .hc/.s and/or .hi files
local($output) = '';
# emit nofibbish time/bytes-alloc stats to stderr;
# see later .stat file post-processing
print STDERR "warning: both -Rgc-stats and -Rghc-timing used, -Rghc-timing wins." if $CollectingGCstats;
- push(@HsC_rts_flags, "-s$Tmp_prefix.stat");
+ push(@HsC_rts_flags, "-S$Tmp_prefix.stat");
push(@Files_to_tidy, "$Tmp_prefix.stat");
}
foreach $d ( @Import_dir ) {
if ($HiIncludeString) {
- $HiIncludeString = "$HiIncludeString:${d}%.${HiSuffix}";
+ $HiIncludeString = "$HiIncludeString${SplitMarker}${d}%.${HiSuffix}";
} else {
$HiIncludeString = "$d%.${HiSuffix}";
}
foreach $d ( @SysImport_dir ) {
if ($HiIncludeString) {
- $HiIncludeString = "$HiIncludeString:${d}%.${HiSuffix_prelude}";
+ $HiIncludeString = "$HiIncludeString${SplitMarker}${d}%.${HiSuffix_prelude}";
} else {
$HiIncludeString = "${d}%.${HiSuffix_prelude}";
}
print STDERR "WARNING: import paths cleared by `-i'\n";
next arg; };
- /^-i(.*)/ && do { local(@new_items)
- = split( /:/, &grab_arg_arg(*Args,'-i', $1));
+ /^-i(.*)/ && do { local(@new_items);
+ local($arg) = $1;
+
+ #
+ if ( $arg =~ /;/ ) {
+ $SplitMarker=";";
+ @new_items = split( /;/, &grab_arg_arg(*Args,'-i', $arg));
+ } else {
+ @new_items = split( /:/, &grab_arg_arg(*Args,'-i', $arg));
+ }
unshift(@Import_dir, @new_items);
next arg; };
/^-fallow-overlapping-instances$/ && do { push(@HsC_flags, $_); next arg; };
/^-fallow-undecidable-instances$/ && do { push(@HsC_flags, $_); next arg; };
/^-fhistory-size.*$/ && do { push(@HsC_flags, $_); next arg; };
+ /^-fdicts-strict$/ && do { push(@HsC_flags, $_); next arg; };
/^-fglasgow-exts$/
&& do { push(@HsC_flags, $_);