- 13 Sep, 2002 1 commit
-
-
simonpj authored
-------------------------------------- Make Template Haskell into the HEAD -------------------------------------- This massive commit transfers to the HEAD all the stuff that Simon and Tim have been doing on Template Haskell. The meta-haskell-branch is no more! WARNING: make sure that you * Update your links if you are using link trees. Some modules have been added, some have gone away. * Do 'make clean' in all library trees. The interface file format has changed, and you can get strange panics (sadly) if GHC tries to read old interface files: e.g. ghc-5.05: panic! (the `impossible' happened, GHC version 5.05): Binary.get(TyClDecl): ForeignType * You need to recompile the rts too; Linker.c has changed However the libraries are almost unaltered; just a tiny change in Base, and to the exports in Prelude. NOTE: so far as TH itself is concerned, expression splices work fine, but declaration splices are not complete. --------------- The main change --------------- The main structural change: renaming and typechecking have to be interleaved, because we can't rename stuff after a declaration splice until after we've typechecked the stuff before (and the splice itself). * Combine the renamer and typecheker monads into one (TcRnMonad, TcRnTypes) These two replace TcMonad and RnMonad * Give them a single 'driver' (TcRnDriver). This driver replaces TcModule.lhs and Rename.lhs * The haskell-src library package has a module Language/Haskell/THSyntax which defines the Haskell data type seen by the TH programmer. * New modules: hsSyn/Convert.hs converts THSyntax -> HsSyn deSugar/DsMeta.hs converts HsSyn -> THSyntax * New module typecheck/TcSplice type-checks Template Haskell splices. ------------- Linking stuff ------------- * ByteCodeLink has been split into ByteCodeLink (which links) ByteCodeAsm (which assembles) * New module ghci/ObjLink is the object-code linker. * compMan/CmLink is removed entirely (was out of place) Ditto CmTypes (which was tiny) * Linker.c initialises the linker when it is first used (no need to call initLinker any more). Template Haskell makes it harder to know when and whether to initialise the linker. ------------------------------------- Gathering the LIE in the type checker ------------------------------------- * Instead of explicitly gathering constraints in the LIE tcExpr :: RenamedExpr -> TcM (TypecheckedExpr, LIE) we now dump the constraints into a mutable varabiable carried by the monad, so we get tcExpr :: RenamedExpr -> TcM TypecheckedExpr Much less clutter in the code, and more efficient too. (Originally suggested by Mark Shields.) ----------------- Remove "SysNames" ----------------- Because the renamer and the type checker were entirely separate, we had to carry some rather tiresome implicit binders (or "SysNames") along inside some of the HsDecl data structures. They were both tiresome and fragile. Now that the typechecker and renamer are more intimately coupled, we can eliminate SysNames (well, mostly... default methods still carry something similar). ------------- Clean up HsPat ------------- One big clean up is this: instead of having two HsPat types (InPat and OutPat), they are now combined into one. This is more consistent with the way that HsExpr etc is handled; there are some 'Out' constructors for the type checker output. So: HsPat.InPat --> HsPat.Pat HsPat.OutPat --> HsPat.Pat No 'pat' type parameter in HsExpr, HsBinds, etc Constructor patterns are nicer now: they use HsPat.HsConDetails for the three cases of constructor patterns: prefix, infix, and record-bindings The *same* data type HsConDetails is used in the type declaration of the data type (HsDecls.TyData) Lots of associated clean-up operations here and there. Less code. Everything is wonderful.
-
- 05 Sep, 2002 1 commit
-
-
simonmar authored
In code style, print negative floating point literals in parentheses to avoid interacting with surrounding syntax. Fixes SourceForge bug #604849 MERGE TO STABLE
-
- 29 Apr, 2002 1 commit
-
-
simonmar authored
FastString cleanup, stage 1. The FastString type is no longer a mixture of hashed strings and literal strings, it contains hashed strings only with O(1) comparison (except for UnicodeStr, but that will also go away in due course). To create a literal instance of FastString, use FSLIT(".."). By far the most common use of the old literal version of FastString was in the pattern ptext SLIT("...") this combination still works, although it doesn't go via FastString any more. The next stage will be to remove the need to use this special combination at all, using a RULE. To convert a FastString into an SDoc, now use 'ftext' instead of 'ptext'. I've also removed all the FAST_STRING related macros from HsVersions.h except for SLIT and FSLIT, just use the relevant functions from FastString instead.
-
- 14 Mar, 2002 1 commit
-
-
simonmar authored
Misc cleanup: remove the iface pretty-printing style, and clean up bits of StringBuffer that aren't required any more.
-
- 04 Mar, 2002 1 commit
-
-
simonmar 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 ParseIface.y). 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 FSLIT()). 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).
-
- 24 Oct, 2001 1 commit
-
-
simonpj authored
---------------- Division by zero ---------------- Teach GHC that the division primops can't fail if the divisor is non-zero. This can eliminate some thunks in an inner loop.
-
- 20 Aug, 2001 2 commits
-
-
simonpj authored
Amplify comment on mkMachInt a little
-
simonmar authored
Remove the in-range assertions on mkMachInt/mkMachWord. They clearly aren't true, because there's nothing stopping you from writing an out-of-range Int# literal (although that's the only way I can see for these to arise). The wider issue is what should be done about out-of-range Int# literals; I vaguely remember that at some point we disallowed them, but I can't find anything in the logs. The case which triggered the assertion, namely "intToWord# 0xffff0000" would appear to be a legitimate use for an out-of-range Int# literal though, given that you can't write Word# literals directly.
-
- 17 Aug, 2001 1 commit
-
-
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.
-
- 19 Jul, 2001 1 commit
-
-
apt authored
fix typo in double2IntLit
-
- 25 Jun, 2001 1 commit
-
-
simonpj authored
---------------- Squash newtypes ---------------- This commit squashes newtypes and their coerces, from the typechecker onwards. The original idea was that the coerces would not get in the way of optimising transformations, but despite much effort they continue to do so. There's no very good reason to retain newtype information beyond the typechecker, so now we don't. Main points: * The post-typechecker suite of Type-manipulating functions is in types/Type.lhs, as before. But now there's a new suite in types/TcType.lhs. The difference is that in the former, newtype are transparent, while in the latter they are opaque. The typechecker should only import TcType, not Type. * The operations in TcType are all non-monadic, and most of them start with "tc" (e.g. tcSplitTyConApp). All the monadic operations (used exclusively by the typechecker) are in a new module, typecheck/TcMType.lhs * I've grouped newtypes with predicate types, thus: data Type = TyVarTy Tyvar | .... | SourceTy SourceType data SourceType = NType TyCon [Type] | ClassP Class [Type] | IParam Type [SourceType was called PredType.] This is a little wierd in some ways, because NTypes can't occur in qualified types. However, the idea is that a SourceType is a type that is opaque to the type checker, but transparent to the rest of the compiler, and newtypes fit that as do implicit parameters and dictionaries. * Recursive newtypes still retain their coreces, exactly as before. If they were transparent we'd get a recursive type, and that would make various bits of the compiler diverge (e.g. things which do type comparison). * I've removed types/Unify.lhs (non-monadic type unifier and matcher), merging it into TcType. Ditto typecheck/TcUnify.lhs (monadic unifier), merging it into TcMType.
-
- 27 Apr, 2001 1 commit
-
-
qrczak authored
Add builtin rules for {intToInt,wordToWord}{8,16,32}# applied to literals.
-
- 26 Apr, 2001 1 commit
-
-
simonmar authored
Allow out-of-range character literals to appear in interface-file unfoldings. They occasionally pop up in Core.
-
- 05 Feb, 2001 1 commit
-
-
rrt authored
Improved comment.
-
- 20 Dec, 2000 1 commit
-
-
simonmar authored
Don't duplicate strings semi-willy-nilly. Literal strings now have a size dependent on their length.
-
- 12 Oct, 2000 1 commit
-
-
simonmar authored
Move FAST_INT and FAST_BOOL into their own module FastTypes, replacing the macro definitions in HsVersions.h with real definitions. Change most of the names in the process. Now we don't get bogus imports of GlaExts all over the place, and -fwarn-unused-imports is less noisy.
-
- 07 Aug, 2000 1 commit
-
-
qrczak authored
Now Char, Char#, StgChar have 31 bits (physically 32). "foo"# is still an array of bytes. CharRep represents 32 bits (on a 64-bit arch too). There is also Int8Rep, used in those places where bytes were originally meant. readCharArray, indexCharOffAddr etc. still use bytes. Storable and {I,M}Array use wide Chars. In future perhaps all sized integers should be primitive types. Then some usages of indexing primops scattered through the code could be changed to then-available Int8 ones, and then Char variants of primops could be made wide (other usages that handle text should use conversion that will be provided later). I/O and _ccall_ arguments assume ISO-8859-1. UTF-8 is internally used for string literals (only). Z-encoding is ready for Unicode identifiers. Ranges of intlike and charlike closures are more easily configurable. I've probably broken nativeGen/MachCode.lhs:chrCode for Alpha but I don't know the Alpha assembler to fix it (what is zapnot?). Generally I'm not sure if I've done the NCG changes right. This commit breaks the binary compatibility (of course). TODO: * is* and to{Lower,Upper} in Char (in progress). * Libraries for text conversion (in design / experiments), to be plugged to I/O and a higher level foreign library. * PackedString. * StringBuffer and accepting source in encodings other than ISO-8859-1.
-
- 06 Aug, 2000 1 commit
-
-
panne authored
Fixed conversion of MachWord to MachInt for large literals. Although completely untested, I believe this fixes bug #111021.
-
- 01 Aug, 2000 1 commit
-
-
simonpj authored
Simon's Marktoberdorf Commits 1. Tidy up the renaming story for "system binders", such as dictionary functions, default methods, constructor workers etc. These are now documented in HsDecls. The main effect of the change, apart from tidying up, is to make the *type-checker* (instead of the renamer) generate names for dict-funs and default-methods. This is good because Sergei's generic-class stuff generates new classes at typecheck time. 2. Fix the CSE pass so it does not require the no-shadowing invariant. Keith discovered that the simplifier occasionally returns a result with shadowing. After much fiddling around (which has improved the code in the simplifier a bit) I found that it is nearly impossible to arrange that it really does do no-shadowing. So I gave up and fixed the CSE pass (which is the only one to rely on it) instead. 3. Fix a performance bug in the simplifier. The change is in SimplUtils.interestingArg. It computes whether an argment should be considered "interesting"; if a function is applied to an interesting argument, we are more likely to inline that function. Consider this case let x = 3 in f x The 'x' argument was considered "uninteresting" for a silly reason. Since x only occurs once, it was unconditionally substituted, but interestingArg didn't take account of that case. Now it does. I also made interestingArg a bit more liberal. Let's see if we get too much inlining now. 4. In the occurrence analyser, we were choosing a bad loop breaker. Here's the comment that's now in OccurAnal.reOrderRec score ((bndr, rhs), _, _) | exprIsTrivial rhs = 3 -- Practically certain to be inlined -- Used to have also: && not (isExportedId bndr) -- But I found this sometimes cost an extra iteration when we have -- rec { d = (a,b); a = ...df...; b = ...df...; df = d } -- where df is the exported dictionary. Then df makes a really -- bad choice for loop breaker I also increased the score for bindings with a non-functional type, so that dictionaries have a better chance of getting inlined early 5. Add a hash code to the InScopeSet (and make it properly abstract) This should make uniqAway a lot more robust. Simple experiments suggest that uniqAway no longer gets into the long iteration chains that it used to. 6. Fix a bug in the inliner that made the simplifier tend to get into a loop where it would keep iterating ("4 iterations, bailing out" message). In SimplUtils.mkRhsTyLam we float bindings out past a big lambda, thus: x = /\ b -> let g = \x -> f x x in E becomes g* = /\a -> \x -> f x x x = /\ b -> let g = g* b in E It's essential that we don't simply inling g* back into the RHS of g, else we will be back to square 1. The inliner is meant not to do this because there's no benefit to the inlining, but the size calculation was a little off in CoreUnfold. 7. In SetLevels we were bogus-ly building a Subst with an empty in-scope set, so a WARNING popped up when compiling some modules. (knights/ChessSetList was the example that tickled it.) Now in fact the warning wasn't an error, but the Right Thing to do is to carry down a proper Subst in SetLevels, so that is what I have now done. It is very little more expensive.
-
- 11 Jul, 2000 1 commit
-
-
panne authored
Hash MachLabel, too
-
- 06 Jul, 2000 1 commit
-
-
simonmar authored
New form of literal: MachLabel, for addresses of labels. Used by foreign label instead of MachLitLit now. Real lit-lits now cause the NCG to panic. Also: removed CLitLit from AbsCSyn; it was only used in one place for a purpose it shouldn't have been used for in the first place.
-
- 02 Jul, 2000 1 commit
-
-
panne authored
Don't use addr2Integer for large integral literals anymore, use a Horner schema with numbers in the Int range instead. This improves constant folding, so e.g. (0x87654321 :: Word32) is evaluated at compile time now. In theory we can completely say Good-bye to addr2Integer, but for the time being it's still there. Feel free to nuke it... >:-)
-
- 29 May, 2000 1 commit
-
-
panne authored
Backed out previous commit, the change was at the completely wrong place. *please merge*
-
- 28 May, 2000 1 commit
-
-
panne authored
Prefix litlits with "__litlit" in interface files. *please merge*
-
- 25 May, 2000 1 commit
-
-
simonpj authored
~~~~~~~~~~~~ Apr/May 2000 ~~~~~~~~~~~~ This is a pretty big commit! It adds stuff I've been working on over the last month or so. DO NOT MERGE IT WITH 4.07! Interface file formats have changed a little; you'll need to make clean before remaking. Simon PJ Recompilation checking ~~~~~~~~~~~~~~~~~~~~~~ Substantial improvement in recompilation checking. The version management is now entirely internal to GHC. ghc-iface.lprl is dead! The trick is to generate the new interface file in two steps: - first convert Types etc to HsTypes etc, and thereby build a new ParsedIface - then compare against the parsed (but not renamed) version of the old interface file Doing this meant adding code to convert *to* HsSyn things, and to compare HsSyn things for equality. That is the main tedious bit. Another improvement is that we now track version info for fixities and rules, which was missing before. Interface file reading ~~~~~~~~~~~~~~~~~~~~~~ Make interface files reading more robust. * If the old interface file is unreadable, don't fail. [bug fix] * If the old interface file mentions interfaces that are unreadable, don't fail. [bug fix] * When we can't find the interface file, print the directories we are looking in. [feature] Type signatures ~~~~~~~~~~~~~~~ * New flag -ddump-types to print type signatures Type pruning ~~~~~~~~~~~~ When importing data T = T1 A | T2 B | T3 C it seems excessive to import the types A, B, C as well, unless the constructors T1, T2 etc are used. A,B,C might be more types, and importing them may mean reading more interfaces, and so on. So the idea is that the renamer will just import the decl data T unless one of the constructors is used. This turns out to be quite easy to implement. The downside is that we must make sure the constructors are always available if they are really needed, so I regard this as an experimental feature. Elimininate ThinAir names ~~~~~~~~~~~~~~~~~~~~~~~~~ Eliminate ThinAir.lhs and all its works. It was always a hack, and now the desugarer carries around an environment I think we can nuke ThinAir altogether. As part of this, I had to move all the Prelude RdrName defns from PrelInfo to PrelMods --- so I renamed PrelMods as PrelNames. I also had to move the builtinRules so that they are injected by the renamer (rather than appearing out of the blue in SimplCore). This is if anything simpler. Miscellaneous ~~~~~~~~~~~~~ * Tidy up the data types involved in Rules * Eliminate RnEnv.better_provenance; use Name.hasBetterProv instead * Add Unique.hasKey :: Uniquable a => a -> Unique -> Bool It's useful in a lot of places * Fix a bug in interface file parsing for __U[!]
-
- 11 May, 2000 1 commit
-
-
panne authored
Added rules for constant folding with the folloging ops: WordQuotOp, WordRemOp, AndOp, OrOp, XorOp, Int2AddrOp, Addr2IntOp, Float2IntOp, DoubleNegOp, Double2IntOp, Double2FloatOp, Float2DoubleOp
-
- 24 Mar, 2000 1 commit
-
-
simonpj authored
Add missing Literal.lhs
-
- 02 Dec, 1998 1 commit
-
-
simonm authored
Move 4.01 onto the main trunk.
-
- 14 Aug, 1998 1 commit
-
-
sof authored
MachInt64 and MachWord64 added; avoid gratuitous range checking on MachInts
-
- 08 Jan, 1998 1 commit
-
-
simonm authored
The Great Multi-Parameter Type Classes Merge. Notes from Simon (abridged): * Multi-parameter type classes are fully implemented. * Error messages from the type checker should be noticeably improved * Warnings for unused bindings (-fwarn-unused-names) * many other minor bug fixes. Internally there are the following changes * Removal of Haskell 1.2 compatibility. * Dramatic clean-up of the PprStyle stuff. * The type Type has been substantially changed. * The dictionary for each class is represented by a new data type for that purpose, rather than by a tuple.
-
- 26 May, 1997 1 commit
-
-
sof authored
Updated imports
-
- 19 May, 1997 1 commit
-
-
sof authored
2.04 changes
-
- 14 Mar, 1997 1 commit
-
-
simonpj authored
Major update to more-or-less 2.02
-
- 06 Jan, 1997 1 commit
-
-
simonpj authored
Pragmas in interface files added
-
- 26 Jun, 1996 1 commit
-
-
partain authored
SLPJ 1.3 changes through 96/06/25
-
- 05 Jun, 1996 1 commit
-
-
partain authored
SLPJ changes through 960604
-
- 19 Mar, 1996 1 commit
-
-
partain authored
simonpj/sansom/partain/dnt 1.3 compiler stuff through 96/03/18
-
- 08 Jan, 1996 1 commit
-
-
partain authored
Initial revision
-