X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fdriver%2Fghc.lprl;h=965a8d6d1940576665b20cc75f55cc874688828b;hb=67fe852eb2e9b3a489b62cbf9259b5a868db5468;hp=7b2ee9ccefda9a466635ee0922b888b7e2a2f93a;hpb=0936dcc4063c8978286400857f25a91e73b63b3a;p=ghc-hetmet.git diff --git a/ghc/driver/ghc.lprl b/ghc/driver/ghc.lprl index 7b2ee9c..965a8d6 100644 --- a/ghc/driver/ghc.lprl +++ b/ghc/driver/ghc.lprl @@ -98,7 +98,7 @@ INSTALLING HOSTPLATFORM TARGETPLATFORM -ProjectName ProjectVersion ProjectVersionInt ProjectPatchLevel +ProjectName ProjectVersion ProjectVersionInt HscMajorVersion HscMinorVersion CcMajorVersion CcMinorVersion @@ -108,18 +108,20 @@ bindir libdir libexecdir datadir 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 @@ -223,15 +225,11 @@ These are the default values, which may be changed by user flags. 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_ShowSimplifierProgress = ''; + $Oopt_UsageSPInf = ''; # Off by default } # end of setupOptFlags # Assign defaults to these right away. @@ -281,13 +279,14 @@ these are turned off by -Wnot. \begin{code} @StandardWarnings = ('-fwarn-overlapping-patterns', '-fwarn-missing-methods', + '-fwarn-missing-fields', '-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'); @@ -301,12 +300,12 @@ Prelude ({\em including} its interface file(s)). $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", + '_mp', "Parallel", + '_mg', "Gransim", # system ways end '_a', "$WAY_a_NAME", '_b', "$WAY_b_NAME", @@ -330,39 +329,30 @@ $BuildTag = ''; # default is sequential build w/ Appel-style GC # %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", + '_mp', "-fstack-check -fparallel -D__PARALLEL_HASKELL__ -optc-DPAR", + '_mg', "-fstack-check -fconcurrent -fgransim -D__GRANSIM__ -D__CONCURRENT_HASKELL__ -optc-DCONCURRENT -optc-DGRAN"); # where to look for interface files (system hi's, i.e., prelude and syslibs) @SysImport_dir = ( $INSTALLING ) @@ -378,14 +368,13 @@ $Haskell1Version = 5; # i.e., Haskell 1.4 # 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 @@ -395,17 +384,11 @@ $Haskell1Version = 5; # i.e., Haskell 1.4 , "$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 = (); @@ -424,8 +407,6 @@ sub initDriverGlobals { # 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} @@ -438,12 +419,19 @@ $OptLevel = 0; # no -O == 0; -O == 1; -O2 == 2; -Ofile == 3 $MinusO2ForC = 0; # set to 1 if -O2 should be given to C compiler $StolenX86Regs = 4; # **HACK*** of the very worst sort $CoreLint = ''; +$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 @@ -492,6 +480,7 @@ $UNPROFscc_auto = ''; # set to relevant hsc flag if forcing auto sccs without pr $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 ; "-" for stdout $Specific_dump_file = ''; # set by -odump ; "-" for stdout $Using_dump_file = 0; @@ -693,216 +682,104 @@ It really really wants to be the last STG-to-STG pass that is run. 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', + '[', + '-finline-phase2', + $Oopt_MaxSimplifierIterations, ']', + $Oopt_AddAutoSccs, -# '-ffull-laziness', # removed 95/04 WDP following Andr\'e's lead - $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. - - '-fessential-unfoldings-only', - '-fsimpl-uf-use-threshold0', - - # See remark re: cloning in defn of minusnotO - '-fclone-binds', - - '-fdo-case-elim', - '-fmax-simplifier-iterations1', - $Oopt_PedanticBottoms, + '-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', ']', - ($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, ) : (), + '-ffull-laziness', + '-ffloat-inwards', - '-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', - ']', +# '-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_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, -# ']', -# ) : (), - # 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, - ']', - ) : (), + '-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, + ']', - '-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', '[', - $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, + # 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', '-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 ']', + '-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 @@ -910,38 +787,20 @@ sub setupOptimiseFlags { # ( ($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 ]" ), # 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, @@ -996,16 +855,13 @@ if ( $OptLevel <= 0 ) { %************************************************************************ 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; @@ -1018,8 +874,6 @@ sub setupBuildFlags { # 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}; @@ -1053,8 +907,12 @@ sub setupBuildFlags { } 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: @@ -1222,6 +1080,7 @@ sub setupLinkOpts { ,'-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"); @@ -1277,7 +1136,10 @@ sub setupSyslibs { # 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)$/); # Push the pvm libraries if ($BuildTag eq '_mp') { @@ -1361,8 +1223,7 @@ if ($#Input_file < 0 && $#Link_file < 0) { 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} %************************************************************************ @@ -1600,13 +1461,15 @@ Now the Haskell compiler, C compiler, and assembler } 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/; ($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); + if ($do_cc) { + &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. # @@ -1841,11 +1704,9 @@ sub runHscAndProcessInterfaces { 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) = ''; @@ -1872,7 +1733,7 @@ sub runHsc { # 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"); } @@ -1897,13 +1758,13 @@ sub runHsc { local($to_do_opts) = "$Tmp_prefix.opts"; open(OPTS, "> $Tmp_prefix.opts") || &tidy_up_and_die(1,"Can't open $Tmp_prefix.opts\n"); - print OPTS "$dump @HsC_flags $CoreLint $StgLint $Verbose"; + 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 $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'); @@ -1930,7 +1791,7 @@ sub makeHiMap { foreach $d ( @Import_dir ) { if ($HiIncludeString) { - $HiIncludeString = "$HiIncludeString:${d}%.${HiSuffix}"; + $HiIncludeString = "$HiIncludeString${SplitMarker}${d}%.${HiSuffix}"; } else { $HiIncludeString = "$d%.${HiSuffix}"; } @@ -1939,7 +1800,7 @@ sub makeHiMap { foreach $d ( @SysImport_dir ) { if ($HiIncludeString) { - $HiIncludeString = "$HiIncludeString:${d}%.${HiSuffix_prelude}"; + $HiIncludeString = "$HiIncludeString${SplitMarker}${d}%.${HiSuffix_prelude}"; } else { $HiIncludeString = "${d}%.${HiSuffix_prelude}"; } @@ -1954,7 +1815,7 @@ Invoke the 'linker' - either the standard linker or the one used to build a (Win32) DLL. \begin{code} -sub runLinker() +sub runLinker { local($libdirs) = ''; @@ -1982,7 +1843,7 @@ sub runLinker() &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 @@ -2027,7 +1888,7 @@ eval 'exec perl -S \$0 \${1+"\$@"}' 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} # \$pvm_executable = '$pvm_executable'; \$pvm_executable_base = '$pvm_executable_base'; @@ -2077,7 +1938,7 @@ EOSCRIPT2 } } -sub createWin32DLL() +sub createWin32DLL { local ($libdirs); @@ -2121,7 +1982,7 @@ sub createWin32DLL() &run_something($to_do, 'DLL creator'); } -sub prepareWin32DllLink () +sub prepareWin32DllLink { local($linking_main) = @_; @@ -2141,10 +2002,10 @@ sub prepareWin32DllLink () 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"); } @@ -2633,7 +2494,7 @@ sub add_syslib { ? "$InstLibDirGhc" : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/misc/cbits" ) - , 'exts' # Syslib dependencies + , 'exts concurrent' # Syslib dependencies , '' # extra ghc opts , '' # extra cc opts , ( $TargetPlatform =~ /-solaris2$/ ? '-lnsl -lsocket' : '') @@ -2802,7 +2663,7 @@ sub check_for_source_options { open(FILE,$file) || return(1); # No big loss while () { - 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; @@ -2908,7 +2769,7 @@ arg: while($_ = $Args[0]) { 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; }; @@ -3107,8 +2968,16 @@ arg: while($_ = $Args[0]) { 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; }; @@ -3141,7 +3010,6 @@ arg: while($_ = $Args[0]) { /^-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; }; @@ -3195,13 +3063,16 @@ arg: while($_ = $Args[0]) { } 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'); @@ -3213,31 +3084,21 @@ arg: while($_ = $Args[0]) { /^-fno-speciali[sz]e$/ && do { $Oopt_DoSpecialise = ''; next arg; }; + /^-fusagesp$/ + && do { $Oopt_UsageSPInf = '-fusagesp'; + push (@HsC_flags, '-fusagesp-on'); next arg; }; + /^-fcompiling-prelude$/ && do { $CompilingPrelude=1; push(@HsC_flags, $_); next arg; }; # Now the foldr/build options, which are *on* by default (for -O). /^-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 ------------- @@ -3269,9 +3130,6 @@ arg: while($_ = $Args[0]) { /^-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; }; @@ -3320,6 +3178,9 @@ arg: while($_ = $Args[0]) { # -d(no-)core-lint is done this way so it is turn-off-able. /^-dcore-lint/ && do { $CoreLint = '-dcore-lint'; next arg; }; /^-dno-core-lint/ && do { $CoreLint = ''; next arg; }; + # Ditto for USP lint + /^-dusagesp-lint/ && do { $USPLint = '-dusagesp-lint'; next arg; }; + /^-dno-usagesp-lint/ && do { $USPLint = ''; next arg; }; # Ditto for STG lint /^-dstg-lint/ && do { $StgLint = '-dstg-lint'; next arg; }; /^-dno-stg-lint/ && do { $StgLint = ''; next arg; };