<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/62574>62574</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            generateCompactUnwindEncoding on ARM64 unexplainably expects particular order of CFI directives
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mraleph
      </td>
    </tr>
</table>

<pre>
    If you assemble (ARM64):

```asm
.text
.globl  _main
.p2align        2
_main:
        .cfi_startproc
        .cfi_def_cfa x29, 16
        .cfi_offset x30, -8
        .cfi_offset x29, -16
        ret
        .cfi_endproc
```

Then LLVM will recognise this as compact unwind info `UNWIND_ARM64_MODE_FRAME`, but if you assemble:

```asm
.text
.globl  _main
.p2align        2
_main:
        .cfi_startproc
        .cfi_def_cfa x29, 16
        .cfi_offset x29, -16
        .cfi_offset x30, -8
        ret
        .cfi_endproc
```

Which means exactly the same thing, LLVM will silently fail to recognise it and instead falls back to `UNWIND_ARM64_MODE_DWARF`. 

I had to look into the LLVM source to understand why this happens, which is a very poor failure mode.

cc @TNorthover 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVE2PozgQ_TXmUmrkmJiGA4ds0kiRJr1Sa2b7GBm7AO8YG9kmH_9-BelRJ9rWHvY2EgJUrz5evSpbhKA7i1gR_gfhu0RMsXe-GrwwOPZJ49S12rdwdROIEHBoDAJhxebtkK8JK0m2IXRH6K93Tm-PCMPNkka8xI_fzrjGEFoeB6Hth21kwujOElqym-UGfqYtU9nqY4jCx9E7-WhW2B5lK-DCSsK2sMofYde2ASNcMjqjT8XX6C326S7YY3x0Ravuiv9q8r7z7z1a-PbtrwOctTHgUbrO6oAQex1ABJBuGIWMMNmztgq0bR2QnP54fd-_7o6LnsfDn7uXY_22ObzM2dkWmimCflT_91D835r-90D-h-LvvZY9DChsALwIGc0VYo8QxLCobru5xudIgjZoZ6dWaAPR3c1IRxDLTEJEoaAVxgRohPw5u305pN375q0mOU3hntIeeqHmGOPcT9A2uoXRwiG4yUucwckq9CHOFc_99bYgvRhHtGFmfF76mpcGTuivMDrnF86TRxicwvS-pJRA1vT7q_Oxdyf0kKgqU2VWigSrVV5kGeUl5UlftZw2ijft86rIOLbP64Zj8cx4JnDdNjlNdMUoyyinfJXzgvGUyzzjctUoqQpWtCuypjgIbVJjTkPqfJfoECascsaf14kRDZqw3COMWTzDAhLG5mvFV3PMUzN1gayp0SGGzyxRR4NVhxa9iLi9HZQfyzl5sdIpbTtwFhb5YbJ4GY3QVjTmCngZUcYAo_BRy8kID84r9OBa2NZ7UNqjjPqEIZm8qfoYxzCvOqsJqzsd-6lJpRsIq2c2H5-n0bu_UUbC6qWHQFi99PhPAAAA__8IyZRd">