%************************************************************************
\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;
HOSTPLATFORM TARGETPLATFORM
-ProjectName ProjectVersion ProjectVersionInt ProjectPatchLevel
+ProjectName ProjectVersion ProjectVersionInt
HscMajorVersion HscMinorVersion CcMajorVersion CcMinorVersion
CURRENT_DIR TMPDIR
-GHC_LIB_DIR GHC_RUNTIME_DIR GHC_UTILS_DIR GHC_INCLUDE_DIR
+GHC_LIB_DIR GHC_RUNTIME_DIR GHC_INCLUDE_DIR
GHC_OPT_HILEV_ASM GhcWithNativeCodeGen
-GHC_UNLIT GHC_HSCPP GHC_HSC GHC_SYSMAN
+GHC_UNLIT GHC_HSCPP GHC_MKDEPENDHS GHC_HSC GHC_SYSMAN
CP RM CONTEXT_DIFF
-WAY_*_NAME WAY_*_HC_OPTS
+WAY_*_NAME WAY_*_REAL_OPTS
LeadingUnderscore
+GhcWithRegisterised
+
\end{verbatim}
Establish what executables to run for the various phases, what the
: "$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..
sub setupOptFlags {
$Oopt_MaxSimplifierIterations = '-fmax-simplifier-iterations4';
$Oopt_PedanticBottoms = '-fpedantic-bottoms'; # ON by default
- $Oopt_MonadEtaExpansion = '';
$Oopt_FinalStgProfilingMassage = '';
$Oopt_StgStats = '';
$Oopt_DoSpecialise = '-fspecialise';
$Oopt_FoldrBuild = 0; # *Off* by default!
- $Oopt_FB_Support = ''; # was '-fdo-arity-expand';
-# $Oopt_FoldrBuildWW = 0; # Off by default
- $Oopt_FoldrBuildInline = ''; # was '-fdo-inline-foldr-build';
$Oopt_UsageSPInf = ''; # Off by default
- $Oopt_ShowSimplifierProgress = '';
} # end of setupOptFlags
# Assign defaults to these right away.
-fwarn-overlapping-patterns
-fwarn-missing-methods
+ -fwarn-missing-fields
+ -fwarn-deprecations
-fwarn-duplicate-exports
these are turned off by -Wnot.
\begin{code}
@StandardWarnings = ('-fwarn-overlapping-patterns',
'-fwarn-missing-methods',
+ '-fwarn-missing-fields',
+ '-fwarn-deprecations',
'-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');
$BuildTag = ''; # default is sequential build w/ Appel-style GC
%BuildDescr = (# system ways begin
- '', 'normal sequential',
- '_p', "$WAY_p_NAME",
- '_t', "$WAY_t_NAME",
- '_u', "$WAY_u_NAME",
- '_mp', "$WAY_mp_NAME",
- '_mg', "$WAY_mg_NAME",
+ '', 'Normal Sequential',
+ '_p', "Profiling",
+ '_t', "Ticky-ticky Profiling",
+ '_u', "Unregisterised",
+ '_s', "SMP",
+ '_mp', "Parallel",
+ '_mg', "Gransim",
# system ways end
'_a', "$WAY_a_NAME",
'_b', "$WAY_b_NAME",
#
%SetupOpts =
(
- '_a', "$WAY_a_HC_OPTS",
- '_b', "$WAY_b_HC_OPTS",
- '_c', "$WAY_c_HC_OPTS",
- '_d', "$WAY_d_HC_OPTS",
- '_e', "$WAY_e_HC_OPTS",
- '_f', "$WAY_f_HC_OPTS",
- '_g', "$WAY_g_HC_OPTS",
- '_h', "$WAY_h_HC_OPTS",
- '_i', "$WAY_i_HC_OPTS",
- '_j', "$WAY_j_HC_OPTS",
- '_k', "$WAY_k_HC_OPTS",
- '_l', "$WAY_l_HC_OPTS",
- '_m', "$WAY_m_HC_OPTS",
- '_n', "$WAY_n_HC_OPTS",
- '_o', "$WAY_o_HC_OPTS",
- '_A', "$WAY_A_HC_OPTS",
- '_B', "$WAY_B_HC_OPTS",
+ '_a', "$WAY_a_REAL_OPTS",
+ '_b', "$WAY_b_REAL_OPTS",
+ '_c', "$WAY_c_REAL_OPTS",
+ '_d', "$WAY_d_REAL_OPTS",
+ '_e', "$WAY_e_REAL_OPTS",
+ '_f', "$WAY_f_REAL_OPTS",
+ '_g', "$WAY_g_REAL_OPTS",
+ '_h', "$WAY_h_REAL_OPTS",
+ '_i', "$WAY_i_REAL_OPTS",
+ '_j', "$WAY_j_REAL_OPTS",
+ '_k', "$WAY_k_REAL_OPTS",
+ '_l', "$WAY_l_REAL_OPTS",
+ '_m', "$WAY_m_REAL_OPTS",
+ '_n', "$WAY_n_REAL_OPTS",
+ '_o', "$WAY_o_REAL_OPTS",
+ '_A', "$WAY_A_REAL_OPTS",
+ '_B', "$WAY_B_REAL_OPTS",
# system ways
- '_p', "$WAY_p_HC_OPTS",
- '_t', "$WAY_t_HC_OPTS",
- '_u', "$WAY_u_HC_OPTS",
- '_mp', "$WAY_mp_HC_OPTS",
- '_mg', "$WAY_mg_HC_OPTS");
-
-\end{code}
-
-Import/include directories (\tr{-I} options) are sufficiently weird to
-require special handling.
-
-\begin{code}
-@Import_dir = ('.'); #-i things
-@Include_dir = ('.'); #-I things; other default(s) stuck on AFTER option processing
+ '_p', "-fscc-profiling -DPROFILING -optc-DPROFILING",
+ '_t', "-fticky-ticky -DTICKY_TICKY -optc-DTICKY_TICKY",
+ '_u', "-optc-DNO_REGS -optc-DUSE_MINIINTERPRETER -fno-asm-mangling -funregisterised",
+ '_s', "-fsmp -optc-pthread -optl-pthread -optc-DSMP",
+ '_mp', "-fparallel -D__PARALLEL_HASKELL__ -optc-DPAR",
+ '_mg', "-fgransim -D__GRANSIM__ -optc-DGRAN");
# where to look for interface files (system hi's, i.e., prelude and syslibs)
@SysImport_dir = ( $INSTALLING )
# 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__"
);
-@UserLibrary_dir= (); #-L things;...
-@UserLibrary = (); #-l things asked for by the user
@SysLibrary_dir = ( ( $INSTALLING ) #-syslib things supplied by the system
? $InstLibDirGhc
, "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/std/cbits"
)
);
-@SysLibrary = (); # will be built up as we go along
-
-$TopClosureFile # defaults to 1.2 one; will be mangled later
- = '';
-# ( $INSTALLING) ? "$InstLibDirGhc/TopClosureXXXX.o"
-# : "$TopPwd/$CURRENT_DIR/$GHC_RUNTIME_DIR/main/TopClosureXXXX.o";
# make depend for Haskell
$MkDependHS
= ( $INSTALLING ) ? "$InstLibExecDirGhc/mkdependHS"
- : "$TopPwd/$CURRENT_DIR/$GHC_UTILS_DIR/mkdependHS/mkdependHS";
+ : "$TopPwd/$CURRENT_DIR/$GHC_MKDEPENDHS";
# Fill in later
@MkDependHS_flags = ();
# reset the following options:
# RTS flags to use while compiling
@HsC_rts_flags = ();
-@HsP_flags = (); # these are the flags destined solely for
- # the flex/yacc parser
@HsC_flags = ();
@HsC_antiflags = ();
\end{code}
$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
+@UserLibrary_dir= (); #-L things;...
+@UserLibrary = (); #-l things asked for by the user
+@SysLibrary = (); # will be built up as we go along
\end{code}
We are given a list of files with various presumably-known suffixes
$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
$TICKYing = ''; # set to t if compiling for ticky-ticky profiling
$PARing = ''; # set to p if compiling for PAR
$GRANing = ''; # set to g if compiling for GRAN
+$UNREGing = ($GhcWithRegisterised eq 'YES') ? '' : 'u';
$Specific_hi_file = ''; # set by -ohi <file>; "-" for stdout
$Specific_dump_file = ''; # set by -odump <file>; "-" for stdout
$Using_dump_file = 0;
$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;
if ( $Status == 0 && $Only_generate_deps ) {
push (@MkDependHS_flags, "-o$Osuffix") if $Osuffix;
- push (@MkDependHS_flags, "-s$BuildTag") if $BuildTag;
# They're not (currently) needed, but we need to quote any -#include options
foreach (@Cmd_opts) {
s/-#include.*$/'$&'/g;
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 {
+ # this pass-ordering sequence was agreed by Simon and Andr\'e
+ # (WDP 94/07, 94/11).
+
@HsC_minusNoO_flags
- = ( '-fsimplify',
- '[',
- $Oopt_FB_Support,
- '-ffloat-lets-exposing-whnf',
- '-ffloat-primops-ok',
- '-fcase-of-case',
- '-fdo-case-elim',
-# '-fdo-lambda-eta-expansion', # too complicated
- '-freuse-con',
-# '-flet-to-case', # no strictness analysis, so...
- $Oopt_PedanticBottoms,
-# $Oopt_MonadEtaExpansion, # no thanks
-
-# These two work fine, if you really want no simplification at all,
-# for bizarre test reasons. But you get really terrible code if you use them,
-# for example: let x = e in x
-# with dozens of redundant thunks etc. So I'm leaving them out.
-#
-# '-fsimpl-uf-use-threshold0',
-# '-fessential-unfoldings-only',
-
- #
- # The presence of -fclone-binds is *temporary* to work around
- # the fact that the desugarer in 3.0{2.3} does generate
- # bindings with identical ids, and the type checker doesn't perform
- # properly cloned type substitutions. Instead, we make sure that all
- # binders are cloned first time through the simplifier.
- #
- # Will be properly fixed in the `new compiler` I hear, at which point
- # the cloning can be turned off here.
- #
- # Let's find out..
- #'-fclone-binds',
-
- $Oopt_MaxSimplifierIterations,
- $Oopt_ShowSimplifierProgress,
+ = (
+ '-fsimplify',
+ '[',
+ $Oopt_MaxSimplifierIterations,
']',
- $Oopt_AddAutoSccs,
-# '-ffull-laziness', # removed 95/04 WDP following Andr\'e's lead
+ $Oopt_AddAutoSccs,
$Oopt_FinalStgProfilingMassage
);
@HsC_minusO_flags # NOTE: used for *both* -O and -O2 (some conditional bits)
= (
+ '-ffoldr-build-on',
+
'-fdo-eta-reduction',
+ '-fdo-lambda-eta-expansion',
+ '-fcase-of-case',
+ '-fcase-merge',
+ '-flet-to-case',
+ $Oopt_PedanticBottoms,
# initial simplify: mk specialiser happy: minimum effort please
+
'-fsimplify',
'[',
- $Oopt_FB_Support,
- '-fkeep-spec-pragma-ids', # required before specialisation
-
-# 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.
+ '-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
- '-fessential-unfoldings-only',
- '-fsimpl-uf-use-threshold0',
+ '-fno-rules', # Similarly, don't apply any rules until after full laziness
+ # Notably, list fusion can prevent floating.
- # See remark re: cloning in defn of minusnotO
- '-fclone-binds',
+ '-fno-case-of-case', # Don't do case-of-case transformations.
+ # This makes full laziness work better
- '-fdo-case-elim',
- '-fmax-simplifier-iterations1',
- $Oopt_PedanticBottoms,
+ '-fmax-simplifier-iterations2',
']',
- ($Oopt_DoSpecialise) ? (
- $Oopt_DoSpecialise,
- ) : (),
+ # Specialisation is best done before full laziness
+ # so that overloaded functions have all their dictionary lambdas manifest
+ ($Oopt_DoSpecialise) ? ( $Oopt_DoSpecialise, ) : (),
+ '-ffloat-outwards',
+ '-ffloat-inwards',
+
+ '-fsimplify',
+ '[',
+ '-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,
+ ']',
$Oopt_UsageSPInf, # infer usage information here in case we need it later.
# (add more of these where you need them --KSW 1999-04)
- '-fsimplify', # need dependency anal after specialiser ...
- '[', # need tossing before calc-inlinings ...
- $Oopt_FB_Support,
- '-ffloat-lets-exposing-whnf',
- '-ffloat-primops-ok',
- '-fcase-of-case',
- '-fdo-case-elim',
- '-fcase-merge',
-# '-fdo-eta-reduction',
- '-fdo-lambda-eta-expansion',
- '-freuse-con',
- $Oopt_PedanticBottoms,
- $Oopt_MonadEtaExpansion,
- $Oopt_MaxSimplifierIterations,
- $Oopt_ShowSimplifierProgress,
- #
- # The presence of -fclone-binds is *crucial* here as
- # -ffull-laziness (which we're about to do next) floats
- # bindings outwards, so we better make sure that this
- # doesn't result in the floating out of bindings
- # with identical uniques, i.e., -ffull-laziness needs
- # to be preceeded by a simplifier pass with -fclone-binds
- # set.
- '-fclone-binds',
- ']',
-
-# ($Oopt_FoldrBuildWW) ? (
-# '-ffoldr-build-ww-anal',
-# '-ffoldr-build-worker-wrapper',
-# '-fsimplify',
-# '[',
-# $Oopt_FB_Support,
-# '-ffloat-lets-exposing-whnf',
-# '-ffloat-primops-ok',
-# '-fcase-of-case',
-# '-fdo-case-elim',
-# '-fcase-merge',
-# '-fdo-eta-reduction',
-# '-fdo-lambda-eta-expansion',
-# '-freuse-con',
-# $Oopt_PedanticBottoms,
-# $Oopt_MonadEtaExpansion,
-# $Oopt_MaxSimplifierIterations,
-# $Oopt_ShowSimplifierProgress,
-# ']',
-# ) : (),
+ '-fsimplify',
+ '[',
+ # 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
- # this pass-ordering sequence was agreed by Simon and Andr\'e
- # (WDP 94/07, 94/11).
- '-ffull-laziness',
-
- ($Oopt_FoldrBuild) ? (
- '-ffoldr-build-on', # desugar list comprehensions for foldr/build
-
- '-fsimplify',
- '[',
- '-fignore-inline-pragma', # **** NB!
- '-fdo-foldr-build', # NB
- $Oopt_FB_Support,
- '-ffloat-lets-exposing-whnf',
- '-ffloat-primops-ok',
- '-fcase-of-case',
- '-fdo-case-elim',
- '-fcase-merge',
-# '-fdo-eta-reduction',
- '-fdo-lambda-eta-expansion', # After full laziness
- '-freuse-con',
- $Oopt_PedanticBottoms,
- $Oopt_MonadEtaExpansion,
- $Oopt_MaxSimplifierIterations,
- $Oopt_ShowSimplifierProgress,
- ']',
- ) : (),
+ '-finline-phase2',
+ '-fmax-simplifier-iterations2',
+ ']',
- '-ffloat-inwards',
'-fsimplify',
'[',
- $Oopt_FB_Support,
- '-ffloat-lets-exposing-whnf',
- '-ffloat-primops-ok',
- '-fcase-of-case',
- '-fdo-case-elim',
- '-fcase-merge',
- '-fdo-eta-reduction',
- '-fdo-lambda-eta-expansion',
- '-freuse-con',
- ($Oopt_FoldrBuildInline),
- # you need to inline foldr and build
- ($Oopt_FoldrBuild) ? ('-fdo-foldr-build') : (),
- # but do reductions if you see them!
- $Oopt_PedanticBottoms,
- $Oopt_MonadEtaExpansion,
- $Oopt_MaxSimplifierIterations,
- $Oopt_ShowSimplifierProgress,
+ '-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',
'-fsimplify',
'[',
- $Oopt_FB_Support,
- '-ffloat-lets-exposing-whnf',
- '-ffloat-primops-ok',
- '-fcase-of-case',
- '-fdo-case-elim',
- '-fcase-merge',
-# '-fdo-eta-reduction',
- '-fdo-lambda-eta-expansion',
- '-freuse-con',
- '-flet-to-case', # Aha! Only done after strictness analysis
- $Oopt_PedanticBottoms,
- $Oopt_MonadEtaExpansion,
- $Oopt_MaxSimplifierIterations,
- $Oopt_ShowSimplifierProgress,
+ $Oopt_MaxSimplifierIterations,
+ # No -finline-phase: allow all Ids to be inlined now
']',
+ '-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.
+ #
+ # CSE must immediately follow a simplification pass, because it relies
+ # on the no-shadowing invariant. See comments at the top of CSE.lhs
+ # So it must NOT follow float-inwards, which can give rise to shadowing,
+ # even if its input doesn't have shadows. Hence putting it between
+ # the two passes.
+ '-fcse',
+
+
'-ffloat-inwards',
# Case-liberation for -O2. This should be after
# ( ($OptLevel != 2)
# ? ''
-# : "-fliberate-case -fsimplify [ $Oopt_FB_Support -ffloat-lets-exposing-whnf -ffloat-primops-ok -fcase-of-case -fdo-case-elim -fcase-merge -fdo-eta-reduction -fdo-lambda-eta-expansion -freuse-con -flet-to-case $Oopt_PedanticBottoms $Oopt_MonadEtaExpansion $Oopt_MaxSimplifierIterations $Oopt_ShowSimplifierProgress ]" ),
+# : "-fliberate-case -fsimplify [ $Oopt_FB_Support -ffloat-lets-exposing-whnf -ffloat-primops-ok -fcase-of-case -fdo-case-elim -fcase-merge -fdo-lambda-eta-expansion -freuse-con -flet-to-case $Oopt_PedanticBottoms $Oopt_MaxSimplifierIterations $Oopt_ShowSimplifierProgress ]" ),
+
+# '-fliberate-case',
# Final clean-up simplification:
'-fsimplify',
'[',
- $Oopt_FB_Support,
- '-ffloat-lets-exposing-whnf',
- '-ffloat-primops-ok',
- '-fcase-of-case',
- '-fdo-case-elim',
- '-fcase-merge',
-# '-fdo-eta-reduction',
- '-fdo-lambda-eta-expansion',
- '-freuse-con',
- '-flet-to-case',
- '-fignore-inline-pragma', # **** NB!
- $Oopt_FoldrBuildInline,
- ($Oopt_FoldrBuild) ? ('-fdo-foldr-build') : (),
- # but still do reductions if you see them!
- $Oopt_PedanticBottoms,
- $Oopt_MonadEtaExpansion,
- $Oopt_MaxSimplifierIterations,
- $Oopt_ShowSimplifierProgress,
+ $Oopt_MaxSimplifierIterations,
+ # No -finline-phase: allow all Ids to be inlined now
']',
# '-fstatic-args',
-#LATER: '-fcalc-inlinings2', -- pointless for 2.01
-
# stg2stg passes
- '-flambda-lift',
+# '-flambda-lift',
$Oopt_FinalStgProfilingMassage,
$Oopt_StgStats,
# SPECIAL FLAGS for -O2
($OptLevel == 2) ? (
- '-fupdate-analysis', # virtually useless; relegated to -O2
- '-fsemi-tagging',
+ # none at the present time
) : (),
);
%************************************************************************
Sort out @$BuildTag@, @$PROFing@, @$PARing@,
-@$GRANing@, @$TICKYing@:
+@$GRANing@, @$TICKYing@, @UNREGing@:
\begin{code}
sub setupBuildFlags {
-
# PROFILING stuff after argv mangling:
if ( ! $PROFing ) {
- # warn about any scc exprs found (in case scc used as identifier)
- push(@HsP_flags, '-W');
-
# add -auto sccs even if not profiling !
push(@HsC_flags, $UNPROFscc_auto) if $UNPROFscc_auto;
# Ignore user sccs when auto annotating, but warn when doing so.
$PROFignore_scc = '-W' if $PROFauto;
-
- push(@HsP_flags, (($PROFignore_scc) ? $PROFignore_scc : '-S'));
}
#if ( $BuildTag ne '' ) {
# local($b) = $BuildDescr{$BuildTag};
exit(1);
}
+ } elsif ( $SMPing eq 's') {
+ $BuildTag = '_s';
+
} elsif ( $GRANing eq 'g' ) {
if ($TICKYing eq 't') { print STDERR "$Pgm: Can't mix -gransim with -ticky.\n"; exit 1; }
$BuildTag = '_mg';
} elsif ( $TICKYing eq 't' ) {
$BuildTag = '_t';
- }
+ } elsif ( $UNREGing eq 'u' ) {
+ if ($GhcWithRegisterised eq 'YES') {
+ $BuildTag = '_u';
+ }
+ }
\end{code}
After the sanity checks, add flags to the necessary parts of the driver pipeline:
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});
}
unshift(@Ld_flags,
( '-u', "${uscore}PrelBase_Izh_static_info"
,'-u', "${uscore}PrelBase_Czh_static_info"
- ,'-u', "${uscore}PrelBase_Fzh_static_info"
- ,'-u', "${uscore}PrelBase_Dzh_static_info"
+ ,'-u', "${uscore}PrelFloat_Fzh_static_info"
+ ,'-u', "${uscore}PrelFloat_Dzh_static_info"
,'-u', "${uscore}PrelAddr_Azh_static_info"
,'-u', "${uscore}PrelAddr_Wzh_static_info"
,'-u', "${uscore}PrelAddr_I64zh_static_info"
,'-u', "${uscore}PrelStable_StablePtr_static_info"
,'-u', "${uscore}PrelBase_Izh_con_info"
,'-u', "${uscore}PrelBase_Czh_con_info"
- ,'-u', "${uscore}PrelBase_Fzh_con_info"
- ,'-u', "${uscore}PrelBase_Dzh_con_info"
+ ,'-u', "${uscore}PrelFloat_Fzh_con_info"
+ ,'-u', "${uscore}PrelFloat_Dzh_con_info"
,'-u', "${uscore}PrelAddr_Azh_con_info"
,'-u', "${uscore}PrelAddr_Wzh_con_info"
,'-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_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");
# 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) {
# to implement the itimers, since cygwin.dll does not
# support it. Only reqd. for `ways' that use itimers.
#
- push(@SysLibrary, '-lwinmm') if $TargetPlatform eq 'i386-unknown-cygwin32';
+ push(@SysLibrary, '-lwinmm') if ($TargetPlatform =~ /-(mingw32|cygwin32)$/);
# Note: currently only tested with mingw, may cause conflicts when linking
# with libcygwin.a
push(@SysLibrary, '-lwsock32') if ($TargetPlatform =~ /-(mingw32|cygwin32)$/);
Tell the world who we are, if they asked.
\begin{code}
-print STDERR "${ProjectName}, version ${ProjectVersion}, patchlevel ${ProjectPatchLevel}\n"
- if $Verbose;
+print STDERR "${ProjectName}, version ${ProjectVersion}\n" if $Verbose;
\end{code}
%************************************************************************
#
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
}
}
if (-f $hsc_out_c_stub) {
- &run_something("cp $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/;
- ($ofile_o_stub_target = $ofile_c_stub_target) =~ s/\.(.*)$/\.o/;
- &runGcc (0, $ofile_c_stub_target, $ofile_s_stub_target);
- &runAs ($ofile_o_stub_target, $ofile_s_stub_target);
#
# Bring the C stub protos into scope when compiling the .hc file.
#
# Hack - ensure that the stub .h file is included in the OPTIONS section
# if the .hc file is saved.
push (@File_options, "-#include \"${ofile_h_stub_target}\"\n");
-
}
if ($do_cc) {
# save a copy of the .s file..
&saveIntermediate($ifile_root , "s" , $cc_as) if ($do_as && $Keep_s_file_too);
&runAs($as_out, $ifile_root) if $do_as;
+
+ if (-f $hsc_out_c_stub) {
+ &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/;
+ ($ofile_o_stub_target = $ofile_c_stub_target) =~ s/\.(.*)$//;
+
+ $ofile_o_stub_target = &osuf_ify($ofile_o_stub_target, "o");
+ if ($do_cc || $do_as) { # might be using NCG, so check $do_as
+ &runGcc (0, $ofile_c_stub_target, $ofile_s_stub_target);
+ &runAs ($ofile_o_stub_target, $ofile_s_stub_target);
+ }
+ }
+
\end{code}
Finally, decide what to queue up for linker input.
# 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);
}
sub runHsc {
local($ifile_root, $hsc_out, $hsc_hi, $hsc_out_c_stub, $hsc_out_h_stub, $going_interactive) = @_;
- # prepend comma to HsP flags (so hsc can tell them apart...)
- foreach $a ( @HsP_flags ) { $a = ",$a" unless $a =~ /^,/; }
-
&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) = '';
# 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
# 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");
}
open(OPTS, "> $Tmp_prefix.opts") || &tidy_up_and_die(1,"Can't open $Tmp_prefix.opts\n");
print OPTS "$dump @HsC_flags $CoreLint $USPLint $StgLint $Verbose";
close(OPTS);
- $to_do = "$HsC @HsP_flags ,$hscpp_hsc \@$Tmp_prefix.opts $output +RTS @HsC_rts_flags";
+ $to_do = "$HsC $hscpp_hsc \@$Tmp_prefix.opts $output +RTS @HsC_rts_flags";
} else {
- $to_do = "$HsC @HsP_flags ,$hscpp_hsc $dump @HsC_flags $CoreLint $USPLint $StgLint $Verbose $output +RTS @HsC_rts_flags";
+ $to_do = "$HsC $hscpp_hsc $dump @HsC_flags $CoreLint $USPLint $StgLint $Verbose $output +RTS @HsC_rts_flags";
}
&run_something($to_do, 'Haskell compiler');
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}";
}
a (Win32) DLL.
\begin{code}
-sub runLinker()
+sub runLinker
{
local($libdirs) = '';
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";
}
&prepareWin32DllLink(1);
- local($to_do) = "$lnkr $Verbose @Ld_flags $output @Link_file $TopClosureFile $libdirs @UserLibrary @SysLibrary";
+ local($to_do) = "$lnkr $Verbose @Ld_flags $output @Link_file $libdirs @UserLibrary @SysLibrary";
&run_something($to_do, 'Linker');
# finally, check the consistency info in the binary
if \$running_under_some_shell;
# =!=!=!=!=!=!=!=!=!=!=!
# This script is automatically generated: DO NOT EDIT!!!
-# Generated by Glasgow Haskell, version ${ProjectVersion} ${ProjectPatchLevel}
+# 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);
}
}
-sub createWin32DLL()
+sub createWin32DLL
{
local ($libdirs);
&run_something($to_do, 'DLL creator');
}
-sub prepareWin32DllLink ()
+sub prepareWin32DllLink
{
local($linking_main) = @_;
foreach $a ( @UserLibrary ) {
$a = "${a}_imp" if ($a =~ /^-lHS/);
}
- push(@Link_file, ( $INSTALLING ) ? "$InstLibDirGhc/Main.o"
- : "$TopPwd/$CURRENT_DIR/$GHC_RUNTIME_DIR/Main.o") if $linking_main;
- push(@Link_file, ( $INSTALLING ) ? "$InstLibDirGhc/PrelMain.o"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/PrelMain.o") if $linking_main;
+ push(@Link_file, ( $INSTALLING ) ? "$InstLibDirGhc/Main.dll_o"
+ : "$TopPwd/$CURRENT_DIR/$GHC_RUNTIME_DIR/Main.dll_o") if $linking_main;
+ push(@Link_file, ( $INSTALLING ) ? "$InstLibDirGhc/PrelMain.dll_o"
+ : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/std/PrelMain.dll_o") if $linking_main;
}
push(@Ld_flags, "-mno-cygwin");
}
# 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');
close(CCOUT) || &tidy_up_and_die(1,"$Pgm: failed closing `$Tmp_prefix.ccout'\n");
}
+ local($signal_num) = $? & 127;
+ local($dumped_core) = $? & 128;
+
+ if ($signal_num != 0) {
+ print STDERR "$tidy_name received signal $signal_num";
+ if ($dumped_core != 0) {
+ print STDERR " (core dumped)";
+ }
+ print STDERR "\n";
+ }
+
if ($return_val != 0) {
if ($Using_dump_file) {
print STDERR "Compilation Errors dumped in $Specific_dump_file\n";
}
&tidy_up_and_die($return_val, '');
}
+
$Using_dump_file = 0;
}
\end{code}
# Lifting this out of this sub brings it out of scope - why??
%Supported_syslibs =
- ( exts,
+ ( lang,
[ # where to slurp interface files from
( $INSTALLING
- ? "$InstLibDirGhc/imports/exts"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/exts"
+ ? "$InstLibDirGhc/imports/lang"
+ : "$TopPwd/hslibs/lang:$TopPwd/hslibs/lang/monads"
)
, # where to find the archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/exts"
+ : "$TopPwd/hslibs/lang"
+ )
+ , # where to find the cbits archive to use when linking
+ ( $INSTALLING
+ ? "$InstLibDirGhc"
+ : "$TopPwd/hslibs/lang/cbits"
)
- , '' # no cbits
, '' # Syslib dependencies
, '' # extra ghc opts
, '' # extra cc opts
, '' # extra ld opts
],
- misc,
+ concurrent,
[ # where to slurp interface files from
( $INSTALLING
- ? "$InstLibDirGhc/imports/misc"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/misc"
+ ? "$InstLibDirGhc/imports/concurrent"
+ : "$TopPwd/hslibs/concurrent"
)
, # where to find the archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/misc"
+ : "$TopPwd/hslibs/concurrent"
)
- , # where to find the cbits archive to use when linking
+ , '' # where to find the cbits archive to use when linking
+ , 'lang' # Syslib dependencies
+ , '' # extra ghc opts
+ , '' # extra cc opts
+ , '' # extra ld opts
+ ],
+
+ data,
+ [ # where to slurp interface files from
+ ( $INSTALLING
+ ? "$InstLibDirGhc/imports/data"
+ : "$TopPwd/hslibs/data:$TopPwd/hslibs/data/edison:$TopPwd/hslibs/data/edison/Assoc:$TopPwd/hslibs/data/edison/Coll:$TopPwd/hslibs/data/edison/Seq"
+ )
+ , # where to find the archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/misc/cbits"
+ : "$TopPwd/hslibs/data"
)
- , 'exts' # Syslib dependencies
- , '' # extra ghc opts
- , '' # extra cc opts
- , ( $TargetPlatform =~ /-solaris2$/ ? '-lnsl -lsocket' : '')
+ , '' # where to find the cbits archive to use when linking
+ , 'lang' # Syslib dependencies
+ , '' # extra ghc opts
+ , '' # extra cc opts
+ , '' # extra ld opts
],
- hbc,
+
+ net,
[ # where to slurp interface files from
( $INSTALLING
- ? "$InstLibDirGhc/imports/hbc"
- : "$TopPwd/CONTRIB/libraries/hbc/src"
+ ? "$InstLibDirGhc/imports/net"
+ : "$TopPwd/hslibs/net"
)
, # where to find the archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
- : "$TopPwd/CONTRIB/libraries/src/hbc"
+ : "$TopPwd/hslibs/net"
)
, # where to find the cbits archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
- : "$TopPwd/CONTRIB/libraries/hbc/cbits"
+ : "$TopPwd/hslibs/net/cbits"
)
- , 'exts' # Syslib dependencies
- , '' # extra ghc opts
- , '' # extra cc opts
- , ''
+ , 'lang text' # Syslib dependencies
+ , '' # extra ghc opts
+ , '' # extra cc opts
+ , ( $TargetPlatform =~ /-solaris2$/ ? '-lnsl -lsocket' : '')
],
+
posix,
[ # where to slurp interface files from
( $INSTALLING
? "$InstLibDirGhc/imports/posix"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/posix"
+ : "$TopPwd/hslibs/posix"
)
, # where to find the archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/posix"
+ : "$TopPwd/hslibs/posix"
)
, # where to find the cbits archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/posix/cbits"
+ : "$TopPwd/hslibs/posix/cbits"
)
- , 'misc' # Syslib dependencies
+ , 'lang' # Syslib dependencies
, '' # extra ghc opts
, '' # extra cc opts
, '' # extra ld opts
],
- concurrent,
+
+ text,
[ # where to slurp interface files from
( $INSTALLING
- ? "$InstLibDirGhc/imports/concurrent"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/concurrent"
+ ? "$InstLibDirGhc/imports/text"
+ : "$TopPwd/hslibs/text:$TopPwd/hslibs/text/html:$TopPwd/hslibs/text/haxml/lib"
)
, # where to find the archive to use when linking
( $INSTALLING
? "$InstLibDirGhc"
- : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/concurrent"
+ : "$TopPwd/hslibs/text"
)
- , '' # where to find the cbits archive to use when linking
- , '' # Syslib dependencies
+ , # where to find the cbits archive to use when linking
+ ( $INSTALLING
+ ? "$InstLibDirGhc"
+ : "$TopPwd/hslibs/text/cbits"
+ )
+ , 'lang data' # Syslib dependencies
, '' # extra ghc opts
, '' # extra cc opts
, '' # extra ld opts
],
+
+ util,
+ [ # where to slurp interface files from
+ ( $INSTALLING
+ ? "$InstLibDirGhc/imports/util"
+ : "$TopPwd/hslibs/util:$TopPwd/hslibs/util/check"
+ )
+ , # where to find the archive to use when linking
+ ( $INSTALLING
+ ? "$InstLibDirGhc"
+ : "$TopPwd/hslibs/util"
+ )
+ , # where to find the cbits archive to use when linking
+ ( $INSTALLING
+ ? "$InstLibDirGhc"
+ : "$TopPwd/hslibs/util/cbits"
+ )
+ , 'lang concurrent posix' # Syslib dependencies
+ , '' # extra ghc opts
+ , '' # extra cc opts
+ , "$LibsReadline" # extra ld opts
+ ],
+
win32,
[ # where to slurp interface files from
( $INSTALLING
: "$TopPwd/hslibs/win32/src"
)
, ''
- , 'exts' # Syslib dependencies
+ , 'lang' # Syslib dependencies
, '' # extra ghc opts
, '' # extra cc opts
, '-luser32 -lgdi32' # extra ld opts
],
+
com,
[ # where to slurp interface files from
( $INSTALLING
: "$TopPwd/hdirect/lib"
)
, ''
- , 'exts' # Syslib dependencies
+ , 'lang' # Syslib dependencies
, '' # extra ghc opts
, '' # extra cc opts
, '-luser32 -lole32 -loleaut32 -ladvapi32'
# This check is here to avoid syslib loops from
# spoiling the party. A side-effect of it is that
# it disallows multiple mentions of a syslib on a command-line,
- # explicit *and* implicit ones (i.e., "-syslib exts -syslib misc"
- # is not equal to "-syslib exts -syslib misc -syslib exts",
+ # explicit *and* implicit ones (i.e., "-syslib lang -syslib misc"
+ # is not equal to "-syslib lang -syslib misc -syslib lang",
# which it needs to be)
#
# Since our current collection of syslibs don't have any
$Syslibs_added{$syslib} = 1;
- local ($hi_dir, $lib_dir, $lib_cbits_dir,
+ local ($hi_dirs, $lib_dir, $lib_cbits_dir,
$syslib_deps, $syslib_ghc_opts,
$syslib_cc_opts, $syslib_ld_opts) = @{ $Supported_syslibs{$syslib} };
-
- unshift(@SysImport_dir, $hi_dir);
+ foreach(split(':',$hi_dirs)) {
+ unshift(@SysImport_dir, $_);
+ }
push(@SysLibrary_dir, $lib_dir);
push(@SysLibrary_dir, $lib_cbits_dir) if ( $lib_cbits_dir ne '');
open(FILE,$file) || return(1); # No big loss
while (<FILE>) {
- if ( /^${comment_start} OPTIONS (.*)${comment_end}$/ ) {
+ if ( /^${comment_start} OPTIONS (.*)${comment_end}/ ) {
# add the options found at the back of the command line.
local(@entries) = split(/\s+/,$1);
print STDERR "Found OPTIONS " . join(' ',@entries) . " in $file\n" if $Verbose;
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");
if (/^-\?$/ || /^--?help$/) { print $LongUsage; exit $Status; }
#-----------version ----------------------------------------------------
- /^--version$/ && do { print STDERR "${ProjectName}, version ${ProjectVersion}, patchlevel ${ProjectPatchLevel}\n"; exit $Status; };
+ /^--version$/ && do { print STDERR "${ProjectName}, version ${ProjectVersion}\n"; exit $Status; };
#---------- verbosity and such -----------------------------------------
/^-v$/ && do { $Verbose = '-v'; $Time = 'time'; next arg; };
# 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.
/^-gransim$/ && do { $GRANing = 'g'; &add_syslib('concurrent'); next arg; }; # GranSim
/^-ticky$/ && do { $TICKYing = 't'; next arg; }; # ticky-ticky
/^-parallel$/ && do { $PARing = 'p'; &add_syslib('concurrent'); next arg; }; # parallel Haskell
+ /^-smp$/ && do { $SMPing = 's'; &add_syslib('concurrent'); next arg; }; # parallel Haskell
#-------------- "user ways" --------------------------------------------
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; };
/^-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)
/^-optP(.*)$/ && do { push(@HsCpp_flags, $1); next arg; };
/^-optCrts(.*)$/&& do { push(@HsC_rts_flags, $1); next arg; };
/^-optC(.*)$/ && do { push(@HsC_flags, $1); next arg; };
- /^-optp(.*)$/ && do { push(@HsP_flags, $1); next arg; };
/^-optcpp(.*)$/ && do { push(@Cpp_define, $1); $Only_preprocess_hc = ($1 eq "-E"); next arg; };
/^-optc(.*)$/ && do { push(@CcBoth_flags, $1); next arg; };
/^-opta(.*)$/ && do { push(@As_flags, $1); next arg; };
/^-fticky-ticky$/ && do { push(@HsC_flags,$_); next arg; };
/^-fgransim$/ && do { push(@HsC_flags,$_); next arg; };
/^-fparallel$/ && do { push(@HsC_flags,$_); next arg; };
+ /^-fsmp$/ && do { push(@HsC_flags,$_); next arg; };
/^-split-objs$/ && do {
if ( $TargetPlatform !~ /^(alpha|hppa1\.1|i386|m68k|mips|powerpc|rs6000|sparc)-/ ) {
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');
}
next arg; };
+ /^-unreg$/ && do { $UNREGing = 'u'; next arg; };
+ /^-funregisterised$/ && do { push(@HsC_flags, $_); next arg; };
/^-fno-asm-mangling$/ && do { $DoAsmMangling = 0; 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, $_);
- push(@HsP_flags, '-N');
- # -fglasgow-exts implies -syslib exts
- &add_syslib('exts');
+ # -fglasgow-exts implies -syslib lang
+ &add_syslib('lang');
next arg; };
/^-ffoldr-build$/
&& do { $Oopt_FoldrBuild = 1;
- $Oopt_FB_Support = '-fdo-arity-expand';
#print "Yes F/B\n";
next arg; };
/^-fno-foldr-build$/
&& do { $Oopt_FoldrBuild = 0;
- $Oopt_FB_Support = '';
- next arg; };
-
- /^-fno-foldr-build-rule$/
- && do { $Oopt_FoldrBuild = 0;
- next arg; };
-
- /^-fno-enable-tech$/
- && do { $Oopt_FB_Support = '';
- next arg; };
-
- /^-fno-snapback-to-append$/
- && do { $Oopt_FoldrBuildInline .= ' -fdo-not-fold-back-append ';
next arg; };
# --------------- Renamer -------------
# ---------------
- /^-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
# ---------------
/^-funfolding-.*$/
&& do { push(@HsC_flags, $_); next arg };
+ /^-fliberate-case-.*$/
+ && do { push(@HsC_flags, $_); next arg };
+
/^-funfold-casms-in-hi-file$/
&& do { push(@HsC_flags, $_); next arg };
/^-fno-pre-inlining$/
&& do { push(@HsC_flags, $_); next arg };
- /^-fdo-monad-eta-expansion$/
- && do { $Oopt_MonadEtaExpansion = $_; next arg; };
-
/^-fno-let-from-(case|app|strict-let)$/ # experimental, really (WDP 95/10)
&& do { push(@HsC_flags, $_); next arg; };
} elsif ($heap_size >= $Specific_heap_size) {
$Specific_heap_size = $heap_size;
} else {
- print STDERR "$Pgm: ignoring heap-size-setting option ($_)...not the largest seen\n";
+ print STDERR "$Pgm: ignoring heap-size-setting option ($_)...not the largest seen\n" if $Verbose;
}
next arg; };
} elsif ($stk_size >= $Specific_stk_size) {
$Specific_stk_size = $stk_size;
} else {
- print STDERR "$Pgm: ignoring stack-size-setting option ($flag $stk_size)...not the largest seen\n";
+ print STDERR "$Pgm: ignoring stack-size-setting option ($flag $stk_size)...not the largest seen\n" if $Verbose;
}
next arg; };
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>