<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">