<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/121103>121103</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64][RISCV][Loongarch] return address should be passed into `_mcount`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
backend:RISC-V,
miscompilation,
backend:loongarch
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
dtcxzyw
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dtcxzyw
</td>
</tr>
</table>
<pre>
Reproducer:
```
; bin/clang -pg test.c && ./a.out && gprof -b a.out gmon.out
int fib(int n) {return n <=1 ? 1 : fib(n-1) + fib(n-2); }
int main() {fib(10); return 0;}
```
The call graph is missing if it is compiled with clang:
```
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
```
With gcc, it works as expected:
```
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1 0.00 0.00 fib
Call graph
granularity: each sample hit covers 2 byte(s) no time propagated
index % time self children called name
176 fib [1]
0.00 0.00 1/1 main [6]
[1] 0.0 0.00 0.00 1+176 fib [1]
176 fib [1]
-----------------------------------------------
Index by function name
[1] fib
```
This issue can be reproduced on AArch64/RISCV/Loongarch platforms.
After investing this issue, I found that we should pass the return address into `_mcount`:
https://github.com/gcc-mirror/gcc/blob/c6b7d0343f2c0eb3102341c9326fe314a047bee6/gcc/config/riscv/riscv.h#L466-L473
https://github.com/bminor/glibc/blob/757ac24f8f2344e5f8afd2465c808d0f6adcc948/sysdeps/riscv/machine-gmon.h
This issue was originally reported by @wzssyqa.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8VkGv26oS_jVkM0qEMXacRRbJOc9Spa76qr7lE4axzS0GX8DnNP31Vzi2m9NWR-rmoijggYFvvvkGW4SgO4t4JsWVMKai_Pb99koYI8XzTkyxd_68GHeNU7fzJxy9U5NET_ILoRdS0uVHLyS_QqMtYbU0wnawHzuIGOJBAmElYSUcCKvFwU1xNXSjdy3sG7hbu8HZNCD0om2EVjeEVWlkCTsBOV49xslbsEDyJ5I_Z0DyGtL_ZVls99m8lF03AyPslKCR4_Oy7yASymrZ874uo8uy5QhK8uvd4zHEzz2CFMZA58XYgw4w6BC07UC3oGMySDeM2qCCVx17mJn4laraiAgpdm1wmaWX_wjZQxDDaBCkm2wMIALQA80goHRWhQOhF7AOoh4QhJTTMBkRUd39AQgrYDHqFwSAgKaFN22zRBeFeZhIG8z7wnra1gPMQQeAzyFlNxHwOLRiwJ8C_F8KvpOSsKfEy6vzX-do8NuIMiH-NymBPyTlN1TAH5Gx8pmQ0vtfatsAALK3lvsgSZEuocPTprPN1nlhJyO8jrckeXxgp9cRpHtBH4BBc4tIWBWSwlduRu9G0f2gRluF32Z6llAXFmSvjfJo10BRzQCXHEN2LN9Q1-oGSHHNSPE8R_y2rfHNfUZYnT1MpjJMvuXdd9llc_zFfyGOsOsK4v3Df2nvY9__WduS8mEmsrlBO1kZtbNbPcyQ1rCW3L65THQAHcKU7hQLDYJfb1cFzsLl4mVfcsLqTx_--_SFsPqjc7YTXvYwGhFb54dZ_4ReLm1ED9q-YIjpOorb3qkCP0DrJqsg9iLCK0Lo3WQUjCIEiD2ud55QymMIoG10QEr6_2GuuYR2Lsg-xjGkIasJqzsd-6k5SDekByn3g_be-fsDYXVjXJOqomyOiuY8b5mk2OQZZTnP5ClnZYt5xgXlxwax3Pyks63uCKu9DvJl7Q89YflHXpb7j_yYvw-mGbS9AzG6eYByLI5CMt5WLcs5x6KtRKsYLwtZ0UrRthRKyhOvCKvDLSgcwwOKQcheW9zP76ilJB8y-CoCOK87bYUxt5RJ5yOqpAvC6ev3EG5_i5SsnTrn6pSfxA7P2TEvMsY45bv-rArFM3WsJM9pVWBFkTZNXmSyOFZC0Hanz4wynjFWZJSVnB-YLDPBeY6t5OWpqAinOAhtDsa8DAfnu92M7ZyxLKP5zogGTVhe9Y2QX9Gme3iTGSPs6c1Mkt3-yzYx6HB_uYmk8t-sN6s8lw8If05A9s3UBcKp0SGGH9Cijmb-7ljPL55Jcb0rfR5uYk_V85NCFwE3OGsY1W8ku5u8Ob8jkgRk6fajd3-hjITVM2Ep7QtnL2f2TwAAAP__yg-m3Q">