1use rustc_middle::ty::{self as rustc_ty, Const as InternalConst, Ty as InternalTy};
9use rustc_smir::Tables;
10
11use crate::abi::Layout;
12use crate::compiler_interface::BridgeTys;
13use crate::mir::alloc::AllocId;
14use crate::mir::mono::{Instance, MonoItem, StaticDef};
15use crate::mir::{BinOp, Mutability, Place, ProjectionElem, RawPtrKind, Safety, UnOp};
16use crate::ty::{
17 Abi, AdtDef, Binder, BoundRegionKind, BoundTyKind, BoundVariableKind, ClosureKind, DynKind,
18 ExistentialPredicate, ExistentialProjection, ExistentialTraitRef, FloatTy, FnSig,
19 GenericArgKind, GenericArgs, IntTy, MirConst, Movability, Pattern, Region, RigidTy, Span,
20 TermKind, TraitRef, Ty, TyConst, UintTy, VariantDef, VariantIdx,
21};
22use crate::unstable::{InternalCx, RustcInternal};
23use crate::{CrateItem, CrateNum, DefId, IndexedVal};
24
25impl RustcInternal for CrateItem {
26 type T<'tcx> = rustc_span::def_id::DefId;
27 fn internal<'tcx>(
28 &self,
29 tables: &mut Tables<'_, BridgeTys>,
30 tcx: impl InternalCx<'tcx>,
31 ) -> Self::T<'tcx> {
32 self.0.internal(tables, tcx)
33 }
34}
35
36impl RustcInternal for CrateNum {
37 type T<'tcx> = rustc_span::def_id::CrateNum;
38 fn internal<'tcx>(
39 &self,
40 _tables: &mut Tables<'_, BridgeTys>,
41 _tcx: impl InternalCx<'tcx>,
42 ) -> Self::T<'tcx> {
43 rustc_span::def_id::CrateNum::from_usize(*self)
44 }
45}
46
47impl RustcInternal for DefId {
48 type T<'tcx> = rustc_span::def_id::DefId;
49 fn internal<'tcx>(
50 &self,
51 tables: &mut Tables<'_, BridgeTys>,
52 tcx: impl InternalCx<'tcx>,
53 ) -> Self::T<'tcx> {
54 tcx.lift(tables.def_ids[*self]).unwrap()
55 }
56}
57
58impl RustcInternal for GenericArgs {
59 type T<'tcx> = rustc_ty::GenericArgsRef<'tcx>;
60 fn internal<'tcx>(
61 &self,
62 tables: &mut Tables<'_, BridgeTys>,
63 tcx: impl InternalCx<'tcx>,
64 ) -> Self::T<'tcx> {
65 InternalCx::mk_args_from_iter(tcx, self.0.iter().map(|arg| arg.internal(tables, tcx)))
66 }
67}
68
69impl RustcInternal for GenericArgKind {
70 type T<'tcx> = rustc_ty::GenericArg<'tcx>;
71 fn internal<'tcx>(
72 &self,
73 tables: &mut Tables<'_, BridgeTys>,
74 tcx: impl InternalCx<'tcx>,
75 ) -> Self::T<'tcx> {
76 let arg: rustc_ty::GenericArg<'tcx> = match self {
77 GenericArgKind::Lifetime(reg) => reg.internal(tables, tcx).into(),
78 GenericArgKind::Type(ty) => ty.internal(tables, tcx).into(),
79 GenericArgKind::Const(cnst) => cnst.internal(tables, tcx).into(),
80 };
81 tcx.lift(arg).unwrap()
82 }
83}
84
85impl RustcInternal for Region {
86 type T<'tcx> = rustc_ty::Region<'tcx>;
87 fn internal<'tcx>(
88 &self,
89 _tables: &mut Tables<'_, BridgeTys>,
90 tcx: impl InternalCx<'tcx>,
91 ) -> Self::T<'tcx> {
92 tcx.lifetimes_re_erased()
94 }
95}
96
97impl RustcInternal for Ty {
98 type T<'tcx> = InternalTy<'tcx>;
99 fn internal<'tcx>(
100 &self,
101 tables: &mut Tables<'_, BridgeTys>,
102 tcx: impl InternalCx<'tcx>,
103 ) -> Self::T<'tcx> {
104 tcx.lift(tables.types[*self]).unwrap()
105 }
106}
107
108impl RustcInternal for TyConst {
109 type T<'tcx> = InternalConst<'tcx>;
110 fn internal<'tcx>(
111 &self,
112 tables: &mut Tables<'_, BridgeTys>,
113 tcx: impl InternalCx<'tcx>,
114 ) -> Self::T<'tcx> {
115 tcx.lift(tables.ty_consts[self.id]).unwrap()
116 }
117}
118
119impl RustcInternal for Pattern {
120 type T<'tcx> = rustc_ty::Pattern<'tcx>;
121 fn internal<'tcx>(
122 &self,
123 tables: &mut Tables<'_, BridgeTys>,
124 tcx: impl InternalCx<'tcx>,
125 ) -> Self::T<'tcx> {
126 tcx.mk_pat(match self {
127 Pattern::Range { start, end, include_end: _ } => rustc_ty::PatternKind::Range {
128 start: start.as_ref().unwrap().internal(tables, tcx),
129 end: end.as_ref().unwrap().internal(tables, tcx),
130 },
131 })
132 }
133}
134
135impl RustcInternal for RigidTy {
136 type T<'tcx> = rustc_ty::TyKind<'tcx>;
137
138 fn internal<'tcx>(
139 &self,
140 tables: &mut Tables<'_, BridgeTys>,
141 tcx: impl InternalCx<'tcx>,
142 ) -> Self::T<'tcx> {
143 match self {
144 RigidTy::Bool => rustc_ty::TyKind::Bool,
145 RigidTy::Char => rustc_ty::TyKind::Char,
146 RigidTy::Int(int_ty) => rustc_ty::TyKind::Int(int_ty.internal(tables, tcx)),
147 RigidTy::Uint(uint_ty) => rustc_ty::TyKind::Uint(uint_ty.internal(tables, tcx)),
148 RigidTy::Float(float_ty) => rustc_ty::TyKind::Float(float_ty.internal(tables, tcx)),
149 RigidTy::Never => rustc_ty::TyKind::Never,
150 RigidTy::Array(ty, cnst) => {
151 rustc_ty::TyKind::Array(ty.internal(tables, tcx), cnst.internal(tables, tcx))
152 }
153 RigidTy::Pat(ty, pat) => {
154 rustc_ty::TyKind::Pat(ty.internal(tables, tcx), pat.internal(tables, tcx))
155 }
156 RigidTy::Adt(def, args) => {
157 rustc_ty::TyKind::Adt(def.internal(tables, tcx), args.internal(tables, tcx))
158 }
159 RigidTy::Str => rustc_ty::TyKind::Str,
160 RigidTy::Slice(ty) => rustc_ty::TyKind::Slice(ty.internal(tables, tcx)),
161 RigidTy::RawPtr(ty, mutability) => {
162 rustc_ty::TyKind::RawPtr(ty.internal(tables, tcx), mutability.internal(tables, tcx))
163 }
164 RigidTy::Ref(region, ty, mutability) => rustc_ty::TyKind::Ref(
165 region.internal(tables, tcx),
166 ty.internal(tables, tcx),
167 mutability.internal(tables, tcx),
168 ),
169 RigidTy::Foreign(def) => rustc_ty::TyKind::Foreign(def.0.internal(tables, tcx)),
170 RigidTy::FnDef(def, args) => {
171 rustc_ty::TyKind::FnDef(def.0.internal(tables, tcx), args.internal(tables, tcx))
172 }
173 RigidTy::FnPtr(sig) => {
174 let (sig_tys, hdr) = sig.internal(tables, tcx).split();
175 rustc_ty::TyKind::FnPtr(sig_tys, hdr)
176 }
177 RigidTy::Closure(def, args) => {
178 rustc_ty::TyKind::Closure(def.0.internal(tables, tcx), args.internal(tables, tcx))
179 }
180 RigidTy::Coroutine(def, args, _mov) => {
181 rustc_ty::TyKind::Coroutine(def.0.internal(tables, tcx), args.internal(tables, tcx))
182 }
183 RigidTy::CoroutineClosure(def, args) => rustc_ty::TyKind::CoroutineClosure(
184 def.0.internal(tables, tcx),
185 args.internal(tables, tcx),
186 ),
187 RigidTy::CoroutineWitness(def, args) => rustc_ty::TyKind::CoroutineWitness(
188 def.0.internal(tables, tcx),
189 args.internal(tables, tcx),
190 ),
191 RigidTy::Dynamic(predicate, region, dyn_kind) => rustc_ty::TyKind::Dynamic(
192 tcx.mk_poly_existential_predicates(&predicate.internal(tables, tcx)),
193 region.internal(tables, tcx),
194 dyn_kind.internal(tables, tcx),
195 ),
196 RigidTy::Tuple(tys) => {
197 rustc_ty::TyKind::Tuple(tcx.mk_type_list(&tys.internal(tables, tcx)))
198 }
199 }
200 }
201}
202
203impl RustcInternal for IntTy {
204 type T<'tcx> = rustc_ty::IntTy;
205
206 fn internal<'tcx>(
207 &self,
208 _tables: &mut Tables<'_, BridgeTys>,
209 _tcx: impl InternalCx<'tcx>,
210 ) -> Self::T<'tcx> {
211 match self {
212 IntTy::Isize => rustc_ty::IntTy::Isize,
213 IntTy::I8 => rustc_ty::IntTy::I8,
214 IntTy::I16 => rustc_ty::IntTy::I16,
215 IntTy::I32 => rustc_ty::IntTy::I32,
216 IntTy::I64 => rustc_ty::IntTy::I64,
217 IntTy::I128 => rustc_ty::IntTy::I128,
218 }
219 }
220}
221
222impl RustcInternal for UintTy {
223 type T<'tcx> = rustc_ty::UintTy;
224
225 fn internal<'tcx>(
226 &self,
227 _tables: &mut Tables<'_, BridgeTys>,
228 _tcx: impl InternalCx<'tcx>,
229 ) -> Self::T<'tcx> {
230 match self {
231 UintTy::Usize => rustc_ty::UintTy::Usize,
232 UintTy::U8 => rustc_ty::UintTy::U8,
233 UintTy::U16 => rustc_ty::UintTy::U16,
234 UintTy::U32 => rustc_ty::UintTy::U32,
235 UintTy::U64 => rustc_ty::UintTy::U64,
236 UintTy::U128 => rustc_ty::UintTy::U128,
237 }
238 }
239}
240
241impl RustcInternal for FloatTy {
242 type T<'tcx> = rustc_ty::FloatTy;
243
244 fn internal<'tcx>(
245 &self,
246 _tables: &mut Tables<'_, BridgeTys>,
247 _tcx: impl InternalCx<'tcx>,
248 ) -> Self::T<'tcx> {
249 match self {
250 FloatTy::F16 => rustc_ty::FloatTy::F16,
251 FloatTy::F32 => rustc_ty::FloatTy::F32,
252 FloatTy::F64 => rustc_ty::FloatTy::F64,
253 FloatTy::F128 => rustc_ty::FloatTy::F128,
254 }
255 }
256}
257
258impl RustcInternal for Mutability {
259 type T<'tcx> = rustc_ty::Mutability;
260
261 fn internal<'tcx>(
262 &self,
263 _tables: &mut Tables<'_, BridgeTys>,
264 _tcx: impl InternalCx<'tcx>,
265 ) -> Self::T<'tcx> {
266 match self {
267 Mutability::Not => rustc_ty::Mutability::Not,
268 Mutability::Mut => rustc_ty::Mutability::Mut,
269 }
270 }
271}
272
273impl RustcInternal for Movability {
274 type T<'tcx> = rustc_ty::Movability;
275
276 fn internal<'tcx>(
277 &self,
278 _tables: &mut Tables<'_, BridgeTys>,
279 _tcx: impl InternalCx<'tcx>,
280 ) -> Self::T<'tcx> {
281 match self {
282 Movability::Static => rustc_ty::Movability::Static,
283 Movability::Movable => rustc_ty::Movability::Movable,
284 }
285 }
286}
287
288impl RustcInternal for RawPtrKind {
289 type T<'tcx> = rustc_middle::mir::RawPtrKind;
290
291 fn internal<'tcx>(
292 &self,
293 _tables: &mut Tables<'_, BridgeTys>,
294 _tcx: impl InternalCx<'tcx>,
295 ) -> Self::T<'tcx> {
296 match self {
297 RawPtrKind::Mut => rustc_middle::mir::RawPtrKind::Mut,
298 RawPtrKind::Const => rustc_middle::mir::RawPtrKind::Const,
299 RawPtrKind::FakeForPtrMetadata => rustc_middle::mir::RawPtrKind::FakeForPtrMetadata,
300 }
301 }
302}
303
304impl RustcInternal for FnSig {
305 type T<'tcx> = rustc_ty::FnSig<'tcx>;
306
307 fn internal<'tcx>(
308 &self,
309 tables: &mut Tables<'_, BridgeTys>,
310 tcx: impl InternalCx<'tcx>,
311 ) -> Self::T<'tcx> {
312 tcx.lift(rustc_ty::FnSig {
313 inputs_and_output: tcx.mk_type_list(&self.inputs_and_output.internal(tables, tcx)),
314 c_variadic: self.c_variadic,
315 safety: self.safety.internal(tables, tcx),
316 abi: self.abi.internal(tables, tcx),
317 })
318 .unwrap()
319 }
320}
321
322impl RustcInternal for VariantIdx {
323 type T<'tcx> = rustc_abi::VariantIdx;
324
325 fn internal<'tcx>(
326 &self,
327 _tables: &mut Tables<'_, BridgeTys>,
328 _tcx: impl InternalCx<'tcx>,
329 ) -> Self::T<'tcx> {
330 rustc_abi::VariantIdx::from(self.to_index())
331 }
332}
333
334impl RustcInternal for VariantDef {
335 type T<'tcx> = &'tcx rustc_ty::VariantDef;
336
337 fn internal<'tcx>(
338 &self,
339 tables: &mut Tables<'_, BridgeTys>,
340 tcx: impl InternalCx<'tcx>,
341 ) -> Self::T<'tcx> {
342 self.adt_def.internal(tables, tcx).variant(self.idx.internal(tables, tcx))
343 }
344}
345
346impl RustcInternal for MirConst {
347 type T<'tcx> = rustc_middle::mir::Const<'tcx>;
348 fn internal<'tcx>(
349 &self,
350 tables: &mut Tables<'_, BridgeTys>,
351 tcx: impl InternalCx<'tcx>,
352 ) -> Self::T<'tcx> {
353 let constant = tables.mir_consts[self.id];
354 match constant {
355 rustc_middle::mir::Const::Ty(ty, ct) => {
356 rustc_middle::mir::Const::Ty(tcx.lift(ty).unwrap(), tcx.lift(ct).unwrap())
357 }
358 rustc_middle::mir::Const::Unevaluated(uneval, ty) => {
359 rustc_middle::mir::Const::Unevaluated(
360 tcx.lift(uneval).unwrap(),
361 tcx.lift(ty).unwrap(),
362 )
363 }
364 rustc_middle::mir::Const::Val(const_val, ty) => {
365 rustc_middle::mir::Const::Val(tcx.lift(const_val).unwrap(), tcx.lift(ty).unwrap())
366 }
367 }
368 }
369}
370
371impl RustcInternal for MonoItem {
372 type T<'tcx> = rustc_middle::mir::mono::MonoItem<'tcx>;
373
374 fn internal<'tcx>(
375 &self,
376 tables: &mut Tables<'_, BridgeTys>,
377 tcx: impl InternalCx<'tcx>,
378 ) -> Self::T<'tcx> {
379 use rustc_middle::mir::mono as rustc_mono;
380 match self {
381 MonoItem::Fn(instance) => rustc_mono::MonoItem::Fn(instance.internal(tables, tcx)),
382 MonoItem::Static(def) => rustc_mono::MonoItem::Static(def.internal(tables, tcx)),
383 MonoItem::GlobalAsm(_) => {
384 unimplemented!()
385 }
386 }
387 }
388}
389
390impl RustcInternal for Instance {
391 type T<'tcx> = rustc_ty::Instance<'tcx>;
392
393 fn internal<'tcx>(
394 &self,
395 tables: &mut Tables<'_, BridgeTys>,
396 tcx: impl InternalCx<'tcx>,
397 ) -> Self::T<'tcx> {
398 tcx.lift(tables.instances[self.def]).unwrap()
399 }
400}
401
402impl RustcInternal for StaticDef {
403 type T<'tcx> = rustc_span::def_id::DefId;
404
405 fn internal<'tcx>(
406 &self,
407 tables: &mut Tables<'_, BridgeTys>,
408 tcx: impl InternalCx<'tcx>,
409 ) -> Self::T<'tcx> {
410 self.0.internal(tables, tcx)
411 }
412}
413
414#[allow(rustc::usage_of_qualified_ty)]
415impl<T> RustcInternal for Binder<T>
416where
417 T: RustcInternal,
418 for<'tcx> T::T<'tcx>: rustc_ty::TypeVisitable<rustc_ty::TyCtxt<'tcx>>,
419{
420 type T<'tcx> = rustc_ty::Binder<'tcx, T::T<'tcx>>;
421
422 fn internal<'tcx>(
423 &self,
424 tables: &mut Tables<'_, BridgeTys>,
425 tcx: impl InternalCx<'tcx>,
426 ) -> Self::T<'tcx> {
427 rustc_ty::Binder::bind_with_vars(
428 self.value.internal(tables, tcx),
429 tcx.mk_bound_variable_kinds_from_iter(
430 self.bound_vars.iter().map(|bound| bound.internal(tables, tcx)),
431 ),
432 )
433 }
434}
435
436impl RustcInternal for BoundVariableKind {
437 type T<'tcx> = rustc_ty::BoundVariableKind;
438
439 fn internal<'tcx>(
440 &self,
441 tables: &mut Tables<'_, BridgeTys>,
442 tcx: impl InternalCx<'tcx>,
443 ) -> Self::T<'tcx> {
444 match self {
445 BoundVariableKind::Ty(kind) => rustc_ty::BoundVariableKind::Ty(match kind {
446 BoundTyKind::Anon => rustc_ty::BoundTyKind::Anon,
447 BoundTyKind::Param(def, _symbol) => {
448 rustc_ty::BoundTyKind::Param(def.0.internal(tables, tcx))
449 }
450 }),
451 BoundVariableKind::Region(kind) => rustc_ty::BoundVariableKind::Region(match kind {
452 BoundRegionKind::BrAnon => rustc_ty::BoundRegionKind::Anon,
453 BoundRegionKind::BrNamed(def, _symbol) => {
454 rustc_ty::BoundRegionKind::Named(def.0.internal(tables, tcx))
455 }
456 BoundRegionKind::BrEnv => rustc_ty::BoundRegionKind::ClosureEnv,
457 }),
458 BoundVariableKind::Const => rustc_ty::BoundVariableKind::Const,
459 }
460 }
461}
462
463impl RustcInternal for DynKind {
464 type T<'tcx> = rustc_ty::DynKind;
465
466 fn internal<'tcx>(
467 &self,
468 _tables: &mut Tables<'_, BridgeTys>,
469 _tcx: impl InternalCx<'tcx>,
470 ) -> Self::T<'tcx> {
471 match self {
472 DynKind::Dyn => rustc_ty::DynKind::Dyn,
473 }
474 }
475}
476
477impl RustcInternal for ExistentialPredicate {
478 type T<'tcx> = rustc_ty::ExistentialPredicate<'tcx>;
479
480 fn internal<'tcx>(
481 &self,
482 tables: &mut Tables<'_, BridgeTys>,
483 tcx: impl InternalCx<'tcx>,
484 ) -> Self::T<'tcx> {
485 match self {
486 ExistentialPredicate::Trait(trait_ref) => {
487 rustc_ty::ExistentialPredicate::Trait(trait_ref.internal(tables, tcx))
488 }
489 ExistentialPredicate::Projection(proj) => {
490 rustc_ty::ExistentialPredicate::Projection(proj.internal(tables, tcx))
491 }
492 ExistentialPredicate::AutoTrait(trait_def) => {
493 rustc_ty::ExistentialPredicate::AutoTrait(trait_def.0.internal(tables, tcx))
494 }
495 }
496 }
497}
498
499impl RustcInternal for ExistentialProjection {
500 type T<'tcx> = rustc_ty::ExistentialProjection<'tcx>;
501
502 fn internal<'tcx>(
503 &self,
504 tables: &mut Tables<'_, BridgeTys>,
505 tcx: impl InternalCx<'tcx>,
506 ) -> Self::T<'tcx> {
507 use crate::unstable::internal_cx::SmirExistentialProjection;
508 tcx.new_from_args(
509 self.def_id.0.internal(tables, tcx),
510 self.generic_args.internal(tables, tcx),
511 self.term.internal(tables, tcx),
512 )
513 }
514}
515
516impl RustcInternal for TermKind {
517 type T<'tcx> = rustc_ty::Term<'tcx>;
518
519 fn internal<'tcx>(
520 &self,
521 tables: &mut Tables<'_, BridgeTys>,
522 tcx: impl InternalCx<'tcx>,
523 ) -> Self::T<'tcx> {
524 match self {
525 TermKind::Type(ty) => ty.internal(tables, tcx).into(),
526 TermKind::Const(cnst) => cnst.internal(tables, tcx).into(),
527 }
528 }
529}
530
531impl RustcInternal for ExistentialTraitRef {
532 type T<'tcx> = rustc_ty::ExistentialTraitRef<'tcx>;
533
534 fn internal<'tcx>(
535 &self,
536 tables: &mut Tables<'_, BridgeTys>,
537 tcx: impl InternalCx<'tcx>,
538 ) -> Self::T<'tcx> {
539 use crate::unstable::internal_cx::SmirExistentialTraitRef;
540 tcx.new_from_args(
541 self.def_id.0.internal(tables, tcx),
542 self.generic_args.internal(tables, tcx),
543 )
544 }
545}
546
547impl RustcInternal for TraitRef {
548 type T<'tcx> = rustc_ty::TraitRef<'tcx>;
549
550 fn internal<'tcx>(
551 &self,
552 tables: &mut Tables<'_, BridgeTys>,
553 tcx: impl InternalCx<'tcx>,
554 ) -> Self::T<'tcx> {
555 use crate::unstable::internal_cx::SmirTraitRef;
556 tcx.new_from_args(self.def_id.0.internal(tables, tcx), self.args().internal(tables, tcx))
557 }
558}
559
560impl RustcInternal for AllocId {
561 type T<'tcx> = rustc_middle::mir::interpret::AllocId;
562 fn internal<'tcx>(
563 &self,
564 tables: &mut Tables<'_, BridgeTys>,
565 tcx: impl InternalCx<'tcx>,
566 ) -> Self::T<'tcx> {
567 tcx.lift(tables.alloc_ids[*self]).unwrap()
568 }
569}
570
571impl RustcInternal for ClosureKind {
572 type T<'tcx> = rustc_ty::ClosureKind;
573
574 fn internal<'tcx>(
575 &self,
576 _tables: &mut Tables<'_, BridgeTys>,
577 _tcx: impl InternalCx<'tcx>,
578 ) -> Self::T<'tcx> {
579 match self {
580 ClosureKind::Fn => rustc_ty::ClosureKind::Fn,
581 ClosureKind::FnMut => rustc_ty::ClosureKind::FnMut,
582 ClosureKind::FnOnce => rustc_ty::ClosureKind::FnOnce,
583 }
584 }
585}
586
587impl RustcInternal for AdtDef {
588 type T<'tcx> = rustc_ty::AdtDef<'tcx>;
589 fn internal<'tcx>(
590 &self,
591 tables: &mut Tables<'_, BridgeTys>,
592 tcx: impl InternalCx<'tcx>,
593 ) -> Self::T<'tcx> {
594 InternalCx::adt_def(tcx, self.0.internal(tables, tcx))
595 }
596}
597
598impl RustcInternal for Abi {
599 type T<'tcx> = rustc_abi::ExternAbi;
600
601 fn internal<'tcx>(
602 &self,
603 _tables: &mut Tables<'_, BridgeTys>,
604 _tcx: impl InternalCx<'tcx>,
605 ) -> Self::T<'tcx> {
606 match *self {
607 Abi::Rust => rustc_abi::ExternAbi::Rust,
608 Abi::C { unwind } => rustc_abi::ExternAbi::C { unwind },
609 Abi::Cdecl { unwind } => rustc_abi::ExternAbi::Cdecl { unwind },
610 Abi::Stdcall { unwind } => rustc_abi::ExternAbi::Stdcall { unwind },
611 Abi::Fastcall { unwind } => rustc_abi::ExternAbi::Fastcall { unwind },
612 Abi::Vectorcall { unwind } => rustc_abi::ExternAbi::Vectorcall { unwind },
613 Abi::Thiscall { unwind } => rustc_abi::ExternAbi::Thiscall { unwind },
614 Abi::Aapcs { unwind } => rustc_abi::ExternAbi::Aapcs { unwind },
615 Abi::CCmseNonSecureCall => rustc_abi::ExternAbi::CmseNonSecureCall,
616 Abi::CCmseNonSecureEntry => rustc_abi::ExternAbi::CmseNonSecureEntry,
617 Abi::Win64 { unwind } => rustc_abi::ExternAbi::Win64 { unwind },
618 Abi::SysV64 { unwind } => rustc_abi::ExternAbi::SysV64 { unwind },
619 Abi::PtxKernel => rustc_abi::ExternAbi::PtxKernel,
620 Abi::Msp430Interrupt => rustc_abi::ExternAbi::Msp430Interrupt,
621 Abi::X86Interrupt => rustc_abi::ExternAbi::X86Interrupt,
622 Abi::GpuKernel => rustc_abi::ExternAbi::GpuKernel,
623 Abi::EfiApi => rustc_abi::ExternAbi::EfiApi,
624 Abi::AvrInterrupt => rustc_abi::ExternAbi::AvrInterrupt,
625 Abi::AvrNonBlockingInterrupt => rustc_abi::ExternAbi::AvrNonBlockingInterrupt,
626 Abi::System { unwind } => rustc_abi::ExternAbi::System { unwind },
627 Abi::RustCall => rustc_abi::ExternAbi::RustCall,
628 Abi::Unadjusted => rustc_abi::ExternAbi::Unadjusted,
629 Abi::RustCold => rustc_abi::ExternAbi::RustCold,
630 Abi::RustInvalid => rustc_abi::ExternAbi::RustInvalid,
631 Abi::RiscvInterruptM => rustc_abi::ExternAbi::RiscvInterruptM,
632 Abi::RiscvInterruptS => rustc_abi::ExternAbi::RiscvInterruptS,
633 Abi::Custom => rustc_abi::ExternAbi::Custom,
634 }
635 }
636}
637
638impl RustcInternal for Safety {
639 type T<'tcx> = rustc_hir::Safety;
640
641 fn internal<'tcx>(
642 &self,
643 _tables: &mut Tables<'_, BridgeTys>,
644 _tcx: impl InternalCx<'tcx>,
645 ) -> Self::T<'tcx> {
646 match self {
647 Safety::Unsafe => rustc_hir::Safety::Unsafe,
648 Safety::Safe => rustc_hir::Safety::Safe,
649 }
650 }
651}
652impl RustcInternal for Span {
653 type T<'tcx> = rustc_span::Span;
654
655 fn internal<'tcx>(
656 &self,
657 tables: &mut Tables<'_, BridgeTys>,
658 _tcx: impl InternalCx<'tcx>,
659 ) -> Self::T<'tcx> {
660 tables.spans[*self]
661 }
662}
663
664impl RustcInternal for Layout {
665 type T<'tcx> = rustc_abi::Layout<'tcx>;
666
667 fn internal<'tcx>(
668 &self,
669 tables: &mut Tables<'_, BridgeTys>,
670 tcx: impl InternalCx<'tcx>,
671 ) -> Self::T<'tcx> {
672 tcx.lift(tables.layouts[*self]).unwrap()
673 }
674}
675
676impl RustcInternal for Place {
677 type T<'tcx> = rustc_middle::mir::Place<'tcx>;
678
679 fn internal<'tcx>(
680 &self,
681 tables: &mut Tables<'_, BridgeTys>,
682 tcx: impl InternalCx<'tcx>,
683 ) -> Self::T<'tcx> {
684 rustc_middle::mir::Place {
685 local: rustc_middle::mir::Local::from_usize(self.local),
686 projection: tcx.mk_place_elems(&self.projection.internal(tables, tcx)),
687 }
688 }
689}
690
691impl RustcInternal for ProjectionElem {
692 type T<'tcx> = rustc_middle::mir::PlaceElem<'tcx>;
693
694 fn internal<'tcx>(
695 &self,
696 tables: &mut Tables<'_, BridgeTys>,
697 tcx: impl InternalCx<'tcx>,
698 ) -> Self::T<'tcx> {
699 match self {
700 ProjectionElem::Deref => rustc_middle::mir::PlaceElem::Deref,
701 ProjectionElem::Field(idx, ty) => {
702 rustc_middle::mir::PlaceElem::Field((*idx).into(), ty.internal(tables, tcx))
703 }
704 ProjectionElem::Index(idx) => rustc_middle::mir::PlaceElem::Index((*idx).into()),
705 ProjectionElem::ConstantIndex { offset, min_length, from_end } => {
706 rustc_middle::mir::PlaceElem::ConstantIndex {
707 offset: *offset,
708 min_length: *min_length,
709 from_end: *from_end,
710 }
711 }
712 ProjectionElem::Subslice { from, to, from_end } => {
713 rustc_middle::mir::PlaceElem::Subslice { from: *from, to: *to, from_end: *from_end }
714 }
715 ProjectionElem::Downcast(idx) => {
716 rustc_middle::mir::PlaceElem::Downcast(None, idx.internal(tables, tcx))
717 }
718 ProjectionElem::OpaqueCast(ty) => {
719 rustc_middle::mir::PlaceElem::OpaqueCast(ty.internal(tables, tcx))
720 }
721 ProjectionElem::Subtype(ty) => {
722 rustc_middle::mir::PlaceElem::Subtype(ty.internal(tables, tcx))
723 }
724 }
725 }
726}
727
728impl RustcInternal for BinOp {
729 type T<'tcx> = rustc_middle::mir::BinOp;
730
731 fn internal<'tcx>(
732 &self,
733 _tables: &mut Tables<'_, BridgeTys>,
734 _tcx: impl InternalCx<'tcx>,
735 ) -> Self::T<'tcx> {
736 match self {
737 BinOp::Add => rustc_middle::mir::BinOp::Add,
738 BinOp::AddUnchecked => rustc_middle::mir::BinOp::AddUnchecked,
739 BinOp::Sub => rustc_middle::mir::BinOp::Sub,
740 BinOp::SubUnchecked => rustc_middle::mir::BinOp::SubUnchecked,
741 BinOp::Mul => rustc_middle::mir::BinOp::Mul,
742 BinOp::MulUnchecked => rustc_middle::mir::BinOp::MulUnchecked,
743 BinOp::Div => rustc_middle::mir::BinOp::Div,
744 BinOp::Rem => rustc_middle::mir::BinOp::Rem,
745 BinOp::BitXor => rustc_middle::mir::BinOp::BitXor,
746 BinOp::BitAnd => rustc_middle::mir::BinOp::BitAnd,
747 BinOp::BitOr => rustc_middle::mir::BinOp::BitOr,
748 BinOp::Shl => rustc_middle::mir::BinOp::Shl,
749 BinOp::ShlUnchecked => rustc_middle::mir::BinOp::ShlUnchecked,
750 BinOp::Shr => rustc_middle::mir::BinOp::Shr,
751 BinOp::ShrUnchecked => rustc_middle::mir::BinOp::ShrUnchecked,
752 BinOp::Eq => rustc_middle::mir::BinOp::Eq,
753 BinOp::Lt => rustc_middle::mir::BinOp::Lt,
754 BinOp::Le => rustc_middle::mir::BinOp::Le,
755 BinOp::Ne => rustc_middle::mir::BinOp::Ne,
756 BinOp::Ge => rustc_middle::mir::BinOp::Ge,
757 BinOp::Gt => rustc_middle::mir::BinOp::Gt,
758 BinOp::Cmp => rustc_middle::mir::BinOp::Cmp,
759 BinOp::Offset => rustc_middle::mir::BinOp::Offset,
760 }
761 }
762}
763
764impl RustcInternal for UnOp {
765 type T<'tcx> = rustc_middle::mir::UnOp;
766
767 fn internal<'tcx>(
768 &self,
769 _tables: &mut Tables<'_, BridgeTys>,
770 _tcx: impl InternalCx<'tcx>,
771 ) -> Self::T<'tcx> {
772 match self {
773 UnOp::Not => rustc_middle::mir::UnOp::Not,
774 UnOp::Neg => rustc_middle::mir::UnOp::Neg,
775 UnOp::PtrMetadata => rustc_middle::mir::UnOp::PtrMetadata,
776 }
777 }
778}
779
780impl<T> RustcInternal for &T
781where
782 T: RustcInternal,
783{
784 type T<'tcx> = T::T<'tcx>;
785
786 fn internal<'tcx>(
787 &self,
788 tables: &mut Tables<'_, BridgeTys>,
789 tcx: impl InternalCx<'tcx>,
790 ) -> Self::T<'tcx> {
791 (*self).internal(tables, tcx)
792 }
793}
794
795impl<T> RustcInternal for Option<T>
796where
797 T: RustcInternal,
798{
799 type T<'tcx> = Option<T::T<'tcx>>;
800
801 fn internal<'tcx>(
802 &self,
803 tables: &mut Tables<'_, BridgeTys>,
804 tcx: impl InternalCx<'tcx>,
805 ) -> Self::T<'tcx> {
806 self.as_ref().map(|inner| inner.internal(tables, tcx))
807 }
808}
809
810impl<T> RustcInternal for Vec<T>
811where
812 T: RustcInternal,
813{
814 type T<'tcx> = Vec<T::T<'tcx>>;
815
816 fn internal<'tcx>(
817 &self,
818 tables: &mut Tables<'_, BridgeTys>,
819 tcx: impl InternalCx<'tcx>,
820 ) -> Self::T<'tcx> {
821 self.iter().map(|e| e.internal(tables, tcx)).collect()
822 }
823}