Skip to content

Commit fa35afe

Browse files
committed
cranelift changes
1 parent da373e3 commit fa35afe

File tree

1 file changed

+59
-49
lines changed

1 file changed

+59
-49
lines changed

src/constant.rs

+59-49
Original file line numberDiff line numberDiff line change
@@ -41,36 +41,30 @@ impl ConstantCx {
4141
pub(crate) fn check_constants(fx: &mut FunctionCx<'_, '_, '_>) -> bool {
4242
let mut all_constants_ok = true;
4343
for constant in &fx.mir.required_consts {
44-
let const_ = match fx.monomorphize(constant.literal) {
45-
ConstantKind::Ty(ct) => ct,
44+
let unevaluated = match fx.monomorphize(constant.literal) {
45+
ConstantKind::Ty(ct) => match ct.kind() {
46+
ConstKind::Unevaluated(uv) => uv.expand(),
47+
ConstKind::Value(_) => continue,
48+
ConstKind::Param(_)
49+
| ConstKind::Infer(_)
50+
| ConstKind::Bound(_, _)
51+
| ConstKind::Placeholder(_)
52+
| ConstKind::Error(_) => unreachable!("{:?}", ct),
53+
},
54+
ConstantKind::Unevaluated(uv, _) => uv,
4655
ConstantKind::Val(..) => continue,
4756
};
48-
match const_.kind() {
49-
ConstKind::Value(_) => {}
50-
ConstKind::Unevaluated(unevaluated) => {
51-
if let Err(err) =
52-
fx.tcx.const_eval_resolve(ParamEnv::reveal_all(), unevaluated, None)
53-
{
54-
all_constants_ok = false;
55-
match err {
56-
ErrorHandled::Reported(_) | ErrorHandled::Linted => {
57-
fx.tcx.sess.span_err(constant.span, "erroneous constant encountered");
58-
}
59-
ErrorHandled::TooGeneric => {
60-
span_bug!(
61-
constant.span,
62-
"codegen encountered polymorphic constant: {:?}",
63-
err
64-
);
65-
}
66-
}
57+
58+
if let Err(err) = fx.tcx.const_eval_resolve(ParamEnv::reveal_all(), unevaluated, None) {
59+
all_constants_ok = false;
60+
match err {
61+
ErrorHandled::Reported(_) | ErrorHandled::Linted => {
62+
fx.tcx.sess.span_err(constant.span, "erroneous constant encountered");
63+
}
64+
ErrorHandled::TooGeneric => {
65+
span_bug!(constant.span, "codegen encountered polymorphic constant: {:?}", err);
6766
}
6867
}
69-
ConstKind::Param(_)
70-
| ConstKind::Infer(_)
71-
| ConstKind::Bound(_, _)
72-
| ConstKind::Placeholder(_)
73-
| ConstKind::Error(_) => unreachable!("{:?}", const_),
7468
}
7569
}
7670
all_constants_ok
@@ -122,43 +116,56 @@ pub(crate) fn codegen_constant<'tcx>(
122116
fx: &mut FunctionCx<'_, '_, 'tcx>,
123117
constant: &Constant<'tcx>,
124118
) -> CValue<'tcx> {
125-
let const_ = match fx.monomorphize(constant.literal) {
126-
ConstantKind::Ty(ct) => ct,
127-
ConstantKind::Unevaluated(mir::Unevaluated { def, substs, promoted })
119+
let (const_val, ty) = match fx.monomorphize(constant.literal) {
120+
ConstantKind::Ty(const_) => match const_.kind() {
121+
ConstKind::Value(valtree) => {
122+
(fx.tcx.valtree_to_const_val((const_.ty(), valtree)), const_.ty())
123+
}
124+
ConstKind::Unevaluated(ty::Unevaluated { def, substs, promoted })
125+
if fx.tcx.is_static(def.did) =>
126+
{
127+
assert!(substs.is_empty());
128+
assert_eq!(promoted, ());
129+
return codegen_static_ref(fx, def.did, fx.layout_of(const_.ty())).to_cvalue(fx);
130+
}
131+
ConstKind::Unevaluated(unevaluated) => {
132+
match fx.tcx.const_eval_resolve(ParamEnv::reveal_all(), unevaluated.expand(), None)
133+
{
134+
Ok(const_val) => (const_val, const_.ty()),
135+
Err(_) => {
136+
span_bug!(
137+
constant.span,
138+
"erroneous constant not captured by required_consts"
139+
);
140+
}
141+
}
142+
}
143+
ConstKind::Param(_)
144+
| ConstKind::Infer(_)
145+
| ConstKind::Bound(_, _)
146+
| ConstKind::Placeholder(_)
147+
| ConstKind::Error(_) => unreachable!("{:?}", const_),
148+
},
149+
ConstantKind::Unevaluated(ty::Unevaluated { def, substs, promoted }, ty)
128150
if fx.tcx.is_static(def.did) =>
129151
{
130152
assert!(substs.is_empty());
131153
assert!(promoted.is_none());
132154

133-
return codegen_static_ref(fx, def.did, fx.layout_of(const_.ty())).to_cvalue(fx);
155+
return codegen_static_ref(fx, def.did, fx.layout_of(ty)).to_cvalue(fx);
134156
}
135-
ConstantKind::Unevaluated(unevaluated) => {
157+
ConstantKind::Unevaluated(unevaluated, ty) => {
136158
match fx.tcx.const_eval_resolve(ParamEnv::reveal_all(), unevaluated, None) {
137-
Ok(const_val) => const_val,
159+
Ok(const_val) => (const_val, ty),
138160
Err(_) => {
139161
span_bug!(constant.span, "erroneous constant not captured by required_consts");
140162
}
141163
}
142164
}
143-
ConstantKind::Val(val, ty) => return codegen_const_value(fx, val, ty),
144-
};
145-
let const_val = match const_.kind() {
146-
ConstKind::Value(valtree) => fx.tcx.valtree_to_const_val((const_.ty(), valtree)),
147-
ConstKind::Unevaluated(ty::Unevaluated { def, substs, promoted })
148-
if fx.tcx.is_static(def.did) =>
149-
{
150-
assert!(substs.is_empty());
151-
assert!(promoted.is_none());
152-
return codegen_static_ref(fx, def.did, fx.layout_of(const_.ty())).to_cvalue(fx);
153-
}
154-
ConstKind::Param(_)
155-
| ConstKind::Infer(_)
156-
| ConstKind::Bound(_, _)
157-
| ConstKind::Placeholder(_)
158-
| ConstKind::Error(_) => unreachable!("{:?}", const_),
165+
ConstantKind::Val(val, ty) => (val, ty),
159166
};
160167

161-
codegen_const_value(fx, const_val, const_.ty())
168+
codegen_const_value(fx, const_val, ty)
162169
}
163170

164171
pub(crate) fn codegen_const_value<'tcx>(
@@ -503,6 +510,9 @@ pub(crate) fn mir_operand_get_const_val<'tcx>(
503510
.eval_for_mir(fx.tcx, ParamEnv::reveal_all())
504511
.try_to_value(fx.tcx),
505512
ConstantKind::Val(val, _) => Some(val),
513+
ConstantKind::Unevaluated(uv, _) => {
514+
fx.tcx.const_eval_resolve(ParamEnv::reveal_all(), uv, None).ok()
515+
}
506516
},
507517
// FIXME(rust-lang/rust#85105): Casts like `IMM8 as u32` result in the const being stored
508518
// inside a temporary before being passed to the intrinsic requiring the const argument.

0 commit comments

Comments
 (0)