diff options
-rw-r--r-- | CMakeLists.txt | 53 | ||||
-rwxr-xr-x | build-js.sh | 187 | ||||
-rwxr-xr-x | travis-emcc-tests.sh | 5 |
3 files changed, 49 insertions, 196 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index c641570a9..36b9e0750 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,10 +161,27 @@ ELSE() ENDIF() ADD_DEBUG_COMPILE_FLAG("-O0") ADD_DEBUG_COMPILE_FLAG("-g3") - ADD_NONDEBUG_COMPILE_FLAG("-O2") + IF (EMSCRIPTEN) + # really focus on minimizing output size when compiling sources + ADD_NONDEBUG_COMPILE_FLAG("-Oz") + ELSE() + ADD_NONDEBUG_COMPILE_FLAG("-O2") + ENDIF() ADD_NONDEBUG_COMPILE_FLAG("-UNDEBUG") # Keep asserts. ENDIF() +IF (EMSCRIPTEN) + # link with -O3 for metadce and other powerful optimizations. note that we + # must use add_link_options so that this appears after CMake's default -O2 + add_link_options("-O3") + ADD_LINK_FLAG("-s SINGLE_FILE") + ADD_LINK_FLAG("-s ALLOW_MEMORY_GROWTH=1") + ADD_COMPILE_FLAG("-s DISABLE_EXCEPTION_CATCHING=0") + ADD_LINK_FLAG("-s DISABLE_EXCEPTION_CATCHING=0") + # make the tools immediately usable on Node.js + ADD_LINK_FLAG("-s NODERAWFS") +ENDIF() + # clang doesn't print colored diagnostics when invoked from Ninja IF (UNIX AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND @@ -196,7 +213,6 @@ SET(binaryen_objs # Sources. - SET(binaryen_SOURCES src/binaryen-c.cpp ) @@ -212,12 +228,6 @@ INSTALL(TARGETS binaryen DESTINATION ${CMAKE_INSTALL_LIBDIR}) INSTALL(FILES src/binaryen-c.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -# if binaryen.js was built (using "./build-js.sh", currently -# optional), install it -IF(EXISTS "${PROJECT_SOURCE_DIR}/out/binaryen.js") - INSTALL(FILES out/binaryen.js DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}) -ENDIF() - SET(wasm-shell_SOURCES src/tools/wasm-shell.cpp ) @@ -308,6 +318,33 @@ SET_PROPERTY(TARGET wasm-reduce PROPERTY CXX_STANDARD 14) SET_PROPERTY(TARGET wasm-reduce PROPERTY CXX_STANDARD_REQUIRED ON) INSTALL(TARGETS wasm-reduce DESTINATION ${CMAKE_INSTALL_BINDIR}) +# binaryen.js +# +# Note that we can't emit binaryen.js directly, as there is libbinaryen already +# declared earlier, so we create binaryen_js.js, which must then be copied. +IF (EMSCRIPTEN) + SET(binaryen_js_SOURCES + src/binaryen-c.cpp + ) + ADD_EXECUTABLE(binaryen_js + ${binaryen_js_SOURCES}) + TARGET_LINK_LIBRARIES(binaryen_js wasm asmjs emscripten-optimizer passes ir cfg support wasm) + # note that SHELL: is needed as otherwise cmake will coalesce -s link flags + # in an incorrect way for emscripten + TARGET_LINK_LIBRARIES(binaryen_js "-s WASM=0") + TARGET_LINK_LIBRARIES(binaryen_js "-s WASM_ASYNC_COMPILATION=0") + TARGET_LINK_LIBRARIES(binaryen_js "-s MODULARIZE_INSTANCE=1") + TARGET_LINK_LIBRARIES(binaryen_js "-s NO_FILESYSTEM=0") + TARGET_LINK_LIBRARIES(binaryen_js "-s NODERAWFS=0") + TARGET_LINK_LIBRARIES(binaryen_js "-s 'EXPORT_NAME=\"Binaryen\"'") + TARGET_LINK_LIBRARIES(binaryen_js "--post-js ${CMAKE_CURRENT_SOURCE_DIR}/src/js/binaryen.js-post.js") + TARGET_LINK_LIBRARIES(binaryen_js optimized "--closure 1") + TARGET_LINK_LIBRARIES(binaryen_js debug "--profiling") + SET_PROPERTY(TARGET binaryen_js PROPERTY CXX_STANDARD 14) + SET_PROPERTY(TARGET binaryen_js PROPERTY CXX_STANDARD_REQUIRED ON) + INSTALL(TARGETS binaryen_js DESTINATION ${CMAKE_INSTALL_BINDIR}) +ENDIF() + # Testing # # Currently just some very simple smoke tests. diff --git a/build-js.sh b/build-js.sh deleted file mode 100755 index 423445764..000000000 --- a/build-js.sh +++ /dev/null @@ -1,187 +0,0 @@ -# -# This file builds the js components using emscripten. You normally don't need -# to run this, as the builds are bundled in the repo in bin/. Running this is -# useful if you are a developer and want to update those builds. -# -# Usage: build-js.sh -# Usage: EMSCRIPTEN=path/to/emscripten build-js.sh # explicit emscripten dir -# -# Emscripten's em++ and tools/webidl_binder.py will be accessed through the -# env var EMSCRIPTEN, e.g. ${EMSCRIPTEN}/em++ -# -# You can get emscripten from -# http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html -# -set -e - -if [ "$1" == "-h" ] || [ "$1" == "--help" ] || [ "$1" == "-help" ]; then - echo "usage: $0 [-g]" >&2 - echo " -g produce debug build" >&2 - echo "" - echo "If EMSCRIPTEN is set in the environment, emscripten will be loaded" - echo "from that directory. Otherwise the location of emscripten is resolved" - echo "through PATH." - exit 1 -fi - -if [ -z "$EMSCRIPTEN" ]; then - if (which emcc >/dev/null); then - # Found emcc in PATH -- set EMSCRIPTEN (we need this to access webidl_binder.py) - EMSCRIPTEN=$(dirname "$(which emcc)") - else - echo "$0: EMSCRIPTEN environment variable is not set and emcc was not found in PATH" >&2 - exit 1 - fi -elif [ ! -d "$EMSCRIPTEN" ]; then - echo "$0: \"$EMSCRIPTEN\" (\$EMSCRIPTEN) is not a directory" >&2 - exit 1 -fi - -EMCC_ARGS="-std=gnu++14 --memory-init-file 0" -EMCC_ARGS="$EMCC_ARGS -s ALLOW_MEMORY_GROWTH=1" -EMCC_ARGS="$EMCC_ARGS -s DEMANGLE_SUPPORT=1" -EMCC_ARGS="$EMCC_ARGS -s NO_FILESYSTEM=0" -EMCC_ARGS="$EMCC_ARGS -s WASM=0" -EMCC_ARGS="$EMCC_ARGS -s BINARYEN_ASYNC_COMPILATION=0" -EMCC_ARGS="$EMCC_ARGS -s DISABLE_EXCEPTION_CATCHING=0" # Exceptions are thrown and caught when optimizing endless loops -OUT_FILE_SUFFIX= - -if [ "$1" == "-g" ]; then - EMCC_ARGS="$EMCC_ARGS -O2" # need emcc js opts to be decently fast - EMCC_ARGS="$EMCC_ARGS --llvm-opts 0 --llvm-lto 0" - EMCC_ARGS="$EMCC_ARGS -profiling" - EMCC_ARGS="$EMCC_ARGS -s ASSERTIONS=0" # 0 as a temporary workaround for https://github.com/emscripten-core/emscripten/pull/9360 -else - EMCC_ARGS="$EMCC_ARGS -Oz" - EMCC_ARGS="$EMCC_ARGS --llvm-lto 1" - EMCC_ARGS="$EMCC_ARGS -s ELIMINATE_DUPLICATE_FUNCTIONS=1" - EMCC_ARGS="$EMCC_ARGS --closure 1" - # Why these settings? - # See https://gist.github.com/rsms/e33c61a25a31c08260161a087be03169 -fi - -# input sources relative to this script -BINARYEN_SRC="$(dirname $0)/src" - -# input sources relative to this script -BINARYEN_SCRIPTS="$(dirname $0)/scripts" - -# output binaries relative to current working directory -OUT="$PWD/out" - -echo "generate embedded intrinsics module" - -python3 "$BINARYEN_SCRIPTS/embedwast.py" "$BINARYEN_SRC/passes/wasm-intrinsics.wast" "$BINARYEN_SRC/passes/WasmIntrinsics.cpp" - -echo "compiling source files" - -mkdir -p "$OUT" -"$EMSCRIPTEN/em++" \ - $EMCC_ARGS \ - "$BINARYEN_SRC/asmjs/asm_v_wasm.cpp" \ - "$BINARYEN_SRC/asmjs/asmangle.cpp" \ - "$BINARYEN_SRC/asmjs/shared-constants.cpp" \ - "$BINARYEN_SRC/cfg/Relooper.cpp" \ - "$BINARYEN_SRC/emscripten-optimizer/optimizer-shared.cpp" \ - "$BINARYEN_SRC/emscripten-optimizer/parser.cpp" \ - "$BINARYEN_SRC/emscripten-optimizer/simple_ast.cpp" \ - "$BINARYEN_SRC/ir/ExpressionAnalyzer.cpp" \ - "$BINARYEN_SRC/ir/ExpressionManipulator.cpp" \ - "$BINARYEN_SRC/ir/LocalGraph.cpp" \ - "$BINARYEN_SRC/ir/ReFinalize.cpp" \ - "$BINARYEN_SRC/passes/pass.cpp" \ - "$BINARYEN_SRC/passes/AlignmentLowering.cpp" \ - "$BINARYEN_SRC/passes/Asyncify.cpp" \ - "$BINARYEN_SRC/passes/AvoidReinterprets.cpp" \ - "$BINARYEN_SRC/passes/CoalesceLocals.cpp" \ - "$BINARYEN_SRC/passes/DeadArgumentElimination.cpp" \ - "$BINARYEN_SRC/passes/CodeFolding.cpp" \ - "$BINARYEN_SRC/passes/CodePushing.cpp" \ - "$BINARYEN_SRC/passes/ConstHoisting.cpp" \ - "$BINARYEN_SRC/passes/DataFlowOpts.cpp" \ - "$BINARYEN_SRC/passes/DeadCodeElimination.cpp" \ - "$BINARYEN_SRC/passes/Directize.cpp" \ - "$BINARYEN_SRC/passes/DuplicateImportElimination.cpp" \ - "$BINARYEN_SRC/passes/DuplicateFunctionElimination.cpp" \ - "$BINARYEN_SRC/passes/ExtractFunction.cpp" \ - "$BINARYEN_SRC/passes/Flatten.cpp" \ - "$BINARYEN_SRC/passes/FuncCastEmulation.cpp" \ - "$BINARYEN_SRC/passes/I64ToI32Lowering.cpp" \ - "$BINARYEN_SRC/passes/Inlining.cpp" \ - "$BINARYEN_SRC/passes/InstrumentLocals.cpp" \ - "$BINARYEN_SRC/passes/InstrumentMemory.cpp" \ - "$BINARYEN_SRC/passes/LegalizeJSInterface.cpp" \ - "$BINARYEN_SRC/passes/LimitSegments.cpp" \ - "$BINARYEN_SRC/passes/LocalCSE.cpp" \ - "$BINARYEN_SRC/passes/LogExecution.cpp" \ - "$BINARYEN_SRC/passes/LoopInvariantCodeMotion.cpp" \ - "$BINARYEN_SRC/passes/MemoryPacking.cpp" \ - "$BINARYEN_SRC/passes/MergeBlocks.cpp" \ - "$BINARYEN_SRC/passes/MergeLocals.cpp" \ - "$BINARYEN_SRC/passes/Metrics.cpp" \ - "$BINARYEN_SRC/passes/MinifyImportsAndExports.cpp" \ - "$BINARYEN_SRC/passes/NameList.cpp" \ - "$BINARYEN_SRC/passes/NoExitRuntime.cpp" \ - "$BINARYEN_SRC/passes/OptimizeAddedConstants.cpp" \ - "$BINARYEN_SRC/passes/OptimizeInstructions.cpp" \ - "$BINARYEN_SRC/passes/PickLoadSigns.cpp" \ - "$BINARYEN_SRC/passes/PostAssemblyScript.cpp" \ - "$BINARYEN_SRC/passes/PostEmscripten.cpp" \ - "$BINARYEN_SRC/passes/Precompute.cpp" \ - "$BINARYEN_SRC/passes/Print.cpp" \ - "$BINARYEN_SRC/passes/PrintFeatures.cpp" \ - "$BINARYEN_SRC/passes/PrintFunctionMap.cpp" \ - "$BINARYEN_SRC/passes/PrintCallGraph.cpp" \ - "$BINARYEN_SRC/passes/RedundantSetElimination.cpp" \ - "$BINARYEN_SRC/passes/RelooperJumpThreading.cpp" \ - "$BINARYEN_SRC/passes/RemoveNonJSOps.cpp" \ - "$BINARYEN_SRC/passes/RemoveImports.cpp" \ - "$BINARYEN_SRC/passes/RemoveMemory.cpp" \ - "$BINARYEN_SRC/passes/RemoveUnusedBrs.cpp" \ - "$BINARYEN_SRC/passes/RemoveUnusedModuleElements.cpp" \ - "$BINARYEN_SRC/passes/RemoveUnusedNames.cpp" \ - "$BINARYEN_SRC/passes/ReorderFunctions.cpp" \ - "$BINARYEN_SRC/passes/ReorderLocals.cpp" \ - "$BINARYEN_SRC/passes/ReReloop.cpp" \ - "$BINARYEN_SRC/passes/SafeHeap.cpp" \ - "$BINARYEN_SRC/passes/SimplifyGlobals.cpp" \ - "$BINARYEN_SRC/passes/SimplifyLocals.cpp" \ - "$BINARYEN_SRC/passes/Souperify.cpp" \ - "$BINARYEN_SRC/passes/SpillPointers.cpp" \ - "$BINARYEN_SRC/passes/SSAify.cpp" \ - "$BINARYEN_SRC/passes/StackIR.cpp" \ - "$BINARYEN_SRC/passes/Strip.cpp" \ - "$BINARYEN_SRC/passes/StripTargetFeatures.cpp" \ - "$BINARYEN_SRC/passes/TrapMode.cpp" \ - "$BINARYEN_SRC/passes/Untee.cpp" \ - "$BINARYEN_SRC/passes/Vacuum.cpp" \ - "$BINARYEN_SRC/passes/WasmIntrinsics.cpp" \ - "$BINARYEN_SRC/support/bits.cpp" \ - "$BINARYEN_SRC/support/colors.cpp" \ - "$BINARYEN_SRC/support/file.cpp" \ - "$BINARYEN_SRC/support/safe_integer.cpp" \ - "$BINARYEN_SRC/support/threads.cpp" \ - "$BINARYEN_SRC/wasm/literal.cpp" \ - "$BINARYEN_SRC/wasm/wasm-binary.cpp" \ - "$BINARYEN_SRC/wasm/wasm-emscripten.cpp" \ - "$BINARYEN_SRC/wasm/wasm-interpreter.cpp" \ - "$BINARYEN_SRC/wasm/wasm-io.cpp" \ - "$BINARYEN_SRC/wasm/wasm-s-parser.cpp" \ - "$BINARYEN_SRC/wasm/wasm-stack.cpp" \ - "$BINARYEN_SRC/wasm/wasm-type.cpp" \ - "$BINARYEN_SRC/wasm/wasm-validator.cpp" \ - "$BINARYEN_SRC/wasm/wasm.cpp" \ - -I"$BINARYEN_SRC" \ - -o "$OUT/shared.o" - -echo "building binaryen.js" - -"$EMSCRIPTEN/em++" \ - $EMCC_ARGS \ - "$BINARYEN_SRC/binaryen-c.cpp" \ - "$OUT/shared.o" \ - -I"$BINARYEN_SRC/" \ - -o "$OUT/binaryen$OUT_FILE_SUFFIX.js" \ - -s MODULARIZE_INSTANCE=1 \ - -s 'EXPORT_NAME="Binaryen"' \ - --post-js "$BINARYEN_SRC/js/binaryen.js-post.js" diff --git a/travis-emcc-tests.sh b/travis-emcc-tests.sh index c141919c8..224636cfd 100755 --- a/travis-emcc-tests.sh +++ b/travis-emcc-tests.sh @@ -1,6 +1,9 @@ set -e echo "travis-test build" -./build-js.sh -g +emconfigure cmake -DCMAKE_BUILD_TYPE=Release +emmake make -j4 binaryen_js +mkdir out +cp bin/binaryen_js.js out/binaryen.js echo "travis-test test" python3 -m scripts.test.binaryenjs echo "travis-test yay!" |