From 9eb19273a3ad514529cbb80f22e198e01de18a82 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 2 Nov 2018 15:17:39 +0100 Subject: [PATCH 1/9] Update llvm-emscripten This updates emscripten to version 1.38.15, which is based on LLVM 6.0.1. --- .gitmodules | 2 +- src/bootstrap/compile.rs | 2 +- src/ci/docker/asmjs/Dockerfile | 10 +++++----- src/ci/docker/scripts/emscripten.sh | 4 ++-- src/llvm-emscripten | 2 +- src/rustllvm/PassWrapper.cpp | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.gitmodules b/.gitmodules index bf9bdd9a5b4b0..6274efaec6c08 100644 --- a/.gitmodules +++ b/.gitmodules @@ -43,7 +43,7 @@ url = https://github.com/rust-lang/rust-by-example.git [submodule "src/llvm-emscripten"] path = src/llvm-emscripten - url = https://github.com/rust-lang/llvm.git + url = https://github.com/kripken/emscripten-fastcomp [submodule "src/stdsimd"] path = src/stdsimd url = https://github.com/rust-lang-nursery/stdsimd.git diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 885ad07e08736..cef0849937bf0 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -736,7 +736,7 @@ pub fn build_codegen_backend(builder: &Builder, // Pass down configuration from the LLVM build into the build of // librustc_llvm and librustc_codegen_llvm. - if builder.is_rust_llvm(target) { + if builder.is_rust_llvm(target) && backend != "emscripten" { cargo.env("LLVM_RUSTLLVM", "1"); } cargo.env("LLVM_CONFIG", &llvm_config); diff --git a/src/ci/docker/asmjs/Dockerfile b/src/ci/docker/asmjs/Dockerfile index cb85cf3d9e9f0..9eaffbf83eb4e 100644 --- a/src/ci/docker/asmjs/Dockerfile +++ b/src/ci/docker/asmjs/Dockerfile @@ -20,11 +20,11 @@ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh ENV PATH=$PATH:/emsdk-portable -ENV PATH=$PATH:/emsdk-portable/clang/e1.37.13_64bit/ -ENV PATH=$PATH:/emsdk-portable/emscripten/1.37.13/ -ENV PATH=$PATH:/emsdk-portable/node/4.1.1_64bit/bin/ -ENV EMSCRIPTEN=/emsdk-portable/emscripten/1.37.13/ -ENV BINARYEN_ROOT=/emsdk-portable/clang/e1.37.13_64bit/binaryen/ +ENV PATH=$PATH:/emsdk-portable/clang/e1.38.15_64bit/ +ENV PATH=$PATH:/emsdk-portable/emscripten/1.38.15/ +ENV PATH=$PATH:/emsdk-portable/node/8.9.1_64bit/bin/ +ENV EMSCRIPTEN=/emsdk-portable/emscripten/1.38.15/ +ENV BINARYEN_ROOT=/emsdk-portable/clang/e1.38.15_64bit/binaryen/ ENV EM_CONFIG=/emsdk-portable/.emscripten ENV TARGETS=asmjs-unknown-emscripten diff --git a/src/ci/docker/scripts/emscripten.sh b/src/ci/docker/scripts/emscripten.sh index d32ed6b461d85..dc4b2af792cf6 100644 --- a/src/ci/docker/scripts/emscripten.sh +++ b/src/ci/docker/scripts/emscripten.sh @@ -33,8 +33,8 @@ curl -fL https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portab cd /emsdk-portable ./emsdk update -hide_output ./emsdk install sdk-1.37.13-64bit -./emsdk activate sdk-1.37.13-64bit +hide_output ./emsdk install sdk-1.38.15-64bit +./emsdk activate sdk-1.38.15-64bit # Compile and cache libc source ./emsdk_env.sh diff --git a/src/llvm-emscripten b/src/llvm-emscripten index 2717444753318..272d3ff91b38e 160000 --- a/src/llvm-emscripten +++ b/src/llvm-emscripten @@ -1 +1 @@ -Subproject commit 2717444753318e461e0c3b30dacd03ffbac96903 +Subproject commit 272d3ff91b38eac051bdbaf6cf84db5c901ce2f8 diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 06f75d981e3d6..902e62ab4a1d9 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -444,7 +444,7 @@ extern "C" void LLVMRustConfigurePassManagerBuilder( LLVMPassManagerBuilderRef PMBR, LLVMRustCodeGenOptLevel OptLevel, bool MergeFunctions, bool SLPVectorize, bool LoopVectorize, bool PrepareForThinLTO, const char* PGOGenPath, const char* PGOUsePath) { -#if LLVM_RUSTLLVM +#if LLVM_VERSION_GE(7, 0) unwrap(PMBR)->MergeFunctions = MergeFunctions; #endif unwrap(PMBR)->SLPVectorize = SLPVectorize; From 97e1d36937e3e0e13801e83e94f3d6d61ba4ad27 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 2 Nov 2018 19:11:31 +0100 Subject: [PATCH 2/9] Fix two run-fail tests for asmjs Use eprintln!() to make sure stdio is flushed. --- src/test/run-fail/mir_drop_panics.rs | 2 +- src/test/run-fail/panic-set-handler.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/run-fail/mir_drop_panics.rs b/src/test/run-fail/mir_drop_panics.rs index 51191dd7087e4..b3980f32d2736 100644 --- a/src/test/run-fail/mir_drop_panics.rs +++ b/src/test/run-fail/mir_drop_panics.rs @@ -17,7 +17,7 @@ impl Drop for Droppable { if self.0 == 1 { panic!("panic 1"); } else { - eprint!("drop {}", self.0); + eprintln!("drop {}", self.0); } } } diff --git a/src/test/run-fail/panic-set-handler.rs b/src/test/run-fail/panic-set-handler.rs index 2d430be07ef2f..2fa933d513a66 100644 --- a/src/test/run-fail/panic-set-handler.rs +++ b/src/test/run-fail/panic-set-handler.rs @@ -14,7 +14,7 @@ use std::panic; fn main() { panic::set_hook(Box::new(|i| { - eprint!("greetings from the panic handler"); + eprintln!("greetings from the panic handler"); })); panic!("foobar"); } From 131fda40af3ced8db2cbea8b88e936e7176cce1c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 2 Nov 2018 19:18:19 +0100 Subject: [PATCH 3/9] Ignore some more tests on emscripten Either missing i128 or asm support --- src/test/ui/inline-asm-bad-constraint.rs | 2 ++ src/test/ui/inline-asm-bad-constraint.stderr | 6 +++--- src/test/ui/inline-asm-bad-operand.rs | 2 ++ src/test/ui/inline-asm-bad-operand.stderr | 14 +++++++------- src/test/ui/issues/issue-49579.rs | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/test/ui/inline-asm-bad-constraint.rs b/src/test/ui/inline-asm-bad-constraint.rs index 654f230741e96..5a08a097fd02f 100644 --- a/src/test/ui/inline-asm-bad-constraint.rs +++ b/src/test/ui/inline-asm-bad-constraint.rs @@ -10,6 +10,8 @@ // Test that the compiler will catch invalid inline assembly constraints. +// ignore-emscripten + #![feature(asm)] extern "C" { diff --git a/src/test/ui/inline-asm-bad-constraint.stderr b/src/test/ui/inline-asm-bad-constraint.stderr index ce1f274749f1f..44facff080543 100644 --- a/src/test/ui/inline-asm-bad-constraint.stderr +++ b/src/test/ui/inline-asm-bad-constraint.stderr @@ -1,17 +1,17 @@ error[E0668]: malformed inline assembly - --> $DIR/inline-asm-bad-constraint.rs:29:9 + --> $DIR/inline-asm-bad-constraint.rs:31:9 | LL | asm!("" :"={rax"(rax)) //~ ERROR E0668 | ^^^^^^^^^^^^^^^^^^^^^^ error[E0668]: malformed inline assembly - --> $DIR/inline-asm-bad-constraint.rs:37:9 + --> $DIR/inline-asm-bad-constraint.rs:39:9 | LL | asm!("callq $0" : : "0"(foo)) //~ ERROR E0668 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0668]: malformed inline assembly - --> $DIR/inline-asm-bad-constraint.rs:44:9 + --> $DIR/inline-asm-bad-constraint.rs:46:9 | LL | asm!("addb $1, $0" : "={rax}"((0i32, rax))); //~ ERROR E0668 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/inline-asm-bad-operand.rs b/src/test/ui/inline-asm-bad-operand.rs index bbfb14b8d9d22..0ee4080fd0cb1 100644 --- a/src/test/ui/inline-asm-bad-operand.rs +++ b/src/test/ui/inline-asm-bad-operand.rs @@ -11,6 +11,8 @@ // Test that the compiler will catch passing invalid values to inline assembly // operands. +// ignore-emscripten + #![feature(asm)] #[repr(C)] diff --git a/src/test/ui/inline-asm-bad-operand.stderr b/src/test/ui/inline-asm-bad-operand.stderr index 2f650bfcab7b5..1a99aa28f584a 100644 --- a/src/test/ui/inline-asm-bad-operand.stderr +++ b/src/test/ui/inline-asm-bad-operand.stderr @@ -1,41 +1,41 @@ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:29:24 + --> $DIR/inline-asm-bad-operand.rs:31:24 | LL | asm!("" :: "r"("")); //~ ERROR E0669 | ^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:34:32 + --> $DIR/inline-asm-bad-operand.rs:36:32 | LL | asm!("ret" : : "{rdi}"(target)); //~ ERROR E0669 | ^^^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:41:29 + --> $DIR/inline-asm-bad-operand.rs:43:29 | LL | unsafe { asm!("" :: "i"(hello)) }; //~ ERROR E0669 | ^^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:49:38 + --> $DIR/inline-asm-bad-operand.rs:51:38 | LL | asm!("movups $1, %xmm0"::"m"(arr)); //~ ERROR E0669 | ^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:56:32 + --> $DIR/inline-asm-bad-operand.rs:58:32 | LL | asm!("mov sp, $0"::"r"(addr)); //~ ERROR E0669 | ^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:63:32 + --> $DIR/inline-asm-bad-operand.rs:65:32 | LL | asm!("mov sp, $0"::"r"(addr), //~ ERROR E0669 | ^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:64:32 + --> $DIR/inline-asm-bad-operand.rs:66:32 | LL | "r"("hello e0669")); //~ ERROR E0669 | ^^^^^^^^^^^^^ diff --git a/src/test/ui/issues/issue-49579.rs b/src/test/ui/issues/issue-49579.rs index e4e97c58d8aa3..83ebc92315552 100644 --- a/src/test/ui/issues/issue-49579.rs +++ b/src/test/ui/issues/issue-49579.rs @@ -8,8 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. - // compile-pass +// ignore-emscripten no i128 support #![feature(nll)] From c14bc575d6de85ebd5a71497eb2db103d56c64f5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 2 Nov 2018 20:16:17 +0100 Subject: [PATCH 4/9] Don't export non-function symbols with emscripten Emscripten only provides an export mechanism for functions. Exporting statics does not make sense conceptually in this case, and will result in emcc undefined function errors. --- src/librustc_codegen_utils/symbol_export.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/librustc_codegen_utils/symbol_export.rs b/src/librustc_codegen_utils/symbol_export.rs index 2d650f7f18d6f..6c40296b2ef37 100644 --- a/src/librustc_codegen_utils/symbol_export.rs +++ b/src/librustc_codegen_utils/symbol_export.rs @@ -388,6 +388,16 @@ fn symbol_export_level(tcx: TyCtxt, sym_def_id: DefId) -> SymbolExportLevel { codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL); if is_extern && !std_internal { + // Emscripten cannot export statics, so reduce their export level here + if tcx.sess.target.target.options.is_like_emscripten { + if let Some(Node::Item(&hir::Item { + node: hir::ItemKind::Static(..), + .. + })) = tcx.hir.get_if_local(sym_def_id) { + return SymbolExportLevel::Rust; + } + } + SymbolExportLevel::C } else { SymbolExportLevel::Rust From 8407612a8d0fa3195fe7d3785be02790979ddf92 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 8 Nov 2018 16:22:20 +0100 Subject: [PATCH 5/9] Disable wasm32 features on emscripten These are only supported by the native wasm32 backend. --- src/librustc_codegen_llvm/llvm_util.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/librustc_codegen_llvm/llvm_util.rs b/src/librustc_codegen_llvm/llvm_util.rs index 0a80fdddbf9fd..0e8fb1c28a303 100644 --- a/src/librustc_codegen_llvm/llvm_util.rs +++ b/src/librustc_codegen_llvm/llvm_util.rs @@ -243,7 +243,8 @@ pub fn target_feature_whitelist(sess: &Session) "hexagon" => HEXAGON_WHITELIST, "mips" | "mips64" => MIPS_WHITELIST, "powerpc" | "powerpc64" => POWERPC_WHITELIST, - "wasm32" => WASM_WHITELIST, + // wasm32 on emscripten does not support these target features + "wasm32" if !sess.target.target.options.is_like_emscripten => WASM_WHITELIST, _ => &[], } } From ffdb2bc1c5ff0963d1bb1d179c12f5dd218b7612 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 8 Nov 2018 16:32:42 +0100 Subject: [PATCH 6/9] Update the disabled wasm32 Dockerfile --- src/ci/docker/disabled/wasm32/Dockerfile | 10 +++++----- src/ci/docker/scripts/emscripten.sh | 5 ----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/ci/docker/disabled/wasm32/Dockerfile b/src/ci/docker/disabled/wasm32/Dockerfile index 6ac90d17450a3..0d2bd39303ef8 100644 --- a/src/ci/docker/disabled/wasm32/Dockerfile +++ b/src/ci/docker/disabled/wasm32/Dockerfile @@ -21,11 +21,11 @@ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh ENV PATH=$PATH:/emsdk-portable -ENV PATH=$PATH:/emsdk-portable/clang/e1.37.13_64bit/ -ENV PATH=$PATH:/emsdk-portable/emscripten/1.37.13/ -ENV PATH=$PATH:/node-v8.0.0-linux-x64/bin/ -ENV EMSCRIPTEN=/emsdk-portable/emscripten/1.37.13/ -ENV BINARYEN_ROOT=/emsdk-portable/clang/e1.37.13_64bit/binaryen/ +ENV PATH=$PATH:/emsdk-portable/clang/e1.38.15_64bit/ +ENV PATH=$PATH:/emsdk-portable/emscripten/1.38.15/ +ENV PATH=$PATH:/emsdk-portable/node/8.9.1_64bit/bin/ +ENV EMSCRIPTEN=/emsdk-portable/emscripten/1.38.15/ +ENV BINARYEN_ROOT=/emsdk-portable/clang/e1.38.15_64bit/binaryen/ ENV EM_CONFIG=/emsdk-portable/.emscripten ENV TARGETS=wasm32-unknown-emscripten diff --git a/src/ci/docker/scripts/emscripten.sh b/src/ci/docker/scripts/emscripten.sh index dc4b2af792cf6..1d7b33db9ed86 100644 --- a/src/ci/docker/scripts/emscripten.sh +++ b/src/ci/docker/scripts/emscripten.sh @@ -46,8 +46,3 @@ rm -f a.* # Make emsdk usable by any user cp /root/.emscripten /emsdk-portable chmod a+rxw -R /emsdk-portable - -# node 8 is required to run wasm -cd / -curl -sL https://nodejs.org/dist/v8.0.0/node-v8.0.0-linux-x64.tar.xz | \ - tar -xJ From 6fb701e8743e3ad1882d85347299bbcb94113ffc Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 8 Nov 2018 17:04:05 +0100 Subject: [PATCH 7/9] Fix compiletest support for wasm32-unknown-emscripten --- src/tools/compiletest/src/runtest.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index a80bbd401ab43..399f9f577edf5 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -1870,11 +1870,9 @@ impl<'test> TestCx<'test> { } else { self.fatal("no NodeJS binary found (--nodejs)"); } - } - - // If this is otherwise wasm , then run tests under nodejs with our + // If this is otherwise wasm, then run tests under nodejs with our // shim - if self.config.target.contains("wasm32") { + } else if self.config.target.contains("wasm32") { if let Some(ref p) = self.config.nodejs { args.push(p.clone()); } else { From b1a33971ab09233c182eb453b9f7812550b3b794 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 8 Nov 2018 17:18:21 +0100 Subject: [PATCH 8/9] Fix some tests for wasm32-unknown-emscripten --- src/test/run-pass/consts/const-endianess.rs | 2 +- src/test/ui/range/issue-54505-no-std.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/run-pass/consts/const-endianess.rs b/src/test/run-pass/consts/const-endianess.rs index 4ac4695570985..529c21354e383 100644 --- a/src/test/run-pass/consts/const-endianess.rs +++ b/src/test/run-pass/consts/const-endianess.rs @@ -23,7 +23,7 @@ fn main() { assert_eq!(BE_U32, b(55u32).to_be()); assert_eq!(LE_U32, b(55u32).to_le()); - #[cfg(not(target_arch = "asmjs"))] + #[cfg(not(target_os = "emscripten"))] { const BE_U128: u128 = 999999u128.to_be(); const LE_I128: i128 = (-999999i128).to_le(); diff --git a/src/test/ui/range/issue-54505-no-std.rs b/src/test/ui/range/issue-54505-no-std.rs index 1915fd82899aa..22cf15fb2e4a1 100644 --- a/src/test/ui/range/issue-54505-no-std.rs +++ b/src/test/ui/range/issue-54505-no-std.rs @@ -11,7 +11,7 @@ use core::ops::RangeBounds; -#[cfg(not(target_arch = "wasm32"))] +#[cfg(any(not(target_arch = "wasm32"), target_os = "emscripten"))] #[lang = "eh_personality"] extern fn eh_personality() {} From 82574e9ec804b6efbf6dfcf523d32618528ee32b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 9 Nov 2018 10:32:24 +0100 Subject: [PATCH 9/9] Pull in fix for dist-i686-linux build --- .gitmodules | 2 +- src/llvm-emscripten | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 6274efaec6c08..bf9bdd9a5b4b0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -43,7 +43,7 @@ url = https://github.com/rust-lang/rust-by-example.git [submodule "src/llvm-emscripten"] path = src/llvm-emscripten - url = https://github.com/kripken/emscripten-fastcomp + url = https://github.com/rust-lang/llvm.git [submodule "src/stdsimd"] path = src/stdsimd url = https://github.com/rust-lang-nursery/stdsimd.git diff --git a/src/llvm-emscripten b/src/llvm-emscripten index 272d3ff91b38e..7f23313edff8b 160000 --- a/src/llvm-emscripten +++ b/src/llvm-emscripten @@ -1 +1 @@ -Subproject commit 272d3ff91b38eac051bdbaf6cf84db5c901ce2f8 +Subproject commit 7f23313edff8beccb3fe44b815714269c5124c15