This seems fine to me. The INSTALLING flag is used to generate two versions of package.conf.in: one for using GHC directly from the build tree (package.conf.inplace), and the other for 'make install' (package.conf.installed).

A further complication is that we might be making a binary distribution, which is just like 'make install' except that pathnames contain things like "$libdir" which are substituted later by distrib/Makefile-bin.in (this doesn't apply to Gentoo, RPM etc.).

Cheers,
        Simon

Duncan Coutts wrote:
So here's a strawman proposal arising from discussions with Simon on irc
today.

Ghc needs to know quite a bit about gcc to bludgeon it into doing what ghc
wants. Depending on different versions of gcc and on different OSs and
machine arches we need different flags. This presents a problem for users
who upgrade gcc after upgrading ghc since currently ghc only tests gcc at
configure/install time. so we may end up using innapropriate flags for the
cersion of gcc that we're actially using. Add to this that some distros have
special extra features in gcc that often need disabling (eg various
"hardening" features) and we see that the current system is not flexible
enough.

So the idea is to be able to chage these gcc flags later, in particular when
the user changes their gcc version. Distros may be able to automate that to
make it transparent.

Simon suggested that instead of hard-coding these flags into ghc that we put
them in the rts package and that we write a program to re-generate the rts
package configuration. This program would be used at install time and could
be used later to update ghc's gcc settings if the gcc version changes.

So here's a patch that adds a "ghc-reconf" tool. Currently it generates
mostly what rts/package.conf.in produces.

Shortcommings:
        * It uses #ifdefs from ghcconfig.h. It might be nicer if took all
        this information dynamically. So we could generate the
        configuration for any arch/os/gcc combo. Perhaps this is too much
        to ask if it depends on compilcated os-specific configure tests.
        At least the gcc-version specific tests need to be done dynamically
        and not via #ifdefs.

        * I don't quite understand the INSTALLING ifdef logic. Ideally this
        would be replaced with appropriate command line argument(s).

        * it doesn't yet replace any of the options currently set in
        DynFlags:smachdepCCOpts which is where most of the gcc version-
        specific flags actually are currently set.

So if this looks like the right kind of thing then I'll carry on.

Wed May  3 19:06:45 BST 2006  Duncan Coutts <[EMAIL PROTECTED]>
  * Innitial idea for a ghc-reconf tool.



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


New patches:

[Innitial idea for a ghc-reconf tool.
Duncan Coutts <[EMAIL PROTECTED]>**20060503180645] {
adddir ./utils/ghc-reconf
hunk ./utils/Makefile 9
-SUBDIRS = mkdependC mkdirhier runstdtest genapply genprimopcode ghc-pkg unlit
+SUBDIRS = mkdependC mkdirhier runstdtest genapply genprimopcode ghc-pkg \
+         ghc-reconf unlit
hunk ./utils/Makefile 12
-SUBDIRS = mkdependC mkdirhier runstdtest ghc-pkg hasktags hp2ps hsc2hs \
-         parallel prof unlit genprimopcode genapply runghc
+SUBDIRS = mkdependC mkdirhier runstdtest ghc-pkg ghc-reconf hasktags \
+         hp2ps hsc2hs parallel prof unlit genprimopcode genapply runghc
addfile ./utils/ghc-reconf/Main.hs
hunk ./utils/ghc-reconf/Main.hs 1
+{-# OPTIONS -fglasgow-exts #-}
+-----------------------------------------------------------------------------
+--
+-- (c) The University of Glasgow 2004.
+--
+-- RTS package generation tool
+--
+-----------------------------------------------------------------------------
+
+-- TODO:
+
+module Main (main) where
+
+import Version ( version, targetOS, targetARCH )
+import Distribution.InstalledPackageInfo
+import Distribution.Package
+import Distribution.Version
+import Distribution.License
+
+import Prelude
+
+#include "../../includes/ghcconfig.h"
+
+#if __GLASGOW_HASKELL__ >= 504
+import System.Console.GetOpt
+#else
+import GetOpt
+#endif
+
+import Control.Monad
+import System.Environment ( getArgs, getProgName )
+import System.Exit ( exitWith, ExitCode(..) )
+import System.IO
+import Data.List ( isSuffixOf )
+
+-- 
-----------------------------------------------------------------------------
+-- Entry point
+
+main :: IO ()
+main = do
+  args <- getArgs
+
+  case getOpt Permute flags args of
+       (cli,_,[]) | FlagHelp `elem` cli -> do
+          prog <- getProgramName
+          bye (usageInfo (usageHeader prog) flags)
+       (cli,_,[]) | FlagVersion `elem` cli ->
+          bye ourCopyright
+       (cli,[],[]) ->
+          runit cli
+       (_,_,errors) -> do
+           prog <- getProgramName
+          die (concat errors ++ usageInfo (usageHeader prog) flags)
+
+
+-- 
-----------------------------------------------------------------------------
+-- Command-line syntax
+
+data Flag
+  = FlagHelp
+  | FlagVersion
+  | FlagArch           String
+  | FlagOS             String
+  | FlagGccVersion     String
+--  | FlagGccHardened
+  deriving Eq
+
+flags :: [OptDescr Flag]
+flags = [
+  Option [] ["arch"] (ReqArg FlagArch "ARCH")
+       "which machine architecture",
+  Option [] ["os"] (ReqArg FlagOS "OS")
+       "which operating system",
+  Option [] ["gcc"] (ReqArg FlagGccVersion "VERSION")
+       "which GCC version",
+  Option ['?'] ["help"] (NoArg FlagHelp)
+       "display this help and exit",
+  Option ['V'] ["version"] (NoArg FlagVersion)
+       "output version information and exit"
+  ]
+
+ourCopyright :: String
+ourCopyright = "RTS package generation tool version " ++ version ++ "\n"
+
+usageHeader :: String -> String
+usageHeader prog = substProg prog $
+  "Usage: $p [OPTION]\n"  ++
+  "    Generate an rts package.conf file with settings for a given\n" ++
+  "    computer architecture, operating system and gcc version\n"
+
+substProg :: String -> String -> String
+substProg _ [] = []
+substProg prog ('$':'p':xs) = prog ++ substProg prog xs
+substProg prog (c:xs) = c : substProg prog xs
+
+-- 
-----------------------------------------------------------------------------
+-- Do the business
+
+runit :: [Flag] -> IO ()
+runit cli = do
+ + let settings =
+        [addUndefSyms
+        ,addDotNetSettings
+        ,addLibDlSettings
+        ,addLibRtSettings
+        ,addLibGmpSettings
+        ,addDebugSettings
+        ,addOSSettings targetOS
+        ,addArchSettings targetARCH
+        ,addGccVersionSettings undefined
+        ]
+ + let packageInfo = foldr1 (.) (reverse settings)
+                    basicRtsInstalledPackageInfo
+ + putStrLn (showInstalledPackageInfo packageInfo)
+
+
+basicRtsInstalledPackageInfo :: InstalledPackageInfo
+basicRtsInstalledPackageInfo =
+  emptyInstalledPackageInfo {
+    package = PackageIdentifier "rts"
+                Version {
+                  versionBranch = [1,0],
+                  versionTags = []
+                },
+    license = BSD3,
+    maintainer = "[email protected]",
+    exposed = True,
+
+    hsLibraries = ["HSrts"],
+ + extraLibraries = ["m", "dl"],
+    includeDirs = ["/usr/lib64/ghc-6.4.2/include"],
+    includes = ["Stg.h"]
+  }
+
+addUndefSyms :: InstalledPackageInfo -> InstalledPackageInfo
+addUndefSyms pInfo =
+  pInfo {
+    ldOptions = undefSymsLdOptions leadingUnderscore
+  }
+
+undefSymsLdOptions :: Bool -> [String]
+undefSymsLdOptions leadingUnderscore =
+ foldr (\x xs -> "-u":x:xs) [] .
+ (if leadingUnderscore then map ('_':) else id) $
+ ["GHCziBase_Izh_static_info"
+ ,"GHCziBase_Czh_static_info"
+ ,"GHCziFloat_Fzh_static_info"
+ ,"GHCziFloat_Dzh_static_info"
+ ,"GHCziPtr_Ptr_static_info"
+ ,"GHCziWord_Wzh_static_info"
+ ,"GHCziInt_I8zh_static_info"
+ ,"GHCziInt_I16zh_static_info"
+ ,"GHCziInt_I32zh_static_info"
+ ,"GHCziInt_I64zh_static_info"
+ ,"GHCziWord_W8zh_static_info"
+ ,"GHCziWord_W16zh_static_info"
+ ,"GHCziWord_W32zh_static_info"
+ ,"GHCziWord_W64zh_static_info"
+ ,"GHCziStable_StablePtr_static_info"
+ ,"GHCziBase_Izh_con_info"
+ ,"GHCziBase_Czh_con_info"
+ ,"GHCziFloat_Fzh_con_info"
+ ,"GHCziFloat_Dzh_con_info"
+ ,"GHCziPtr_Ptr_con_info"
+ ,"GHCziPtr_FunPtr_con_info"
+ ,"GHCziStable_StablePtr_con_info"
+ ,"GHCziBase_False_closure"
+ ,"GHCziBase_True_closure"
+ ,"GHCziPack_unpackCString_closure"
+ ,"GHCziIOBase_stackOverflow_closure"
+ ,"GHCziIOBase_heapOverflow_closure"
+ ,"GHCziIOBase_NonTermination_closure"
+ ,"GHCziIOBase_BlockedOnDeadMVar_closure"
+ ,"GHCziIOBase_BlockedIndefinitely_closure"
+ ,"GHCziIOBase_Deadlock_closure"
+ ,"GHCziIOBase_NestedAtomically_closure"
+ ,"GHCziWeak_runFinalizzerBatch_closure"]
+
+addDotNetSettings :: InstalledPackageInfo -> InstalledPackageInfo
+addDotNetSettings pInfo
+  | wantDotNetSupport = addLibs ["oleaut32", "ole32", "uuid"] pInfo
+  | otherwise = pInfo
+
+addLibDlSettings :: InstalledPackageInfo -> InstalledPackageInfo
+addLibDlSettings pInfo
+  | haveLibDl = addLibs ["dl"] pInfo
+  | otherwise = pInfo
+
+addLibRtSettings :: InstalledPackageInfo -> InstalledPackageInfo
+addLibRtSettings pInfo + | haveLibRt = addLibs ["rt"] pInfo
+  | otherwise = pInfo
+
+addLibGmpSettings :: InstalledPackageInfo -> InstalledPackageInfo
+addLibGmpSettings pInfo + | haveFrameworkGmp = addFrameworks ["GMP"] pInfo
+  | otherwise        = addLibs ["gmp"] pInfo
+
+addDebugSettings :: InstalledPackageInfo -> InstalledPackageInfo
+addDebugSettings pInfo + | debug && haveLibBfd = addLibs ["bfd", "liberty"] pInfo
+  | otherwise = pInfo
+
+addOSSettings :: String -> InstalledPackageInfo -> InstalledPackageInfo
+addOSSettings "mingw32" pInfo =  addLibs ["wsock32"] pInfo
+
+addOSSettings _ pInfo = pInfo
+
+addArchSettings :: String -> InstalledPackageInfo -> InstalledPackageInfo
+addArchSettings _ pInfo = pInfo
+
+addGccVersionSettings :: Version -> InstalledPackageInfo -> 
InstalledPackageInfo
+addGccVersionSettings _ pInfo = pInfo
+
+addLibs :: [String] -> InstalledPackageInfo -> InstalledPackageInfo
+addLibs libs pInfo = pInfo { extraLibraries = extraLibraries pInfo ++ libs }
+
+addFrameworks :: [String] -> InstalledPackageInfo -> InstalledPackageInfo
+addFrameworks fs pInfo = pInfo { frameworks = frameworks pInfo ++ fs }
+
+-----------------------------------------------------------------------------
+-- cpp stuff
+
+leadingUnderscore :: Bool
+#ifdef LEADING_UNDERSCORE
+leadingUnderscore = True
+#else
+leadingUnderscore = False
+#endif
+
+haveLibDl :: Bool
+#ifdef HAVE_LIBDL
+haveLibDl = True
+#else
+haveLibDl = False
+#endif
+
+haveLibRt :: Bool
+#ifdef HAVE_LIBRT
+haveLibRt = True
+#else
+haveLibRt = False
+#endif
+
+haveLibBfd :: Bool
+#ifdef HAVE_LIBBFD
+haveLibBfd = True
+#else
+haveLibBfd = False
+#endif
+
+haveFrameworkGmp :: Bool
+#ifdef HAVE_FRAMEWORK_GMP
+haveFrameworkGmp = True
+#else
+haveFrameworkGmp = False
+#endif
+
+wantDotNetSupport :: Bool
+#ifdef WANT_DOTNET_SUPPORT
+wantDotNetSupport = True
+#else
+wantDotNetSupport = False
+#endif
+
+debug :: Bool
+#ifdef DEBUG
+debug = True
+#else
+debug = False
+#endif
+
+
+-----------------------------------------------------------------------------
+
+getProgramName :: IO String
+getProgramName = liftM (`withoutSuffix` ".bin") getProgName
+   where str `withoutSuffix` suff
+            | suff `isSuffixOf` str = take (length str - length suff) str
+            | otherwise             = str
+
+bye :: String -> IO a
+bye s = putStr s >> exitWith ExitSuccess
+
+die :: String -> IO a
+die s = do + hFlush stdout
+  prog <- getProgramName
+  hPutStrLn stderr (prog ++ ": " ++ s)
+  exitWith (ExitFailure 1)
addfile ./utils/ghc-reconf/Makefile
hunk ./utils/ghc-reconf/Makefile 1
+TOP=../..
+include $(TOP)/mk/boilerplate.mk
+
+# hack for ghci-inplace script, see below
+INSTALLING=1
+
+# -----------------------------------------------------------------------------
+# ghc-reconf.bin
+
+SRC_HC_OPTS += -cpp -Wall -fno-warn-name-shadowing -fno-warn-unused-matches
+
+# This causes libghccompat.a to be used:
+include $(GHC_COMPAT_DIR)/compat.mk
+
+# This is required because libghccompat.a must be built with
+# $(GhcHcOpts) because it is linked to the compiler, and hence
+# we must also build with $(GhcHcOpts) here:
+SRC_HC_OPTS += $(GhcHcOpts)
+
+ifeq "$(ghc_ge_504)" "NO"
+SRC_HC_OPTS +=  -package lang -package util -package text
+endif
+
+# On Windows, ghc-reconf is a standalone program
+# ($bindir/ghc-reconf.exe), whereas on Unix it needs a wrapper script
+# to pass the appropriate flag to the real binary
+# ($libexecdir/ghc-reconf.bin) so that it can find package.conf.
+ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
+HS_PROG           = ghc-reconf.exe
+INSTALL_PROGS    += $(HS_PROG)
+else
+HS_PROG           = ghc-reconf.bin
+INSTALL_LIBEXECS += $(HS_PROG)
+endif
+
+# 
-----------------------------------------------------------------------------=
+# Create the Version.hs file
+
+VERSION_HS = Version.hs
+EXTRA_SRCS += $(VERSION_HS)
+
+boot :: $(VERSION_HS)
+
+Version.hs : Makefile $(TOP)/mk/config.mk
+       @$(RM) -f $(VERSION_HS)
+       @echo "Creating $(VERSION_HS) ... "
+       @echo "module Version where" >>$(VERSION_HS)
+       @echo "version, targetOS, targetARCH :: String" >>$(VERSION_HS)
+       @echo "version    = \"$(ProjectVersion)\"" >> $(VERSION_HS)
+       @echo "targetOS   = \"$(TargetOS_CPP)\"" >> $(VERSION_HS)
+       @echo "targetARCH = \"$(TargetArch_CPP)\"" >> $(VERSION_HS)
+
+DIST_CLEAN_FILES += $(VERSION_HS)
+
+# -----------------------------------------------------------------------------
+# ghc-reconf script
+
+ifeq "$(INSTALLING)" "1"
+ifeq "$(BIN_DIST)"   "1"
+GHCPKGBIN=$$\"\"libexecdir/$(HS_PROG)
+PKGCONF=$$\"\"libdir/package.conf
+else
+GHCPKGBIN=$(libexecdir)/$(HS_PROG)
+PKGCONF=$(libdir)/package.conf
+endif # BIN_DIST
+else
+GHCPKGBIN=$(FPTOOLS_TOP_ABS)/utils/ghc-reconf/$(HS_PROG)
+PKGCONF=$(FPTOOLS_TOP_ABS_PLATFORM)/driver/package.conf.inplace
+endif
+
+ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
+INSTALLED_SCRIPT_PROG  = ghc-reconf-$(ProjectVersion)
+endif
+INPLACE_SCRIPT_PROG    = ghc-reconf-inplace
+
+SCRIPT_OBJS      = ghc-reconf.sh
+INTERP           = $(SHELL)
+SCRIPT_SUBST_VARS = GHCPKGBIN PKGCONFOPT
+ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
+INSTALL_SCRIPTS  += $(SCRIPT_PROG)
+endif
+PKGCONFOPT       = --global-conf $(PKGCONF)
+
+ifeq "$(INSTALLING)" "1"
+SCRIPT_PROG    =  $(INSTALLED_SCRIPT_PROG)
+ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
+LINK           =  ghc-reconf
+endif
+else
+SCRIPT_PROG    =  $(INPLACE_SCRIPT_PROG)
+endif
+
+# -----------------------------------------------------------------------------
+# don't recurse on 'make install'
+#
+ifeq "$(INSTALLING)" "1"
+all :: $(HS_PROG)
+       $(MAKE) INSTALLING=0 BIN_DIST=0 $(MFLAGS) $@
+clean distclean maintainer-clean ::
+       $(MAKE) INSTALLING=0 BIN_DIST=0 $(MFLAGS) $@
+endif
+
+# ghc-reconf is needed to boot in rts/ and library dirs
+# Do a recursive 'make all' after generating dependencies, because this
+# will work with 'make -j'.
+ifneq "$(BootingFromHc)" "YES"
+boot :: depend
+       $(MAKE) all
+endif
+
+include $(TOP)/mk/target.mk
addfile ./utils/ghc-reconf/ghc-reconf.sh
hunk ./utils/ghc-reconf/ghc-reconf.sh 1
+# Mini-driver for ghc-pkg
+exec $GHCPKGBIN ${1+"$@"}
}

Context:

[$(ProjectNameShort) => ghc
Simon Marlow <[EMAIL PROTECTED]>**20060503102419] [only pass -fno-unit-at-a-time to gcc if it is supported Simon Marlow <[EMAIL PROTECTED]>**20060503093614] [Arrange that -fth is no longer implied by -fglasgow-exts
[EMAIL PROTECTED]
Messages involving Template Haskell are deeply puzzling
 if you don't know about TH, so it seems better to make
 -fth an explicit flag.  It is no longer switched on
 by -fglasgow-exts.
] [remove code not required in the new source tree layout Simon Marlow <[EMAIL PROTECTED]>**20060502114235] [move "compat" earlier in the build for .hc bootstrapping Simon Marlow <[EMAIL PROTECTED]>**20060502112001] [fix ctime_r problem on Solaris (I hope) Simon Marlow <[EMAIL PROTECTED]>**20060502111231] [fix whitespace problem that shows up on Solaris (x86) Simon Marlow <[EMAIL PROTECTED]>**20060502110001] [libraries/time is boring Simon Marlow <[EMAIL PROTECTED]>**20060502105524] [add time package to libraries Makefile Ashley Yakeley <[EMAIL PROTECTED]>**20060501092241] [add time package to default-packages Ashley Yakeley <[EMAIL PROTECTED]>**20060426070445] [Fix stage2 segfault on openbsd.
[EMAIL PROTECTED]
Somewhere along the 6.5 branch, gcc started compiling the rts such that
 it triggers the stack smash handler, causing stage2 to by kill'd
 immediately. This turns off the stack protector, which will do for now.
] [fix quoting around ${FPTOOLS_TOP_ABS} (fixes #749) Simon Marlow <[EMAIL PROTECTED]>**20060428085252] [Fix bug shown in the mod77 test. Lemmih <[EMAIL PROTECTED]>**20060427113313] [Don't init root pointers if they aren't gonna be used. Lemmih <[EMAIL PROTECTED]>**20060426111143] [Fix recompilation checking.
Simon Marlow <[EMAIL PROTECTED]>**20060425140932
 One-shot compilation was throwing away the old iface read by
 checkOldIface, with the result that version numbers were never being
 incremented.  Fixes the recomp001 test too.
] [Solaris needs -lrt for the threaded RTS Simon Marlow <[EMAIL PROTECTED]>**20060425082823] [fix problem with binary-dist docs Simon Marlow <[EMAIL PROTECTED]>**20060424090159] [Enable breakpoint support. Lemmih <[EMAIL PROTECTED]>**20060421113112] [Fixing some lexer errors with extcore Josef Svenningsson <[EMAIL PROTECTED]>**20060420222625] [Extcore can now handle data types without constructors Josef Svenningsson <[EMAIL PROTECTED]>**20060420213622] [Comments only Josef Svenningsson <[EMAIL PROTECTED]>**20060420213555] [Resurrect ProjectName [EMAIL PROTECTED] [Remove the section on platform support, link to the wiki page
Simon Marlow <[EMAIL PROTECTED]>**20060420125555
 The section in the building guide was becoming out of date, a wiki
 page is much more likely to be kept fresh.
] [Fix workaround for a GHC 6.4 bug [EMAIL PROTECTED] [hslibs is dead, Jim... [EMAIL PROTECTED] [Synched .spec file with reality [EMAIL PROTECTED] [Add .spec file to source distribution [EMAIL PROTECTED] [remove paragraph about mutable objects that doesn't apply now Simon Marlow <[EMAIL PROTECTED]>**20060419082038] [HsBool should be HsInt, not StgBool
Simon Marlow <[EMAIL PROTECTED]>**20060418144214
 StgBool is mapped to C's int type.  GHC doesn't currently know the
 size of a C int on the target arch, it's easier to use StgInt instead.
 I guess nobody ever uses Bool arguments to foreign imports/exports.
] [handle Bool arg to foreign import "wrapper"
Simon Marlow <[EMAIL PROTECTED]>**20060418143936
 Fixes #746
] [update commentry for foreign import "wrapper" handling Simon Marlow <[EMAIL PROTECTED]>**20060418143714] [remove vestiges of ByteArray and MutableByteArray, which are no more Simon Marlow <[EMAIL PROTECTED]>**20060418143641] [Comment only [EMAIL PROTECTED] [Fix rank-validity testing
[EMAIL PROTECTED]
GHC does not now do "hoisting" as it used to. Instead, it allows
 foralls to the right of fuction arrows, as well as to the left.
But the type-validity tester hadn't caught up. This commit fixes it. The test is tc203. Incidentally, GHC still doesn't let you write
        forall a. Eq a => forall b. b -> b
 because we get a zillion reduce/reduce errors if we allow that.  I'm
 sure it's fixable.  But meanwhile you have to use an auxiliary type
 synonym, which is a bit stupid.
] [Make the initial rdr and type scope available in the ghc-api. Lemmih <[EMAIL PROTECTED]>**20060418023606] [Fix minor bug in Linker.withExtendedLinkEnv Lemmih <[EMAIL PROTECTED]>**20060418023518] [Export 'insertSymbol' and 'insertStableSymbol'.
Lemmih <[EMAIL PROTECTED]>**20060418021806
'insertStableSymbol' is used for exporting closures that are affected by the GC. ] [Allow $x, as well as $(x), at top level in TH
[EMAIL PROTECTED]
Bulat pointed out that in Template Haskell
    $x
is allowed instead of $(x)
 in expressions, but not at the top level of modules.
This commit fixes the omission. Now you can say f x = x
        $h
        data T = T
and the $h will run Template Haskell just as you'd expect. ] [Fix TH erorr recovery (test is TH_recover) [EMAIL PROTECTED] [Comments only [EMAIL PROTECTED] [Recover gracefully from a Template Haskell programmers error
[EMAIL PROTECTED]
If a TH programmer uses a type constructor as a data constructor,
 GHC simply crashed.  This commit makes it report the error in a
 graceful way.
] [Document newtype-unwrapping for IO in FFI [EMAIL PROTECTED] [Cosmetics in SpecConstr
[EMAIL PROTECTED]
SpecConstr currently uses substExpr for tiresome reasons to do with
 GADTs.  Unfortunately the substExpr generates some WARNINGS (when DEBUG)
 is on, because we aren't adding all the in-scope Ids to the in-scope
 set of the substitution.
When we move to FC these substExprs will go away, so I'm not going to
 worry about this now.
] [Improve pruning of case alternatives to account for GADTs
[EMAIL PROTECTED]
Consider data T a where
     T1 :: T Int
     T2 :: T Bool
     T3 :: T Char
f :: T Bool -> Int
   f x = case x of
          DEFAULT -> ...
          T2 -> 3
Here the DEFAULT case covers multiple constructors (T1,T3), but none of them can match a scrutinee of type (T Bool). So we can prune away
 the default case altogether.
In implementing this, I re-factored this bit of the simplifier, elminiating
 prepareAlts from SimplUtils, and putting all the work into simplAlts in
 Simplify
The proximate cause was a program written by Manuel using PArrays ] [Fix a bug in optimising division to shift right
Simon Marlow <[EMAIL PROTECTED]>**20060412144247
 Division by an integral log2 can't be directly optimised to a shift
 right, because shift right behaves like a division that rounds to
 negative infinity, whereas we want one that rounds to zero.  Fix this
 by adding (divisor-1) to the dividend when it is negative before
 shifting.  We do this without jumps, generating very slightly worse
 code than gcc, which uses conditional moves on CPUs that support it.
] [Omit lndir on Windows, as it used to be [EMAIL PROTECTED] [remove a trace Simon Marlow <[EMAIL PROTECTED]>**20060411131531] [Allow IO to be wrapped in a newtype in foreign import/export
[EMAIL PROTECTED]
Up to now, the silent unwrapping of newtypes in foreign import/export
 has been limited to data values.  But it's useful for the IO monad
 itself:
newtype MyIO a = MIO (IO a) foreign import foo :: Int -> MyIO Int This patch allows the IO monad to be wrapped too. This applies to foreign import "dynamic" and "wrapper", thus foreign import "wrapper" foo :: MyIO () -> HisIO (FunPtr (MyIO ())) Warning: I did on the plane, and I'm no longer sure if its 100% complete, so needs more testing. In particular the wrapper/dynamic bit. ] [Improve newtype deriving
[EMAIL PROTECTED]
Ross Paterson pointed out a useful generalisation of GHC's newtype-deriving mechanism. This implements it. The idea
 is to allow
        newtype Wrap m a = Wrap (m a) deriving (Monad, Eq)
 where the representation type doesn't start with a type
 constructor.
Actually GHC already *did* implement this, but the eta-ok
 check in TcDeriv missed a case, so there was a lurking bug.
This patches fixes the documentation too. drvrun019 tests. ] [add take to the list of functions deforestable Simon Marlow <[EMAIL PROTECTED]>**20060411090131] [avoid versionitis in Numeric.showHex (should fix tcrun007) Simon Marlow <[EMAIL PROTECTED]>**20060411085009] [add a note about full-laziness Simon Marlow <[EMAIL PROTECTED]>**20060410093824] [robustify the test for the top of the tree a little Simon Marlow <[EMAIL PROTECTED]>**20060410082224] [Make darcs-all work without a ghc toplevel directory Josef Svenningsson <[EMAIL PROTECTED]>**20060407161738] [Fix typo in darcsall warning Josef Svenningsson <[EMAIL PROTECTED]>**20060407161335] [fix source dists Simon Marlow <[EMAIL PROTECTED]>**20060407150045] [add a README for binary dists Simon Marlow <[EMAIL PROTECTED]>**20060407143832] [fix binary dists Simon Marlow <[EMAIL PROTECTED]>**20060407143822] [remove the last bits of the ghc/ subdir Simon Marlow <[EMAIL PROTECTED]>**20060407085219] [TAG 07.04.06 Lemmih <[EMAIL PROTECTED]>**20060407130411] Patch bundle hash:
de58cac80316e520aedba01bdab1a4e457275908


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

_______________________________________________
Cvs-ghc mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/cvs-ghc

_______________________________________________
Cvs-ghc mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to