Skip to content

Commit 6f69710

Browse files
committed
Auto merge of #141696 - tgross35:rollup-fhpj180, r=tgross35
Rollup of 7 pull requests Successful merges: - #140369 (Add data_ptr method to Mutex and RwLock) - #140697 (Split `autodiff` into `autodiff_forward` and `autodiff_reverse`) - #141404 (Improve intrinsic handling in cg_ssa) - #141411 (rustdoc: linking to a local proc macro no longer warns) - #141548 (consider glob imports in cfg suggestion) - #141627 (Drop-build cleanups) - #141670 (Fix ICE in tokenstream with contracts from parser recovery) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 40311c4 + d6b1108 commit 6f69710

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+907
-575
lines changed

compiler/rustc_builtin_macros/messages.ftl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ builtin_macros_assert_requires_expression = macro requires an expression as an a
5656
5757
builtin_macros_autodiff = autodiff must be applied to function
5858
builtin_macros_autodiff_missing_config = autodiff requires at least a name and mode
59-
builtin_macros_autodiff_mode = unknown Mode: `{$mode}`. Use `Forward` or `Reverse`
6059
builtin_macros_autodiff_mode_activity = {$act} can not be used in {$mode} Mode
6160
builtin_macros_autodiff_not_build = this rustc version does not support autodiff
6261
builtin_macros_autodiff_number_activities = expected {$expected} activities, but found {$found}

compiler/rustc_builtin_macros/src/autodiff.rs

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,27 +86,23 @@ mod llvm_enzyme {
8686
ecx: &mut ExtCtxt<'_>,
8787
meta_item: &ThinVec<MetaItemInner>,
8888
has_ret: bool,
89+
mode: DiffMode,
8990
) -> AutoDiffAttrs {
9091
let dcx = ecx.sess.dcx();
91-
let mode = name(&meta_item[1]);
92-
let Ok(mode) = DiffMode::from_str(&mode) else {
93-
dcx.emit_err(errors::AutoDiffInvalidMode { span: meta_item[1].span(), mode });
94-
return AutoDiffAttrs::error();
95-
};
9692

9793
// Now we check, whether the user wants autodiff in batch/vector mode, or scalar mode.
9894
// If he doesn't specify an integer (=width), we default to scalar mode, thus width=1.
99-
let mut first_activity = 2;
95+
let mut first_activity = 1;
10096

101-
let width = if let [_, _, x, ..] = &meta_item[..]
97+
let width = if let [_, x, ..] = &meta_item[..]
10298
&& let Some(x) = width(x)
10399
{
104-
first_activity = 3;
100+
first_activity = 2;
105101
match x.try_into() {
106102
Ok(x) => x,
107103
Err(_) => {
108104
dcx.emit_err(errors::AutoDiffInvalidWidth {
109-
span: meta_item[2].span(),
105+
span: meta_item[1].span(),
110106
width: x,
111107
});
112108
return AutoDiffAttrs::error();
@@ -165,6 +161,24 @@ mod llvm_enzyme {
165161
ts.push(TokenTree::Token(comma.clone(), Spacing::Alone));
166162
}
167163

164+
pub(crate) fn expand_forward(
165+
ecx: &mut ExtCtxt<'_>,
166+
expand_span: Span,
167+
meta_item: &ast::MetaItem,
168+
item: Annotatable,
169+
) -> Vec<Annotatable> {
170+
expand_with_mode(ecx, expand_span, meta_item, item, DiffMode::Forward)
171+
}
172+
173+
pub(crate) fn expand_reverse(
174+
ecx: &mut ExtCtxt<'_>,
175+
expand_span: Span,
176+
meta_item: &ast::MetaItem,
177+
item: Annotatable,
178+
) -> Vec<Annotatable> {
179+
expand_with_mode(ecx, expand_span, meta_item, item, DiffMode::Reverse)
180+
}
181+
168182
/// We expand the autodiff macro to generate a new placeholder function which passes
169183
/// type-checking and can be called by users. The function body of the placeholder function will
170184
/// later be replaced on LLVM-IR level, so the design of the body is less important and for now
@@ -198,11 +212,12 @@ mod llvm_enzyme {
198212
/// ```
199213
/// FIXME(ZuseZ4): Once autodiff is enabled by default, make this a doc comment which is checked
200214
/// in CI.
201-
pub(crate) fn expand(
215+
pub(crate) fn expand_with_mode(
202216
ecx: &mut ExtCtxt<'_>,
203217
expand_span: Span,
204218
meta_item: &ast::MetaItem,
205219
mut item: Annotatable,
220+
mode: DiffMode,
206221
) -> Vec<Annotatable> {
207222
if cfg!(not(llvm_enzyme)) {
208223
ecx.sess.dcx().emit_err(errors::AutoDiffSupportNotBuild { span: meta_item.span });
@@ -245,29 +260,41 @@ mod llvm_enzyme {
245260
// create TokenStream from vec elemtents:
246261
// meta_item doesn't have a .tokens field
247262
let mut ts: Vec<TokenTree> = vec![];
248-
if meta_item_vec.len() < 2 {
249-
// At the bare minimum, we need a fnc name and a mode, even for a dummy function with no
250-
// input and output args.
263+
if meta_item_vec.len() < 1 {
264+
// At the bare minimum, we need a fnc name.
251265
dcx.emit_err(errors::AutoDiffMissingConfig { span: item.span() });
252266
return vec![item];
253267
}
254268

255-
meta_item_inner_to_ts(&meta_item_vec[1], &mut ts);
269+
let mode_symbol = match mode {
270+
DiffMode::Forward => sym::Forward,
271+
DiffMode::Reverse => sym::Reverse,
272+
_ => unreachable!("Unsupported mode: {:?}", mode),
273+
};
274+
275+
// Insert mode token
276+
let mode_token = Token::new(TokenKind::Ident(mode_symbol, false.into()), Span::default());
277+
ts.insert(0, TokenTree::Token(mode_token, Spacing::Joint));
278+
ts.insert(
279+
1,
280+
TokenTree::Token(Token::new(TokenKind::Comma, Span::default()), Spacing::Alone),
281+
);
256282

257283
// Now, if the user gave a width (vector aka batch-mode ad), then we copy it.
258284
// If it is not given, we default to 1 (scalar mode).
259285
let start_position;
260286
let kind: LitKind = LitKind::Integer;
261287
let symbol;
262-
if meta_item_vec.len() >= 3
263-
&& let Some(width) = width(&meta_item_vec[2])
288+
if meta_item_vec.len() >= 2
289+
&& let Some(width) = width(&meta_item_vec[1])
264290
{
265-
start_position = 3;
291+
start_position = 2;
266292
symbol = Symbol::intern(&width.to_string());
267293
} else {
268-
start_position = 2;
294+
start_position = 1;
269295
symbol = sym::integer(1);
270296
}
297+
271298
let l: Lit = Lit { kind, symbol, suffix: None };
272299
let t = Token::new(TokenKind::Literal(l), Span::default());
273300
let comma = Token::new(TokenKind::Comma, Span::default());
@@ -289,7 +316,7 @@ mod llvm_enzyme {
289316
ts.pop();
290317
let ts: TokenStream = TokenStream::from_iter(ts);
291318

292-
let x: AutoDiffAttrs = from_ast(ecx, &meta_item_vec, has_ret);
319+
let x: AutoDiffAttrs = from_ast(ecx, &meta_item_vec, has_ret, mode);
293320
if !x.is_active() {
294321
// We encountered an error, so we return the original item.
295322
// This allows us to potentially parse other attributes.
@@ -1017,4 +1044,4 @@ mod llvm_enzyme {
10171044
}
10181045
}
10191046

1020-
pub(crate) use llvm_enzyme::expand;
1047+
pub(crate) use llvm_enzyme::{expand_forward, expand_reverse};

compiler/rustc_builtin_macros/src/errors.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,6 @@ mod autodiff {
180180
pub(crate) act: String,
181181
}
182182

183-
#[derive(Diagnostic)]
184-
#[diag(builtin_macros_autodiff_mode)]
185-
pub(crate) struct AutoDiffInvalidMode {
186-
#[primary_span]
187-
pub(crate) span: Span,
188-
pub(crate) mode: String,
189-
}
190-
191183
#[derive(Diagnostic)]
192184
#[diag(builtin_macros_autodiff_width)]
193185
pub(crate) struct AutoDiffInvalidWidth {

compiler/rustc_builtin_macros/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
#![allow(internal_features)]
66
#![allow(rustc::diagnostic_outside_of_impl)]
77
#![allow(rustc::untranslatable_diagnostic)]
8+
#![cfg_attr(not(bootstrap), feature(autodiff))]
89
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
910
#![doc(rust_logo)]
1011
#![feature(assert_matches)]
11-
#![feature(autodiff)]
1212
#![feature(box_patterns)]
1313
#![feature(decl_macro)]
1414
#![feature(if_let_guard)]
@@ -112,7 +112,8 @@ pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) {
112112

113113
register_attr! {
114114
alloc_error_handler: alloc_error_handler::expand,
115-
autodiff: autodiff::expand,
115+
autodiff_forward: autodiff::expand_forward,
116+
autodiff_reverse: autodiff::expand_reverse,
116117
bench: test::expand_bench,
117118
cfg_accessible: cfg_accessible::Expander,
118119
cfg_eval: cfg_eval::expand,

compiler/rustc_codegen_gcc/src/intrinsic/mod.rs

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ use rustc_codegen_ssa::traits::{
2222
};
2323
use rustc_middle::bug;
2424
#[cfg(feature = "master")]
25-
use rustc_middle::ty::layout::{FnAbiOf, HasTyCtxt};
25+
use rustc_middle::ty::layout::FnAbiOf;
2626
use rustc_middle::ty::layout::{HasTypingEnv, LayoutOf};
2727
use rustc_middle::ty::{self, Instance, Ty};
2828
use rustc_span::{Span, Symbol, sym};
29-
use rustc_target::callconv::{ArgAbi, FnAbi, PassMode};
29+
use rustc_target::callconv::{ArgAbi, PassMode};
3030
use rustc_target::spec::PanicStrategy;
3131

3232
#[cfg(feature = "master")]
@@ -200,9 +200,8 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
200200
fn codegen_intrinsic_call(
201201
&mut self,
202202
instance: Instance<'tcx>,
203-
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
204203
args: &[OperandRef<'tcx, RValue<'gcc>>],
205-
llresult: RValue<'gcc>,
204+
result: PlaceRef<'tcx, RValue<'gcc>>,
206205
span: Span,
207206
) -> Result<(), Instance<'tcx>> {
208207
let tcx = self.tcx;
@@ -221,7 +220,6 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
221220
let name_str = name.as_str();
222221

223222
let llret_ty = self.layout_of(ret_ty).gcc_type(self);
224-
let result = PlaceRef::new_sized(llresult, fn_abi.ret.layout);
225223

226224
let simple = get_simple_intrinsic(self, name);
227225
let simple_func = get_simple_function(self, name);
@@ -271,7 +269,7 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
271269
args[0].immediate(),
272270
args[1].immediate(),
273271
args[2].immediate(),
274-
llresult,
272+
result,
275273
);
276274
return Ok(());
277275
}
@@ -286,17 +284,10 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
286284
}
287285

288286
sym::volatile_load | sym::unaligned_volatile_load => {
289-
let tp_ty = fn_args.type_at(0);
290287
let ptr = args[0].immediate();
291-
let layout = self.layout_of(tp_ty);
292-
let load = if let PassMode::Cast { cast: ref ty, pad_i32: _ } = fn_abi.ret.mode {
293-
let gcc_ty = ty.gcc_type(self);
294-
self.volatile_load(gcc_ty, ptr)
295-
} else {
296-
self.volatile_load(layout.gcc_type(self), ptr)
297-
};
288+
let load = self.volatile_load(result.layout.gcc_type(self), ptr);
298289
// TODO(antoyo): set alignment.
299-
if let BackendRepr::Scalar(scalar) = layout.backend_repr {
290+
if let BackendRepr::Scalar(scalar) = result.layout.backend_repr {
300291
self.to_immediate_scalar(load, scalar)
301292
} else {
302293
load
@@ -511,16 +502,14 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
511502
_ => return Err(Instance::new_raw(instance.def_id(), instance.args)),
512503
};
513504

514-
if !fn_abi.ret.is_ignore() {
515-
if let PassMode::Cast { cast: ref ty, .. } = fn_abi.ret.mode {
516-
let ptr_llty = self.type_ptr_to(ty.gcc_type(self));
517-
let ptr = self.pointercast(result.val.llval, ptr_llty);
518-
self.store(value, ptr, result.val.align);
519-
} else {
520-
OperandRef::from_immediate_or_packed_pair(self, value, result.layout)
521-
.val
522-
.store(self, result);
523-
}
505+
if result.layout.ty.is_bool() {
506+
OperandRef::from_immediate_or_packed_pair(self, value, result.layout)
507+
.val
508+
.store(self, result);
509+
} else if !result.layout.ty.is_unit() {
510+
let ptr_llty = self.type_ptr_to(result.layout.gcc_type(self));
511+
let ptr = self.pointercast(result.val.llval, ptr_llty);
512+
self.store(value, ptr, result.val.align);
524513
}
525514
Ok(())
526515
}
@@ -1230,14 +1219,13 @@ fn try_intrinsic<'a, 'b, 'gcc, 'tcx>(
12301219
try_func: RValue<'gcc>,
12311220
data: RValue<'gcc>,
12321221
_catch_func: RValue<'gcc>,
1233-
dest: RValue<'gcc>,
1222+
dest: PlaceRef<'tcx, RValue<'gcc>>,
12341223
) {
12351224
if bx.sess().panic_strategy() == PanicStrategy::Abort {
12361225
bx.call(bx.type_void(), None, None, try_func, &[data], None, None);
12371226
// Return 0 unconditionally from the intrinsic call;
12381227
// we can never unwind.
1239-
let ret_align = bx.tcx.data_layout.i32_align.abi;
1240-
bx.store(bx.const_i32(0), dest, ret_align);
1228+
OperandValue::Immediate(bx.const_i32(0)).store(bx, dest);
12411229
} else {
12421230
if wants_msvc_seh(bx.sess()) {
12431231
unimplemented!();
@@ -1261,12 +1249,12 @@ fn try_intrinsic<'a, 'b, 'gcc, 'tcx>(
12611249
// functions in play. By calling a shim we're guaranteed that our shim will have
12621250
// the right personality function.
12631251
#[cfg(feature = "master")]
1264-
fn codegen_gnu_try<'gcc>(
1265-
bx: &mut Builder<'_, 'gcc, '_>,
1252+
fn codegen_gnu_try<'gcc, 'tcx>(
1253+
bx: &mut Builder<'_, 'gcc, 'tcx>,
12661254
try_func: RValue<'gcc>,
12671255
data: RValue<'gcc>,
12681256
catch_func: RValue<'gcc>,
1269-
dest: RValue<'gcc>,
1257+
dest: PlaceRef<'tcx, RValue<'gcc>>,
12701258
) {
12711259
let cx: &CodegenCx<'gcc, '_> = bx.cx;
12721260
let (llty, func) = get_rust_try_fn(cx, &mut |mut bx| {
@@ -1322,8 +1310,7 @@ fn codegen_gnu_try<'gcc>(
13221310
// Note that no invoke is used here because by definition this function
13231311
// can't panic (that's what it's catching).
13241312
let ret = bx.call(llty, None, None, func, &[try_func, data, catch_func], None, None);
1325-
let i32_align = bx.tcx().data_layout.i32_align.abi;
1326-
bx.store(ret, dest, i32_align);
1313+
OperandValue::Immediate(ret).store(bx, dest);
13271314
}
13281315

13291316
// Helper function used to get a handle to the `__rust_try` function used to

0 commit comments

Comments
 (0)