<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/126176>126176</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
-fno-plt option does not suppress PLT generation in Clang 19 dev, while GCC works as expected
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
lfeng14
</td>
</tr>
</table>
<pre>
#### Environment
- Arch: aarch64
- Clang Version: Clang 19 dev (e.g., clang version 19.0.0git)
- GCC Version: (e.g., gcc version 10.3)
- Compiler Flags: -fno-plt
#### Description:
I encountered an issue with the -fno-plt option in Clang 19 dev (development version) on aarch64. When compiling code with -fno-plt, Clang still generates PLT (Procedure Linkage Table) entries for function calls, whereas GCC behaves correctly and does not generate PLT entries.
This issue affects scenarios where direct GOT-based access is expected, and the presence of PLT entries may lead to unnecessary indirection and performance overhead.
Compile the following code with Clang 19 dev and -fno-plt
```
// gcc 1.c -shared -fno-plt -O0 -o libnoplt-clang.so -fPIC
// clang 1.c -shared -fno-plt -O0 -o libnoplt-gcc.so -fPIC
int bar(int a) {
return 10;
}
int foo(int a) {
return bar(a);
}
```
The Clang-compiled version generates PLT functions, while the GCC version does not.
```
// libnoplt-clang.so
Disassembly of section .plt:
0000000000000440 <.plt>:
440: a9bf7bf0 stp x16, x30, [sp, #-16]!
444: f00000f0 adrp x16, 1f000 <__FRAME_END__+0x1e934>
448: f947fe11 ldr x17, [x16, #4088]
44c: 913fe210 add x16, x16, #0xff8
450: d61f0220 br x17
454: d503201f nop
458: d503201f nop
45c: d503201f nop
0000000000000470 <bar@plt>:
470: 90000110 adrp x16, 20000 <__cxa_finalize@GLIBC_2.17>
474: f9400611 ldr x17, [x16, #8]
478: 91002210 add x16, x16, #0x8
47c: d61f0220 br x17
0000000000000588 <foo>:
588: d10083ff sub sp, sp, #0x20
58c: a9017bfd stp x29, x30, [sp, #16]
590: 910043fd add x29, sp, #0x10
594: b81fc3a0 stur w0, [x29, #-4]
598: b85fc3a0 ldur w0, [x29, #-4]
59c: 97ffffb5 bl 470 <bar@plt>
5a0: a9417bfd ldp x29, x30, [sp, #16]
5a4: 910083ff add sp, sp, #0x20
5a8: d65f03c0 ret
```
```
libnoplt-gcc.so
00000000000005c4 <bar>:
5c4: d10043ff sub sp, sp, #0x10
5c8: b9000fe0 str w0, [sp, #12]
5cc: 52800140 mov w0, #0xa // #10
5d0: 910043ff add sp, sp, #0x10
5d4: d65f03c0 ret
00000000000005d8 <foo>:
5d8: a9be7bfd stp x29, x30, [sp, #-32]!
5dc: 910003fd mov x29, sp
5e0: b9001fe0 str w0, [sp, #28]
5e4: b9401fe0 ldr w0, [sp, #28]
5e8: f00000e1 adrp x1, 1f000 <__FRAME_END__+0x1e900>
5ec: f947e821 ldr x1, [x1, #4048]
5f0: d63f0020 blr x1
5f4: a8c27bfd ldp x29, x30, [sp], #32
5f8: d65f03c0 ret
```
relevant issue: (Support fno-plt like gcc)[https://github.com/llvm/llvm-project/issues/78275]
relevant pr: (Implement -fno-plt for SelectionDAG/GlobalISel)[https://github.com/llvm/llvm-project/pull/78890]
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycV91u2zwSfRr6hrBBUZRFXfjCcZogQHe_YhvsXgYUNbS1pUWBlJ1kn37BH8lykybBF7i1IfGcmTk8Q42Ec-2-A9ig4gYVtwtxGg7GbrSCbp-xRW2a1w2i-fTB37pza013hG5AZLvEWysPKN9iIaw8rFm4hndadHv8b7CuNZ2_Gy9kFW7gjBHlsNqvEN1hGa6f40KcVSuyIvt2QLSKRPe73ZxmhtxLecGRVT5BdubYtxosvtNi7zxqqTqz7LXP13_m1dyCk7bth8iPyPYBQyfNqRvAQoNFh1vnToCf2-GAhwNMXNgEEG67N7U1cAZteq_QmCGiFTbdqNEK_-cAHZYh0bbbY2maFGJKle4SrxtarfEeOrBiAId_fH_0QX5YI6E5WcDf2-6X2AN-FLUGHwi6wbbgsDIWq1MnQ55SaO086_MBLAgXlK3hIM7gsDTWghz0KxZdgxsDDndmmIKGmIl1FUV8PLQuSSOUAjk47CR0wrbGxRC4aT0nvv_rcVkL58WUEpxHYXjpQQ7Q-Hx8RC9sb8FBJwEbNY-Hj-IVaxANHgw-dR14DmFfcdvFAL44z9GDVcYeRaA4gz2AaFKyyREhjDJam-dr0a820HPNDbMm6eOdc4foHQ7Wy1YSL91BeJdMnsDLvwheGqzbujO9HpbB3itn8FL9eNjNKKLvv0ayl3JO0XYDroVFlPtfwu84Km8Q2WJsYThZ3w4o9xdQeZvWK2PeWZ-WRzJ_Yw6bF_54gCjSMnoWmqn1ro052i05bRTde20EjO5avS_uG-kQ2d62TjgHx1q_ene4tOsrv0OhaRHZkvkfYwSjfBcXfItrMGMk_KpEVauyVgQjUrmhR6R6ydY-4Zec-C9U3Lg-_KD5Mluj4hbRLDKwyKBClMggGjujyPwtH_vp6e5f2398e_r2z9unJ0RvyEsGVc58OoGJJ6aKlQqyzDPpxgaiMiWRKBHNGeHcpxGQMiKrLFdAs5RDM6tigpEXpXgAFan0Zp0pQmkA1WO0sCBV1hQkpyRTfkFn-niPf3BP_unemz0pgy7ebIxcb0yZsqv8uix7R1ZKJlnli3hSbSd0-z9AjNx_f7jZPdFVVo7SlmySlpD1Z9JOupZ81JUQ-pmuUdVSfqjq7woUnPsSfC9OtRd8FDcjhOcqCOhOtf8_eHByInmhJCLkaGOSlbVqZjam1R9sHF3s0RW5lMnyiE5lRvQsYBYDVknQmmdK5iL1zckX-jxGSmDfMWwKxUdcMeF08wXc6PBSKaXqIsiqEanes5AHiKmx2aSIbr6qiGAXRcYdiIr8aQfEuGfrQpFchsIsjOPF_Eyb_f7tOH9jDsnG2i7mkOxiDvaxOdJeyVFz30sK0l5dSX6RgI4SyKR4QTkhGQuoozlfUD6CwG__EKnSue35YgrNtcM-0nNEsA_0vFapeaeFGj6d6_DVhljm9HKuF428pExSU8T6L03h1wG5qJt9oi4dT5YCxv6p2ISKB9KHKD5_1kB2dSh-_qghZOwOkJdHDXB6dR5Ox-H0oGFTAmp6ZuSKkHS66YQLC1Jdgkv6edt5tUOMnEb0n5to3kFka0HDWXRDHDfTW8DPU98bO-BxaNLtL_BzmR9iipvDMPR-8o_e3LfD4VSvpDkieqf1efxa9tb8F-SA6F2gdojelZyWRVRgitvbFPTh2GsIY_00rPkZ-yfoOJHcbu8RvbvXphb64Sfov5lMf9I6pMIrgopbvGg2eVPllVjAJitzXhFGOFscNjUBLteyyvy_IlvXBefros6p4NybedFuKKEFoaQkrGCMrSrOZFGuCWFCcp5zxAgcRatXPoWVsftFUGKT0XVWrhda1KBdeDWkNAxkiPq-WdhNyLk-7R1iRLducBeKoR00bH5_UZreKtyp97N-HBjT-PjOm9RlgvTT47OxvxwWl1eHxcnqzd_f51TgeUP_HwAA___8cSWS">