1. 03 Nov, 2000 1 commit
  2. 02 Nov, 2000 2 commits
    • simonmar's avatar
      [project @ 2000-11-02 14:27:01 by simonmar] · 803963ad
      simonmar authored
      Cleaning up the configuration/build process.
      
        - New build.mk option: GhcWithInterpreter. It has reasonable
          defaults, and shouldn't need to be overriden (you get the interpreter
          if you're bootstrapping with ghc 4.09+ on an ELF architecture, at
          the moment).
      
        - compilation manager now lives in compiler/compMan.  compiler/ghci
          contains only interpreter-related files.
      
        - WithGhcHc has gone, it now defaults to $(GHC).  This is so that
          we can reliably determine the version of $(GHC) using the stuff that
          configure tells us.  configure gets a new --with-ghc option so you
          can specify which ghc to use.
      803963ad
    • simonmar's avatar
      [project @ 2000-11-02 13:36:44 by simonmar] · 31c886b4
      simonmar authored
      Remove GhcWithRegisterised since it isn't used.  It might be
      re-instated later if/when we decide on the right way to implement it.
      31c886b4
  3. 31 Oct, 2000 1 commit
  4. 30 Oct, 2000 2 commits
  5. 27 Oct, 2000 6 commits
  6. 12 Oct, 2000 1 commit
  7. 10 Oct, 2000 1 commit
  8. 29 Sep, 2000 1 commit
  9. 11 Sep, 2000 1 commit
    • sewardj's avatar
      [project @ 2000-09-11 12:20:56 by sewardj] · 55945d0a
      sewardj authored
      First shot at a STG interpreter for GHCI.  Translates Stg syntax into a
      form convenient for interpretation, and can then run that.  Most of the
      translation stuff is there and works.  The interpreter framework is there
      and partly filled in, and seems to work.  There are still quite a lot of
      cases, etc, to fill in, but this should be straightforward given that
      the framework exists.  This interpreter cannot handle (yet?) unboxed
      tuples, but can deal with more or less everything else, including standard
      unboxed Int, Double, etc, code.
      55945d0a
  10. 22 Aug, 2000 2 commits
  11. 21 Aug, 2000 1 commit
  12. 09 Aug, 2000 1 commit
  13. 08 Aug, 2000 1 commit
  14. 07 Aug, 2000 1 commit
    • sewardj's avatar
      [project @ 2000-08-07 14:11:48 by sewardj] · 014a3451
      sewardj authored
      Reorganise the way primops are done.  Most of the information about
      primops, their types and relevant attributes is in prelude/primops.txt.
      A supporting program in fptools/ghc/utils/genprimopcode reads this
      file and generates various bits of code which are #include'd into
      prelude/PrimOp.lhs.  Eventually this mechanism will be extended to
      generate PrelGHC.hi and C code for primops in the bytecode evaluator.
      
      Also, add a few primops for creating, reading and writing BCOs.
      014a3451
  15. 21 Jul, 2000 1 commit
  16. 17 Jul, 2000 1 commit
  17. 14 Jul, 2000 1 commit
    • simonpj's avatar
      [project @ 2000-07-14 08:17:36 by simonpj] · 77a8c0db
      simonpj authored
      This commit completely re-does the kind-inference mechanism.
      Previously it was inter-wound with type inference, but that was
      always hard to understand, and it finally broke when we started
      checking for ambiguity when type-checking a type signature (details
      irrelevant).
      
      So now kind inference is more clearly separated, so that it never
      takes place at the same time as type inference.  The biggest change
      is in TcTyClsDecls, which does the kind inference for a group of
      type and class declarations.  It now contains comments to explain
      how it all works.
      
      There are also comments in TypeRep which describes the slightly
      tricky way in which we deal with the fact that kind 'type' (written
      '*') actually has 'boxed type' and 'unboxed type' as sub-kinds.
      The whole thing is a bit of a hack, because we don't really have 
      sub-kinding, but it's less of a hack than before.
      
      A lot of general tidying up happened at the same time.
      In particular, I removed some dead code here and there
      77a8c0db
  18. 07 Jul, 2000 1 commit
  19. 15 Jun, 2000 1 commit
    • sewardj's avatar
      [project @ 2000-06-15 11:17:41 by sewardj] · 0779a545
      sewardj authored
      Emit slightly better x86 floating point code for comparisons, +, -,
      * and /, in the common case where one of the source fake FP regs
      is the same as the destination reg.
      0779a545
  20. 01 Jun, 2000 1 commit
  21. 28 May, 2000 1 commit
    • panne's avatar
      [project @ 2000-05-28 16:06:52 by panne] · bcf0e153
      panne authored
      Lowered magical value of unfolding threshold for PrimPacked, so strlen
      doesn't appear in interface file. This fixes bootstrapping problems,
      e.g. when compiling FastString. Extremely hacky solution...
      bcf0e153
  22. 12 May, 2000 1 commit
  23. 10 May, 2000 1 commit
  24. 08 May, 2000 1 commit
  25. 21 Apr, 2000 2 commits
    • simonpj's avatar
      [project @ 2000-04-21 14:35:46 by simonpj] · 7166525e
      simonpj authored
      First I forgot to commit all the files for the
      Java support.  Then I spoke the wrong CVS command.
      This commit just adds the log message!
      
      --------------------------
      Add support for Java generation, written in
      a lightning day with Erik Meijer
      
      	ghc -J Foo.hs
      
      will do the business, generating Foo.java
      
      The code is in a new directory, javaGen/, so
      you'll need to cvs update -d.
      
      I've reorganised main/CodeOutput quite a bit; it
      is now much much tidier, and will accommodate new
      languages quite easily.
      
      I've also fiddled with the flags that communicate
      between the driver and hsc.
      
      GONE:	-S=  -C=
      
      NEW:	-olang=xxx	output language xxx
      			xxx can be: C, asm, java
      
      	-ofile=xxx	put the output code in file xxx
      
      
      BEWARE that I might have broken some of the more
      cryptic stuff in ghc.lprl.
      
      Simon
      7166525e
    • simonpj's avatar
      [project @ 2000-04-21 12:57:54 by simonpj] · c30bd911
      simonpj authored
      /home/simonpj/tmp/msg
      c30bd911
  26. 31 Mar, 2000 1 commit
    • hwloidl's avatar
      [project @ 2000-03-31 03:09:35 by hwloidl] · dd4c28a9
      hwloidl authored
      Numerous changes in the RTS to get GUM-4.06 working (currently works with
      parfib-ish programs). Most changes are isolated in the rts/parallel dir.
      
      rts/parallel/:
        The most important changes are a rewrite of the (un-)packing code (Pack.c)
        and changes in LAGA, GALA table operations (Global.c) expecially in
        rebuilding the tables during GC.
      
      rts/:
        Minor changes in Schedule.c, GC.c (interface to par specific root marking
        and evacuation), and lots of additions to Sanity.c (surprise ;-)
        Main.c change for startup: I use a new function rts_evalNothing to
        start non-main-PEs in a PAR || SMP setup (RtsAPI.c)
      
      includes/:
        Updated GranSim macros in PrimOps.h.
      
      lib/std:
        Few changes in PrelHandle.c etc replacing ForeignObj by Addr in a PAR
        setup (we still don't support ForeignObjs or WeakPtrs in GUM).
        Typically use
          #define FILE_OBJECT	    Addr
        when dealing with files.
      
      hslibs/lang/:
        Same as above (in Foreign(Obj).lhs, Weak.lhs, IOExts.lhs etc).
      
      -- HWL
      dd4c28a9
  27. 23 Mar, 2000 1 commit
    • simonpj's avatar
      [project @ 2000-03-23 17:45:17 by simonpj] · 111cee3f
      simonpj authored
      This utterly gigantic commit is what I've been up to in background
      mode in the last couple of months.  Originally the main goal
      was to get rid of Con (staturated constant applications)
      in the CoreExpr type, but one thing led to another, and I kept
      postponing actually committing.   Sorry.
      
      	Simon, 23 March 2000
      
      
      I've tested it pretty thoroughly, but doubtless things will break.
      
      Here are the highlights
      
      * Con is gone; the CoreExpr type is simpler
      * NoRepLits have gone
      * Better usage info in interface files => less recompilation
      * Result type signatures work
      * CCall primop is tidied up
      * Constant folding now done by Rules
      * Lots of hackery in the simplifier
      * Improvements in CPR and strictness analysis
      
      Many bug fixes including
      
      * Sergey's DoCon compiles OK; no loop in the strictness analyser
      * Volker Wysk's programs don't crash the CPR analyser
      
      I have not done much on measuring compilation times and binary sizes;
      they could have got worse.  I think performance has got significantly
      better, though, in most cases.
      
      
      Removing the Con form of Core expressions
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      The big thing is that
      
        For every constructor C there are now *two* Ids:
      
      	C is the constructor's *wrapper*. It evaluates and unboxes arguments
      	before calling $wC.  It has a perfectly ordinary top-level defn
      	in the module defining the data type.
      
      	$wC is the constructor's *worker*.  It is like a primop that simply
      	allocates and builds the constructor value.  Its arguments are the
      	actual representation arguments of the constructor.
      	Its type may be different to C, because:
      		- useless dict args are dropped
      		- strict args may be flattened
      
        For every primop P there is *one* Id, its (curried) Id
      
        Neither contructor worker Id nor the primop Id have a defminition anywhere.
        Instead they are saturated during the core-to-STG pass, and the code generator
        generates code for them directly. The STG language still has saturated
        primops and constructor applications.
      
      * The Const type disappears, along with Const.lhs.  The literal part
        of Const.lhs reappears as Literal.lhs.  Much tidying up in here,
        to bring all the range checking into this one module.
      
      * I got rid of NoRep literals entirely.  They just seem to be too much trouble.
      
      * Because Con's don't exist any more, the funny C { args } syntax
        disappears from inteface files.
      
      
      Parsing
      ~~~~~~~
      * Result type signatures now work
      	f :: Int -> Int = \x -> x
      	-- The Int->Int is the type of f
      
      	g x y :: Int = x+y
      	-- The Int is the type of the result of (g x y)
      
      
      Recompilation checking and make
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      * The .hi file for a modules is not touched if it doesn't change.  (It used to
        be touched regardless, forcing a chain of recompilations.)  The penalty for this
        is that we record exported things just as if they were mentioned in the body of
        the module.  And the penalty for that is that we may recompile a module when
        the only things that have changed are the things it is passing on without using.
        But it seems like a good trade.
      
      * -recomp is on by default
      
      Foreign declarations
      ~~~~~~~~~~~~~~~~~~~~
      * If you say
      	foreign export zoo :: Int -> IO Int
        then you get a C produre called 'zoo', not 'zzoo' as before.
        I've also added a check that complains if you export (or import) a C
        procedure whose name isn't legal C.
      
      
      Code generation and labels
      ~~~~~~~~~~~~~~~~~~~~~~~~~~
      * Now that constructor workers and wrappers have distinct names, there's
        no need to have a Foo_static_closure and a Foo_closure for constructor Foo.
        I nuked the entire StaticClosure story.  This has effects in some of
        the RTS headers (i.e. s/static_closure/closure/g)
      
      
      Rules, constant folding
      ~~~~~~~~~~~~~~~~~~~~~~~
      * Constant folding becomes just another rewrite rule, attached to the Id for the
        PrimOp.   To achieve this, there's a new form of Rule, a BuiltinRule (see CoreSyn.lhs).
        The prelude rules are in prelude/PrelRules.lhs, while simplCore/ConFold.lhs has gone.
      
      * Appending of constant strings now works, using fold/build fusion, plus
        the rewrite rule
      	unpack "foo" c (unpack "baz" c n)  =  unpack "foobaz" c n
        Implemented in PrelRules.lhs
      
      * The CCall primop is tidied up quite a bit.  There is now a data type CCall,
        defined in PrimOp, that packages up the info needed for a particular CCall.
        There is a new Id for each new ccall, with an big "occurrence name"
      	{__ccall "foo" gc Int# -> Int#}
        In interface files, this is parsed as a single Id, which is what it is, really.
      
      Miscellaneous
      ~~~~~~~~~~~~~
      * There were numerous places where the host compiler's
        minInt/maxInt was being used as the target machine's minInt/maxInt.
        I nuked all of these; everything is localised to inIntRange and inWordRange,
        in Literal.lhs
      
      * Desugaring record updates was broken: it didn't generate correct matches when
        used withe records with fancy unboxing etc.  It now uses matchWrapper.
      
      * Significant tidying up in codeGen/SMRep.lhs
      
      * Add __word, __word64, __int64 terminals to signal the obvious types
        in interface files.  Add the ability to print word values in hex into
        C code.
      
      * PrimOp.lhs is no longer part of a loop.  Remove PrimOp.hi-boot*
      
      
      Types
      ~~~~~
      * isProductTyCon no longer returns False for recursive products, nor
        for unboxed products; you have to test for these separately.
        There's no reason not to do CPR for recursive product types, for example.
        Ditto splitProductType_maybe.
      
      Simplification
      ~~~~~~~~~~~~~~~
      * New -fno-case-of-case flag for the simplifier.  We use this in the first run
        of the simplifier, where it helps to stop messing up expressions that
        the (subsequent) full laziness pass would otherwise find float out.
        It's much more effective than previous half-baked hacks in inlining.
      
        Actually, it turned out that there were three places in Simplify.lhs that
        needed to know use this flag.
      
      * Make the float-in pass push duplicatable bindings into the branches of
        a case expression, in the hope that we never have to allocate them.
        (see FloatIn.sepBindsByDropPoint)
      
      * Arrange that top-level bottoming Ids get a NOINLINE pragma
        This reduced gratuitous inlining of error messages.
        But arrange that such things still get w/w'd.
      
      * Arrange that a strict argument position is regarded as an 'interesting'
        context, so that if we see
      	foldr k z (g x)
        then we'll be inclined to inline g; this can expose a build.
      
      * There was a missing case in CoreUtils.exprEtaExpandArity that meant
        we were missing some obvious cases for eta expansion
        Also improve the code when handling applications.
      
      * Make record selectors (identifiable by their IdFlavour) into "cheap" operations.
      	  [The change is a 2-liner in CoreUtils.exprIsCheap]
        This means that record selection may be inlined into function bodies, which
        greatly improves the arities of overloaded functions.
      
      * Make a cleaner job of inlining "lone variables".  There was some distributed
        cunning, but I've centralised it all now in SimplUtils.analyseCont, which
        analyses the context of a call to decide whether it is "interesting".
      
      * Don't specialise very small functions in Specialise.specDefn
        It's better to inline it.  Rather like the worker/wrapper case.
      
      * Be just a little more aggressive when floating out of let rhss.
        See comments with Simplify.wantToExpose
        A small change with an occasional big effect.
      
      * Make the inline-size computation think that
      	case x of I# x -> ...
        is *free*.
      
      
      CPR analysis
      ~~~~~~~~~~~~
      * Fix what was essentially a bug in CPR analysis.  Consider
      
      	letrec f x = let g y = let ... in f e1
      		     in
      		     if ... then (a,b) else g x
      
        g has the CPR property if f does; so when generating the final annotated
        RHS for f, we must use an envt in which f is bound to its final abstract
        value.  This wasn't happening.  Instead, f was given the CPR tag but g
        wasn't; but of course the w/w pass gives rotten results in that case!!
        (Because f's CPR-ness relied on g's.)
      
        On they way I tidied up the code in CprAnalyse.  It's quite a bit shorter.
      
        The fact that some data constructors return a constructed product shows
        up in their CPR info (MkId.mkDataConId) not in CprAnalyse.lhs
      
      
      
      Strictness analysis and worker/wrapper
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      * BIG THING: pass in the demand to StrictAnal.saExpr.  This affects situations
        like
      	f (let x = e1 in (x,x))
        where f turns out to have strictness u(SS), say.  In this case we can
        mark x as demanded, and use a case expression for it.
      
        The situation before is that we didn't "know" that there is the u(SS)
        demand on the argument, so we simply computed that the body of the let
        expression is lazy in x, and marked x as lazily-demanded.  Then even after
        f was w/w'd we got
      
      	let x = e1 in case (x,x) of (a,b) -> $wf a b
      
        and hence
      
      	let x = e1 in $wf a b
      
        I found a much more complicated situation in spectral/sphere/Main.shade,
        which improved quite a bit with this change.
      
      * Moved the StrictnessInfo type from IdInfo to Demand.  It's the logical
        place for it, and helps avoid module loops
      
      * Do worker/wrapper for coerces even if the arity is zero.  Thus:
      	stdout = coerce Handle (..blurg..)
        ==>
      	wibble = (...blurg...)
      	stdout = coerce Handle wibble
        This is good because I found places where we were saying
      	case coerce t stdout of { MVar a ->
      	...
      	case coerce t stdout of { MVar b ->
      	...
        and the redundant case wasn't getting eliminated because of the coerce.
      111cee3f
  28. 14 Feb, 2000 1 commit
  29. 04 Feb, 2000 1 commit
  30. 25 Jan, 2000 1 commit
  31. 24 Jan, 2000 1 commit