<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/66752>66752</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
wasm-ld discards elem segments
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
camilstaps
</td>
</tr>
</table>
<pre>
It seems that `wasm-ld` sometimes discards `elem` segments which are needed when references to functions are made. With the following files:
```wat
;; llvm-table.wat
(module
(import "llvm-table-a" "populate" (func $populate))
(table $table (export "table") 1 funcref)
(func $main
(call $populate)
(call_indirect $table (i32.const 0))
)
)
;; llvm-table-a.wat
(module
(import "llvm-table" "table" (table $table 1 funcref))
(elem func $f)
(func $f)
(func $populate
(table.set $table (i32.const 0) (ref.func $f))
)
)
```
the `elem` segment is required for `ref.func` in llvm-table-a to work. However, running:
```
wat2wasm -r --enable-multi-memory llvm-table.wat
wat2wasm -r --enable-multi-memory llvm-table-a.wat
wasm-ld-17 --no-entry --export=main --import-table llvm-table.wasm llvm-table-a.wasm -o llvm-table.linked.wasm
```
results in a linked file where the `elem` segment has been removed:
```
$ wasm2wat llvm-table.linked.wasm
llvm-table.linked.wasm:000006a: error: function 1 is not declared in any elem sections
```
```wat
;; wasm2wat --no-check llvm-table.linked.wasm
(module
(type (;0;) (func))
(func $main (type 0)
call $populate
i32.const 0
call_indirect (type 0))
(func $f (type 0))
(func $populate (type 0)
i32.const 0
ref.func $f
table.set 0)
(table (;0;) 1 funcref)
(memory (;0;) 2)
(global $__stack_pointer (mut i32) (i32.const 66560))
(export "memory" (memory 0))
(export "main" (func $main))
(export "table" (table 0)))
```
Is this intentional? Maybe I'm misunderstanding how to share a `table` over multiple files?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVs2S6jYTfRqx6TJly2Dwwos73xT1zSLrLKdkq8HK6IdI8ji8fUoyxjYMVJJb1B3TarUOx32OmjknThqxIts3sn1fsc63xlYNU0I6z85uVRt-qT48OETlwLfMAynSnjmVSE6KFJxR6IVCB1y4hlnuQgJKVHEVTwq1d9C3ommBWQSNyJFD36IGi0e0qBt04A0cO914YbSLeYpxXMPvwrfgW4SjkdL0Qp_gKCQ6kv8i6TtJx_-LdPj0zF8j-RvJ30DKb5V4VktcT0t0rwzvJI4VSkL3Qp2N9UAonbYkjFAaQmdz7iTzOHzdB6BA6GYKl-EzxxNrxiIhcXzY41_jKTFEKCW0hCz-dIvHH6uMpykm9BSPSw2T8h7IY8an0FxYbPwCisjpujHaeUiX-GfPd3DuKU3YfyD1Suns-Z6nBR0_MRK6C0Zajkvo-5_ij6s3xpZ0DZ3i8BVVIWLxuF4c9Jq-sTvneEJTPyoFhAOLf3bCIoejsSFlPCykCb3gP8imN_ZrDf83PX6jJfR_YDuthT49k8jwtWeeBhlDYiFJUMd6qpNeJAqVsZcfpfNvds2742oYSbaDJNEmQe3tJVSIeiD5e2huSJKhYYb9SwBO3ZcOKMw8SQr9hTyuvODdouukd4FJBsOWaCnBkSzCk9fSMgc1RstS5hv5a3IJ3UCAQXvmnyCEIfMJ_PxXGv4VjOS_AK01NjyMBglZaBNtPHBsJAutEn6NvkBUhsPBRn-G9swpb3jjC2pabL5ek7sUPEQhX85RMCR_S0PZQSyxd2cagTtTu-1MpxQAeDC328pcj0Pw3uZm9aaSc3P4BznjuU_gPYIAgKUv3MKTraTLs24WM2Ps8TaIqVd9LXPpMuckTc0iaZ-fzrPm6_NshPZoY4HOB9DXlzLBL4pt8cjCdFMNB1-t-oriZX64p5YX5RB6uuPxLhjrv3TQjzCQiKBkjzp0PJMkP8Bv7FIjfBC6U6CE6zRH6zzTPAwPremDZ7o2jBgsKH04vEjBfKOF6GVnieOUcVjxKudlXrIVVllRbrNsuynyVVvVPEcs-GZXZruc5fl-t2M8Y_u8rot6l_OVqGhK87TMyrSkG5qvm11TbPdNXZdZliLdkk2Kigm5DjJbG3taCec6rIpit6UryWqULk5mlGrsIS6GiWH7vrJVlGbdnRzZpFI476YqXniJ1dVyp7Hs6g3DQLbqrKxa789xkqIHQg8n4duuXjdGEXoIxa5_krM1f2DjCT1ECI7QQ4T4dwAAAP__MakEEA">