1 use crate::back::lto::{LtoModuleCodegen, SerializedModule, ThinModule}; 2 use crate::back::write::{CodegenContext, FatLTOInput, ModuleConfig}; 3 use crate::{CompiledModule, ModuleCodegen}; 4 5 use rustc_errors::{FatalError, Handler}; 6 use rustc_middle::dep_graph::WorkProduct; 7 8 pub trait WriteBackendMethods: 'static + Sized + Clone { 9 type Module: Send + Sync; 10 type TargetMachine; 11 type ModuleBuffer: ModuleBufferMethods; 12 type Context: ?Sized; 13 type ThinData: Send + Sync; 14 type ThinBuffer: ThinBufferMethods; 15 16 /// Merge all modules into main_module and returning it run_link( cgcx: &CodegenContext<Self>, diag_handler: &Handler, modules: Vec<ModuleCodegen<Self::Module>>, ) -> Result<ModuleCodegen<Self::Module>, FatalError>17 fn run_link( 18 cgcx: &CodegenContext<Self>, 19 diag_handler: &Handler, 20 modules: Vec<ModuleCodegen<Self::Module>>, 21 ) -> Result<ModuleCodegen<Self::Module>, FatalError>; 22 /// Performs fat LTO by merging all modules into a single one and returning it 23 /// for further optimization. run_fat_lto( cgcx: &CodegenContext<Self>, modules: Vec<FatLTOInput<Self>>, cached_modules: Vec<(SerializedModule<Self::ModuleBuffer>, WorkProduct)>, ) -> Result<LtoModuleCodegen<Self>, FatalError>24 fn run_fat_lto( 25 cgcx: &CodegenContext<Self>, 26 modules: Vec<FatLTOInput<Self>>, 27 cached_modules: Vec<(SerializedModule<Self::ModuleBuffer>, WorkProduct)>, 28 ) -> Result<LtoModuleCodegen<Self>, FatalError>; 29 /// Performs thin LTO by performing necessary global analysis and returning two 30 /// lists, one of the modules that need optimization and another for modules that 31 /// can simply be copied over from the incr. comp. cache. run_thin_lto( cgcx: &CodegenContext<Self>, modules: Vec<(String, Self::ThinBuffer)>, cached_modules: Vec<(SerializedModule<Self::ModuleBuffer>, WorkProduct)>, ) -> Result<(Vec<LtoModuleCodegen<Self>>, Vec<WorkProduct>), FatalError>32 fn run_thin_lto( 33 cgcx: &CodegenContext<Self>, 34 modules: Vec<(String, Self::ThinBuffer)>, 35 cached_modules: Vec<(SerializedModule<Self::ModuleBuffer>, WorkProduct)>, 36 ) -> Result<(Vec<LtoModuleCodegen<Self>>, Vec<WorkProduct>), FatalError>; print_pass_timings(&self)37 fn print_pass_timings(&self); optimize( cgcx: &CodegenContext<Self>, diag_handler: &Handler, module: &ModuleCodegen<Self::Module>, config: &ModuleConfig, ) -> Result<(), FatalError>38 unsafe fn optimize( 39 cgcx: &CodegenContext<Self>, 40 diag_handler: &Handler, 41 module: &ModuleCodegen<Self::Module>, 42 config: &ModuleConfig, 43 ) -> Result<(), FatalError>; optimize_thin( cgcx: &CodegenContext<Self>, thin: &mut ThinModule<Self>, ) -> Result<ModuleCodegen<Self::Module>, FatalError>44 unsafe fn optimize_thin( 45 cgcx: &CodegenContext<Self>, 46 thin: &mut ThinModule<Self>, 47 ) -> Result<ModuleCodegen<Self::Module>, FatalError>; codegen( cgcx: &CodegenContext<Self>, diag_handler: &Handler, module: ModuleCodegen<Self::Module>, config: &ModuleConfig, ) -> Result<CompiledModule, FatalError>48 unsafe fn codegen( 49 cgcx: &CodegenContext<Self>, 50 diag_handler: &Handler, 51 module: ModuleCodegen<Self::Module>, 52 config: &ModuleConfig, 53 ) -> Result<CompiledModule, FatalError>; prepare_thin(module: ModuleCodegen<Self::Module>) -> (String, Self::ThinBuffer)54 fn prepare_thin(module: ModuleCodegen<Self::Module>) -> (String, Self::ThinBuffer); serialize_module(module: ModuleCodegen<Self::Module>) -> (String, Self::ModuleBuffer)55 fn serialize_module(module: ModuleCodegen<Self::Module>) -> (String, Self::ModuleBuffer); run_lto_pass_manager( cgcx: &CodegenContext<Self>, llmod: &ModuleCodegen<Self::Module>, config: &ModuleConfig, thin: bool, ) -> Result<(), FatalError>56 fn run_lto_pass_manager( 57 cgcx: &CodegenContext<Self>, 58 llmod: &ModuleCodegen<Self::Module>, 59 config: &ModuleConfig, 60 thin: bool, 61 ) -> Result<(), FatalError>; 62 } 63 64 pub trait ThinBufferMethods: Send + Sync { data(&self) -> &[u8]65 fn data(&self) -> &[u8]; 66 } 67 68 pub trait ModuleBufferMethods: Send + Sync { data(&self) -> &[u8]69 fn data(&self) -> &[u8]; 70 } 71