%************************************************************************
\begin{code}
+use 5; # require Perl version 5 or later.
+
($Pgm = $0) =~ s|.*/||;
$ShortUsage = "\nUsage: For basic information, try the `-help' option.\n";
$LongUsage = "\n" . <<EOUSAGE;
: "$TopPwd/${CURRENT_DIR}" );
if ( $ENV{'TMPDIR'} ) { # where to make tmp file names
- $Tmp_prefix = ($ENV{'TMPDIR'} . "/ghc$$");
+ # Try to find a $Tmp_prefix which isn't being used...
+ $tmp = $$;
+ do {
+ $Tmp_prefix = ($ENV{'TMPDIR'} . "/ghc$tmp");
+ $tmp++;
+ } while ( -e "$Tmp_prefix.hc" ||
+ -e "$Tmp_Prefix.s" ||
+ -e "$Tmp_Prefix.hi" );
} else {
print STDERR "TMPDIR has not been set to anything useful!\n" if (${TMPDIR} eq '');
$Tmp_prefix ="${TMPDIR}/ghc$$"; # TMPDIR set via Makefile when booting..
-fwarn-overlapping-patterns
-fwarn-missing-methods
+ -fwarn-missing-fields
+ -fwarn-deprecations
-fwarn-duplicate-exports
these are turned off by -Wnot.
@StandardWarnings = ('-fwarn-overlapping-patterns',
'-fwarn-missing-methods',
'-fwarn-missing-fields',
+ '-fwarn-deprecations',
'-fwarn-duplicate-exports');
@MinusWOpts = (@StandardWarnings,
'-fwarn-unused-binds',
$Static = 1;
$Static = 0 if ($EnableWin32DLLs eq 'YES');
-# native code-gen or via C?
+# Output language
$HaveNativeCodeGen = $GhcWithNativeCodeGen;
-$HscOut = '-C='; # '-C=' ==> .hc output; '-S=' ==> .s output; '-N=' ==> neither
-$HscOut = '-S='
- if ($HaveNativeCodeGen ne 'YES') && $TargetPlatform =~ /^(alpha)-/;
-# TEMP: disable x86 & Sparc if $HaveNativeCodeGen && $TargetPlatform =~ /^(i386|alpha|sparc)-/;
+$HscLang = 'C'; # 'C' ==> .hc output;
+ # 'asm' ==> .s output;
+ # 'java' ==> .java output
+ # 'none' ==> no code output
+$HscLang = 'asm'
+ if ($HaveNativeCodeGen eq 'YES') && $TargetPlatform =~ /^(i386)-/;
+
$ProduceHi = '-hifile=';
$HiOnStdout = 0;
$HiWith = '';
$CollectGhcTimings = 0;
$DEBUGging = ''; # -DDEBUG and all that it entails (um... not really)
$PROFing = ''; # set to p or e if profiling
-$PROFgroup = ''; # set to group if an explicit -Ggroup specified
$PROFauto = ''; # set to relevant hsc flag if -auto or -auto-all
$PROFcaf = ''; # set to relevant hsc flag if -caf-all
$PROFdict = ''; # set to relevant hsc flag if -auto-dicts
$HiSuffix = 'hi';
$HiSuffix_prelude = '';
$CompilingPrelude=0;
-$Do_recomp_chkr = 0; # don't use the recompilatio checker unless asked
+$Do_recomp_chkr = 1; # Use the recompilation checker by default
$Do_cc = -1; # a MAGIC indeterminate value; will be set to 1 or 0.
$Do_as = 1;
that's run. (Um, well, howzabout the simplifier just once more...)
\end{description}
-STG-TO-STG PASSES:
-\begin{description}
-\item[\tr{-fupdate-analysis}:]
-It really really wants to be the last STG-to-STG pass that is run.
-\end{description}
-
\begin{code}
sub setupOptimiseFlags {
'-fno-rules', # Similarly, don't apply any rules until after full laziness
# Notably, list fusion can prevent floating.
+ '-fno-case-of-case', # Don't do case-of-case transformations.
+ # This makes full laziness work better
+
'-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-outwards',
'-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',
-# ']',
-
-
'-fsimplify',
'[',
'-finline-phase1',
# before strictness analysis runs
'-finline-phase2',
- $Oopt_MaxSimplifierIterations,
+ '-fmax-simplifier-iterations2',
']',
+ '-fsimplify',
+ '[',
+ '-fmax-simplifier-iterations2',
+ # No -finline-phase: allow all Ids to be inlined now
+ # This gets foldr inlined before strictness analysis
+ ']',
+
'-fstrictness',
'-fcpr-analyse',
'-fworker-wrapper',
# No -finline-phase: allow all Ids to be inlined now
']',
- '-ffull-laziness', # nofib/spectral/hartel/wang doubles in speed if you
+ '-ffloat-outwards', # 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)
+# Leave out lambda lifting for now
+# '-fsimplify', # Tidy up results of full laziness
+# '[',
+# '-fmax-simplifier-iterations2',
+# ']',
+# '-ffloat-outwards-full',
+
# We want CSE to follow the final full-laziness pass, because it may
# succeed in commoning up things floated out by full laziness.
#
# SPECIAL FLAGS for -O2
($OptLevel == 2) ? (
- '-fupdate-analysis', # virtually useless; relegated to -O2
- '-fsemi-tagging',
+ # none at the present time
) : (),
);
if ( $BuildTag ne '' ) { # something other than normal sequential...
local($Tag) = "${BuildTag}";
- $Tag =~ s/_//; # move the underscore to the back
+ $Tag =~ s/_//; # move the underscore to the back
- $HscOut = '-C='; # must go via C
+ $HscLang = 'C'; # must go via C
&processArgs(split(' ', $SetupOpts{$BuildTag}));
# eval($EvaldSetupOpts{$BuildTag});
}
,'-u', "${uscore}PrelAddr_I64zh_con_info"
,'-u', "${uscore}PrelAddr_W64zh_con_info"
,'-u', "${uscore}PrelStable_StablePtr_con_info"
- ,'-u', "${uscore}PrelBase_False_static_closure"
- ,'-u', "${uscore}PrelBase_True_static_closure"
+ ,'-u', "${uscore}PrelBase_False_closure"
+ ,'-u', "${uscore}PrelBase_True_closure"
,'-u', "${uscore}PrelPack_unpackCString_closure"
,'-u', "${uscore}PrelException_stackOverflow_closure"
,'-u', "${uscore}PrelException_heapOverflow_closure"
- ,'-u', "${uscore}PrelException_NonTermination_static_closure"
+ ,'-u', "${uscore}PrelException_NonTermination_closure"
+ ,'-u', "${uscore}PrelException_PutFullMVar_closure"
+ ,'-u', "${uscore}PrelException_BlockedOnDeadMVar_closure"
+ ,'-u', "${uscore}__init_Prelude"
+ ,'-u', "${uscore}__init_PrelMain"
));
if (!$NoHaskellMain) {
unshift (@Ld_flags,'-u', "${uscore}PrelMain_mainIO_closure");
}
- if ($PROFing ne '') {
- unshift (@Ld_flags,'-u', "${uscore}_regPrelude");
- }
if ($TargetPlatform =~ /^powerpc-|^rs6000-/) {
# sometimes we have lots of toc entries...
# unshift(@Ld_flags, ('-Xlinker -bbigtoc -Xlinker -bnoquiet'));
unshift(@Ld_flags, ('-Xlinker -bbigtoc'));
}
-
+ if ($TargetPlatform =~ /^hppa/) {
+ unshift(@Ld_flags, ('-Xlinker +vnocompatwarnings'));
+ }
} # end of setupLinkOpts
push (@Include_dir, "$TopPwd/${CURRENT_DIR}/${GHC_INCLUDE_DIR}");
} else {
push (@Include_dir, "$InstLibDirGhc/includes");
- push (@Include_dir, "$InstLibDirGhc/includes");
}
} # end of setupIncPaths
\end{code}
\begin{code}
sub setupSyslibs {
- push(@SysLibrary, ( '-lHS', '-lHS_cbits' )); # basic I/O and prelude stuff
+ push(@SysLibrary, ( '-lHSstd', '-lHSstd_cbits' )); # basic I/O and prelude stuff
local($f);
foreach $f (@SysLibrary) {
#
local($do_cc) = ( $Do_cc != -1) # i.e., it was set explicitly
? $Do_cc
- : ( ($HscOut eq '-C=') ? 1 : 0 );
+ : ( ($HscLang eq 'C') ? 1 : 0 );
local($do_as) = $Do_as;
- local($hsc_out) = ( $HscOut eq '-C=' ) ? "$Tmp_prefix.hc" : "$Tmp_prefix.s" ;
- local($hsc_out_c_stub) = ( $HscOut eq '-C=' ) ? "${Tmp_prefix}_stb.c" : "";
- local($hsc_out_h_stub) = ( $HscOut eq '-C=' ) ? "${Tmp_prefix}_stb.h" : "";
+
+ local($hsc_out_suffix) = ( $HscLang eq 'C' ) ? "hc" :
+ ( $HscLang eq 'asm' ) ? "s" :
+ ( $HscLang eq 'java' ) ? "java" :
+ "" ;
+
+ local($hsc_out) = "$Tmp_prefix.$hsc_out_suffix" ;
+ local($hsc_out_c_stub) = "${Tmp_prefix}_stb.c";
+ local($hsc_out_h_stub) = "${Tmp_prefix}_stb.h";
if ($Only_preprocess_hc) { # stop after having run $Cc -E
$do_as=0;
phase) to @"$ifile_root.<suffix>"@.
\begin{code}
- local($going_interactive) = $HscOut eq '-N=' || $ifile_root eq '_stdin';
+ local($going_interactive) = $HscLang eq 'none' || $ifile_root eq '_stdin';
#
# Warning issued if -keep-hc-file-too is used without
# -fvia-C (or the equivalent)
#
- if ( $HscOut ne '-C=' && $Keep_hc_file_too ) {
+ if ( $HscLang ne 'C' && $Keep_hc_file_too ) {
print STDERR "$Pgm: warning: Native code generator to be used, -keep-hc-file-too will be ignored\n";
}
if (! $do_cc && ! $do_as) { # stopping after hsc
$hsc_out = ($Specific_output_file ne '')
? $Specific_output_file
- : &odir_ify($ifile_root, ($HscOut eq '-C=') ? 'hc' : 's');
+ : &odir_ify($ifile_root, $hsc_out_suffix);
$ofile_target = $hsc_out; # reset
}
# Tell the C compiler and assembler not to run
$do_cc = 0; $do_as = 0;
- # Update dependency info, touch both object file and
- # interface file, so that the following invariant is
- # maintained:
- #
- # a dependent module's interface file should after recompilation
- # checking be newer than the interface files of its imports.
- #
- # That is, if module A's interface file changes, then module B
- # (which import from A) needs to be checked.
- # If A's change does not affect B, which causes the compiler to bail
- # out early, we still need to touch the interface file of B. The reason
- # for this is that B may export A's interface.
+ # Update dependency info, by touching the object file
+ # This records in the file system that the work of
+ # recompiling this module has been done
#
&run_something("touch $ofile_target",
- "Touch $ofile_target, to propagate dependencies") if $HscOut ne '-N=';
- &run_something("touch $hifile_target",
- "Touch $hifile_target, to propagate dependencies") if $ProduceHi =~ /-nohifile=/ ;
+ "Touch $ofile_target, to propagate dependencies") if $HscLang ne 'none';
} else {
# If non-interactive, heave in the consistency info at the end
# NB: pretty hackish (depends on how $output is set)
if ( ! $going_interactive ) {
- if ( $HscOut eq '-C=' ) {
- $to_do = "echo 'static char ghc_hsc_ID[] = \"\@(#)hsc $ifile\t$HsC_major_version.$HsC_minor_version,$HsC_consist_options\";' >> $hsc_out";
+ if ( $HscLang eq 'C' ) {
+ $to_do = "echo 'static char ghc_hsc_ID[] = \"\@(#)hsc $ifile\t$HsC_major_version.$HsC_minor_version,$HsC_consist_options\";' >> $hsc_out";
- } elsif ( $HscOut eq '-S=' ) {
+ &run_something($to_do, 'Pin on Haskell consistency info');
+ } elsif ( $HscLang eq 'asm' ) {
local($consist) = "hsc.$ifile.$HsC_major_version.$HsC_minor_version.$HsC_consist_options";
$consist =~ s/,/./g;
$consist =~ s/\//./g;
$consist =~ s/-/_/g;
$consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
$to_do = "echo '\n\t.text\n$consist:' >> $hsc_out";
+ &run_something($to_do, 'Pin on Haskell consistency info');
}
- &run_something($to_do, 'Pin on Haskell consistency info');
+ # no consistency info for Java output files
}
}
# if we're going to split up object files,
# we inject split markers into the .hc file now
- if ( $HscOut eq '-C=' && $SplitObjFiles ) {
+ if ( $HscLang eq 'C' && $SplitObjFiles ) {
&inject_split_markers ( $hsc_out );
}
# save a copy of the .hc file, even if we are carrying on...
- if ($HscOut eq '-C=' && $do_cc && $Keep_hc_file_too) {
+ if ($HscLang eq 'C' && $do_cc && $Keep_hc_file_too) {
&saveIntermediate($ifile_root , "hc" , $hsc_out);
}
# set up for producing output/.hi; note that flag twiddling
# may mean that nothing will actually be produced:
- $output = "$ProduceHi$hsc_hi $HscOut$hsc_out -F=$hsc_out_c_stub -FH=$hsc_out_h_stub";
+ $oflags = ( $HscLang eq 'none' ? "" : "-olang=$HscLang -ofile=$hsc_out" ) ;
+ $output = "$ProduceHi$hsc_hi $oflags -F=$hsc_out_c_stub -FH=$hsc_out_h_stub";
push(@Files_to_tidy, $hsc_hi, $hsc_out, $hsc_out_c_stub, $hsc_out_h_stub );
# if we're compiling foo.hs, we want the GC stats to end up in foo.stat
local($lnkr) = ( $Lnkr ) ? $Lnkr : $CcRegd;
if ( ($Specific_output_file eq '') &&
- ($TargetPlatform eq 'i386-unknown-cygwin32') ) {
+ ( ($TargetPlatform eq 'i386-unknown-cygwin32') ||
+ ($TargetPlatform eq 'i386-unknown-mingw32')) ) {
$Specific_output_file = 'main.exe';
print STDERR "Output file not specified, defaulting to \"main.exe\"\n";
}
# =!=!=!=!=!=!=!=!=!=!=!
# This script is automatically generated: DO NOT EDIT!!!
# Generated by Glasgow Haskell, version ${ProjectVersion}
+# ngoqvam choHbogh vaj' vIHoHnISbej !!!!
#
\$pvm_executable = '$pvm_executable';
\$pvm_executable_base = '$pvm_executable_base';
}
if ( $a eq '-d' && $in_RTS_args ) {
$debug = '-';
- } elsif ( $a =~ /^-N(\d+)/ && $in_RTS_args ) {
+ } elsif ( $a =~ /^-qN(\d+)/ && $in_RTS_args ) {
+ $nprocessors = $1;
+ } elsif ( $a =~ /^-qp(\d+)/ && $in_RTS_args ) {
$nprocessors = $1;
} else {
push(@nonPVM_args, $a);
# need to add the -I flags in case the file is going through cpp (.S files)
local($includes) = '-I' . join(' -I', @Include_dir);
- if ( ! $SplitObjFiles ) {
+ if ( ! $SplitObjFiles || $ifile_root =~ /_stub\.s$/ ) {
local($to_do) = "$asmblr -o $as_out -c @As_flags $includes $cc_as";
push(@Files_to_tidy, $as_out );
&run_something($to_do, 'Unix assembler');
: "$TopPwd/hslibs/data"
)
, '' # where to find the cbits archive to use when linking
- , '' # Syslib dependencies
+ , 'lang' # Syslib dependencies
, '' # extra ghc opts
, '' # extra cc opts
, '' # extra ld opts
[ # where to slurp interface files from
( $INSTALLING
? "$InstLibDirGhc/imports/text"
- : "$TopPwd/hslibs/text:$TopPwd/hslibs/text/html"
+ : "$TopPwd/hslibs/text:$TopPwd/hslibs/text/html:$TopPwd/hslibs/text/haxml/lib"
)
, # where to find the archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
: "$TopPwd/hslibs/text/cbits"
)
- , 'lang' # Syslib dependencies
+ , 'lang data' # Syslib dependencies
, '' # extra ghc opts
, '' # extra cc opts
, '' # extra ld opts
[ # where to slurp interface files from
( $INSTALLING
? "$InstLibDirGhc/imports/util"
- : "$TopPwd/hslibs/util"
+ : "$TopPwd/hslibs/util:$TopPwd/hslibs/util/check"
)
, # where to find the archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
: "$TopPwd/hslibs/util/cbits"
)
- , 'lang concurrent' # Syslib dependencies
+ , 'lang concurrent posix' # Syslib dependencies
, '' # extra ghc opts
, '' # extra cc opts
- , '' # extra ld opts
+ , "$LibsReadline" # extra ld opts
],
win32,
arg: while($_ = $args[0]) {
shift(@args);
# sigh, we have to deal with these -option arg specially here.
- /^-(tmpdir|odir|ohi|o|isuf|osuf|hisuf|odump|syslib)$/ &&
+ /^-(tmpdir|odir|ohi|o|isuf|osuf|hisuf|odump|syslib|package|package-name)$/ &&
do { push(@Cmd_opts, $_); push(@Cmd_opts,$args[0]); shift(@args); next arg; };
/^--?./ && do { push(@Cmd_opts, $_); next arg; };
local ($final,$suffix,$tmp)= @_ ;
local ($to_do);
+ local ($new_suffix);
+
# $final -- root of where to park ${final}.${suffix}
# $tmp -- temporary file where hsc put the intermediate file.
+ # HWL: use -odir for .hc and .s files, too
+ if ( $Specific_output_dir ne '' ) {
+ $final = "${Specific_output_dir}/${final}";
+ }
+ # HWL: use the same suffix as for $Osuffix in generating intermediate file,
+ # replacing o with hc or s, respectively.
+ if ( $Osuffix ne '' ) {
+ ($new_suffix = $Osuffix) =~ s/o$/hc/ if $suffix eq "hc";
+ ($new_suffix = $Osuffix) =~ s/o$/s/ if $suffix eq "s";
+ $suffix = $new_suffix;
+ print stderr "HWL says: suffix for intermediate file is $suffix; ${final}.${suffix} overall\n" if $Verbose;
+ }
+
# Delete the old file
$to_do = "$Rm ${final}.${suffix}"; &run_something($to_do, "Removing old .${suffix} file");
# change the global default:
# we won't run cat; we'll run the real thing
- /^-C$/ && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscOut = '-C=';
+ /^-C$/ && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscLang = 'C';
next arg; };
# stop after generating C
- /^-noC$/ && do { $HscOut = '-N='; $ProduceHi = '-nohifile=';
+ /^-J$/ && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscLang = 'java';
+ next arg; };
+ # stop after generating Java
+
+ /^-noC$/ && do { $HscLang = 'none'; $ProduceHi = '-nohifile=';
$Do_cc = 0; $Do_as = 0; $Do_lnkr = 0;
next arg; };
# leave out actual C generation (debugging) [also turns off interface gen]
$PROFignore_scc = '-W';
next arg; };
- /^-G(.*)$/ && do { push(@HsC_flags, "-G=$1"); # set group for cost centres
- next arg; };
-
/^-unprof-scc-auto/ && do {
# generate auto SCCs on top level bindings when not profiling.
# Used to measure optimisation effects of presence of sccs.
/^-L(.*)/ && do { push(@UserLibrary_dir, &grab_arg_arg(*Args,'-L', $1)); next arg; };
/^-l(.*)/ && do { push(@UserLibrary,'-l'.&grab_arg_arg(*Args,'-l', $1)); next arg; };
+ # DEPRECATED: use -package instead
/^-syslib(.*)/ && do { local($syslib) = &grab_arg_arg(*Args,'-syslib',$1);
&add_syslib($syslib);
next arg; };
+ /^-package-name(.*)/ && do
+ { local($package) = &grab_arg_arg(*Args,'-package-name',$1);
+ push(@HsC_flags,"-inpackage=$package");
+ next arg;
+ };
+
+ /^-package(.*)/ && do { local($package) = &grab_arg_arg(*Args,'-package',$1);
+ &add_syslib($package);
+ next arg; };
+
#=======================================================================
# various flags that we can harmlessly send to one program or another
# (we will later "reclaim" some of the compiler ones now sent to gcc)
print STDERR "WARNING: don't know how to split objects on this platform: $TargetPlatform\n`-split-objs' option ignored\n";
} else {
$SplitObjFiles = 1;
- $HscOut = '-C=';
+ $HscLang = 'C';
push(@HsC_flags, "-fglobalise-toplev-names");
push(@CcBoth_flags, '-DUSE_SPLIT_MARKERS');
# ---------------
- /^-fasm-(.*)$/ && do { $HscOut = '-S='; next arg; }; # force using nativeGen
- /^-fvia-[cC]$/ && do { $HscOut = '-C='; next arg; }; # force using C compiler
+ /^-fasm-(.*)$/ && do { $HscLang = 'asm'; next arg; }; # force using nativeGen
+ /^-fvia-[cC]$/ && do { $HscLang = 'C'; next arg; }; # force using C compiler
# ---------------
local($opt_lev) = ( /^-O2$/ ) ? 2 : 1; # max 'em
$OptLevel = ( $opt_lev > $OptLevel ) ? $opt_lev : $OptLevel;
- $HscOut = '-C=' if $OptLevel == 2; # force use of C compiler
+ $HscLang = 'C'; # force use of C compiler
next arg; };
/^-Onot$/ && do { $OptLevel = 0; next arg; }; # # set it to <no opt>