Skip to content

Commit be78b11

Browse files
committed
Allow user to specify aliasing model for Miri
1 parent 47ac7e4 commit be78b11

File tree

10 files changed

+75
-5
lines changed

10 files changed

+75
-5
lines changed

compiler/base/cargo-miri-playground

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
set -eu
44

55
export MIRI_SYSROOT=~/.cache/miri
6-
export MIRIFLAGS="-Zmiri-disable-isolation"
6+
export MIRIFLAGS="${MIRIFLAGS:-} -Zmiri-disable-isolation"
77
exec cargo miri run

compiler/base/orchestrator/src/coordinator.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,12 @@ pub enum Channel {
243243
Nightly,
244244
}
245245

246+
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
247+
pub enum AliasingModel {
248+
Stacked,
249+
Tree,
250+
}
251+
246252
impl Channel {
247253
#[cfg(test)]
248254
pub(crate) const ALL: [Self; 3] = [Self::Stable, Self::Beta, Self::Nightly];
@@ -656,6 +662,7 @@ pub struct MiriRequest {
656662
pub channel: Channel,
657663
pub crate_type: CrateType,
658664
pub edition: Edition,
665+
pub aliasing_model: AliasingModel,
659666
pub code: String,
660667
}
661668

@@ -672,7 +679,12 @@ impl MiriRequest {
672679
ExecuteCommandRequest {
673680
cmd: "cargo".to_owned(),
674681
args: vec!["miri-playground".to_owned()],
675-
envs: Default::default(),
682+
envs: match self.aliasing_model {
683+
AliasingModel::Stacked => Default::default(),
684+
AliasingModel::Tree => [("MIRIFLAGS".to_owned(), "-Zmiri-tree-borrows".to_owned())]
685+
.into_iter()
686+
.collect(),
687+
},
676688
cwd: None,
677689
}
678690
}
@@ -3869,6 +3881,7 @@ mod tests {
38693881
channel: Channel::Nightly,
38703882
crate_type: CrateType::Binary,
38713883
edition: Edition::Rust2021,
3884+
aliasing_model: AliasingModel::Stacked,
38723885
code: String::new(),
38733886
};
38743887

ui/frontend/AdvancedOptionsMenu.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,22 @@ import * as config from './reducers/configuration';
44
import { Either as EitherConfig, Select as SelectConfig } from './ConfigElement';
55
import MenuGroup from './MenuGroup';
66
import * as selectors from './selectors';
7-
import { Backtrace, Channel, Edition } from './types';
7+
import { Backtrace, Channel, Edition, AliasingModel } from './types';
88
import { useAppDispatch, useAppSelector } from './hooks';
99

1010
const AdvancedOptionsMenu: React.FC = () => {
1111
const isEditionDefault = useAppSelector(selectors.isEditionDefault);
1212
const edition = useAppSelector((state) => state.configuration.edition);
1313
const isBacktraceSet = useAppSelector(selectors.getBacktraceSet);
1414
const backtrace = useAppSelector((state) => state.configuration.backtrace);
15+
const isAliasingModelDefault = useAppSelector(selectors.isAliasingModelDefault);
16+
const aliasingModel = useAppSelector((state) => state.configuration.aliasingModel);
1517

1618
const dispatch = useAppDispatch();
1719

1820
const changeEdition = useCallback((e: Edition) => dispatch(config.changeEdition(e)), [dispatch]);
1921
const changeBacktrace = useCallback((b: Backtrace) => dispatch(config.changeBacktrace(b)), [dispatch]);
22+
const changeAliasingModel = useCallback((b: AliasingModel) => dispatch(config.changeAliasingModel(b)), [dispatch]);
2023

2124
const channel = useAppSelector((state) => state.configuration.channel);
2225
const switchText = (channel !== Channel.Nightly) ? ' (will select nightly Rust)' : '';
@@ -43,6 +46,16 @@ const AdvancedOptionsMenu: React.FC = () => {
4346
value={backtrace}
4447
isNotDefault={isBacktraceSet}
4548
onChange={changeBacktrace} />
49+
50+
<EitherConfig
51+
id="aliasingModel"
52+
name="Aliasing model"
53+
a={AliasingModel.Stacked}
54+
b={AliasingModel.Tree}
55+
value={aliasingModel}
56+
isNotDefault={!isAliasingModelDefault}
57+
onChange={changeAliasingModel} />
58+
4659
</MenuGroup>
4760
);
4861
};

ui/frontend/reducers/configuration.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
Channel,
88
DemangleAssembly,
99
Edition,
10+
AliasingModel,
1011
Editor,
1112
Mode,
1213
Orientation,
@@ -35,6 +36,7 @@ interface State {
3536
mode: Mode;
3637
edition: Edition;
3738
backtrace: Backtrace;
39+
aliasingModel: AliasingModel;
3840
}
3941

4042
const initialState: State = {
@@ -56,6 +58,7 @@ const initialState: State = {
5658
mode: Mode.Debug,
5759
edition: Edition.Rust2021,
5860
backtrace: Backtrace.Disabled,
61+
aliasingModel: AliasingModel.Stacked,
5962
};
6063

6164
const slice = createSlice({
@@ -74,6 +77,10 @@ const slice = createSlice({
7477
state.backtrace = action.payload;
7578
},
7679

80+
changeAliasingModel: (state, action: PayloadAction<AliasingModel>) => {
81+
state.aliasingModel = action.payload;
82+
},
83+
7784
changeChannel: (state, action: PayloadAction<Channel>) => {
7885
state.channel = action.payload;
7986
},
@@ -124,6 +131,7 @@ export const {
124131
changeAceTheme,
125132
changeAssemblyFlavor,
126133
changeBacktrace,
134+
changeAliasingModel,
127135
changeChannel,
128136
changeDemangleAssembly,
129137
changeEditionRaw,

ui/frontend/reducers/output/miri.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as z from 'zod';
44
import { jsonPost, routes } from '../../api';
55
import { State as RootState } from '../../reducers';
66
import { miriRequestSelector } from '../../selectors';
7+
import { AliasingModel } from '../../types';
78

89
const sliceName = 'output/miri';
910

@@ -21,6 +22,7 @@ interface State {
2122
interface MiriRequestBody {
2223
code: string;
2324
edition: string;
25+
aliasingModel: AliasingModel,
2426
}
2527

2628
const MiriResponseBody = z.object({

ui/frontend/selectors/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
Backtrace,
77
Channel,
88
Edition,
9+
AliasingModel,
910
Focus,
1011
Orientation,
1112
PrimaryActionAuto,
@@ -147,6 +148,7 @@ export const rustfmtVersionDetailsText = createSelector(getRustfmt, versionDetai
147148
export const miriVersionDetailsText = createSelector(getMiri, versionDetails);
148149

149150
const editionSelector = (state: State) => state.configuration.edition;
151+
export const aliasingModelSelector = (state: State) => state.configuration.aliasingModel;
150152

151153
export const isNightlyChannel = createSelector(
152154
channelSelector,
@@ -175,6 +177,11 @@ export const isEditionDefault = createSelector(
175177
edition => edition == Edition.Rust2021,
176178
);
177179

180+
export const isAliasingModelDefault = createSelector(
181+
aliasingModelSelector,
182+
aliasingModel => aliasingModel == AliasingModel.Stacked,
183+
);
184+
178185
export const getBacktraceSet = (state: State) => (
179186
state.configuration.backtrace !== Backtrace.Disabled
180187
);
@@ -388,7 +395,8 @@ export const formatRequestSelector = createSelector(
388395
export const miriRequestSelector = createSelector(
389396
editionSelector,
390397
codeSelector,
391-
(edition, code) => ({ edition, code }),
398+
aliasingModelSelector,
399+
(edition, code, aliasingModel) => ({ edition, code, aliasingModel }),
392400
);
393401

394402
export const macroExpansionRequestSelector = createSelector(

ui/frontend/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ export enum Backtrace {
144144
Enabled = 'enabled',
145145
}
146146

147+
export enum AliasingModel {
148+
Stacked = 'stacked',
149+
Tree = 'tree',
150+
}
151+
147152
export enum Focus {
148153
Clippy = 'clippy',
149154
Miri = 'miri',

ui/src/metrics.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,8 @@ impl HasLabelsCore for coordinator::MiriRequest {
351351
channel,
352352
crate_type,
353353
edition,
354+
// REVIEW: should I add aliasing_model to `LabelsCore`?
355+
aliasing_model: _,
354356
code: _,
355357
} = *self;
356358

ui/src/public_http_api.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ pub(crate) struct MiriRequest {
103103
pub(crate) code: String,
104104
#[serde(default)]
105105
pub(crate) edition: String,
106+
#[serde(default, rename = "aliasingModel")]
107+
pub(crate) aliasing_model: String,
106108
}
107109

108110
#[derive(Debug, Clone, Serialize)]

ui/src/server_axum.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1479,12 +1479,13 @@ pub(crate) mod api_orchestrator_integration_impls {
14791479
type Error = ParseMiriRequestError;
14801480

14811481
fn try_from(other: api::MiriRequest) -> std::result::Result<Self, Self::Error> {
1482-
let api::MiriRequest { code, edition } = other;
1482+
let api::MiriRequest { code, edition, aliasing_model } = other;
14831483

14841484
Ok(MiriRequest {
14851485
channel: Channel::Nightly, // TODO: use what user has submitted
14861486
crate_type: CrateType::Binary, // TODO: use what user has submitted
14871487
edition: parse_edition(&edition)?,
1488+
aliasing_model: parse_aliasing_model(&aliasing_model)?,
14881489
code,
14891490
})
14901491
}
@@ -1494,6 +1495,8 @@ pub(crate) mod api_orchestrator_integration_impls {
14941495
pub(crate) enum ParseMiriRequestError {
14951496
#[snafu(transparent)]
14961497
Edition { source: ParseEditionError },
1498+
#[snafu(transparent)]
1499+
AliasingMode { source: ParseAliasingModelError },
14971500
}
14981501

14991502
impl From<WithOutput<MiriResponse>> for api::MiriResponse {
@@ -1709,12 +1712,26 @@ pub(crate) mod api_orchestrator_integration_impls {
17091712
})
17101713
}
17111714

1715+
pub(crate) fn parse_aliasing_model(s: &str) -> Result<AliasingModel, ParseAliasingModelError> {
1716+
Ok(match s {
1717+
"stacked" => AliasingModel::Stacked,
1718+
"tree" => AliasingModel::Tree,
1719+
value => return ParseAliasingModelSnafu { value }.fail(),
1720+
})
1721+
}
1722+
17121723
#[derive(Debug, Snafu)]
17131724
#[snafu(display("'{value}' is not a valid edition"))]
17141725
pub(crate) struct ParseEditionError {
17151726
value: String,
17161727
}
17171728

1729+
#[derive(Debug, Snafu)]
1730+
#[snafu(display("'{value}' is not a valid aliasing model"))]
1731+
pub(crate) struct ParseAliasingModelError {
1732+
value: String,
1733+
}
1734+
17181735
impl From<gist::Gist> for api::MetaGistResponse {
17191736
fn from(me: gist::Gist) -> Self {
17201737
api::MetaGistResponse {

0 commit comments

Comments
 (0)