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) => {
175 rustc_ty::TyKind::FnDef(def.0.internal(tables, tcx), args.internal(tables, tcx))
176 }
177 RigidTy::FnPtr(sig) => {
178 let (sig_tys, hdr) = sig.internal(tables, tcx).split();
179 rustc_ty::TyKind::FnPtr(sig_tys, hdr)
180 }
181 RigidTy::Closure(def, args) => {
182 rustc_ty::TyKind::Closure(def.0.internal(tables, tcx), args.internal(tables, tcx))
183 }
184 RigidTy::Coroutine(def, args) => {
185 rustc_ty::TyKind::Coroutine(def.0.internal(tables, tcx), args.internal(tables, tcx))
186 }
187 RigidTy::CoroutineClosure(def, args) => rustc_ty::TyKind::CoroutineClosure(
188 def.0.internal(tables, tcx),
189 args.internal(tables, tcx),
190 ),
191 RigidTy::CoroutineWitness(def, args) => rustc_ty::TyKind::CoroutineWitness(
192 def.0.internal(tables, tcx),
193 args.internal(tables, tcx),
194 ),
195 RigidTy::Dynamic(predicate, region) => rustc_ty::TyKind::Dynamic(
196 tcx.mk_poly_existential_predicates(&predicate.internal(tables, tcx)),
197 region.internal(tables, tcx),
198 ),
199 RigidTy::Tuple(tys) => {
200 rustc_ty::TyKind::Tuple(tcx.mk_type_list(&tys.internal(tables, tcx)))
201 }
202 }
203 }
204}
205
206impl RustcInternal for IntTy {
207 type T<'tcx> = rustc_ty::IntTy;
208
209 fn internal<'tcx>(
210 &self,
211 _tables: &mut Tables<'_, BridgeTys>,
212 _tcx: impl InternalCx<'tcx>,
213 ) -> Self::T<'tcx> {
214 match self {
215 IntTy::Isize => rustc_ty::IntTy::Isize,
216 IntTy::I8 => rustc_ty::IntTy::I8,
217 IntTy::I16 => rustc_ty::IntTy::I16,
218 IntTy::I32 => rustc_ty::IntTy::I32,
219 IntTy::I64 => rustc_ty::IntTy::I64,
220 IntTy::I128 => rustc_ty::IntTy::I128,
221 }
222 }
223}
224
225impl RustcInternal for UintTy {
226 type T<'tcx> = rustc_ty::UintTy;
227
228 fn internal<'tcx>(
229 &self,
230 _tables: &mut Tables<'_, BridgeTys>,
231 _tcx: impl InternalCx<'tcx>,
232 ) -> Self::T<'tcx> {
233 match self {
234 UintTy::Usize => rustc_ty::UintTy::Usize,
235 UintTy::U8 => rustc_ty::UintTy::U8,
236 UintTy::U16 => rustc_ty::UintTy::U16,
237 UintTy::U32 => rustc_ty::UintTy::U32,
238 UintTy::U64 => rustc_ty::UintTy::U64,
239 UintTy::U128 => rustc_ty::UintTy::U128,
240 }
241 }
242}
243
244impl RustcInternal for FloatTy {
245 type T<'tcx> = rustc_ty::FloatTy;
246
247 fn internal<'tcx>(
248 &self,
249 _tables: &mut Tables<'_, BridgeTys>,
250 _tcx: impl InternalCx<'tcx>,
251 ) -> Self::T<'tcx> {
252 match self {
253 FloatTy::F16 => rustc_ty::FloatTy::F16,
254 FloatTy::F32 => rustc_ty::FloatTy::F32,
255 FloatTy::F64 => rustc_ty::FloatTy::F64,
256 FloatTy::F128 => rustc_ty::FloatTy::F128,
257 }
258 }
259}
260
261impl RustcInternal for Mutability {
262 type T<'tcx> = rustc_ty::Mutability;
263
264 fn internal<'tcx>(
265 &self,
266 _tables: &mut Tables<'_, BridgeTys>,
267 _tcx: impl InternalCx<'tcx>,
268 ) -> Self::T<'tcx> {
269 match self {
270 Mutability::Not => rustc_ty::Mutability::Not,
271 Mutability::Mut => rustc_ty::Mutability::Mut,
272 }
273 }
274}
275
276impl RustcInternal for Movability {
277 type T<'tcx> = rustc_ty::Movability;
278
279 fn internal<'tcx>(
280 &self,
281 _tables: &mut Tables<'_, BridgeTys>,
282 _tcx: impl InternalCx<'tcx>,
283 ) -> Self::T<'tcx> {
284 match self {
285 Movability::Static => rustc_ty::Movability::Static,
286 Movability::Movable => rustc_ty::Movability::Movable,
287 }
288 }
289}
290
291impl RustcInternal for RawPtrKind {
292 type T<'tcx> = rustc_middle::mir::RawPtrKind;
293
294 fn internal<'tcx>(
295 &self,
296 _tables: &mut Tables<'_, BridgeTys>,
297 _tcx: impl InternalCx<'tcx>,
298 ) -> Self::T<'tcx> {
299 match self {
300 RawPtrKind::Mut => rustc_middle::mir::RawPtrKind::Mut,
301 RawPtrKind::Const => rustc_middle::mir::RawPtrKind::Const,
302 RawPtrKind::FakeForPtrMetadata => rustc_middle::mir::RawPtrKind::FakeForPtrMetadata,
303 }
304 }
305}
306
307impl RustcInternal for FnSig {
308 type T<'tcx> = rustc_ty::FnSig<'tcx>;
309
310 fn internal<'tcx>(
311 &self,
312 tables: &mut Tables<'_, BridgeTys>,
313 tcx: impl InternalCx<'tcx>,
314 ) -> Self::T<'tcx> {
315 let fn_sig_kind = rustc_ty::FnSigKind::default()
316 .set_abi(self.abi.internal(tables, tcx))
317 .set_safety(self.safety.internal(tables, tcx))
318 .set_c_variadic(self.c_variadic);
319 rustc_ty::FnSig {
320 inputs_and_output: tcx.mk_type_list(&self.inputs_and_output.internal(tables, tcx)),
321 fn_sig_kind,
322 }
323 }
324}
325
326impl RustcInternal for VariantIdx {
327 type T<'tcx> = rustc_abi::VariantIdx;
328
329 fn internal<'tcx>(
330 &self,
331 _tables: &mut Tables<'_, BridgeTys>,
332 _tcx: impl InternalCx<'tcx>,
333 ) -> Self::T<'tcx> {
334 rustc_abi::VariantIdx::from(self.to_index())
335 }
336}
337
338impl RustcInternal for VariantDef {
339 type T<'tcx> = &'tcx rustc_ty::VariantDef;
340
341 fn internal<'tcx>(
342 &self,
343 tables: &mut Tables<'_, BridgeTys>,
344 tcx: impl InternalCx<'tcx>,
345 ) -> Self::T<'tcx> {
346 self.adt_def.internal(tables, tcx).variant(self.idx.internal(tables, tcx))
347 }
348}
349
350impl RustcInternal for MirConst {
351 type T<'tcx> = rustc_middle::mir::Const<'tcx>;
352 fn internal<'tcx>(
353 &self,
354 tables: &mut Tables<'_, BridgeTys>,
355 tcx: impl InternalCx<'tcx>,
356 ) -> Self::T<'tcx> {
357 let constant = tables.mir_consts[self.id];
358 match constant {
359 rustc_middle::mir::Const::Ty(ty, ct) => {
360 rustc_middle::mir::Const::Ty(tcx.lift(ty), tcx.lift(ct))
361 }
362 rustc_middle::mir::Const::Unevaluated(uneval, ty) => {
363 rustc_middle::mir::Const::Unevaluated(tcx.lift(uneval), tcx.lift(ty))
364 }
365 rustc_middle::mir::Const::Val(const_val, ty) => {
366 rustc_middle::mir::Const::Val(tcx.lift(const_val), tcx.lift(ty))
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])
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 tables.alloc_ids[*self]
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}
640
641impl RustcInternal for Constness {
642 type T<'tcx> = rustc_hir::Constness;
643
644 fn internal<'tcx>(
645 &self,
646 _tables: &mut Tables<'_, BridgeTys>,
647 _tcx: impl InternalCx<'tcx>,
648 ) -> Self::T<'tcx> {
649 match self {
650 Constness::Const => rustc_hir::Constness::Const,
651 Constness::NotConst => rustc_hir::Constness::NotConst,
652 }
653 }
654}
655
656impl RustcInternal for Asyncness {
657 type T<'tcx> = rustc_ty::Asyncness;
658
659 fn internal<'tcx>(
660 &self,
661 _tables: &mut Tables<'_, BridgeTys>,
662 _tcx: impl InternalCx<'tcx>,
663 ) -> Self::T<'tcx> {
664 match self {
665 Asyncness::Async => rustc_ty::Asyncness::Yes,
666 Asyncness::NotAsync => rustc_ty::Asyncness::No,
667 }
668 }
669}
670impl RustcInternal for Span {
671 type T<'tcx> = rustc_span::Span;
672
673 fn internal<'tcx>(
674 &self,
675 tables: &mut Tables<'_, BridgeTys>,
676 _tcx: impl InternalCx<'tcx>,
677 ) -> Self::T<'tcx> {
678 tables.spans[*self]
679 }
680}
681
682impl RustcInternal for Layout {
683 type T<'tcx> = rustc_abi::Layout<'tcx>;
684
685 fn internal<'tcx>(
686 &self,
687 tables: &mut Tables<'_, BridgeTys>,
688 tcx: impl InternalCx<'tcx>,
689 ) -> Self::T<'tcx> {
690 tcx.lift(tables.layouts[*self])
691 }
692}
693
694impl RustcInternal for Place {
695 type T<'tcx> = rustc_middle::mir::Place<'tcx>;
696
697 fn internal<'tcx>(
698 &self,
699 tables: &mut Tables<'_, BridgeTys>,
700 tcx: impl InternalCx<'tcx>,
701 ) -> Self::T<'tcx> {
702 rustc_middle::mir::Place {
703 local: rustc_middle::mir::Local::from_usize(self.local),
704 projection: tcx.mk_place_elems(&self.projection.internal(tables, tcx)),
705 }
706 }
707}
708
709impl RustcInternal for ProjectionElem {
710 type T<'tcx> = rustc_middle::mir::PlaceElem<'tcx>;
711
712 fn internal<'tcx>(
713 &self,
714 tables: &mut Tables<'_, BridgeTys>,
715 tcx: impl InternalCx<'tcx>,
716 ) -> Self::T<'tcx> {
717 match self {
718 ProjectionElem::Deref => rustc_middle::mir::PlaceElem::Deref,
719 ProjectionElem::Field(idx, ty) => {
720 rustc_middle::mir::PlaceElem::Field((*idx).into(), ty.internal(tables, tcx))
721 }
722 ProjectionElem::Index(idx) => rustc_middle::mir::PlaceElem::Index((*idx).into()),
723 ProjectionElem::ConstantIndex { offset, min_length, from_end } => {
724 rustc_middle::mir::PlaceElem::ConstantIndex {
725 offset: *offset,
726 min_length: *min_length,
727 from_end: *from_end,
728 }
729 }
730 ProjectionElem::Subslice { from, to, from_end } => {
731 rustc_middle::mir::PlaceElem::Subslice { from: *from, to: *to, from_end: *from_end }
732 }
733 ProjectionElem::Downcast(idx) => {
734 rustc_middle::mir::PlaceElem::Downcast(None, idx.internal(tables, tcx))
735 }
736 ProjectionElem::OpaqueCast(ty) => {
737 rustc_middle::mir::PlaceElem::OpaqueCast(ty.internal(tables, tcx))
738 }
739 }
740 }
741}
742
743impl RustcInternal for BinOp {
744 type T<'tcx> = rustc_middle::mir::BinOp;
745
746 fn internal<'tcx>(
747 &self,
748 _tables: &mut Tables<'_, BridgeTys>,
749 _tcx: impl InternalCx<'tcx>,
750 ) -> Self::T<'tcx> {
751 match self {
752 BinOp::Add => rustc_middle::mir::BinOp::Add,
753 BinOp::AddUnchecked => rustc_middle::mir::BinOp::AddUnchecked,
754 BinOp::Sub => rustc_middle::mir::BinOp::Sub,
755 BinOp::SubUnchecked => rustc_middle::mir::BinOp::SubUnchecked,
756 BinOp::Mul => rustc_middle::mir::BinOp::Mul,
757 BinOp::MulUnchecked => rustc_middle::mir::BinOp::MulUnchecked,
758 BinOp::Div => rustc_middle::mir::BinOp::Div,
759 BinOp::Rem => rustc_middle::mir::BinOp::Rem,
760 BinOp::BitXor => rustc_middle::mir::BinOp::BitXor,
761 BinOp::BitAnd => rustc_middle::mir::BinOp::BitAnd,
762 BinOp::BitOr => rustc_middle::mir::BinOp::BitOr,
763 BinOp::Shl => rustc_middle::mir::BinOp::Shl,
764 BinOp::ShlUnchecked => rustc_middle::mir::BinOp::ShlUnchecked,
765 BinOp::Shr => rustc_middle::mir::BinOp::Shr,
766 BinOp::ShrUnchecked => rustc_middle::mir::BinOp::ShrUnchecked,
767 BinOp::Eq => rustc_middle::mir::BinOp::Eq,
768 BinOp::Lt => rustc_middle::mir::BinOp::Lt,
769 BinOp::Le => rustc_middle::mir::BinOp::Le,
770 BinOp::Ne => rustc_middle::mir::BinOp::Ne,
771 BinOp::Ge => rustc_middle::mir::BinOp::Ge,
772 BinOp::Gt => rustc_middle::mir::BinOp::Gt,
773 BinOp::Cmp => rustc_middle::mir::BinOp::Cmp,
774 BinOp::Offset => rustc_middle::mir::BinOp::Offset,
775 }
776 }
777}
778
779impl RustcInternal for UnOp {
780 type T<'tcx> = rustc_middle::mir::UnOp;
781
782 fn internal<'tcx>(
783 &self,
784 _tables: &mut Tables<'_, BridgeTys>,
785 _tcx: impl InternalCx<'tcx>,
786 ) -> Self::T<'tcx> {
787 match self {
788 UnOp::Not => rustc_middle::mir::UnOp::Not,
789 UnOp::Neg => rustc_middle::mir::UnOp::Neg,
790 UnOp::PtrMetadata => rustc_middle::mir::UnOp::PtrMetadata,
791 }
792 }
793}
794
795impl<T> RustcInternal for &T
796where
797 T: RustcInternal,
798{
799 type T<'tcx> = 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).internal(tables, tcx)
807 }
808}
809
810impl<T> RustcInternal for Option<T>
811where
812 T: RustcInternal,
813{
814 type T<'tcx> = Option<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.as_ref().map(|inner| inner.internal(tables, tcx))
822 }
823}
824
825impl<T> RustcInternal for Vec<T>
826where
827 T: RustcInternal,
828{
829 type T<'tcx> = Vec<T::T<'tcx>>;
830
831 fn internal<'tcx>(
832 &self,
833 tables: &mut Tables<'_, BridgeTys>,
834 tcx: impl InternalCx<'tcx>,
835 ) -> Self::T<'tcx> {
836 self.iter().map(|e| e.internal(tables, tcx)).collect()
837 }
838}