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