Skip to content

Commit

Permalink
Rollup merge of #111914 - rcvalle:rust-cfi-fix-111184, r=compiler-errors
Browse files Browse the repository at this point in the history
CFI: Fix cfi with async: transform_ty: unexpected GeneratorWitness(Bi…

Fixes #111184 by encoding ty::Generator parent substs only.
  • Loading branch information
compiler-errors authored Jun 2, 2023
2 parents 24404e6 + 76ff5ec commit ceec225
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -601,9 +601,7 @@ fn encode_ty<'tcx>(
}

// Function types
ty::FnDef(def_id, substs)
| ty::Closure(def_id, substs)
| ty::Generator(def_id, substs, ..) => {
ty::FnDef(def_id, substs) | ty::Closure(def_id, substs) => {
// u<length><name>[I<element-type1..element-typeN>E], where <element-type> is <subst>,
// as vendor extended type.
let mut s = String::new();
Expand All @@ -614,6 +612,23 @@ fn encode_ty<'tcx>(
typeid.push_str(&s);
}

ty::Generator(def_id, substs, ..) => {
// u<length><name>[I<element-type1..element-typeN>E], where <element-type> is <subst>,
// as vendor extended type.
let mut s = String::new();
let name = encode_ty_name(tcx, *def_id);
let _ = write!(s, "u{}{}", name.len(), &name);
// Encode parent substs only
s.push_str(&encode_substs(
tcx,
tcx.mk_substs(substs.as_generator().parent_substs()),
dict,
options,
));
compress(dict, DictKey::Ty(ty, TyQ::None), &mut s);
typeid.push_str(&s);
}

// Pointer types
ty::Ref(region, ty0, ..) => {
// [U3mut]u3refI<element-type>E as vendor extended type qualifier and type
Expand Down Expand Up @@ -732,7 +747,12 @@ fn transform_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, options: TransformTyOptio
let mut ty = ty;

match ty.kind() {
ty::Float(..) | ty::Char | ty::Str | ty::Never | ty::Foreign(..) => {}
ty::Float(..)
| ty::Char
| ty::Str
| ty::Never
| ty::Foreign(..)
| ty::GeneratorWitness(..) => {}

ty::Bool => {
if options.contains(EncodeTyOptions::NORMALIZE_INTEGERS) {
Expand Down Expand Up @@ -915,7 +935,6 @@ fn transform_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, options: TransformTyOptio

ty::Bound(..)
| ty::Error(..)
| ty::GeneratorWitness(..)
| ty::GeneratorWitnessMIR(..)
| ty::Infer(..)
| ty::Alias(..)
Expand Down
17 changes: 17 additions & 0 deletions tests/ui/sanitize/issue-111184-generator-witness.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Regression test for issue 111184, where ty::GeneratorWitness were not expected to occur in
// encode_ty and caused the compiler to ICE.
//
// needs-sanitizer-cfi
// compile-flags: -Clto -Ctarget-feature=-crt-static -Zsanitizer=cfi --edition=2021
// no-prefer-dynamic
// only-x86_64-unknown-linux-gnu
// run-pass

use std::future::Future;

async fn foo() {}
fn bar<T>(_: impl Future<Output = T>) {}

fn main() {
bar(foo());
}

0 comments on commit ceec225

Please sign in to comment.