1. 14 Sep, 2001 1 commit
    • simonpj's avatar
      [project @ 2001-09-14 15:51:41 by simonpj] · 5ab261bb
      simonpj authored
      --------------------------
      	Add a rule-check pass
      	(special request by Manuel)
      	--------------------------
      
      	DO NOT merge with stable
      
      The flag
      
      	-frule-check foo
      
      will report all sites at which RULES whose name starts with "foo.."
      might apply, but in fact the arguments don't match so the rule
      doesn't apply.
      
      The pass is run right after all the core-to-core passes.  (Next thing
      to do: make the core-to-core script external, so you can fiddle with
      it.  Meanwhile, the core-to-core script is in
      	DriverState.builCoreToDo
      so you can move the CoreDoRuleCheck line around if you want.
      
      The format of the report is experimental: Manuel, feel free to fiddle
      with it.
      
      Most of the code is in specialise/Rules.lhs
      
      
      Incidental changes
      ~~~~~~~~~~~~~~~~~~
      Change BuiltinRule so that the rule name is accessible
      without actually successfully applying the rule.  This
      change affects quite a few files in a trivial way.
      5ab261bb
  2. 17 Aug, 2001 2 commits
    • apt's avatar
      [project @ 2001-08-17 17:18:51 by apt] · 1dfaee31
      apt authored
      How I spent my summer vacation.
      
      Primops
      -------
      
      The format of the primops.txt.pp file has been enhanced to allow
      (latex-style) primop descriptions to be included.  There is a new flag
      to genprimopcode that generates documentation including these
      descriptions. A first cut at descriptions of the more interesting
      primops has been made, and the file has been reordered a bit.
      
      31-bit words
      ------------
      
      The front end now can cope with the possibility of 31-bit (or even 30-bit)
      Int# and Word# types.  The only current use of this is to generate
      external .core files that can be translated into OCAML source files
      (OCAML uses a one-bit tag to distinguish integers from pointers).
      The only way to get this right now is by hand-defining the preprocessor
      symbol WORD_SIZE_IN_BITS, which is normally set automatically from
      the familiar WORD_SIZE_IN_BYTES.
      
      Just in case 31-bit words are used, we now have Int32# and Word32# primitive types
      and an associated family of operators, paralleling the existing 64-bit
      stuff.  Of course, none of the operators actually need to be implemented
      in the absence of a 31-bit backend.
      There has also been some minor re-jigging of the 32 vs. 64 bit stuff.
      See the description at the top of primops.txt.pp file for more details.
      Note that, for the first time, the *type* of a primop can now depend
      on the target word size.
      
      Also, the family of primops intToInt8#, intToInt16#, etc.
      have been renamed narrow8Int#, narrow16Int#, etc., to emphasize
      that they work on Int#'s and don't actually convert between types.
      
      Addresses
      ---------
      
      As another part of coping with the possibility of 31-bit ints,
      the addr2Int# and int2Addr# primops are now thoroughly deprecated
      (and not even defined in the 31-bit case) and all uses
      of them have been removed except from the (deprecated) module
      hslibs/lang/Addr
      
      Addr# should now be treated as a proper abstract type, and has these suitable operators:
      
      nullAddr# : Int# -> Addr# (ignores its argument; nullary primops cause problems at various places)
      plusAddr# :  Addr# -> Int# -> Addr#
      minusAddr : Addr# -> Addr# -> Int#
      remAddr# : Addr# -> Int# -> Int#
      
      Obviously, these don't allow completely arbitrary offsets if 31-bit ints are
      in use, but they should do for all practical purposes.
      
      It is also still possible to generate an address constant, and there is a built-in rule
      that makes use of this to remove the nullAddr# calls.
      
      Misc
      ----
      There is a new compile flag -fno-code that causes GHC to quit after generating .hi files
      and .core files (if requested) but before generating STG.
      
      Z-encoded names for tuples have been rationalized; e.g.,
      Z3H now means an unboxed 3-tuple, rather than an unboxed
      tuple with 3 commas (i.e., a 4-tuple)!
      
      Removed misc. litlits in hslibs/lang
      
      Misc. small changes to external core format.  The external core description
      has also been substantially updated, and incorporates the automatically-generated
      primop documentation; its in the repository at /papers/ext-core/core.tex.
      
      A little make-system addition to allow passing CPP options to compiler and
      library builds.
      1dfaee31
    • sof's avatar
      [project @ 2001-08-17 00:14:49 by sof] · 7bca7846
      sof authored
      Get rid of (harmless) CPP warnings
      7bca7846
  3. 08 Aug, 2001 1 commit
    • simonmar's avatar
      [project @ 2001-08-08 10:50:36 by simonmar] · 52c07834
      simonmar authored
      Had a brainwave on the way to work this morning, and realised that the
      garbage collector can handle "pinned objects" as long as they don't
      contain any pointers.
      
      This is absolutely ideal for doing temporary allocation in the FFI,
      because what we really want to do is allocate a pinned ByteArray and
      let the GC clean it up later.  So this set of changes adds the
      required framework.
      
      There are two new primops:
      
       newPinnedByteArray# :: Int# -> State# s -> (# State# s, MutByteArr# s #)
       byteArrayContents#  :: ByteArr# -> Addr#
      
      obviously byteArrayContents# is highly unsafe.
      
      Allocating a pinned ByteArr# isn't the default, because a pinned
      ByteArr# will hold an entire block (currently 4k) live until it is
      garbage collected (that doesn't mean each pinned ByteArr# requires
      4k of storage, just that if a block contains a single live pinned
      ByteArray, the whole block must be retained).
      52c07834
  4. 04 Aug, 2001 1 commit
    • ken's avatar
      [project @ 2001-08-04 06:19:54 by ken] · ea138284
      ken authored
      NB: This commit renames some files.  In each of your build directories,
          you will need to:
      
      	rm -f ghc/compiler/prelude/primops.txt
      	rm -f ghc/compiler/prelude/primops.i
      	rm -f ghc/lib/std/PrelGHC.hi-boot
      	lndir ../fptools	# or wherever your CVS working directory is
      
      The change:
      Run PrelGHC.hi-boot through the preprocesor, as we already do primops.txt.
      
      This commit introduces a new prefix, ".pp", which means "run through
      preprocesor".  In a previous commit, I changed ghc/compiler/Makefile
      to preprocess primops.txt into primops.i.  That is gone now.  We now
      preprocess primops.txt.pp (a file in the CVS repository) into primops.txt
      (a platform-dependent file, created at build time).  We also preprocess
      PrelGHC.hi-boot.pp (a file in the CVS repository) into PrelGHC.hi-boot
      (a platform-dependent file, created at build time).
      
      The reason for using the preprocessor is because fewer primops are defined
      if SUPPORT_LONG_LONGS is undefined.  SUPPORT_LONG_LONGS is undefined on
      64-bit architectures such as the Alpha.
      ea138284
  5. 26 Jul, 2001 1 commit
    • ken's avatar
      [project @ 2001-07-26 03:08:38 by ken] · 47774449
      ken authored
      Run prelude/primops.txt through the preprocessor, to weed out
      primitives that don't (need to) exist on 64-bit architectures.
      47774449
  6. 23 Jul, 2001 1 commit
  7. 13 Jul, 2001 1 commit
  8. 04 May, 2001 1 commit
  9. 22 Mar, 2001 1 commit
    • hwloidl's avatar
      [project @ 2001-03-22 03:51:08 by hwloidl] · 20fc2f0c
      hwloidl authored
      -*- outline -*-
      Time-stamp: <Thu Mar 22 2001 03:50:16 Stardate: [-30]6365.79 hwloidl>
      
      This commit covers changes in GHC to get GUM (way=mp) and GUM/GdH (way=md)
      working. It is a merge of my working version of GUM, based on GHC 4.06,
      with GHC 4.11. Almost all changes are in the RTS (see below).
      
      GUM is reasonably stable, we used the 4.06 version in large-ish programs for
      recent papers. Couple of things I want to change, but nothing urgent.
      GUM/GdH has just been merged and needs more testing. Hope to do that in the
      next weeks. It works in our working build but needs tweaking to run.
      GranSim doesn't work yet (*sigh*). Most of the code should be in, but needs
      more debugging.
      
      ToDo: I still want to make the following minor modifications before the release
      - Better wrapper skript for parallel execution [ghc/compiler/main]
      - Update parallel docu: started on it but it's minimal [ghc/docs/users_guide]
      - Clean up [nofib/parallel]: it's a real mess right now (*sigh*)
      - Update visualisation tools (minor things only IIRC) [ghc/utils/parallel]
      - Add a Klingon-English glossary
      
      * RTS:
      
      Almost all changes are restricted to ghc/rts/parallel and should not
      interfere with the rest. I only comment on changes outside the parallel
      dir:
      
      - Several changes in Schedule.c (scheduling loop; createThreads etc);
        should only affect parallel code
      - Added ghc/rts/hooks/ShutdownEachPEHook.c
      - ghc/rts/Linker.[ch]: GUM doesn't know about Stable Names (ifdefs)!!
      - StgMiscClosures.h: END_TSO_QUEUE etc now defined here (from StgMiscClosures.hc)
                           END_ECAF_LIST was missing a leading stg_
      - SchedAPI.h: taskStart now defined in here; it's only a wrapper around
                    scheduleThread now, but might use some init, shutdown later
      - RtsAPI.h: I have nuked the def of rts_evalNothing
      
      * Compiler:
      
      - ghc/compiler/main/DriverState.hs
        added PVM-ish flags to the parallel way
        added new ways for parallel ticky profiling and distributed exec
      
      - ghc/compiler/main/DriverPipeline.hs
        added a fct run_phase_MoveBinary which is called with way=mp after linking;
        it moves the bin file into a PVM dir and produces a wrapper script for
        parallel execution
        maybe cleaner to add a MoveBinary phase in DriverPhases.hs but this way
        it's less intrusive and MoveBinary makes probably only sense for mp anyway
      
      * Nofib:
      
      - nofib/spectral/Makefile, nofib/real/Makefile, ghc/tests/programs/Makefile:
        modified to skip some tests if HWL_NOFIB_HACK is set; only tmp to record
        which test prgs cause problems in my working build right now
      20fc2f0c
  10. 28 Feb, 2001 1 commit
    • qrczak's avatar
      [project @ 2001-02-28 00:01:01 by qrczak] · 871db587
      qrczak authored
      * Add {intToInt,wordToWord}{8,16,32}# primops. WARNING: Not implemented
        in ncg for Alpha and Sparc. But -O -fasm is not going to go far anyway
        because of other omissions.
      
      * Have full repertoire of 8,16,32-bit signed and unsigned MachMisc.Size
        values. Again only x86 is fully supported. They are used for
        {index,read,write}{Int,Word}{8,16,32}{OffAddr,Array}# and
        {intToInt,wordToWord}{8,16,32}# primops.
      
      * Have full repertoire of
        {index,read,write}\
        {Char,WideChar,Int,Word,Addr,Float,Double,StablePtr,\
         {Int,Word}{8,16,32,64}}\
        {OffAddr,Array} primops and appropriate instances.
        There were various omissions in various places.
      
      * Add {plus,minus,times}Word# primops to avoid so many Word# <-> Int#
        coercions.
      
      * Rewrite modules PrelWord and PrelInt almost from scratch.
      
      * Simplify fromInteger and realToFrac rules. For each of
        {Int,Word}{8,16,32} there is just a pair of fromInteger rules
        replacing the source or target type with Int or Word. For
        {Int,Word,Int64,Word64} there are rules from any to any.
        Don't include rules which are derivable from inlining anyway,
        e.g. those mentioning Integer. Old explicit coercions are simply
        defined as appropriately typed fromInteger.
      
      * Various old coercion functions marked as deprecated.
      
      * Add instance Bits Int, and
        instance {Show,Num,Real,Enum,Integral,Bounded,Ix,Read,Bits} Word.
      
      * Coercions to sized integer types consistently behave as cutting the
        right amount of bits from the infinite two-complement representation.
        For example (fromIntegral (-1 :: Int8) :: Word64) == maxBound.
      
      * ghc/tests/numeric/should_run/arith011 tests {Int,Word}64 and instance
        Bits Int, and does not try to use overflowing toEnum. arith011.stdout
        is not updated yet because of a problem I will tell about soon.
      
      * Move fromInteger and realToFrac from Prelude to PrelReal.
        Move fromInt from PrelNum to PrelReal and define as fromInteger.
        Define toInt as fromInteger. fromInteger is the place to write
        integer conversion rules for.
      
      * Remove ArrayBase.newInitialisedArray, use default definition of
        newArray instead.
      
      * Bugs fixed:
        - {quot,rem}Word# primop attributes.
        - integerToInt64# for small negative values.
        - {min,max}Bound::Int on 64-bit platforms.
        - iShiftRL64#.
        - Various Bits instances.
      
      * Polishing:
        - Use 'ppr' instead of 'pprPrimOp' and 'text . showPrimRep'.
        - PrimRep.{primRepString,showPrimRepToUser} removed.
        - MachMisc.sizeOf returns Int instead of Integer.
        - Some eta reduction, parens, spacing, and reordering cleanups -
          sorry, couldn't resist.
      
      * Questions:
        - Should iShiftRL and iShiftRL64 be removed? IMHO they should,
          s/iShiftRA/iShiftR/, s/shiftRL/shiftR/. The behaviour on shifting
          is a property of the signedness of the type, not the operation!
          I haven't done this change.
      871db587
  11. 15 Feb, 2001 1 commit
  12. 14 Feb, 2001 1 commit
    • simonmar's avatar
      [project @ 2001-02-14 12:59:34 by simonmar] · a599281d
      simonmar authored
      - make putMVar block rather than raise an exception when it encounters a
        full MVar (to match the semantics in our recent paper on async excpetions).
      
      - add tryPutMVar, a non-blocking version of putMVar.
      a599281d
  13. 15 Jan, 2001 2 commits
  14. 03 Jan, 2001 1 commit
  15. 15 Dec, 2000 3 commits
  16. 12 Dec, 2000 1 commit
    • simonmar's avatar
      [project @ 2000-12-12 12:19:57 by simonmar] · 65ace55b
      simonmar authored
      - Add primops for {read,write,index}{Int,Word}{8,16,32,64}OffAddr.
          This enables us to remove all the _casm_s from Int/Word.
      
        - Replace new{Char,Int,etc.}Array# with newByteArray# (save a few primops,
          at the cost of having to know the size of these types in PrelArr).
      
        - Implement MArray/IArray support for sized types.  finally.
      
        - Move the guts of the sized types into ghc/lib/std, we'll need
          them for doing more FFIish things in the Prelude.
      65ace55b
  17. 11 Dec, 2000 1 commit
  18. 04 Dec, 2000 1 commit
  19. 07 Nov, 2000 1 commit
  20. 26 Sep, 2000 1 commit
    • simonpj's avatar
      [project @ 2000-09-26 16:45:33 by simonpj] · 70c5660c
      simonpj authored
      * Remove all traces of addr2Integer.  Big integer literals are now
        done by multiplying up small integers.
      
      * As a result, we can remove PrelNum.hi-boot altogether.
      
      * Correct the default method for (==) in PrelBase.  (It simply
        returned True, which seems bogus to me!)
      
      * Add a type signature for PrelBase.mapFB
      70c5660c
  21. 11 Sep, 2000 2 commits
    • 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
    • sewardj's avatar
      [project @ 2000-09-11 11:17:09 by sewardj] · d4993e8b
      sewardj authored
      Initial primop support for the metacircular interpreter (GHCI).
      Only appears if you compile with -DGHCI; if not, the world is
      unchanged.
      
      new primops:
         indexPtrOffClosure#
         indexWordOffClosure#
      
      modified:
         dataToTag#   -- now dereferences indirections before extracting tag
      
      new entry code
         mci_constr_entry          and
         mci_constr[1..8]entry
      being the direct and vectored return code fragments for interpreter
      created constructors.  Support for static constructors is not yet
      done.
      
      New handwritten .hc functions:
         mci_make_constr*
      being code to create various flavours of constructors from args
      on the stack.  An interface file to describe these will follow in
      a later commit.
      d4993e8b
  22. 21 Aug, 2000 1 commit
  23. 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