Skip to content
  • Simon Marlow's avatar
    [project @ 2002-03-04 17:01:26 by simonmar] · 0171936c
    Simon Marlow authored
    Binary Interface Files - stage 1
    This commit changes the default interface file format from text to
    binary, in order to improve compilation performace.
    To view an interface file, use 'ghc --show-iface Foo.hi'.
    utils/Binary.hs is the basic Binary I/O library, based on the nhc98
    binary I/O library but much stripped-down and working in terms of
    bytes rather than bits, and with some special features for GHC: it
    remembers which Module is being emitted to avoid dumping too many
    qualified names, and it keeps track of a "dictionary" of FastStrings
    so that we don't dump the same FastString more than once into the
    binary file.  I'll make a generic version of this for the libraries at
    some point.
    main/BinIface.hs contains most of the Binary instances.  Some
    instances are in the same module as the data type (RdrName, Name,
    OccName in particular).  Most instances were generated using a
    modified version of DrIFT, which I'll commit later.  However, editing
    them by hand isn't hard (certainly easier than modifying
    The first thing in a binary interface is the interface version, so
    nice error messages will be generated if the binary format changes and
    you still have old interfaces lying around.  The version also now
    includes the "way" as an extra sanity check.
    Other changes
    I don't like the way FastStrings contain both hashed strings (with
    O(1) comparison) and literal C strings (with O(n) comparison).  So as
    a first step to separating these I made serveral "literal" type
    strings into hashed strings.  SLIT() still generates a literal, and
    now FSLIT() generates a hashed string.  With DEBUG on, you'll get a
    warning if you try to compare any SLIT()s with anything, and the
    compiler will fall over if you try to dump any literal C strings into
    an interface file (usually indicating a use of SLIT() which should be
    mkSysLocal no longer re-encodes its FastString argument each time it
    is called.
    I also fixed the -pgm options so that the argument can now optionally
    be separted from the option.
    Bugfix: PrelNames declared Names for several comparison primops, eg.
    eqCharName, eqIntName etc. but these had different uniques from the
    real primop names.  I've moved these to PrimOps and defined them using
    mkPrimOpIdName instead, and deleted some for which we don't have real
    primops (Manuel: please check that things still work for you after
    this change).