Skip to content

Emscripten 2.0.18 & higher compiles+links Box2D without error, yet produces incorrect code #14583

@Birch-san

Description

@Birch-san

Trying to upgrade to newer Emscripten, and build box2d-wasm.

2.0.17 works fine.
2.0.18 compiles+links without error, yet produces incorrect code (physics doesn't run).

2.0.17 works fine:

➜  box2d-wasm git:(master) ✗ which emcc
/Users/birch/git/emsdk/upstream/emscripten/emcc
➜  box2d-wasm git:(master) ✗ emcc --version
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.17 (64e7f8708b6940ff3c3bdd51b5cd152d71106567)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
➜  box2d-wasm git:(master) ✗ pwd
/Users/birch/git/box2d-wasm/box2d-wasm
➜  box2d-wasm git:(master) ✗ export TARGET_TYPE=Debug
➜  box2d-wasm git:(master) ✗ export EMSCRIPTEN_TOOLS="$(realpath "$(dirname "$(realpath "$(which emcc)")")/tools")"
➜  box2d-wasm git:(master) ✗ export PYTHON3="${EMSDK_PYTHON:-"$(which python3)"}"
➜  box2d-wasm git:(master) ✗ export BUILD_UMD_FROM_SCRATCH=1
➜  box2d-wasm git:(master) ✗ rm -rf build && ./build_all.sh
+ ../build_makefile.sh

Generating Makefile with emcmake
TARGET_TYPE is Debug
+ emcmake cmake -DCMAKE_BUILD_TYPE=Debug ../../box2d -DBOX2D_BUILD_UNIT_TESTS=OFF -DBOX2D_BUILD_DOCS=OFF -DBOX2D_BUILD_TESTBED=OFF
configure: cmake -DCMAKE_BUILD_TYPE=Debug ../../box2d -DBOX2D_BUILD_UNIT_TESTS=OFF -DBOX2D_BUILD_DOCS=OFF -DBOX2D_BUILD_TESTBED=OFF -DCMAKE_TOOLCHAIN_FILE=/Users/birch/git/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR="/Users/birch/git/emsdk/node/14.15.5_64bit/bin/node"
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/birch/git/box2d-wasm/box2d-wasm/build

Compiling C++ to LLVM IR (creates ./build/bin/libbox2d.a archive)
+ emmake make
make: make
[  2%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_broad_phase.cpp.o
shared:INFO: (Emscripten: Running sanity checks)
[  4%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_chain_shape.cpp.o
[  6%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_circle_shape.cpp.o
[  8%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_circle.cpp.o
[ 10%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_edge.cpp.o
[ 13%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_polygon.cpp.o
[ 15%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collision.cpp.o
[ 17%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_distance.cpp.o
[ 19%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_dynamic_tree.cpp.o
[ 21%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_edge_shape.cpp.o
[ 23%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_polygon_shape.cpp.o
[ 26%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_time_of_impact.cpp.o
[ 28%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_block_allocator.cpp.o
[ 30%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_draw.cpp.o
[ 32%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_math.cpp.o
[ 34%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_settings.cpp.o
[ 36%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_stack_allocator.cpp.o
[ 39%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_timer.cpp.o
[ 41%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_body.cpp.o
[ 43%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_chain_circle_contact.cpp.o
[ 45%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_chain_polygon_contact.cpp.o
[ 47%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_circle_contact.cpp.o
[ 50%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact.cpp.o
[ 52%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact_manager.cpp.o
[ 54%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact_solver.cpp.o
[ 56%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_distance_joint.cpp.o
[ 58%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_edge_circle_contact.cpp.o
[ 60%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_edge_polygon_contact.cpp.o
[ 63%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_fixture.cpp.o
[ 65%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_friction_joint.cpp.o
[ 67%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_gear_joint.cpp.o
[ 69%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_island.cpp.o
[ 71%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_joint.cpp.o
[ 73%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_motor_joint.cpp.o
[ 76%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_mouse_joint.cpp.o
[ 78%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_polygon_circle_contact.cpp.o
[ 80%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_polygon_contact.cpp.o
[ 82%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_prismatic_joint.cpp.o
[ 84%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_pulley_joint.cpp.o
[ 86%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_revolute_joint.cpp.o
[ 89%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_weld_joint.cpp.o
[ 91%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_wheel_joint.cpp.o
[ 93%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_world.cpp.o
[ 95%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_world_callbacks.cpp.o
[ 97%] Building CXX object src/CMakeFiles/box2d.dir/rope/b2_rope.cpp.o
[100%] Linking CXX static library ../bin/libbox2d.a
[100%] Built target box2d

+ ../build_idl_bindings.sh
Using the following Emscripten tools directory: /Users/birch/git/emsdk/upstream/emscripten/tools
Using the following Python binary: /Users/birch/git/emsdk/python/3.9.2-1_64bit/bin/python3
+ exec /Users/birch/git/emsdk/python/3.9.2-1_64bit/bin/python3 /Users/birch/git/emsdk/upstream/emscripten/tools/webidl_binder.py /Users/birch/git/box2d-wasm/box2d-wasm/Box2D.idl box2d_glue

+ ../build_wasm.sh
TARGET_TYPE is Debug
Building bare WASM
+ emcc /Users/birch/git/box2d-wasm/box2d-wasm/glue_stub.cpp bin/libbox2d.a -I /Users/birch/git/box2d-wasm/box2d-wasm/../box2d/include -fno-rtti -s MODULARIZE=1 -s EXPORT_NAME=Box2D -s ALLOW_TABLE_GROWTH=1 --memory-init-file 0 -s FILESYSTEM=0 -s SUPPORT_LONGJMP=0 -s EXPORTED_FUNCTIONS=_malloc,_free -s ALLOW_MEMORY_GROWTH=1 -g3 -gsource-map -s ASSERTIONS=2 -s DEMANGLE_SUPPORT=1 --oformat=bare -o Box2D.bare.wasm
emcc: warning: --oformat=base/--post-link are experimental and subject to change. [-Wexperimental]
Successfully built Box2D.bare.wasm

TARGET_TYPE is Debug
Building bare WASM
+ emcc /Users/birch/git/box2d-wasm/box2d-wasm/glue_stub.cpp bin/libbox2d.a -I /Users/birch/git/box2d-wasm/box2d-wasm/../box2d/include -fno-rtti -s MODULARIZE=1 -s EXPORT_NAME=Box2D -s ALLOW_TABLE_GROWTH=1 --memory-init-file 0 -s FILESYSTEM=0 -s SUPPORT_LONGJMP=0 -s EXPORTED_FUNCTIONS=_malloc,_free -s ALLOW_MEMORY_GROWTH=1 -g3 -gsource-map -s ASSERTIONS=2 -s DEMANGLE_SUPPORT=1 --oformat=bare -o Box2D.bare.wasm
emcc: warning: --oformat=base/--post-link are experimental and subject to change. [-Wexperimental]
Successfully built Box2D.bare.wasm

Building post-link targets

Building ES module, es/Box2D.{js,wasm}
+ emcc --post-link Box2D.bare.wasm --post-js box2d_glue.js --post-js /Users/birch/git/box2d-wasm/box2d-wasm/glue_stub.js -fno-rtti -s MODULARIZE=1 -s EXPORT_NAME=Box2D -s ALLOW_TABLE_GROWTH=1 --memory-init-file 0 -s FILESYSTEM=0 -s SUPPORT_LONGJMP=0 -s EXPORTED_FUNCTIONS=_malloc,_free -s ALLOW_MEMORY_GROWTH=1 -g3 -gsource-map -s ASSERTIONS=2 -s DEMANGLE_SUPPORT=1 -s EXPORT_ES6=1 -o es/Box2D.js
emcc: warning: --oformat=base/--post-link are experimental and subject to change. [-Wexperimental]
emcc:WARNING: Wasm source map won't be usable in a browser without --source-map-base
Successfully built es/Box2D.{js,wasm}

Building UMD module, umd/Box2D.{js,wasm} from scratch
+ emcc --post-link Box2D.bare.wasm --post-js box2d_glue.js --post-js /Users/birch/git/box2d-wasm/box2d-wasm/glue_stub.js -fno-rtti -s MODULARIZE=1 -s EXPORT_NAME=Box2D -s ALLOW_TABLE_GROWTH=1 --memory-init-file 0 -s FILESYSTEM=0 -s SUPPORT_LONGJMP=0 -s EXPORTED_FUNCTIONS=_malloc,_free -s ALLOW_MEMORY_GROWTH=1 -g3 -gsource-map -s ASSERTIONS=2 -s DEMANGLE_SUPPORT=1 -o umd/Box2D.js
emcc: warning: --oformat=base/--post-link are experimental and subject to change. [-Wexperimental]
emcc:WARNING: Wasm source map won't be usable in a browser without --source-map-base
Successfully built umd/Box2D.{js,wasm}

box2d-wasm-4.0.2-em2.0.17.tar.gz

2.0.17.mov

My web integration test works fine:

My NodeJS integration test runs gravity for a bit, and confirms that the body falls and accelerates:

👍 Ran 6 iterations of a falling body. Body had the expected position on each iteration.
integration-test-backend/src/index.ts:45

2.0.18 is broken:

Compiles + links without error:

➜  box2d-wasm git:(master) ✗ which emcc
/Users/birch/git/emsdk/upstream/emscripten/emcc
➜  box2d-wasm git:(master) ✗ emcc --version
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.18 (87b5d5617b174ef99acadb8da064344b5d81be95)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
➜  box2d-wasm git:(master) ✗ rm -rf build && ./build_all.sh
+ ../build_makefile.sh

Generating Makefile with emcmake
TARGET_TYPE is Debug
+ emcmake cmake -DCMAKE_BUILD_TYPE=Debug ../../box2d -DBOX2D_BUILD_UNIT_TESTS=OFF -DBOX2D_BUILD_DOCS=OFF -DBOX2D_BUILD_TESTBED=OFF
configure: cmake -DCMAKE_BUILD_TYPE=Debug ../../box2d -DBOX2D_BUILD_UNIT_TESTS=OFF -DBOX2D_BUILD_DOCS=OFF -DBOX2D_BUILD_TESTBED=OFF -DCMAKE_TOOLCHAIN_FILE=/Users/birch/git/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR="/Users/birch/git/emsdk/node/14.15.5_64bit/bin/node"
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/birch/git/box2d-wasm/box2d-wasm/build

Compiling C++ to LLVM IR (creates ./build/bin/libbox2d.a archive)
+ emmake make
make: make
[  2%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_broad_phase.cpp.o
shared:INFO: (Emscripten: Running sanity checks)
[  4%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_chain_shape.cpp.o
[  6%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_circle_shape.cpp.o
[  8%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_circle.cpp.o
[ 10%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_edge.cpp.o
[ 13%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_polygon.cpp.o
[ 15%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collision.cpp.o
[ 17%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_distance.cpp.o
[ 19%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_dynamic_tree.cpp.o
[ 21%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_edge_shape.cpp.o
[ 23%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_polygon_shape.cpp.o
[ 26%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_time_of_impact.cpp.o
[ 28%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_block_allocator.cpp.o
[ 30%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_draw.cpp.o
[ 32%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_math.cpp.o
[ 34%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_settings.cpp.o
[ 36%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_stack_allocator.cpp.o
[ 39%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_timer.cpp.o
[ 41%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_body.cpp.o
[ 43%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_chain_circle_contact.cpp.o
[ 45%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_chain_polygon_contact.cpp.o
[ 47%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_circle_contact.cpp.o
[ 50%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact.cpp.o
[ 52%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact_manager.cpp.o
[ 54%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact_solver.cpp.o
[ 56%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_distance_joint.cpp.o
[ 58%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_edge_circle_contact.cpp.o
[ 60%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_edge_polygon_contact.cpp.o
[ 63%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_fixture.cpp.o
[ 65%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_friction_joint.cpp.o
[ 67%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_gear_joint.cpp.o
[ 69%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_island.cpp.o
[ 71%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_joint.cpp.o
[ 73%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_motor_joint.cpp.o
[ 76%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_mouse_joint.cpp.o
[ 78%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_polygon_circle_contact.cpp.o
[ 80%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_polygon_contact.cpp.o
[ 82%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_prismatic_joint.cpp.o
[ 84%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_pulley_joint.cpp.o
[ 86%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_revolute_joint.cpp.o
[ 89%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_weld_joint.cpp.o
[ 91%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_wheel_joint.cpp.o
[ 93%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_world.cpp.o
[ 95%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_world_callbacks.cpp.o
[ 97%] Building CXX object src/CMakeFiles/box2d.dir/rope/b2_rope.cpp.o
[100%] Linking CXX static library ../bin/libbox2d.a
[100%] Built target box2d

+ ../build_idl_bindings.sh
Using the following Emscripten tools directory: /Users/birch/git/emsdk/upstream/emscripten/tools
Using the following Python binary: /Users/birch/git/emsdk/python/3.9.2-1_64bit/bin/python3
+ exec /Users/birch/git/emsdk/python/3.9.2-1_64bit/bin/python3 /Users/birch/git/emsdk/upstream/emscripten/tools/webidl_binder.py /Users/birch/git/box2d-wasm/box2d-wasm/Box2D.idl box2d_glue

+ ../build_wasm.sh
TARGET_TYPE is Debug
Building bare WASM
+ emcc /Users/birch/git/box2d-wasm/box2d-wasm/glue_stub.cpp bin/libbox2d.a -I /Users/birch/git/box2d-wasm/box2d-wasm/../box2d/include -fno-rtti -s MODULARIZE=1 -s EXPORT_NAME=Box2D -s ALLOW_TABLE_GROWTH=1 --memory-init-file 0 -s FILESYSTEM=0 -s SUPPORT_LONGJMP=0 -s EXPORTED_FUNCTIONS=_malloc,_free -s ALLOW_MEMORY_GROWTH=1 -g3 -gsource-map -s ASSERTIONS=2 -s DEMANGLE_SUPPORT=1 --oformat=bare -o Box2D.bare.wasm
emcc: warning: --oformat=base/--post-link are experimental and subject to change. [-Wexperimental]
Successfully built Box2D.bare.wasm

Building post-link targets
Building ES module, es/Box2D.{js,wasm}
+ emcc --post-link Box2D.bare.wasm --post-js box2d_glue.js --post-js /Users/birch/git/box2d-wasm/box2d-wasm/glue_stub.js -fno-rtti -s MODULARIZE=1 -s EXPORT_NAME=Box2D -s ALLOW_TABLE_GROWTH=1 --memory-init-file 0 -s FILESYSTEM=0 -s SUPPORT_LONGJMP=0 -s EXPORTED_FUNCTIONS=_malloc,_free -s ALLOW_MEMORY_GROWTH=1 -g3 -gsource-map -s ASSERTIONS=2 -s DEMANGLE_SUPPORT=1 -s EXPORT_ES6=1 -o es/Box2D.js
emcc: warning: --oformat=base/--post-link are experimental and subject to change. [-Wexperimental]
emcc:WARNING: Wasm source map won't be usable in a browser without --source-map-base
Successfully built es/Box2D.{js,wasm}

Building UMD module, umd/Box2D.{js,wasm} from scratch
+ emcc --post-link Box2D.bare.wasm --post-js box2d_glue.js --post-js /Users/birch/git/box2d-wasm/box2d-wasm/glue_stub.js -fno-rtti -s MODULARIZE=1 -s EXPORT_NAME=Box2D -s ALLOW_TABLE_GROWTH=1 --memory-init-file 0 -s FILESYSTEM=0 -s SUPPORT_LONGJMP=0 -s EXPORTED_FUNCTIONS=_malloc,_free -s ALLOW_MEMORY_GROWTH=1 -g3 -gsource-map -s ASSERTIONS=2 -s DEMANGLE_SUPPORT=1 -o umd/Box2D.js
emcc: warning: --oformat=base/--post-link are experimental and subject to change. [-Wexperimental]
emcc:WARNING: Wasm source map won't be usable in a browser without --source-map-base
Successfully built umd/Box2D.{js,wasm}


+ ../build_typings.sh
webidl-to-ts found at: ../node_modules/webidl-to-ts
+ exec node --experimental-specifier-resolution=node --harmony ../node_modules/webidl-to-ts/dist/index.js -f ../Box2D.idl -n Box2D -o Box2D.d.ts
Parsing /Users/birch/git/box2d-wasm/box2d-wasm/Box2D.idl
Writing typings to /Users/birch/git/box2d-wasm/box2d-wasm/build/Box2D.d.ts

box2d-wasm-4.0.2-em2.0.18.tar.gz

No bodies visible in Web integration test (interestingly, rope physics still works):

2.0.18.mov

some C++ has succeeded (adding bodies to the world incremented the body count):

world.GetBodyCount()
21

A breakpoint before the initial world.Step() reveals the starting position of the first body in the list:

p = world.GetBodyList().GetTransform().get_p(), [p.x, p.y]
// Array [ -7.517228603363037, 51.5 ]

But the same command run after world.Step() shows that physics does not progress:

p = world.GetBodyList().GetTransform().get_p(), [p.x, p.y]
// Array [ -7.517228603363037, 51.5 ]

My breakpoints inside debug draw (drawCircle, drawPolygon) reveal that my debug draw callback is not being invoked for bodies. drawSegment and drawPoint are hit (because the ropes is still rendered).

Meanwhile, the NodeJS integration test fails on first assertion (revealing that physics doesn't run):

Uncaught AssertionError [ERR_ASSERTION]: 0 within 0.01 of '0.16666666666666666 (difference: 0.16666666666666666)'

Any ideas? I'd really like to be able to continue upgrading Emscripten.

Here's what changed from 2.0.17...2.0.18:
2.0.17...2.0.18
https://github.com/emscripten-core/emscripten/blob/main/ChangeLog.md#2018-04232021

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions