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