Calling an unknown function from low-level Cmm

Simon Peyton Jones simonpj at
Mon Feb 24 14:33:37 UTC 2020

I don’t know the answer to this, but Alexis when you find out can I ask (I know I'm a broken record on this) that you write a Note to explain, with pointers from the various places you looked when you were trying to find out the answer?



|  -----Original Message-----
|  From: ghc-devs <ghc-devs-bounces at> On Behalf Of Alexis King
|  Sent: 14 February 2020 19:53
|  To: ghc-devs <ghc-devs at>
|  Subject: Calling an unknown function from low-level Cmm
|  Hi all,
|  I’m trying to understand how to properly call an unknown function from
|  low-level Cmm code. If I’m just applying a function to a state token, it’s
|  easy; I can just do
|      R1 = io;
|      jump stg_ap_v_fast [R1];
|  since the calling convention is consistent in that case. But what if my
|  function takes actual arguments? I can’t do
|      R1 = fun;
|      R2 = arg;
|      jump stg_ap_p_fast [R1, R2];
|  because if the calling convention doesn’t pass any arguments in registers,
|  that would be wrong. I could check if NO_ARG_REGS is defined and generate
|  different code in that situation, but that seems extreme. One option I
|  think would work would be to do
|      R1 = fun;
|      Sp_adj(-2);
|      Sp(1) = arg;
|      jump RET_LBL(stg_ap_p) [R1];
|  but that seems wasteful if I have the argument in a register already
|  anyway. Am I missing something?
|  Thanks,
|  Alexis
|  _______________________________________________
|  ghc-devs mailing list
|  ghc-devs at
|  devs&
|  b187813d%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637173067859470793&a
|  mp;sdata=uVYlDXXGfB1vN0MD%2FM%2BBsUflWvrfkYPTEFtVJk2N7Y4%3D&reserved=0

More information about the ghc-devs mailing list