summaryrefslogtreecommitdiff
path: root/ghc/compiler/cmm
Commit message (Collapse)AuthorAgeFilesLines
* Reorganisation of the source treeSimon Marlow2006-04-0710-5339/+0
| | | | | | | | | | | | | | | Most of the other users of the fptools build system have migrated to Cabal, and with the move to darcs we can now flatten the source tree without losing history, so here goes. The main change is that the ghc/ subdir is gone, and most of what it contained is now at the top level. The build system now makes no pretense at being multi-project, it is just the GHC build system. No doubt this will break many things, and there will be a period of instability while we fix the dependencies. A straightforward build should work, but I haven't yet fixed binary/source distributions. Changes to the Building Guide will follow, too.
* omit the __DISCARD__() call if unregisterisedSimon Marlow2006-03-241-1/+4
|
* gcc is getting smarter, so we need to hit it with a bigger stickSimon Marlow2006-03-231-0/+9
| | | | | | | | | | On x86_64 we are using C argument registers for global registers in the STG machine. This is always going to be problematic when it comes to making C calls from STG and compiling via C. Prior to GCC 4.1.0 (approx) it was possible to just assign the argument expressions to temporaries to avoid a clash. Now, we need to add an extra dummy function call as a barrier between the temporary assignments and the actual call. The dummy call is removed by the mangler.
* Fix a really nasty bug in SMPSimon Marlow2006-03-141-1/+3
| | | | | | | | | | | In SMP mode a THUNK can change to an IND at any time. The generic apply code (stg_ap_p etc.) examines a closure to determine how to apply it to its arguments, if it is a THUNK it must enter it first in order to evaluate it. The problem was that in order to enter the THUNK, we were re-reading the info pointer, and possibly ending up with an IND instead of the original THUNK. It isn't safe to enter the IND, because it points to a function (functions are never "entered", only applied). Solution: we must not re-read the info pointer.
* fix parse errorSimon Marlow2006-03-011-5/+0
|
* add commentsSimon Marlow2006-03-011-6/+48
|
* Allow C argument regs to be used as global regs (R1, R2, etc.)Simon Marlow2006-02-283-4/+23
| | | | | | | | | | The problem here was that we generated C calls with expressions involving R1 etc. as parameters. When some of the R registers are also C argument registers, both GCC and the native code generator generate incorrect code. The hacky workaround is to assign problematic arguments to temporaries first; fortunately this works with both GCC and the NCG, but we have to be careful not to undo this with later optimisations (see changes to CmmOpt).
* pass arguments to unknown function calls in registersSimon Marlow2006-02-281-0/+9
| | | | | | | | | | | | | | | We now have more stg_ap entry points: stg_ap_*_fast, which take arguments in registers according to the platform calling convention. This is faster if the function being called is evaluated and has the right arity, which is the common case (see the eval/apply paper for measurements). We still need the stg_ap_*_info entry points for stack-based application, such as an overflows when a function is applied to too many argumnets. The stg_ap_*_fast functions actually just check for an evaluated function, and if they don't find one, push the args on the stack and invoke stg_ap_*_info. (this might be slightly slower in some cases, but not the common case).
* add file to go with "extract some of the generic..." patchSimon Marlow2006-02-241-0/+460
|
* add instance Outputable CLabelSimon Marlow2006-02-241-0/+3
|
* floating-point fix for x86_64Simon Marlow2006-02-221-13/+13
| | | | | | | | | | For 32-bit float primtives like sinFloat#, we currently call the double versions of the C library functions (sin(), cos() etc.). It seems more correct to call the float versions (sinf(), cosf() etc.). This makes a difference on x86_64, I'm not entirely sure why, but this way at least generates more consistent results and avoids extra promotion/demotion instructions when calling these primitives.
* fix for the unregisterised waySimon Marlow2006-02-091-7/+11
| | | | | | We always assign to BaseReg on return from resumeThread(), but in cases where BaseReg is not an lvalue (eg. unreg) we need to disable this assigment. See comments for more details.
* tiny panic msg fixSimon Marlow2006-02-091-1/+1
|
* [project @ 2006-01-17 16:13:18 by simonmar]simonmar2006-01-171-0/+2
| | | | | | | | | | | | | | | | | | | | | | | Improve the GC behaviour of IORefs (see Ticket #650). This is a small change to the way IORefs interact with the GC, which should improve GC performance for programs with plenty of IORefs. Previously we had a single closure type for mutable variables, MUT_VAR. Mutable variables were *always* on the mutable list in older generations, and always traversed on every GC. Now, we have two closure types: MUT_VAR_CLEAN and MUT_VAR_DIRTY. The latter is on the mutable list, but the former is not. (NB. this differs from MUT_ARR_PTRS_CLEAN and MUT_ARR_PTRS_DIRTY, both of which are on the mutable list). writeMutVar# now implements a write barrier, by calling dirty_MUT_VAR() in the runtime, that does the necessary modification of MUT_VAR_CLEAN into MUT_VAR_DIRY, and adding to the mutable list if necessary. This results in some pretty dramatic speedups for GHC itself. I've just measureed a 30% overall speedup compiling a 31-module program (anna) with the default heap settings :-D
* [project @ 2006-01-17 16:03:47 by simonmar]simonmar2006-01-171-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | Improve the GC behaviour of IOArrays/STArrays See Ticket #650 This is a small change to the way mutable arrays interact with the GC, that can have a dramatic effect on performance, and make tricks with unsafeThaw/unsafeFreeze redundant. Data.HashTable should be faster now (I haven't measured it yet). We now have two mutable array closure types, MUT_ARR_PTRS_CLEAN and MUT_ARR_PTRS_DIRTY. Both are on the mutable list if the array is in an old generation. writeArray# sets the type to MUT_ARR_PTRS_DIRTY. The garbage collector can set the type to MUT_ARR_PTRS_CLEAN if it finds that no element of the array points into a younger generation (discovering this required a small addition to evacuate(), but rough tests indicate that it doesn't measurably affect performance). NOTE: none of this affects unboxed arrays (IOUArray/STUArray), only boxed arrays (IOArray/STArray). We could go further and extend the DIRTY bit to be per-block rather than for the whole array, but for now this is an easy improvement.
* [project @ 2006-01-06 16:30:17 by simonmar]simonmar2006-01-066-21/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add support for UTF-8 source files GHC finally has support for full Unicode in source files. Source files are now assumed to be UTF-8 encoded, and the full range of Unicode characters can be used, with classifications recognised using the implementation from Data.Char. This incedentally means that only the stage2 compiler will recognise Unicode in source files, because I was too lazy to port the unicode classifier code into libcompat. Additionally, the following synonyms for keywords are now recognised: forall symbol (U+2200) forall right arrow (U+2192) -> left arrow (U+2190) <- horizontal ellipsis (U+22EF) .. there are probably more things we could add here. This will break some source files if Latin-1 characters are being used. In most cases this should result in a UTF-8 decoding error. Later on if we want to support more encodings (perhaps with a pragma to specify the encoding), I plan to do it by recoding into UTF-8 before parsing. Internally, there were some pretty big changes: - FastStrings are now stored in UTF-8 - Z-encoding has been moved right to the back end. Previously we used to Z-encode every identifier on the way in for simplicity, and only decode when we needed to show something to the user. Instead, we now keep every string in its UTF-8 encoding, and Z-encode right before printing it out. To avoid Z-encoding the same string multiple times, the Z-encoding is cached inside the FastString the first time it is requested. This speeds up the compiler - I've measured some definite improvement in parsing at least, and I expect compilations overall to be faster too. It also cleans up a lot of cruft from the OccName interface. Z-encoding is nicely hidden inside the Outputable instance for Names & OccNames now. - StringBuffers are UTF-8 too, and are now represented as ForeignPtrs. - I've put together some test cases, not by any means exhaustive, but there are some interesting UTF-8 decoding error cases that aren't obvious. Also, take a look at unicode001.hs for a demo.
* [project @ 2005-11-02 11:56:56 by simonmar]simonmar2005-11-021-0/+4
| | | | | Fix warnings when assigning the result of a foreign call to BaseReg (as now happens in SMP mode with resumeThread()).
* [project @ 2005-08-02 12:01:57 by simonmar]simonmar2005-08-021-0/+1
| | | | Allow an empty list of volatile regs on a call
* [project @ 2005-07-26 12:15:54 by simonmar]simonmar2005-07-261-2/+1
| | | | | printing C: use the quick printForC rather than the slow (but prettier) printForUser. This has been a ToDo for a while.
* [project @ 2005-06-23 09:17:30 by simonmar]simonmar2005-06-231-4/+9
| | | | | | Add a 'U' suffix to all integer literals to make them explicitly unsigned. This avoids some warnings from gcc, but I don't think it fixes any actual bugs (I could be wrong, though).
* [project @ 2005-06-21 10:44:37 by simonmar]simonmar2005-06-212-23/+23
| | | | | | | | | | | | | | | | | | | | | | | Relax the restrictions on conflicting packages. This should address many of the traps that people have been falling into with the current package story. Now, a local module can shadow a module in an exposed package, as long as the package is not otherwise required by the program. GHC checks for conflicts when it knows the dependencies of the module being compiled. Also, we now check for module conflicts in exposed packages only when importing a module: if an import can be satisfied from multiple packages, that's an error. It's not possible to prevent GHC from starting by installing packages now (unless you install another base package). It seems to be possible to confuse GHCi by having a local module shadowing a package module that goes away and comes back again. I think it's nearly right, but strange happenings have been observed. I'll try to merge this into the STABLE branch.
* [project @ 2005-05-23 08:22:06 by simonmar]simonmar2005-05-231-1/+0
| | | | | needsCDecl: remove extra equation for CaseLabel, which was overlapped (and wrong!).
* [project @ 2005-05-21 15:39:00 by panne]panne2005-05-212-7/+3
| | | | | | | | Warning police: Removed overlapped patterns. In general, taking compiler warnings about unmatched patterns seriously when they come up later might be better than writing catch-all patterns right from the start. Otherwise readers are confused and wonder which patterns might be missing when there are none.
* [project @ 2005-05-18 12:14:03 by simonmar]simonmar2005-05-181-0/+7
| | | | | We should be using ASSIGN_DBL/PK_DBL for stores/loads respectively of doubles. Hopefully fixes SIGBUS on HPPA, and possible Sparc too.
* [project @ 2005-05-15 02:46:27 by wolfgang]wolfgang2005-05-152-3/+6
| | | | | Clean up things by making PicBaseReg a constructor of GlobalReg instead of CmmExpr.
* [project @ 2005-05-07 17:28:05 by wolfgang]wolfgang2005-05-071-1/+1
| | | | | | | | | GCC 4.0 Fix: Do not emit lvalue casts for foreign calls. Note: This fix might break cmm code that directly assigns the result of a foreign call to a "strange type" register (but we don't do that). MERGE TO STABLE
* [project @ 2005-05-03 10:38:19 by simonmar]simonmar2005-05-031-0/+7
| | | | Add a couple more lint tests
* [project @ 2005-04-22 10:21:10 by simonmar]simonmar2005-04-221-3/+5
| | | | | | | pprLit: when printing a CLabel, prefix it with '&'. This ensures we get the address rather than the value, in the case when the C label refers to a variable (as might be the case if it is from a foreign import, for example).
* [project @ 2005-04-08 10:15:38 by simonmar]simonmar2005-04-081-0/+1
| | | | | Tell the C backend that BaseReg has a "strange type" (this forces it to cast it to StgWord before doing arithmetic)
* [project @ 2005-04-07 12:40:33 by simonmar]simonmar2005-04-071-0/+1
| | | | Allow use of BaseReg
* [project @ 2005-04-01 12:14:29 by simonmar]simonmar2005-04-011-0/+1
| | | | | | | | | | | | | | | | First cut at the x86_64 native code generator. Lots of code is shared with i386, but floating point uses SSE2. This more or less works, the things I know that don't work are: - the floating-point primitives (sin, cos etc.) are missing - floating-point comparisons involving NaN are wrong - there's no PIC support yet Also, I have a long list of small things to fix up to improve performance. I think the small memory model is assumed, for now.
* [project @ 2005-03-31 10:16:33 by simonmar]simonmar2005-03-312-3/+3
| | | | | | | Tweaks to get the GHC sources through Haddock. Doesn't quite work yet, because Haddock complains about the recursive modules. Haddock needs to understand SOURCE imports (it can probably just ignore them as a first attempt).
* [project @ 2005-03-21 10:50:22 by simonmar]simonmar2005-03-211-11/+13
| | | | | | | | | | | | Complete the transition of -split-objs into a dynamic flag (looks like I half-finished it in the last commit). Also: complete the transition of -tmpdir into a dynamic flag, which involves some rearrangement of code from SysTools into DynFlags. Someday, initSysTools should move wholesale into initDynFlags, because most of the state that it initialises is now part of the DynFlags structure, and the rest could be moved in easily.
* [project @ 2005-03-18 13:37:27 by simonmar]simonmar2005-03-183-5/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Flags cleanup. Basically the purpose of this commit is to move more of the compiler's global state into DynFlags, which is moving in the direction we need to go for the GHC API which can have multiple active sessions supported by a single GHC instance. Before: $ grep 'global_var' */*hs | wc -l 78 After: $ grep 'global_var' */*hs | wc -l 27 Well, it's an improvement. Most of what's left won't really affect our ability to host multiple sessions. Lots of static flags have become dynamic flags (yay!). Notably lots of flags that we used to think of as "driver" flags, like -I and -L, are now dynamic. The most notable static flags left behind are the "way" flags, eg. -prof. It would be nice to fix this, but it isn't urgent. On the way, lots of cleanup has happened. Everything related to static and dynamic flags lives in StaticFlags and DynFlags respectively, and they share a common command-line parser library in CmdLineParser. The flags related to modes (--makde, --interactive etc.) are now private to the front end: in fact private to Main itself, for now.
* [project @ 2005-02-10 13:01:52 by simonmar]simonmar2005-02-102-3/+3
| | | | | | | | | | | | | | | | | | | | | | | GC changes: instead of threading old-generation mutable lists through objects in the heap, keep it in a separate flat array. This has some advantages: - the IND_OLDGEN object is now only 2 words, so the minimum size of a THUNK is now 2 words instead of 3. This saves some amount of allocation (about 2% on average according to my measurements), and is more friendly to the cache by squashing objects together more. - keeping the mutable list separate from the IND object will be necessary for our multiprocessor implementation. - removing the mut_link field makes the layout of some objects more uniform, leading to less complexity and special cases. - I also unified the two mutable lists (mut_once_list and mut_list) into a single mutable list, which lead to more simplifications in the GC.
* [project @ 2005-01-28 12:55:17 by simonmar]simonmar2005-01-282-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Rationalise the BUILD,HOST,TARGET defines. Recall that: - build is the platform we're building on - host is the platform we're running on - target is the platform we're generating code for The change is that now we take these definitions as applying from the point of view of the particular source code being built, rather than the point of view of the whole build tree. For example, in RTS and library code, we were previously testing the TARGET platform. But under the new rule, the platform on which this code is going to run is the HOST platform. TARGET only makes sense in the compiler sources. In practical terms, this means that the values of BUILD, HOST & TARGET may vary depending on which part of the build tree we are in. Actual changes: - new file: includes/ghcplatform.h contains platform defines for the RTS and library code. - new file: includes/ghcautoconf.h contains the autoconf settings only (HAVE_BLAH). This is so that we can get hold of these settings independently of the platform defines when necessary (eg. in GHC). - ghcconfig.h now #includes both ghcplatform.h and ghcautoconf.h. - MachRegs.h, which is included into both the compiler and the RTS, now has to cope with the fact that it might need to test either _TARGET_ or _HOST_ depending on the context. - the compiler's Makefile now generates stage{1,2,3}/ghc_boot_platform.h which contains platform defines for the compiler. These differ depending on the stage, of course: in stage2, the HOST is the TARGET of stage1. This was wrong before. - The compiler doesn't get platform info from Config.hs any more. Previously it did (sometimes), but unless we want to generate a new Config.hs for each stage we can't do this. - GHC now helpfully defines *_{BUILD,HOST}_{OS,ARCH} automatically in CPP'd Haskell source. - ghcplatform.h defines *_TARGET_* for backwards compatibility (ghcplatform.h is included by ghcconfig.h, which is included by config.h, so code which still #includes config.h will get the TARGET settings as before). - The Users's Guide is updated to mention *_HOST_* rather than *_TARGET_*. - coding-style.html in the commentary now contains a section on platform defines. There are further doc updates to come. Thanks to Wolfgang Thaller for pointing me in the right direction.
* [project @ 2005-01-23 18:50:40 by wolfgang]wolfgang2005-01-232-0/+3
| | | | | | | | | | Make the NCG distinguish between the read-only data section and the "relocatable read-only data" section. Read-only data is supposed to be _really_ read-only, whereas "relrodata" can have relocations, but should not be modified by the program at runtime. For Linux, put relrodata into ".data" by default, as the dynamic linker tends to do evil things to avoid relocating things in read-only sections.
* [project @ 2005-01-23 06:10:15 by wolfgang]wolfgang2005-01-231-0/+10
| | | | | | | | | | | | | | | | | | | | | | | Add support for the dead code stripping feature of recent Apple linkers. If your code is compiled using the NCG, you can now specify -optl-W,-dead_strip on the GHC command line when linking. It will have basically the same effect as using split-objs to build the libraries. Advantages over split-objs: * No evil perl script involved * Requires no special handling when building libraries Disadvantages: * The current version of Apple's linker is slow when given the -dead_strip flag. _REALLY_ slow. * Mac OS X only. This works by making the NCG emit the .subsections_via_symbols directive. Additionally, we have to add an extra label at the top of every info table, and make sure that the entry code references it (otherwise the info table will be considered part of the preceding entry code). The mangler just removes the .subsections_via_symbols directive.
* [project @ 2005-01-16 05:31:39 by wolfgang]wolfgang2005-01-161-0/+2
| | | | | | | | | | | | A first stab at position independent code generation for i386-linux. It doesn't work yet, but it shouldn't break anything. What we need now is one or both of the following: a) A volunteer to implement PIC for x86 -fvia-C (I definitely refuse to touch any piece of code that contains both Perl and x86 assembly). b) A volunteer to improve the NCG to the point where it can compile the RTS (so we won't need point a).
* [project @ 2005-01-16 02:50:16 by wolfgang]wolfgang2005-01-161-0/+2
| | | | | pprExpr: add cases for CmmPicBaseReg and CmmRegOff so that we can do -fPIC -ddump-opt-cmm
* [project @ 2005-01-05 16:24:44 by wolfgang]wolfgang2005-01-051-2/+2
| | | | | Don't use PK_Word64 and ASSIGN_Word64 on 64-bit machines; they just make the .hc files harder to read without adding any benefit.
* [project @ 2004-12-08 15:09:14 by simonpj]simonpj2004-12-081-41/+5
| | | | Undo bogus 1.4 commit
* [project @ 2004-12-08 15:03:50 by simonpj]simonpj2004-12-081-5/+41
| | | | First commit for new Cmm code generation (branch)
* [project @ 2004-11-29 23:28:58 by wolfgang]wolfgang2004-11-291-10/+0
| | | | | Revert part of the previous commit. Something unrelated slipped in :-(.
* [project @ 2004-11-29 23:21:43 by wolfgang]wolfgang2004-11-291-20/+25
| | | | | Fix -dynamic compilation - don't use nameModule on names that might be local.
* [project @ 2004-11-26 16:19:45 by simonmar]simonmar2004-11-262-67/+138
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Further integration with the new package story. GHC now supports pretty much everything in the package proposal. - GHC now works in terms of PackageIds (<pkg>-<version>) rather than just package names. You can still specify package names without versions on the command line, as long as the name is unambiguous. - GHC understands hidden/exposed modules in a package, and will refuse to import a hidden module. Also, the hidden/eposed status of packages is taken into account. - I had to remove the old package syntax from ghc-pkg, backwards compatibility isn't really practical. - All the package.conf.in files have been rewritten in the new syntax, and contain a complete list of modules in the package. I've set all the versions to 1.0 for now - please check your package(s) and fix the version number & other info appropriately. - New options: -hide-package P sets the expose flag on package P to False -ignore-package P unregisters P for this compilation For comparison, -package P sets the expose flag on package P to True, and also causes P to be linked in eagerly. -package-name is no longer officially supported. Unofficially, it's a synonym for -ignore-package, which has more or less the same effect as -package-name used to. Note that a package may be hidden and yet still be linked into the program, by virtue of being a dependency of some other package. To completely remove a package from the compiler's internal database, use -ignore-package. The compiler will complain if any two packages in the transitive closure of exposed packages contain the same module. You *must* use -ignore-package P when compiling modules for package P, if package P (or an older version of P) is already registered. The compiler will helpfully complain if you don't. The fptools build system does this. - Note: the Cabal library won't work yet. It still thinks GHC uses the old package config syntax. Internal changes/cleanups: - The ModuleName type has gone away. Modules are now just (a newtype of) FastStrings, and don't contain any package information. All the package-related knowledge is in DynFlags, which is passed down to where it is needed. - DynFlags manipulation has been cleaned up somewhat: there are no global variables holding DynFlags any more, instead the DynFlags are passed around properly. - There are a few less global variables in GHC. Lots more are scheduled for removal. - -i is now a dynamic flag, as are all the package-related flags (but using them in {-# OPTIONS #-} is Officially Not Recommended). - make -j now appears to work under fptools/libraries/. Probably wouldn't take much to get it working for a whole build.
* [project @ 2004-11-10 01:56:00 by wolfgang]wolfgang2004-11-101-14/+15
| | | | | | Fix pretty-printing of integer constants on 64-bit platforms. If sizeof(int) == 4 on a 64-bit platform, we have to add an 'L' suffix to integer constants.
* [project @ 2004-10-26 17:48:39 by ross]ross2004-10-261-1/+1
| | | | bind acosDouble to acos(), rather than asin()
* [project @ 2004-10-20 11:16:08 by simonmar]simonmar2004-10-201-2/+1
| | | | Fix braino in pprAsmCLbl
* [project @ 2004-10-18 11:51:22 by simonmar]simonmar2004-10-181-0/+3
| | | | Put the '@' suffix on stdcall ForeignLabels on Windows only.