High-level Cmm code and stack allocation

Simon Peyton Jones simonpj at microsoft.com
Wed Jan 8 10:07:26 UTC 2014


| > Can't we just allocate a Cmm "area"? The address of an area is a
| perfectly well-defined Cmm value.

What about this idea?

Simon

| -----Original Message-----
| From: Simon Marlow [mailto:marlowsd at gmail.com]
| Sent: 08 January 2014 09:26
| To: Simon Peyton Jones; Herbert Valerio Riedel
| Cc: ghc-devs at haskell.org
| Subject: Re: High-level Cmm code and stack allocation
| 
| On 07/01/14 22:53, Simon Peyton Jones wrote:
| > | Yes, this is technically wrong but luckily works.  I'd very much
| > | like to have a better solution, preferably one that doesn't add any
| > | extra overhead.
| >
| > | __decodeFloat_Int is a C function, so it will not touch the Haskell
| > | stack.
| >
| > This all seems terribly fragile to me.  At least it ought to be
| surrounded with massive comments pointing out how terribly fragile it
| is, breaking all the rules that we carefully document elsewhere.
| >
| > Can't we just allocate a Cmm "area"? The address of an area is a
| perfectly well-defined Cmm value.
| 
| It is fragile, yes.  We can't use static memory because it needs to be
| thread-local.  This particular hack has gone through several iterations
| over the years: first we had static memory, which broke when we did the
| parallel runtime, then we had special storage in the Capability, which
| we gave up when GMP was split out into a separate library, because it
| didn't seem right to have magic fields in the Capability for one
| library.
| 
| I'm looking into whether we can do temporary allocation on the heap for
| this instead.
| 
| Cheers,
| Simon
| 
| 
| > Simon
| >
| > | -----Original Message-----
| > | From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of
| > | Simon Marlow
| > | Sent: 07 January 2014 16:05
| > | To: Herbert Valerio Riedel; ghc-devs at haskell.org
| > | Subject: Re: High-level Cmm code and stack allocation
| > |
| > | On 04/01/2014 23:26, Herbert Valerio Riedel wrote:
| > | > Hello,
| > | >
| > | > According to Note [Syntax of .cmm files],
| > | >
| > | > | There are two ways to write .cmm code:
| > | > |
| > | > |  (1) High-level Cmm code delegates the stack handling to GHC,
| and
| > | > |      never explicitly mentions Sp or registers.
| > | > |
| > | > |  (2) Low-level Cmm manages the stack itself, and must know about
| > | > |      calling conventions.
| > | > |
| > | > | Whether you want high-level or low-level Cmm is indicated by the
| > | > | presence of an argument list on a procedure.
| > | >
| > | > However, while working on integer-gmp I've been noticing in
| > | > integer-gmp/cbits/gmp-wrappers.cmm that even though all Cmm
| > | procedures
| > | > have been converted to high-level Cmm, they still reference the
| 'Sp'
| > | > register, e.g.
| > | >
| > | >
| > | >      #define GMP_TAKE1_RET1(name,mp_fun)       \
| > | >      name (W_ ws1, P_ d1)                      \
| > | >      {                                         \
| > | >        W_ mp_tmp1;                             \
| > | >        W_ mp_result1;                          \
| > | >                                                \
| > | >      again:                                    \
| > | >        STK_CHK_GEN_N (2 * SIZEOF_MP_INT);      \
| > | >        MAYBE_GC(again);                        \
| > | >                                                \
| > | >        mp_tmp1    = Sp - 1 * SIZEOF_MP_INT;    \
| > | >        mp_result1 = Sp - 2 * SIZEOF_MP_INT;    \
| > | >        ...                                     \
| > | >
| > | >
| > | > So is this valid high-level Cmm code? What's the proper way to
| > | allocate
| > | > Stack (and/or Heap) memory from high-level Cmm code?
| > |
| > | Yes, this is technically wrong but luckily works.  I'd very much
| > | like to have a better solution, preferably one that doesn't add any
| > | extra overhead.
| > |
| > | The problem here is that we need to allocate a couple of temporary
| > | words and take their address; that's an unusual thing to do in Cmm,
| > | so it only occurs in a few places (mainly interacting with gmp).
| > | Usually if you want some temporary storage you can use local
| > | variables or some heap-allocated memory.
| > |
| > | Cheers,
| > | Simon
| > | _______________________________________________
| > | ghc-devs mailing list
| > | ghc-devs at haskell.org
| > | http://www.haskell.org/mailman/listinfo/ghc-devs
| >



More information about the ghc-devs mailing list