1 use super::write::WriteBackendMethods;
2 use super::CodegenObject;
3 use crate::back::write::TargetMachineFactoryFn;
4 use crate::{CodegenResults, ModuleCodegen};
6 use rustc_ast::expand::allocator::AllocatorKind;
7 use rustc_data_structures::fx::FxHashMap;
8 use rustc_errors::ErrorReported;
9 use rustc_metadata::EncodedMetadata;
10 use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
11 use rustc_middle::ty::layout::{FnAbiOf, HasTyCtxt, LayoutOf, TyAndLayout};
12 use rustc_middle::ty::query::{ExternProviders, Providers};
13 use rustc_middle::ty::{Ty, TyCtxt};
15 config::{self, OutputFilenames, PrintRequest},
16 cstore::MetadataLoaderDyn,
19 use rustc_span::symbol::Symbol;
20 use rustc_target::abi::call::FnAbi;
21 use rustc_target::spec::Target;
23 pub use rustc_data_structures::sync::MetadataRef;
27 pub trait BackendTypes {
28 type Value: CodegenObject;
29 type Function: CodegenObject;
31 type BasicBlock: Copy;
32 type Type: CodegenObject;
35 // FIXME(eddyb) find a common convention for all of the debuginfo-related
36 // names (choose between `Dbg`, `Debug`, `DebugInfo`, `DI` etc.).
38 type DILocation: Copy;
39 type DIVariable: Copy;
42 pub trait Backend<'tcx>:
46 + LayoutOf<'tcx, LayoutOfResult = TyAndLayout<'tcx>>
47 + FnAbiOf<'tcx, FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>>
51 impl<'tcx, T> Backend<'tcx> for T where
54 + LayoutOf<'tcx, LayoutOfResult = TyAndLayout<'tcx>>
55 + FnAbiOf<'tcx, FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>>
59 pub trait CodegenBackend {
60 fn init(&self, _sess: &Session) {}
61 fn print(&self, _req: PrintRequest, _sess: &Session) {}
62 fn target_features(&self, _sess: &Session) -> Vec<Symbol> {
65 fn print_passes(&self) {}
66 fn print_version(&self) {}
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> {
74 /// The metadata loader used to load rlib and dylib metadata.
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)
82 fn provide(&self, _providers: &mut Providers) {}
83 fn provide_extern(&self, _providers: &mut ExternProviders) {}
84 fn codegen_crate<'tcx>(
87 metadata: EncodedMetadata,
88 need_metadata_module: bool,
91 /// This is called on the returned `Box<dyn Any>` from `codegen_backend`
95 /// Panics when the passed `Box<dyn Any>` was not returned by `codegen_backend`.
98 ongoing_codegen: Box<dyn Any>,
100 outputs: &OutputFilenames,
101 ) -> Result<(CodegenResults, FxHashMap<WorkProductId, WorkProduct>), ErrorReported>;
103 /// This is called on the returned `Box<dyn Any>` from `join_codegen`
107 /// Panics when the passed `Box<dyn Any>` was not returned by `join_codegen`.
111 codegen_results: CodegenResults,
112 outputs: &OutputFilenames,
113 ) -> Result<(), ErrorReported>;
116 pub trait ExtraBackendMethods: CodegenBackend + WriteBackendMethods + Sized + Send + Sync {
117 fn new_metadata(&self, sess: TyCtxt<'_>, mod_name: &str) -> Self::Module;
118 fn codegen_allocator<'tcx>(
121 module_llvm: &mut Self::Module,
124 has_alloc_error_handler: bool,
126 /// This generates the codegen unit and returns it along with
127 /// a `u64` giving an estimate of the unit's processing cost.
128 fn compile_codegen_unit(
132 ) -> (ModuleCodegen<Self::Module>, u64);
133 fn target_machine_factory(
136 opt_level: config::OptLevel,
137 ) -> TargetMachineFactoryFn<Self>;
138 fn target_cpu<'b>(&self, sess: &'b Session) -> &'b str;
139 fn tune_cpu<'b>(&self, sess: &'b Session) -> Option<&'b str>;
141 fn spawn_thread<F, T>(_time_trace: bool, f: F) -> std::thread::JoinHandle<T>
147 std::thread::spawn(f)
150 fn spawn_named_thread<F, T>(
154 ) -> std::io::Result<std::thread::JoinHandle<T>>
160 std::thread::Builder::new().name(name).spawn(f)