1use rustc_middle::ty::{self as rustc_ty, Const as InternalConst, Ty as InternalTy};
9use rustc_public_bridge::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,
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.0)
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) => {
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) => rustc_ty::TyKind::Dynamic(
192 tcx.mk_poly_existential_predicates(&predicate.internal(tables, tcx)),
193 region.internal(tables, tcx),
194 ),
195 RigidTy::Tuple(tys) => {
196 rustc_ty::TyKind::Tuple(tcx.mk_type_list(&tys.internal(tables, tcx)))
197 }
198 }
199 }
200}
201
202impl RustcInternal for IntTy {
203 type T<'tcx> = rustc_ty::IntTy;
204
205 fn internal<'tcx>(
206 &self,
207 _tables: &mut Tables<'_, BridgeTys>,
208 _tcx: impl InternalCx<'tcx>,
209 ) -> Self::T<'tcx> {
210 match self {
211 IntTy::Isize => rustc_ty::IntTy::Isize,
212 IntTy::I8 => rustc_ty::IntTy::I8,
213 IntTy::I16 => rustc_ty::IntTy::I16,
214 IntTy::I32 => rustc_ty::IntTy::I32,
215 IntTy::I64 => rustc_ty::IntTy::I64,
216 IntTy::I128 => rustc_ty::IntTy::I128,
217 }
218 }
219}
220
221impl RustcInternal for UintTy {
222 type T<'tcx> = rustc_ty::UintTy;
223
224 fn internal<'tcx>(
225 &self,
226 _tables: &mut Tables<'_, BridgeTys>,
227 _tcx: impl InternalCx<'tcx>,
228 ) -> Self::T<'tcx> {
229 match self {
230 UintTy::Usize => rustc_ty::UintTy::Usize,
231 UintTy::U8 => rustc_ty::UintTy::U8,
232 UintTy::U16 => rustc_ty::UintTy::U16,
233 UintTy::U32 => rustc_ty::UintTy::U32,
234 UintTy::U64 => rustc_ty::UintTy::U64,
235 UintTy::U128 => rustc_ty::UintTy::U128,
236 }
237 }
238}
239
240impl RustcInternal for FloatTy {
241 type T<'tcx> = rustc_ty::FloatTy;
242
243 fn internal<'tcx>(
244 &self,
245 _tables: &mut Tables<'_, BridgeTys>,
246 _tcx: impl InternalCx<'tcx>,
247 ) -> Self::T<'tcx> {
248 match self {
249 FloatTy::F16 => rustc_ty::FloatTy::F16,
250 FloatTy::F32 => rustc_ty::FloatTy::F32,
251 FloatTy::F64 => rustc_ty::FloatTy::F64,
252 FloatTy::F128 => rustc_ty::FloatTy::F128,
253 }
254 }
255}
256
257impl RustcInternal for Mutability {
258 type T<'tcx> = rustc_ty::Mutability;
259
260 fn internal<'tcx>(
261 &self,
262 _tables: &mut Tables<'_, BridgeTys>,
263 _tcx: impl InternalCx<'tcx>,
264 ) -> Self::T<'tcx> {
265 match self {
266 Mutability::Not => rustc_ty::Mutability::Not,
267 Mutability::Mut => rustc_ty::Mutability::Mut,
268 }
269 }
270}
271
272impl RustcInternal for Movability {
273 type T<'tcx> = rustc_ty::Movability;
274
275 fn internal<'tcx>(
276 &self,
277 _tables: &mut Tables<'_, BridgeTys>,
278 _tcx: impl InternalCx<'tcx>,
279 ) -> Self::T<'tcx> {
280 match self {
281 Movability::Static => rustc_ty::Movability::Static,
282 Movability::Movable => rustc_ty::Movability::Movable,
283 }
284 }
285}
286
287impl RustcInternal for RawPtrKind {
288 type T<'tcx> = rustc_middle::mir::RawPtrKind;
289
290 fn internal<'tcx>(
291 &self,
292 _tables: &mut Tables<'_, BridgeTys>,
293 _tcx: impl InternalCx<'tcx>,
294 ) -> Self::T<'tcx> {
295 match self {
296 RawPtrKind::Mut => rustc_middle::mir::RawPtrKind::Mut,
297 RawPtrKind::Const => rustc_middle::mir::RawPtrKind::Const,
298 RawPtrKind::FakeForPtrMetadata => rustc_middle::mir::RawPtrKind::FakeForPtrMetadata,
299 }
300 }
301}
302
303impl RustcInternal for FnSig {
304 type T<'tcx> = rustc_ty::FnSig<'tcx>;
305
306 fn internal<'tcx>(
307 &self,
308 tables: &mut Tables<'_, BridgeTys>,
309 tcx: impl InternalCx<'tcx>,
310 ) -> Self::T<'tcx> {
311 let fn_sig_kind = rustc_ty::FnSigKind::default()
312 .set_abi(self.abi.internal(tables, tcx))
313 .set_safe(self.safety == Safety::Safe)
314 .set_c_variadic(self.c_variadic);
315 tcx.lift(rustc_ty::FnSig {
316 inputs_and_output: tcx.mk_type_list(&self.inputs_and_output.internal(tables, tcx)),
317 fn_sig_kind,
318 })
319 .unwrap()
320 }
321}
322
323impl RustcInternal for VariantIdx {
324 type T<'tcx> = rustc_abi::VariantIdx;
325
326 fn internal<'tcx>(
327 &self,
328 _tables: &mut Tables<'_, BridgeTys>,
329 _tcx: impl InternalCx<'tcx>,
330 ) -> Self::T<'tcx> {
331 rustc_abi::VariantIdx::from(self.to_index())
332 }
333}
334
335impl RustcInternal for VariantDef {
336 type T<'tcx> = &'tcx rustc_ty::VariantDef;
337
338 fn internal<'tcx>(
339 &self,
340 tables: &mut Tables<'_, BridgeTys>,
341 tcx: impl InternalCx<'tcx>,
342 ) -> Self::T<'tcx> {
343 self.adt_def.internal(tables, tcx).variant(self.idx.internal(tables, tcx))
344 }
345}
346
347impl RustcInternal for MirConst {
348 type T<'tcx> = rustc_middle::mir::Const<'tcx>;
349 fn internal<'tcx>(
350 &self,
351 tables: &mut Tables<'_, BridgeTys>,
352 tcx: impl InternalCx<'tcx>,
353 ) -> Self::T<'tcx> {
354 let constant = tables.mir_consts[self.id];
355 match constant {
356 rustc_middle::mir::Const::Ty(ty, ct) => {
357 rustc_middle::mir::Const::Ty(tcx.lift(ty).unwrap(), tcx.lift(ct).unwrap())
358 }
359 rustc_middle::mir::Const::Unevaluated(uneval, ty) => {
360 rustc_middle::mir::Const::Unevaluated(
361 tcx.lift(uneval).unwrap(),
362 tcx.lift(ty).unwrap(),
363 )
364 }
365 rustc_middle::mir::Const::Val(const_val, ty) => {
366 rustc_middle::mir::Const::Val(tcx.lift(const_val).unwrap(), tcx.lift(ty).unwrap())
367 }
368 }
369 }
370}
371
372impl RustcInternal for MonoItem {
373 type T<'tcx> = rustc_middle::mono::MonoItem<'tcx>;
374
375 fn internal<'tcx>(
376 &self,
377 tables: &mut Tables<'_, BridgeTys>,
378 tcx: impl InternalCx<'tcx>,
379 ) -> Self::T<'tcx> {
380 use rustc_middle::mono as rustc_mono;
381 match self {
382 MonoItem::Fn(instance) => rustc_mono::MonoItem::Fn(instance.internal(tables, tcx)),
383 MonoItem::Static(def) => rustc_mono::MonoItem::Static(def.internal(tables, tcx)),
384 MonoItem::GlobalAsm(_) => {
385 ::core::panicking::panic("not implemented")unimplemented!()
386 }
387 }
388 }
389}
390
391impl RustcInternal for Instance {
392 type T<'tcx> = rustc_ty::Instance<'tcx>;
393
394 fn internal<'tcx>(
395 &self,
396 tables: &mut Tables<'_, BridgeTys>,
397 tcx: impl InternalCx<'tcx>,
398 ) -> Self::T<'tcx> {
399 tcx.lift(tables.instances[self.def]).unwrap()
400 }
401}
402
403impl RustcInternal for StaticDef {
404 type T<'tcx> = rustc_span::def_id::DefId;
405
406 fn internal<'tcx>(
407 &self,
408 tables: &mut Tables<'_, BridgeTys>,
409 tcx: impl InternalCx<'tcx>,
410 ) -> Self::T<'tcx> {
411 self.0.internal(tables, tcx)
412 }
413}
414
415#[allow(rustc::usage_of_qualified_ty)]
416impl<T> RustcInternal for Binder<T>
417where
418 T: RustcInternal,
419 for<'tcx> T::T<'tcx>: rustc_ty::TypeVisitable<rustc_ty::TyCtxt<'tcx>>,
420{
421 type T<'tcx> = rustc_ty::Binder<'tcx, T::T<'tcx>>;
422
423 fn internal<'tcx>(
424 &self,
425 tables: &mut Tables<'_, BridgeTys>,
426 tcx: impl InternalCx<'tcx>,
427 ) -> Self::T<'tcx> {
428 rustc_ty::Binder::bind_with_vars(
429 self.value.internal(tables, tcx),
430 tcx.mk_bound_variable_kinds_from_iter(
431 self.bound_vars.iter().map(|bound| bound.internal(tables, tcx)),
432 ),
433 )
434 }
435}
436
437impl RustcInternal for BoundVariableKind {
438 type T<'tcx> = rustc_ty::BoundVariableKind<'tcx>;
439
440 fn internal<'tcx>(
441 &self,
442 tables: &mut Tables<'_, BridgeTys>,
443 tcx: impl InternalCx<'tcx>,
444 ) -> Self::T<'tcx> {
445 match self {
446 BoundVariableKind::Ty(kind) => rustc_ty::BoundVariableKind::Ty(match kind {
447 BoundTyKind::Anon => rustc_ty::BoundTyKind::Anon,
448 BoundTyKind::Param(def, _symbol) => {
449 rustc_ty::BoundTyKind::Param(def.0.internal(tables, tcx))
450 }
451 }),
452 BoundVariableKind::Region(kind) => rustc_ty::BoundVariableKind::Region(match kind {
453 BoundRegionKind::BrAnon => rustc_ty::BoundRegionKind::Anon,
454 BoundRegionKind::BrNamed(def, _symbol) => {
455 rustc_ty::BoundRegionKind::Named(def.0.internal(tables, tcx))
456 }
457 BoundRegionKind::BrEnv => rustc_ty::BoundRegionKind::ClosureEnv,
458 }),
459 BoundVariableKind::Const => rustc_ty::BoundVariableKind::Const,
460 }
461 }
462}
463
464impl RustcInternal for ExistentialPredicate {
465 type T<'tcx> = rustc_ty::ExistentialPredicate<'tcx>;
466
467 fn internal<'tcx>(
468 &self,
469 tables: &mut Tables<'_, BridgeTys>,
470 tcx: impl InternalCx<'tcx>,
471 ) -> Self::T<'tcx> {
472 match self {
473 ExistentialPredicate::Trait(trait_ref) => {
474 rustc_ty::ExistentialPredicate::Trait(trait_ref.internal(tables, tcx))
475 }
476 ExistentialPredicate::Projection(proj) => {
477 rustc_ty::ExistentialPredicate::Projection(proj.internal(tables, tcx))
478 }
479 ExistentialPredicate::AutoTrait(trait_def) => {
480 rustc_ty::ExistentialPredicate::AutoTrait(trait_def.0.internal(tables, tcx))
481 }
482 }
483 }
484}
485
486impl RustcInternal for ExistentialProjection {
487 type T<'tcx> = rustc_ty::ExistentialProjection<'tcx>;
488
489 fn internal<'tcx>(
490 &self,
491 tables: &mut Tables<'_, BridgeTys>,
492 tcx: impl InternalCx<'tcx>,
493 ) -> Self::T<'tcx> {
494 use crate::unstable::internal_cx::ExistentialProjectionHelpers;
495 tcx.new_from_args(
496 self.def_id.0.internal(tables, tcx),
497 self.generic_args.internal(tables, tcx),
498 self.term.internal(tables, tcx),
499 )
500 }
501}
502
503impl RustcInternal for TermKind {
504 type T<'tcx> = rustc_ty::Term<'tcx>;
505
506 fn internal<'tcx>(
507 &self,
508 tables: &mut Tables<'_, BridgeTys>,
509 tcx: impl InternalCx<'tcx>,
510 ) -> Self::T<'tcx> {
511 match self {
512 TermKind::Type(ty) => ty.internal(tables, tcx).into(),
513 TermKind::Const(cnst) => cnst.internal(tables, tcx).into(),
514 }
515 }
516}
517
518impl RustcInternal for ExistentialTraitRef {
519 type T<'tcx> = rustc_ty::ExistentialTraitRef<'tcx>;
520
521 fn internal<'tcx>(
522 &self,
523 tables: &mut Tables<'_, BridgeTys>,
524 tcx: impl InternalCx<'tcx>,
525 ) -> Self::T<'tcx> {
526 use crate::unstable::internal_cx::ExistentialTraitRefHelpers;
527 tcx.new_from_args(
528 self.def_id.0.internal(tables, tcx),
529 self.generic_args.internal(tables, tcx),
530 )
531 }
532}
533
534impl RustcInternal for TraitRef {
535 type T<'tcx> = rustc_ty::TraitRef<'tcx>;
536
537 fn internal<'tcx>(
538 &self,
539 tables: &mut Tables<'_, BridgeTys>,
540 tcx: impl InternalCx<'tcx>,
541 ) -> Self::T<'tcx> {
542 use crate::unstable::internal_cx::TraitRefHelpers;
543 tcx.new_from_args(self.def_id.0.internal(tables, tcx), self.args().internal(tables, tcx))
544 }
545}
546
547impl RustcInternal for AllocId {
548 type T<'tcx> = rustc_middle::mir::interpret::AllocId;
549 fn internal<'tcx>(
550 &self,
551 tables: &mut Tables<'_, BridgeTys>,
552 tcx: impl InternalCx<'tcx>,
553 ) -> Self::T<'tcx> {
554 tcx.lift(tables.alloc_ids[*self]).unwrap()
555 }
556}
557
558impl RustcInternal for ClosureKind {
559 type T<'tcx> = rustc_ty::ClosureKind;
560
561 fn internal<'tcx>(
562 &self,
563 _tables: &mut Tables<'_, BridgeTys>,
564 _tcx: impl InternalCx<'tcx>,
565 ) -> Self::T<'tcx> {
566 match self {
567 ClosureKind::Fn => rustc_ty::ClosureKind::Fn,
568 ClosureKind::FnMut => rustc_ty::ClosureKind::FnMut,
569 ClosureKind::FnOnce => rustc_ty::ClosureKind::FnOnce,
570 }
571 }
572}
573
574impl RustcInternal for AdtDef {
575 type T<'tcx> = rustc_ty::AdtDef<'tcx>;
576 fn internal<'tcx>(
577 &self,
578 tables: &mut Tables<'_, BridgeTys>,
579 tcx: impl InternalCx<'tcx>,
580 ) -> Self::T<'tcx> {
581 InternalCx::adt_def(tcx, self.0.internal(tables, tcx))
582 }
583}
584
585impl RustcInternal for Abi {
586 type T<'tcx> = rustc_abi::ExternAbi;
587
588 fn internal<'tcx>(
589 &self,
590 _tables: &mut Tables<'_, BridgeTys>,
591 _tcx: impl InternalCx<'tcx>,
592 ) -> Self::T<'tcx> {
593 match *self {
594 Abi::Rust => rustc_abi::ExternAbi::Rust,
595 Abi::C { unwind } => rustc_abi::ExternAbi::C { unwind },
596 Abi::Cdecl { unwind } => rustc_abi::ExternAbi::Cdecl { unwind },
597 Abi::Stdcall { unwind } => rustc_abi::ExternAbi::Stdcall { unwind },
598 Abi::Fastcall { unwind } => rustc_abi::ExternAbi::Fastcall { unwind },
599 Abi::Vectorcall { unwind } => rustc_abi::ExternAbi::Vectorcall { unwind },
600 Abi::Thiscall { unwind } => rustc_abi::ExternAbi::Thiscall { unwind },
601 Abi::Aapcs { unwind } => rustc_abi::ExternAbi::Aapcs { unwind },
602 Abi::CCmseNonSecureCall => rustc_abi::ExternAbi::CmseNonSecureCall,
603 Abi::CCmseNonSecureEntry => rustc_abi::ExternAbi::CmseNonSecureEntry,
604 Abi::Win64 { unwind } => rustc_abi::ExternAbi::Win64 { unwind },
605 Abi::SysV64 { unwind } => rustc_abi::ExternAbi::SysV64 { unwind },
606 Abi::PtxKernel => rustc_abi::ExternAbi::PtxKernel,
607 Abi::Msp430Interrupt => rustc_abi::ExternAbi::Msp430Interrupt,
608 Abi::X86Interrupt => rustc_abi::ExternAbi::X86Interrupt,
609 Abi::GpuKernel => rustc_abi::ExternAbi::GpuKernel,
610 Abi::EfiApi => rustc_abi::ExternAbi::EfiApi,
611 Abi::AvrInterrupt => rustc_abi::ExternAbi::AvrInterrupt,
612 Abi::AvrNonBlockingInterrupt => rustc_abi::ExternAbi::AvrNonBlockingInterrupt,
613 Abi::System { unwind } => rustc_abi::ExternAbi::System { unwind },
614 Abi::RustCall => rustc_abi::ExternAbi::RustCall,
615 Abi::Unadjusted => rustc_abi::ExternAbi::Unadjusted,
616 Abi::RustCold => rustc_abi::ExternAbi::RustCold,
617 Abi::RustInvalid => rustc_abi::ExternAbi::RustInvalid,
618 Abi::RiscvInterruptM => rustc_abi::ExternAbi::RiscvInterruptM,
619 Abi::RiscvInterruptS => rustc_abi::ExternAbi::RiscvInterruptS,
620 Abi::RustPreserveNone => rustc_abi::ExternAbi::RustPreserveNone,
621 Abi::Custom => rustc_abi::ExternAbi::Custom,
622 }
623 }
624}
625
626impl RustcInternal for Safety {
627 type T<'tcx> = rustc_hir::Safety;
628
629 fn internal<'tcx>(
630 &self,
631 _tables: &mut Tables<'_, BridgeTys>,
632 _tcx: impl InternalCx<'tcx>,
633 ) -> Self::T<'tcx> {
634 match self {
635 Safety::Unsafe => rustc_hir::Safety::Unsafe,
636 Safety::Safe => rustc_hir::Safety::Safe,
637 }
638 }
639}
640impl RustcInternal for Span {
641 type T<'tcx> = rustc_span::Span;
642
643 fn internal<'tcx>(
644 &self,
645 tables: &mut Tables<'_, BridgeTys>,
646 _tcx: impl InternalCx<'tcx>,
647 ) -> Self::T<'tcx> {
648 tables.spans[*self]
649 }
650}
651
652impl RustcInternal for Layout {
653 type T<'tcx> = rustc_abi::Layout<'tcx>;
654
655 fn internal<'tcx>(
656 &self,
657 tables: &mut Tables<'_, BridgeTys>,
658 tcx: impl InternalCx<'tcx>,
659 ) -> Self::T<'tcx> {
660 tcx.lift(tables.layouts[*self]).unwrap()
661 }
662}
663
664impl RustcInternal for Place {
665 type T<'tcx> = rustc_middle::mir::Place<'tcx>;
666
667 fn internal<'tcx>(
668 &self,
669 tables: &mut Tables<'_, BridgeTys>,
670 tcx: impl InternalCx<'tcx>,
671 ) -> Self::T<'tcx> {
672 rustc_middle::mir::Place {
673 local: rustc_middle::mir::Local::from_usize(self.local),
674 projection: tcx.mk_place_elems(&self.projection.internal(tables, tcx)),
675 }
676 }
677}
678
679impl RustcInternal for ProjectionElem {
680 type T<'tcx> = rustc_middle::mir::PlaceElem<'tcx>;
681
682 fn internal<'tcx>(
683 &self,
684 tables: &mut Tables<'_, BridgeTys>,
685 tcx: impl InternalCx<'tcx>,
686 ) -> Self::T<'tcx> {
687 match self {
688 ProjectionElem::Deref => rustc_middle::mir::PlaceElem::Deref,
689 ProjectionElem::Field(idx, ty) => {
690 rustc_middle::mir::PlaceElem::Field((*idx).into(), ty.internal(tables, tcx))
691 }
692 ProjectionElem::Index(idx) => rustc_middle::mir::PlaceElem::Index((*idx).into()),
693 ProjectionElem::ConstantIndex { offset, min_length, from_end } => {
694 rustc_middle::mir::PlaceElem::ConstantIndex {
695 offset: *offset,
696 min_length: *min_length,
697 from_end: *from_end,
698 }
699 }
700 ProjectionElem::Subslice { from, to, from_end } => {
701 rustc_middle::mir::PlaceElem::Subslice { from: *from, to: *to, from_end: *from_end }
702 }
703 ProjectionElem::Downcast(idx) => {
704 rustc_middle::mir::PlaceElem::Downcast(None, idx.internal(tables, tcx))
705 }
706 ProjectionElem::OpaqueCast(ty) => {
707 rustc_middle::mir::PlaceElem::OpaqueCast(ty.internal(tables, tcx))
708 }
709 }
710 }
711}
712
713impl RustcInternal for BinOp {
714 type T<'tcx> = rustc_middle::mir::BinOp;
715
716 fn internal<'tcx>(
717 &self,
718 _tables: &mut Tables<'_, BridgeTys>,
719 _tcx: impl InternalCx<'tcx>,
720 ) -> Self::T<'tcx> {
721 match self {
722 BinOp::Add => rustc_middle::mir::BinOp::Add,
723 BinOp::AddUnchecked => rustc_middle::mir::BinOp::AddUnchecked,
724 BinOp::Sub => rustc_middle::mir::BinOp::Sub,
725 BinOp::SubUnchecked => rustc_middle::mir::BinOp::SubUnchecked,
726 BinOp::Mul => rustc_middle::mir::BinOp::Mul,
727 BinOp::MulUnchecked => rustc_middle::mir::BinOp::MulUnchecked,
728 BinOp::Div => rustc_middle::mir::BinOp::Div,
729 BinOp::Rem => rustc_middle::mir::BinOp::Rem,
730 BinOp::BitXor => rustc_middle::mir::BinOp::BitXor,
731 BinOp::BitAnd => rustc_middle::mir::BinOp::BitAnd,
732 BinOp::BitOr => rustc_middle::mir::BinOp::BitOr,
733 BinOp::Shl => rustc_middle::mir::BinOp::Shl,
734 BinOp::ShlUnchecked => rustc_middle::mir::BinOp::ShlUnchecked,
735 BinOp::Shr => rustc_middle::mir::BinOp::Shr,
736 BinOp::ShrUnchecked => rustc_middle::mir::BinOp::ShrUnchecked,
737 BinOp::Eq => rustc_middle::mir::BinOp::Eq,
738 BinOp::Lt => rustc_middle::mir::BinOp::Lt,
739 BinOp::Le => rustc_middle::mir::BinOp::Le,
740 BinOp::Ne => rustc_middle::mir::BinOp::Ne,
741 BinOp::Ge => rustc_middle::mir::BinOp::Ge,
742 BinOp::Gt => rustc_middle::mir::BinOp::Gt,
743 BinOp::Cmp => rustc_middle::mir::BinOp::Cmp,
744 BinOp::Offset => rustc_middle::mir::BinOp::Offset,
745 }
746 }
747}
748
749impl RustcInternal for UnOp {
750 type T<'tcx> = rustc_middle::mir::UnOp;
751
752 fn internal<'tcx>(
753 &self,
754 _tables: &mut Tables<'_, BridgeTys>,
755 _tcx: impl InternalCx<'tcx>,
756 ) -> Self::T<'tcx> {
757 match self {
758 UnOp::Not => rustc_middle::mir::UnOp::Not,
759 UnOp::Neg => rustc_middle::mir::UnOp::Neg,
760 UnOp::PtrMetadata => rustc_middle::mir::UnOp::PtrMetadata,
761 }
762 }
763}
764
765impl<T> RustcInternal for &T
766where
767 T: RustcInternal,
768{
769 type T<'tcx> = T::T<'tcx>;
770
771 fn internal<'tcx>(
772 &self,
773 tables: &mut Tables<'_, BridgeTys>,
774 tcx: impl InternalCx<'tcx>,
775 ) -> Self::T<'tcx> {
776 (*self).internal(tables, tcx)
777 }
778}
779
780impl<T> RustcInternal for Option<T>
781where
782 T: RustcInternal,
783{
784 type T<'tcx> = Option<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.as_ref().map(|inner| inner.internal(tables, tcx))
792 }
793}
794
795impl<T> RustcInternal for Vec<T>
796where
797 T: RustcInternal,
798{
799 type T<'tcx> = Vec<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.iter().map(|e| e.internal(tables, tcx)).collect()
807 }
808}