Skip to content
  • Simon Marlow's avatar
    Add a way to reserve temporary stack space in high-level Cmm · eaa37a0f
    Simon Marlow authored
    We occasionally need to reserve some temporary memory in a primop for
    passing to a foreign function.  We've been using the stack for this,
    but when we moved to high-level Cmm it became quite fragile because
    primops are in high-level Cmm and the stack is supposed to be under
    the control of the Cmm pipeline.
    
    So this change puts things on a firmer footing by adding a new Cmm
    construct 'reserve'.  e.g. in decodeFloat_Int#:
    
        reserve 2 = tmp {
    
          mp_tmp1  = tmp + WDS(1);
          mp_tmp_w = tmp;
    
          /* Perform the operation */
          ccall __decodeFloat_Int(mp_tmp1 "ptr", mp_tmp_w "ptr", arg);
    
          r1 = W_[mp_tmp1];
          r2 = W_[mp_tmp_w];
        }
    
    reserve is described in CmmParse.y.
    
    Unfortunately the argument to reserve must be a compile-time constant.
    We might have to extend the parser to allow expressions with
    arithmetic operators if this is too restrictive.
    
    Note also that the return instruction for the procedure must be
    outside the scope of the reserved stack area, so we have to extract
    the values from the reserved area before we close the scope.  This
    means some more local variables (r1, r2 in the example above).  The
    generated code is more or less identical to what we had before though.
    eaa37a0f