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