Skip to content

Broken WASM codegen with u128 and wasm_abi #88207

Not planned
@kostko

Description

@kostko

It seems that the following code:

#![feature(wasm_abi)]

#[no_mangle]
pub extern "wasm" fn test() {
    format!("boom: {}", 0u128);
}

can result in invalid WASM being generated in case it is compiled with lto = true. I've created a repository with the minimal example that reproduces the issue when built with (tested on rustc 1.56.0-nightly (0035d9dce 2021-08-16)):

cargo build --target wasm32-unknown-unknown --release

Parsing the generated WASM will produce an error similar to the following:

[parse exception: attempted pop from empty stack / beyond block start boundary at 536 (at 0:536)]
Fatal: error parsing wasm

Using an argument of type u64 or disabling lto or using the C ABI instead of wasm ABI (which enables LLVM's multivalue feature) works.

Meta

rustc --version --verbose:

rustc 1.56.0-nightly (0035d9dce 2021-08-16)
binary: rustc
commit-hash: 0035d9dcecee49d1f7349932bfa52c05a6f83641
commit-date: 2021-08-16
host: x86_64-unknown-linux-gnu
release: 1.56.0-nightly
LLVM version: 12.0.1

Activity

memoryruins

memoryruins commented on Jul 20, 2022

@memoryruins
Contributor

@rustbot label: +O-wasm +A-abi +A-ffi +A-lto

added
A-ABIArea: Concerning the application binary interface (ABI)
A-FFIArea: Foreign function interface (FFI)
O-wasmTarget: WASM (WebAssembly), http://webassembly.org/
A-LTOArea: Link-time optimization (LTO)
on Jul 20, 2022
Jules-Bertholet

Jules-Bertholet commented on Oct 18, 2023

@Jules-Bertholet
Contributor

@rustbot label I-unsound

added
I-unsoundIssue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/Soundness
I-prioritizeIssue: Indicates that prioritization has been requested for this issue.
on Oct 18, 2023
removed
I-prioritizeIssue: Indicates that prioritization has been requested for this issue.
on Oct 19, 2023
bjorn3

bjorn3 commented on Dec 16, 2024

@bjorn3
Member

extern "wasm" has been removed. Can't reproduce with

echo '#[no_mangle]
pub extern "C" fn test() {
    format!("boom: {}", 0u128);
}' | rustc +nightly - --target wasm32-unknown-unknown --crate-type cdylib -Clto=yes -Copt-level=3
kostko

kostko commented on Dec 16, 2024

@kostko
Author

Yeah as mentioned in the original issue:

Using an argument of type u64 or disabling lto or using the C ABI instead of wasm ABI (which enables LLVM's multivalue feature) works.

If the wasm ABI was removed, then this issue is likely no longer relevant.

nikic

nikic commented on Dec 16, 2024

@nikic
Contributor

Right, there should no longer be any way to expose this from Rust anymore. There is an upstream LLVM issue tracking i128 with multi-value here: llvm/llvm-project#98323

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-ABIArea: Concerning the application binary interface (ABI)A-FFIArea: Foreign function interface (FFI)A-LTOArea: Link-time optimization (LTO)C-bugCategory: This is a bug.I-unsoundIssue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/SoundnessO-wasmTarget: WASM (WebAssembly), http://webassembly.org/

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @nikic@kostko@apiraino@memoryruins@bjorn3

        Issue actions

          Broken WASM codegen with u128 and wasm_abi · Issue #88207 · rust-lang/rust