]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_codegen_ssa/src/traits/backend.rs
New upstream version 1.66.0+dfsg1
[rustc.git] / compiler / rustc_codegen_ssa / src / traits / backend.rs
CommitLineData
a1dfa0c6
XL
1use super::write::WriteBackendMethods;
2use super::CodegenObject;
fc512014 3use crate::back::write::TargetMachineFactoryFn;
29967ef6 4use crate::{CodegenResults, ModuleCodegen};
60c5eb7d 5
74b04a01 6use rustc_ast::expand::allocator::AllocatorKind;
29967ef6 7use rustc_data_structures::fx::FxHashMap;
5e7ed085 8use rustc_errors::ErrorGuaranteed;
c295e0f8 9use rustc_metadata::EncodedMetadata;
29967ef6 10use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
c295e0f8 11use rustc_middle::ty::layout::{FnAbiOf, HasTyCtxt, LayoutOf, TyAndLayout};
3c0e092e 12use rustc_middle::ty::query::{ExternProviders, Providers};
ba9703b0
XL
13use rustc_middle::ty::{Ty, TyCtxt};
14use rustc_session::{
15 config::{self, OutputFilenames, PrintRequest},
c295e0f8 16 cstore::MetadataLoaderDyn,
ba9703b0
XL
17 Session,
18};
dfeec247 19use rustc_span::symbol::Symbol;
c295e0f8 20use rustc_target::abi::call::FnAbi;
1b1a35ee 21use rustc_target::spec::Target;
a1dfa0c6 22
ba9703b0
XL
23pub use rustc_data_structures::sync::MetadataRef;
24
25use std::any::Any;
60c5eb7d 26
a1dfa0c6
XL
27pub trait BackendTypes {
28 type Value: CodegenObject;
e74abb32
XL
29 type Function: CodegenObject;
30
a1dfa0c6
XL
31 type BasicBlock: Copy;
32 type Type: CodegenObject;
33 type Funclet;
34
74b04a01
XL
35 // FIXME(eddyb) find a common convention for all of the debuginfo-related
36 // names (choose between `Dbg`, `Debug`, `DebugInfo`, `DI` etc.).
a1dfa0c6 37 type DIScope: Copy;
29967ef6 38 type DILocation: Copy;
74b04a01 39 type DIVariable: Copy;
a1dfa0c6
XL
40}
41
42pub trait Backend<'tcx>:
94222f64
XL
43 Sized
44 + BackendTypes
45 + HasTyCtxt<'tcx>
c295e0f8
XL
46 + LayoutOf<'tcx, LayoutOfResult = TyAndLayout<'tcx>>
47 + FnAbiOf<'tcx, FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>>
a1dfa0c6
XL
48{
49}
50
51impl<'tcx, T> Backend<'tcx> for T where
94222f64
XL
52 Self: BackendTypes
53 + HasTyCtxt<'tcx>
c295e0f8
XL
54 + LayoutOf<'tcx, LayoutOfResult = TyAndLayout<'tcx>>
55 + FnAbiOf<'tcx, FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>>
a1dfa0c6
XL
56{
57}
58
ba9703b0
XL
59pub trait CodegenBackend {
60 fn init(&self, _sess: &Session) {}
61 fn print(&self, _req: PrintRequest, _sess: &Session) {}
064997fb 62 fn target_features(&self, _sess: &Session, _allow_unstable: bool) -> Vec<Symbol> {
ba9703b0
XL
63 vec![]
64 }
65 fn print_passes(&self) {}
66 fn print_version(&self) {}
67
1b1a35ee
XL
68 /// If this plugin provides additional builtin targets, provide the one enabled by the options here.
69 /// Be careful: this is called *before* init() is called.
70 fn target_override(&self, _opts: &config::Options) -> Option<Target> {
71 None
72 }
73
17df50a5
XL
74 /// The metadata loader used to load rlib and dylib metadata.
75 ///
76 /// Alternative codegen backends may want to use different rlib or dylib formats than the
77 /// default native static archives and dynamic libraries.
78 fn metadata_loader(&self) -> Box<MetadataLoaderDyn> {
79 Box::new(crate::back::metadata::DefaultMetadataLoader)
80 }
81
82 fn provide(&self, _providers: &mut Providers) {}
3c0e092e 83 fn provide_extern(&self, _providers: &mut ExternProviders) {}
ba9703b0
XL
84 fn codegen_crate<'tcx>(
85 &self,
86 tcx: TyCtxt<'tcx>,
87 metadata: EncodedMetadata,
88 need_metadata_module: bool,
89 ) -> Box<dyn Any>;
90
91 /// This is called on the returned `Box<dyn Any>` from `codegen_backend`
92 ///
93 /// # Panics
94 ///
95 /// Panics when the passed `Box<dyn Any>` was not returned by `codegen_backend`.
96 fn join_codegen(
97 &self,
98 ongoing_codegen: Box<dyn Any>,
99 sess: &Session,
a2a8927a 100 outputs: &OutputFilenames,
5e7ed085 101 ) -> Result<(CodegenResults, FxHashMap<WorkProductId, WorkProduct>), ErrorGuaranteed>;
ba9703b0
XL
102
103 /// This is called on the returned `Box<dyn Any>` from `join_codegen`
104 ///
105 /// # Panics
106 ///
107 /// Panics when the passed `Box<dyn Any>` was not returned by `join_codegen`.
108 fn link(
109 &self,
110 sess: &Session,
29967ef6 111 codegen_results: CodegenResults,
ba9703b0 112 outputs: &OutputFilenames,
5e7ed085 113 ) -> Result<(), ErrorGuaranteed>;
ba9703b0
XL
114}
115
dfeec247 116pub trait ExtraBackendMethods: CodegenBackend + WriteBackendMethods + Sized + Send + Sync {
dc9dc135 117 fn codegen_allocator<'tcx>(
9fa01778 118 &self,
dc9dc135 119 tcx: TyCtxt<'tcx>,
c295e0f8 120 module_name: &str,
dc9dc135 121 kind: AllocatorKind,
29967ef6 122 has_alloc_error_handler: bool,
04454e1e 123 ) -> Self::Module;
dfeec247
XL
124 /// This generates the codegen unit and returns it along with
125 /// a `u64` giving an estimate of the unit's processing cost.
e74abb32
XL
126 fn compile_codegen_unit(
127 &self,
128 tcx: TyCtxt<'_>,
129 cgu_name: Symbol,
dfeec247 130 ) -> (ModuleCodegen<Self::Module>, u64);
a1dfa0c6
XL
131 fn target_machine_factory(
132 &self,
133 sess: &Session,
9fa01778 134 opt_level: config::OptLevel,
5e7ed085 135 target_features: &[String],
fc512014 136 ) -> TargetMachineFactoryFn<Self>;
3c0e092e
XL
137
138 fn spawn_thread<F, T>(_time_trace: bool, f: F) -> std::thread::JoinHandle<T>
139 where
140 F: FnOnce() -> T,
141 F: Send + 'static,
142 T: Send + 'static,
143 {
144 std::thread::spawn(f)
145 }
146
147 fn spawn_named_thread<F, T>(
148 _time_trace: bool,
149 name: String,
150 f: F,
151 ) -> std::io::Result<std::thread::JoinHandle<T>>
152 where
153 F: FnOnce() -> T,
154 F: Send + 'static,
155 T: Send + 'static,
156 {
157 std::thread::Builder::new().name(name).spawn(f)
158 }
a1dfa0c6 159}