High-level Cmm code and stack allocation

Herbert Valerio Riedel hvr at gnu.org
Sat Jan 4 23:26:52 UTC 2014


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?

Cheers,
  hvr


More information about the ghc-devs mailing list