about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2017-01-19 15:49:29 -0800
committerAlex Crichton <alex@alexcrichton.com>2017-01-20 08:35:46 -0800
commit0c7117457dbefa93468f8fb1a85eba75f32e2865 (patch)
treee57cd3d263ea0544fd17ae19045eb904b08c315a
parent18a39ed66e8a73afd4e4fb00ad2eb3615e3f7c3d (diff)
parent6162637762d12760ba5b6c1e20f01298111ae8fe (diff)
Rollup merge of #39068 - alexcrichton:more-small-tests, r=brson
travis: Add i586 linux and i686 musl

This commit expands the existing x86_64-musl entry in the Travis matrix to also
build/test i586-unknown-linux-gnu and i686-unknown-linux-musl.

cc #38531
Closes #35599
Closes #39053
-rw-r--r--.travis.yml2
-rw-r--r--src/ci/docker/linux-tested-targets/Dockerfile (renamed from src/ci/docker/x86_64-musl/Dockerfile)25
-rw-r--r--src/ci/docker/linux-tested-targets/build-musl.sh64
-rw-r--r--src/ci/docker/linux-tested-targets/musl-libunwind-patch.patch15
-rw-r--r--src/ci/docker/x86_64-musl/build-musl.sh33
-rw-r--r--src/test/run-pass/issue-21634.rs6
-rw-r--r--src/test/run-pass/sse2.rs11
-rw-r--r--src/tools/compiletest/src/main.rs4
-rw-r--r--src/tools/compiletest/src/util.rs69
9 files changed, 152 insertions, 77 deletions
diff --git a/.travis.yml b/.travis.yml
index abd0a8fe346..6cdc4d99f20 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,6 +15,7 @@ matrix:
     # Linux builders, all docker images
     - env: IMAGE=arm-android DEPLOY=1
     - env: IMAGE=cross DEPLOY=1
+    - env: IMAGE=linux-tested-targets DEPLOY=1
     - env: IMAGE=dist-arm-linux DEPLOY=1
     - env: IMAGE=dist-armv7-aarch64-linux DEPLOY=1
     - env: IMAGE=dist-freebsd DEPLOY=1
@@ -32,7 +33,6 @@ matrix:
     - env: IMAGE=x86_64-gnu-nopt
     - env: IMAGE=x86_64-gnu-make
     - env: IMAGE=x86_64-gnu-llvm-3.7 ALLOW_PR=1 RUST_BACKTRACE=1
-    - env: IMAGE=x86_64-musl DEPLOY=1
     - env: IMAGE=x86_64-gnu-distcheck
 
     # OSX builders
diff --git a/src/ci/docker/x86_64-musl/Dockerfile b/src/ci/docker/linux-tested-targets/Dockerfile
index 11b85a6c8fd..2a43201ed0a 100644
--- a/src/ci/docker/x86_64-musl/Dockerfile
+++ b/src/ci/docker/linux-tested-targets/Dockerfile
@@ -1,7 +1,7 @@
 FROM ubuntu:16.04
 
 RUN apt-get update && apt-get install -y --no-install-recommends \
-  g++ \
+  g++-multilib \
   make \
   file \
   curl \
@@ -11,10 +11,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
   cmake \
   xz-utils \
   sudo \
-  gdb
+  gdb \
+  patch
 
 WORKDIR /build/
-COPY build-musl.sh /build/
+COPY musl-libunwind-patch.patch build-musl.sh /build/
 RUN sh /build/build-musl.sh && rm -rf /build
 
 RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
@@ -27,9 +28,17 @@ RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST |
       tar xJf - -C /usr/local/bin --strip-components=1
 
 ENV RUST_CONFIGURE_ARGS \
-      --target=x86_64-unknown-linux-musl \
-      --musl-root-x86_64=/musl-x86_64
-ENV PATH=$PATH:/musl-x86_64/bin
+      --target=x86_64-unknown-linux-musl,i686-unknown-linux-musl,i586-unknown-linux-gnu \
+      --musl-root-x86_64=/musl-x86_64 \
+      --musl-root-i686=/musl-i686
+
 ENV SCRIPT \
-      python2.7 ../x.py test --target x86_64-unknown-linux-musl && \
-      python2.7 ../x.py dist --target x86_64-unknown-linux-musl
+      python2.7 ../x.py test \
+          --target x86_64-unknown-linux-musl \
+          --target i686-unknown-linux-musl \
+          --target i586-unknown-linux-gnu \
+          && \
+      python2.7 ../x.py dist \
+          --target x86_64-unknown-linux-musl \
+          --target i686-unknown-linux-musl \
+          --target i586-unknown-linux-gnu
diff --git a/src/ci/docker/linux-tested-targets/build-musl.sh b/src/ci/docker/linux-tested-targets/build-musl.sh
new file mode 100644
index 00000000000..2382605f9bd
--- /dev/null
+++ b/src/ci/docker/linux-tested-targets/build-musl.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+# Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+# file at the top-level directory of this distribution and at
+# http://rust-lang.org/COPYRIGHT.
+#
+# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+# option. This file may not be copied, modified, or distributed
+# except according to those terms.
+
+set -ex
+
+export CFLAGS="-fPIC"
+MUSL=musl-1.1.14
+curl https://www.musl-libc.org/releases/$MUSL.tar.gz | tar xzf -
+cd $MUSL
+./configure --prefix=/musl-x86_64 --disable-shared
+make -j10
+make install
+make clean
+# for i686
+CFLAGS="$CFLAGS -m32" ./configure --prefix=/musl-i686 --disable-shared --target=i686
+make -j10
+make install
+cd ..
+
+# To build MUSL we're going to need a libunwind lying around, so acquire that
+# here and build it.
+curl -L https://github.com/llvm-mirror/llvm/archive/release_37.tar.gz | tar xzf -
+curl -L https://github.com/llvm-mirror/libunwind/archive/release_37.tar.gz | tar xzf -
+
+# Whoa what's this mysterious patch we're applying to libunwind! Why are we
+# swapping the values of ESP/EBP in libunwind?!
+#
+# Discovered in #35599 it turns out that the vanilla build of libunwind is not
+# suitable for unwinding 32-bit musl. After some investigation it ended up
+# looking like the register values for ESP/EBP were indeed incorrect (swapped)
+# in the source. Similar commits in libunwind (r280099 and r282589) have noticed
+# this for other platforms, and we just need to realize it for musl linux as
+# well.
+#
+# More technical info can be found at #35599
+cd libunwind-release_37
+patch -Np1 < /build/musl-libunwind-patch.patch
+cd ..
+
+mkdir libunwind-build
+cd libunwind-build
+cmake ../libunwind-release_37 -DLLVM_PATH=/build/llvm-release_37 \
+          -DLIBUNWIND_ENABLE_SHARED=0
+make -j10
+cp lib/libunwind.a /musl-x86_64/lib
+
+# (Note: the next cmake call doesn't fully override the previous cached one, so remove the cached
+# configuration manually. IOW, if don't do this or call make clean we'll end up building libunwind
+# for x86_64 again)
+rm -rf *
+# for i686
+CFLAGS="$CFLAGS -m32 -g" CXXFLAGS="$CXXFLAGS -m32 -g" cmake ../libunwind-release_37 \
+          -DLLVM_PATH=/build/llvm-release_37 \
+          -DLIBUNWIND_ENABLE_SHARED=0
+make -j10
+cp lib/libunwind.a /musl-i686/lib
diff --git a/src/ci/docker/linux-tested-targets/musl-libunwind-patch.patch b/src/ci/docker/linux-tested-targets/musl-libunwind-patch.patch
new file mode 100644
index 00000000000..99cd685b72d
--- /dev/null
+++ b/src/ci/docker/linux-tested-targets/musl-libunwind-patch.patch
@@ -0,0 +1,15 @@
+diff --git a/include/libunwind.h b/include/libunwind.h
+index c5b9633..1360eb2 100644
+--- a/include/libunwind.h
++++ b/include/libunwind.h
+@@ -151,8 +151,8 @@ enum {
+   UNW_X86_ECX = 1,
+   UNW_X86_EDX = 2,
+   UNW_X86_EBX = 3,
+-  UNW_X86_EBP = 4,
+-  UNW_X86_ESP = 5,
++  UNW_X86_ESP = 4,
++  UNW_X86_EBP = 5,
+   UNW_X86_ESI = 6,
+   UNW_X86_EDI = 7
+ };
diff --git a/src/ci/docker/x86_64-musl/build-musl.sh b/src/ci/docker/x86_64-musl/build-musl.sh
deleted file mode 100644
index 2bfbd646b75..00000000000
--- a/src/ci/docker/x86_64-musl/build-musl.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-# Copyright 2016 The Rust Project Developers. See the COPYRIGHT
-# file at the top-level directory of this distribution and at
-# http://rust-lang.org/COPYRIGHT.
-#
-# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-# option. This file may not be copied, modified, or distributed
-# except according to those terms.
-
-set -ex
-
-export CFLAGS="-fPIC"
-MUSL=musl-1.1.14
-curl https://www.musl-libc.org/releases/$MUSL.tar.gz | tar xzf -
-cd $MUSL
-./configure --prefix=/musl-x86_64 --disable-shared
-make -j10
-make install
-make clean
-cd ..
-
-# To build MUSL we're going to need a libunwind lying around, so acquire that
-# here and build it.
-curl -L https://github.com/llvm-mirror/llvm/archive/release_37.tar.gz | tar xzf -
-curl -L https://github.com/llvm-mirror/libunwind/archive/release_37.tar.gz | tar xzf -
-mkdir libunwind-build
-cd libunwind-build
-cmake ../libunwind-release_37 -DLLVM_PATH=/build/llvm-release_37 \
-          -DLIBUNWIND_ENABLE_SHARED=0
-make -j10
-cp lib/libunwind.a /musl-x86_64/lib
diff --git a/src/test/run-pass/issue-21634.rs b/src/test/run-pass/issue-21634.rs
index 2a146ae8fcf..08cc993ce4f 100644
--- a/src/test/run-pass/issue-21634.rs
+++ b/src/test/run-pass/issue-21634.rs
@@ -8,8 +8,9 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(cfg_target_feature)]
 
-
+#[cfg(any(not(target_arch = "x86"), target_feature = "sse2"))]
 fn main() {
     if let Ok(x) = "3.1415".parse::<f64>() {
         assert_eq!(false, x <= 0.0);
@@ -21,3 +22,6 @@ fn main() {
         assert_eq!(8.1415, { x += 5.0; x });
     }
 }
+
+#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]
+fn main() {}
diff --git a/src/test/run-pass/sse2.rs b/src/test/run-pass/sse2.rs
index 78d91b2f312..7e42698d496 100644
--- a/src/test/run-pass/sse2.rs
+++ b/src/test/run-pass/sse2.rs
@@ -10,9 +10,16 @@
 
 #![feature(cfg_target_feature)]
 
-pub fn main() {
+use std::env;
+
+fn main() {
+    // Skip this tests on i586-unknown-linux-gnu where sse2 is disabled
+    let real_target = env::var("TARGET").unwrap();
+    if real_target.contains("i586") {
+        return
+    }
     if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
         assert!(cfg!(target_feature = "sse2"),
-            "SSE2 was not detected as available on an x86 platform");
+                "SSE2 was not detected as available on an x86 platform");
     }
 }
diff --git a/src/tools/compiletest/src/main.rs b/src/tools/compiletest/src/main.rs
index 8c9982d1d4e..43d02479fb1 100644
--- a/src/tools/compiletest/src/main.rs
+++ b/src/tools/compiletest/src/main.rs
@@ -319,6 +319,10 @@ pub fn run_tests(config: &Config) {
     // Prevent issue #21352 UAC blocking .exe containing 'patch' etc. on Windows
     // If #11207 is resolved (adding manifest to .exe) this becomes unnecessary
     env::set_var("__COMPAT_LAYER", "RunAsInvoker");
+
+    // Let tests know which target they're running as
+    env::set_var("TARGET", &config.target);
+
     let res = test::run_tests_console(&opts, tests.into_iter().collect());
     match res {
         Ok(true) => {}
diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs
index cad71c59f0a..4202356bd97 100644
--- a/src/tools/compiletest/src/util.rs
+++ b/src/tools/compiletest/src/util.rs
@@ -12,39 +12,44 @@ use std::env;
 use common::Config;
 
 /// Conversion table from triple OS name to Rust SYSNAME
-const OS_TABLE: &'static [(&'static str, &'static str)] = &[("android", "android"),
-                                                            ("bitrig", "bitrig"),
-                                                            ("darwin", "macos"),
-                                                            ("dragonfly", "dragonfly"),
-                                                            ("freebsd", "freebsd"),
-                                                            ("haiku", "haiku"),
-                                                            ("ios", "ios"),
-                                                            ("linux", "linux"),
-                                                            ("mingw32", "windows"),
-                                                            ("netbsd", "netbsd"),
-                                                            ("openbsd", "openbsd"),
-                                                            ("win32", "windows"),
-                                                            ("windows", "windows"),
-                                                            ("solaris", "solaris"),
-                                                            ("emscripten", "emscripten")];
+const OS_TABLE: &'static [(&'static str, &'static str)] = &[
+    ("android", "android"),
+    ("bitrig", "bitrig"),
+    ("darwin", "macos"),
+    ("dragonfly", "dragonfly"),
+    ("freebsd", "freebsd"),
+    ("haiku", "haiku"),
+    ("ios", "ios"),
+    ("linux", "linux"),
+    ("mingw32", "windows"),
+    ("netbsd", "netbsd"),
+    ("openbsd", "openbsd"),
+    ("win32", "windows"),
+    ("windows", "windows"),
+    ("solaris", "solaris"),
+    ("emscripten", "emscripten"),
+];
 
-const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[("aarch64", "aarch64"),
-                                                              ("amd64", "x86_64"),
-                                                              ("arm", "arm"),
-                                                              ("arm64", "aarch64"),
-                                                              ("hexagon", "hexagon"),
-                                                              ("i386", "x86"),
-                                                              ("i686", "x86"),
-                                                              ("mips", "mips"),
-                                                              ("msp430", "msp430"),
-                                                              ("powerpc", "powerpc"),
-                                                              ("powerpc64", "powerpc64"),
-                                                              ("s390x", "s390x"),
-                                                              ("sparc", "sparc"),
-                                                              ("x86_64", "x86_64"),
-                                                              ("xcore", "xcore"),
-                                                              ("asmjs", "asmjs"),
-                                                              ("wasm32", "wasm32")];
+const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[
+    ("aarch64", "aarch64"),
+    ("amd64", "x86_64"),
+    ("arm", "arm"),
+    ("arm64", "aarch64"),
+    ("hexagon", "hexagon"),
+    ("i386", "x86"),
+    ("i586", "x86"),
+    ("i686", "x86"),
+    ("mips", "mips"),
+    ("msp430", "msp430"),
+    ("powerpc", "powerpc"),
+    ("powerpc64", "powerpc64"),
+    ("s390x", "s390x"),
+    ("sparc", "sparc"),
+    ("x86_64", "x86_64"),
+    ("xcore", "xcore"),
+    ("asmjs", "asmjs"),
+    ("wasm32", "wasm32"),
+];
 
 pub fn get_os(triple: &str) -> &'static str {
     for &(triple_os, os) in OS_TABLE {