[llvm-dev] Semantics of preserve_all calling convention

Keno Fischer via llvm-dev llvm-dev at lists.llvm.org
Mon Jun 13 05:49:42 PDT 2016

The ir reference for preserve_all states:

This calling convention also behaves identical to the Ccalling convention
> on how arguments and return values are passed

I tried the following:

uint64_t return_zero() __attribute__((preserve_all))
    return 0;

and got

0000000000000020 <return_zero>:
  20: 50                   push   %rax
  21: 31 c0                xor    %eax,%eax
  23: 58                   pop    %rax
  24: c3                   retq

as you can see, the rax register is restored to its value upon entry to the
function and does not contain the return value. What are the semantics
here? Should this work? Should we add a verifier error for functions with
this calling convention that return values?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160613/9d19ade0/attachment.html>

More information about the llvm-dev mailing list