1 //! Interface of a Rust codegen backend
3 //! This crate defines all the traits that have to be implemented by a codegen backend in order to
4 //! use the backend-agnostic codegen code in `rustc_codegen_ssa`.
6 //! The interface is designed around two backend-specific data structures, the codegen context and
7 //! the builder. The codegen context is supposed to be read-only after its creation and during the
8 //! actual codegen, while the builder stores the information about the function during codegen and
9 //! is used to produce the instructions of the backend IR.
11 //! Finally, a third `Backend` structure has to implement methods related to how codegen information
12 //! is passed to the backend, especially for asynchronous compilation.
14 //! The traits contain associated types that are backend-specific, such as the backend's value or
31 pub use self::abi::AbiBuilderMethods;
32 pub use self::asm::{AsmBuilderMethods, AsmMethods, GlobalAsmOperandRef, InlineAsmOperandRef};
33 pub use self::backend::{Backend, BackendTypes, CodegenBackend, ExtraBackendMethods};
34 pub use self::builder::{BuilderMethods, OverflowOp};
35 pub use self::consts::ConstMethods;
36 pub use self::coverageinfo::{CoverageInfoBuilderMethods, CoverageInfoMethods};
37 pub use self::debuginfo::{DebugInfoBuilderMethods, DebugInfoMethods};
38 pub use self::declare::PreDefineMethods;
39 pub use self::intrinsic::IntrinsicCallMethods;
40 pub use self::misc::MiscMethods;
41 pub use self::statics::{StaticBuilderMethods, StaticMethods};
42 pub use self::type_::{
43 ArgAbiMethods, BaseTypeMethods, DerivedTypeMethods, LayoutTypeMethods, TypeMembershipMethods,
46 pub use self::write::{ModuleBufferMethods, ThinBufferMethods, WriteBackendMethods};
48 use rustc_middle::ty::layout::{HasParamEnv, HasTyCtxt};
49 use rustc_target::spec::HasTargetSpec;
53 pub trait CodegenObject: Copy + PartialEq + fmt::Debug {}
54 impl<T: Copy + PartialEq + fmt::Debug> CodegenObject for T {}
56 pub trait CodegenMethods<'tcx>:
62 + CoverageInfoMethods<'tcx>
63 + DebugInfoMethods<'tcx>
65 + PreDefineMethods<'tcx>
72 impl<'tcx, T> CodegenMethods<'tcx> for T where
78 + CoverageInfoMethods<'tcx>
79 + DebugInfoMethods<'tcx>
81 + PreDefineMethods<'tcx>
88 pub trait HasCodegen<'tcx>:
89 Backend<'tcx> + std::ops::Deref<Target = <Self as HasCodegen<'tcx>>::CodegenCx>
91 type CodegenCx: CodegenMethods<'tcx>
94 Function = Self::Function,
95 BasicBlock = Self::BasicBlock,
97 Funclet = Self::Funclet,
98 DIScope = Self::DIScope,
99 DILocation = Self::DILocation,
100 DIVariable = Self::DIVariable,