@@ -42,6 +42,22 @@ many different seeds.
4242Runs the benchmarks from bench-cargo-miri in hyperfine. hyperfine needs to be installed.
4343<benches> can explicitly list the benchmarks to run; by default, all of them are run.
4444
45+ ./miri rustc-pull:
46+ Pull and merge Miri changes from the rustc repo.
47+
48+ ./miri rustc-push <github user> <branch>:
49+ Push Miri changes back to the rustc repo. This will update the 'master' branch
50+ in the Rust fork of the given user to upstream. It will also pull a copy of the
51+ rustc history into the Miri repo, unless you set the RUSTC_GIT env var to an
52+ existing clone of the rustc repo.
53+
54+ ./miri toolchain <commit> <flags>:
55+ Update and activate the rustup toolchain 'miri'. If no commit is given, updates
56+ to the commit given in the `rust-version` file. If the commit is `HEAD`, updates
57+ to the latest upstream rustc commit.
58+ `rustup-toolchain-install-master` must be installed for this to work. Any extra
59+ flags are passed to `rustup-toolchain-install-master`.
60+
4561 ENVIRONMENT VARIABLES
4662
4763MIRI_SYSROOT:
@@ -52,37 +68,96 @@ Pass extra flags to all cargo invocations. (Ignored by `./miri cargo`.)
5268EOF
5369)
5470
55- # # We need to know where we are.
71+ # # We need to know which command to run and some global constants.
72+ COMMAND=" $1 "
73+ if [ -z " $COMMAND " ]; then
74+ echo " $USAGE "
75+ exit 1
76+ fi
77+ shift
5678# macOS does not have a useful readlink/realpath so we have to use Python instead...
5779MIRIDIR=$( python3 -c ' import os, sys; print(os.path.dirname(os.path.realpath(sys.argv[1])))' " $0 " )
80+ # Used for rustc syncs.
81+ JOSH_FILTER=" :at_commit=75dd959a3a40eb5b4574f8d2e23aa6efbeb33573[:prefix=src/tools/miri]:/src/tools/miri"
5882
59- # # Run the auto-things.
60- if [ -z " $MIRI_AUTO_OPS " ] ; then
61- export MIRI_AUTO_OPS=42
62-
63- # Run this first, so that the toolchain doesn't change after
64- # other code has run.
65- if [ -f " $MIRIDIR /.auto-everything " ] || [ -f " $MIRIDIR /.auto -toolchain" ] ; then
66- (cd " $MIRIDIR " && ./rustup-toolchain)
83+ # # Early commands, that don't do auto-things and don't want the environment-altering things happening below .
84+ case " $COMMAND " in
85+ toolchain)
86+ cd " $MIRIDIR "
87+ # Make sure rustup- toolchain-install-master is installed.
88+ if ! which rustup-toolchain-install-master > /dev/null ; then
89+ echo " Please install rustup-toolchain-install-master by running 'cargo install rustup -toolchain-install-master' "
90+ exit 1
6791 fi
68-
69- if [ -f " $MIRIDIR /.auto-everything" ] || [ -f " $MIRIDIR /.auto-fmt" ] ; then
70- $0 fmt
92+ # Determine new commit.
93+ if [[ " $1 " == " " ]]; then
94+ NEW_COMMIT=$( cat rust-version)
95+ elif [[ " $1 " == " HEAD" ]]; then
96+ NEW_COMMIT=$( git ls-remote https://github.com/rust-lang/rust/ HEAD | cut -f 1)
97+ else
98+ NEW_COMMIT=" $1 "
7199 fi
72-
73- if [ -f " $MIRIDIR /.auto-everything" ] || [ -f " $MIRIDIR /.auto-clippy" ] ; then
74- $0 clippy -- -D warnings
100+ echo " $NEW_COMMIT " > rust-version
101+ shift || true # don't fail if shifting fails because no commit was given
102+ # Check if we already are at that commit.
103+ CUR_COMMIT=$( rustc +miri --version -v 2> /dev/null | grep " ^commit-hash: " | cut -d " " -f 2)
104+ if [[ " $CUR_COMMIT " == " $NEW_COMMIT " ]]; then
105+ echo " miri toolchain is already at commit $CUR_COMMIT ."
106+ rustup override set miri
107+ exit 0
75108 fi
76- fi
77-
78- # # Determine command and toolchain.
79- COMMAND=" $1 "
80- [ $# -gt 0 ] && shift
81- # Doing this *after* auto-toolchain logic above, since that might change the toolchain.
82- TOOLCHAIN=$( cd " $MIRIDIR " ; rustup show active-toolchain | head -n 1 | cut -d ' ' -f 1)
83-
84- # # Handle some commands early, since they should *not* alter the environment.
85- case " $COMMAND " in
109+ # Install and setup new toolchain.
110+ rustup toolchain uninstall miri
111+ rustup-toolchain-install-master -n miri -c cargo -c rust-src -c rustc-dev -c llvm-tools -c rustfmt -c clippy " $@ " -- " $NEW_COMMIT "
112+ rustup override set miri
113+ # Cleanup.
114+ cargo clean
115+ # Call 'cargo metadata' on the sources in case that changes the lockfile
116+ # (which fails under some setups when it is done from inside vscode).
117+ cargo metadata --format-version 1 --manifest-path " $( rustc --print sysroot) /lib/rustlib/rustc-src/rust/compiler/rustc/Cargo.toml" > /dev/null
118+ # Done!
119+ exit 0
120+ ;;
121+ rustc-pull)
122+ cd " $MIRIDIR "
123+ git fetch http://localhost:8000/rust-lang/rust.git$JOSH_FILTER .git master
124+ git merge FETCH_HEAD
125+ exit 0
126+ ;;
127+ rustc-push)
128+ USER=" $1 "
129+ BRANCH=" $2 "
130+ if [ -z " $USER " ] || [ -z " $BRANCH " ]; then
131+ echo " Usage: $0 rustc-push <github user> <branch>"
132+ exit 1
133+ fi
134+ if [ -n " $RUSTC_GIT " ]; then
135+ # Use an existing fork for the branch updates.
136+ cd " $RUSTC_GIT "
137+ else
138+ # Do this in the local Miri repo.
139+ echo " This will pull a copy of the rust-lang/rust history into this Miri checkout, growing it by about 1GB."
140+ read -r -p " To avoid that, abort now and set the RUSTC_GIT environment variable to an existing rustc checkout. Proceed? [y/N] "
141+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
142+ exit 1
143+ fi
144+ cd " $MIRIDIR "
145+ fi
146+ # Prepare the branches. For reliable pushing we need to push to a non-existent branch
147+ # and set `-o base` to a branch that holds current rustc master.
148+ echo " Preparing $USER /rust..."
149+ if git fetch https://github.com/$USER /rust $BRANCH & > /dev/null; then
150+ echo " The '$BRANCH ' seems to already exist in $USER /rust. Please delete it and try again."
151+ exit 1
152+ fi
153+ git fetch https://github.com/rust-lang/rust master
154+ git push https://github.com/$USER /rust FETCH_HEAD:master
155+ # Do the actual push.
156+ cd " $MIRIDIR "
157+ echo " Pushing Miri changes..."
158+ git push http://localhost:8000/$USER /rust.git$JOSH_FILTER .git HEAD:$BRANCH -o base=master
159+ exit 0
160+ ;;
86161many-seeds)
87162 for SEED in $( { echo obase=16; seq 0 255; } | bc) ; do
88163 echo " Trying seed: $SEED "
@@ -106,9 +181,28 @@ bench)
106181 ;;
107182esac
108183
184+ # # Run the auto-things.
185+ if [ -z " $MIRI_AUTO_OPS " ]; then
186+ export MIRI_AUTO_OPS=42
187+
188+ # Run this first, so that the toolchain doesn't change after
189+ # other code has run.
190+ if [ -f " $MIRIDIR /.auto-everything" ] || [ -f " $MIRIDIR /.auto-toolchain" ] ; then
191+ $0 toolchain
192+ fi
193+
194+ if [ -f " $MIRIDIR /.auto-everything" ] || [ -f " $MIRIDIR /.auto-fmt" ] ; then
195+ $0 fmt
196+ fi
197+
198+ if [ -f " $MIRIDIR /.auto-everything" ] || [ -f " $MIRIDIR /.auto-clippy" ] ; then
199+ $0 clippy -- -D warnings
200+ fi
201+ fi
202+
109203# # Prepare the environment
110204# Determine some toolchain properties
111- # export the target so its available in miri
205+ TOOLCHAIN= $( cd " $MIRIDIR " ; rustup show active-toolchain | head -n 1 | cut -d ' ' -f 1 )
112206TARGET=$( rustc +$TOOLCHAIN --version --verbose | grep " ^host:" | cut -d ' ' -f 2)
113207SYSROOT=$( rustc +$TOOLCHAIN --print sysroot)
114208LIBDIR=$SYSROOT /lib/rustlib/$TARGET /lib
@@ -227,10 +321,7 @@ cargo)
227321 $CARGO " $@ "
228322 ;;
229323* )
230- if [ -n " $COMMAND " ]; then
231- echo " Unknown command: $COMMAND "
232- echo
233- fi
234- echo " $USAGE "
324+ echo " Unknown command: $COMMAND "
235325 exit 1
326+ ;;
236327esac
0 commit comments