<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/128747>128747</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LLD] LTO internalizing global marked with 'STV_PROTECTED'
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jhuber6
</td>
</tr>
</table>
<pre>
I'm trying to compile the following files targeting the AMDGPU architecture.
```llvm
target triple = "amdgcn-amd-amdhsa"
@__llvm_libc_heap_ptr = external hidden addrspace(1) global ptr, align 8
; Function Attrs: convergent mustprogress noinline nounwind optnone
define protected amdgpu_kernel void @kernel(ptr noundef %out) #0 {
entry:
%out.addr = alloca ptr, align 8, addrspace(5)
%out.addr.ascast = addrspacecast ptr addrspace(5) %out.addr to ptr
store ptr %out, ptr %out.addr.ascast, align 8
%0 = load ptr, ptr addrspacecast (ptr addrspace(1) @__llvm_libc_heap_ptr to ptr), align 8
%1 = load ptr, ptr %out.addr.ascast, align 8
store ptr %0, ptr %1, align 8
ret void
}
attributes #0 = { convergent mustprogress noinline nounwind optnone "frame-pointer"="all" "no-builtin-printf" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}
!0 = !{i32 1, !"amdhsa_code_object_version", i32 500}
!1 = !{i32 1, !"wchar_size", i32 4}
!2 = !{i32 8, !"PIC Level", i32 2}
!3 = !{i32 7, !"frame-pointer", i32 2}
!4 = !{!"clang version 21.0.0git"}
```
```llvm
target triple = "amdgcn-amd-amdhsa"
@__llvm_libc_heap_ptr = protected local_unnamed_addr addrspace(1) global ptr null, align 8
@__llvm_libc_heap_size = protected local_unnamed_addr addrspace(1) global i64 0, align 8
!llvm.module.flags = !{!0, !1, !2, !3, !4}
!llvm.ident = !{!5}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"frame-pointer", i32 2}
!3 = !{i32 1, !"ThinLTO", i32 0}
!4 = !{i32 1, !"EnableSplitLTOUnit", i32 1}
!5 = !{!"clang version 21.0.0git"}
```
If I take these two files and run them through `ld.lld` I notice that the reference to the protected variable gets internalized. In the resolutions.txt file, it claims that it is not visible to the regular object because it is not exported. But, this is a `-shared` build and a protected symbol should not be internalized like this.
```
ld.lld foo.o bar.o -shared -save-temps
```
Reading the temporary outputs shows the internalization happening.
```console
$ opt -S a.out.0.0.preopt.bc
@__llvm_libc_heap_size = protected local_unnamed_addr addrspace(1) global i64 0, align 8
@__llvm_libc_heap_ptr = protected local_unnamed_addr addrspace(1) global ptr null, align 8
...
$ opt -S a.out.0.2.internalize.bc
@__llvm_libc_heap_size = protected addrspace(1) global i64 0, align 8
@__llvm_libc_heap_ptr = internal addrspace(1) global ptr null, align 8
...
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8V11v2zoS_TX0y8ACRUv-ePCDEzeLAFmkuM3dV4OSxhIbihTIkdP01y9IyYntpNuvvQUcKCLnzMwZHg4p6b2qDeKa5Vcs305kT411689NX6CbTwpbPa9vmVi0QO5ZmRrIQmnbTmkEahD2Vmv7FCb2SqMHkq5GioYNwubf2399_BukKxtFWFLvMGF8E35zPvy0PrSMbwYckFOdRmCzLTAhZFvVpZnKtgp_jZdMiBGe8d0uQHdaFeWuQdntOnIRiF8InZEaGlVVaEBWlfOdLJGJZcrECmptC6mhI8fENUitagPL0e_sCm56U5KyBjZEzrPZBkprDuhqNARt76lztnboPRirjFYGwdjePClTge3IWIOMbyrch5nO2UAcKwhkun73iM6ghoNVFbCMD69MLEP2wU2Fe2Aitz2FVJmYcWCLK8Y3aMg9s1nIEkaLJFCLnKXWtpSXlMK_J-RzJlYBfQJOpC-lp8HH0TSOhHwuwWdhycZwIRtP1mFEHDO_Pnk7DXRe8MiDx-DayuqY_lnoIb2hPm9W8lsyGHMTq3fipe_G-36qZyT5CS69tHRIcX2DnhbbQViSyKmiJ_TjmgaFL65-XlphX-ydbHHaWWUIXdgTs23YLVozIcK8sdOiV5qUmXZOGdq_jpOTXadMPW0lNS9Qcj2ONp5k-TgdZWvdtOj3e3RTr77ii_ky2h6pMZGGJUhaW_Uak72WtR93cBqkK9JYLSbSdHyK8TkbfYwOVBXKcIbMTqPwkzk1E3B0N3SKxstdaSvc2eIzlrQ7oPPKmpC0uIZgn3P-EjD9tq-nspFudyQ8YrMXpLhALl-RH2-v4Q4PYT-_AMULcHYBXLwC3yzoG3B2XhcmRKmlqWFkCSJNeMJrRQE9gI4d9p_ttq8NLnQgveuNkS1Wu9gj_kfrBdMHvZ7133fChGX49ThqngF_2-R_Q7DDM_uucPMfFO53xHYp0x8W26VKf0psl0o9yfehUebu4f4Ext_V6AXsg5GFxk-dVnT3cP-3GXQ6ekhfPOS_p3K-ud3DLZB8jJcTj0BPdryYSFOB600Yb4EaZ_u6gbAjqkTris053IKxpMoAlRSvLw736NCEIRsHXkV4kE4FSlAjeYilNFKrr1glcGtGtLe6DzcJn9AXinlEygSllqr1QyBFoEK_Jzgor4LLMZjDutfSwdDPoMBS9h5P7PFLZx2FiFfDmUuN8mFSBmJT30iHkVk4DKpYAXlCwT-3hdXgG9vrKjos8IwJaBULqXxyUemhaLC3NrFQSJdYGMPB1MsDTgnbzl-A_kJZHS-GYd466Z7B9tT15EMaTz7OvaYg4zWskV2HRpn6LIvSGm81Rt1k4XCE6SeQSTjEecKTzqHtKCnKP9ZX_kyPTJLkfcoiOVm6n-L9fyJ5DP9rhI7LOqnWs2o1W8kJrtNFxnOeLdN80qyr-bxcYIFlzmW2mhcyL1eLKsOCp6v5gu8nai24yLkQebqYzWZ5kuVFuipTXuBSiiIrWMaxlUonsWdbV0-U9z2uU7FcZIuJlgVqH7-DhAgtQYjwQeTWwXxa9LVnGdfKk391QIp0_HS6u9uyfAt3D_cn8g1iH7m30j1iBU-KGmBi8enhP7uPf90_fLh--LBlYjHpnV43RF343GDihombWlHTF0lpWyZu4rE9PMLVLPQDJm5i-p6Jm5HBYS3-GwAA___lmDbO">