@@ -5,8 +5,10 @@ use rustc_codegen_ssa::back::write::{CodegenContext, ModuleConfig, run_assembler
5
5
use rustc_codegen_ssa:: traits:: * ;
6
6
use base;
7
7
use consts;
8
+ use rustc:: hir:: def_id:: LOCAL_CRATE ;
8
9
use rustc:: session:: config:: { self , OutputType , Passes , Lto } ;
9
10
use rustc:: session:: Session ;
11
+ use rustc:: ty:: TyCtxt ;
10
12
use time_graph:: Timeline ;
11
13
use llvm:: { self , DiagnosticInfo , PassManager , SMDiagnostic } ;
12
14
use llvm_util;
@@ -81,42 +83,46 @@ pub fn write_output_file(
81
83
}
82
84
}
83
85
84
- pub ( crate ) fn get_llvm_opt_level ( optimize : config:: OptLevel ) -> llvm:: CodeGenOptLevel {
85
- match optimize {
86
- config:: OptLevel :: No => llvm:: CodeGenOptLevel :: None ,
87
- config:: OptLevel :: Less => llvm:: CodeGenOptLevel :: Less ,
88
- config:: OptLevel :: Default => llvm:: CodeGenOptLevel :: Default ,
89
- config:: OptLevel :: Aggressive => llvm:: CodeGenOptLevel :: Aggressive ,
90
- _ => llvm:: CodeGenOptLevel :: Default ,
91
- }
92
- }
93
-
94
- pub ( crate ) fn get_llvm_opt_size ( optimize : config:: OptLevel ) -> llvm:: CodeGenOptSize {
95
- match optimize {
96
- config:: OptLevel :: Size => llvm:: CodeGenOptSizeDefault ,
97
- config:: OptLevel :: SizeMin => llvm:: CodeGenOptSizeAggressive ,
98
- _ => llvm:: CodeGenOptSizeNone ,
99
- }
86
+ pub fn create_target_machine (
87
+ tcx : TyCtxt ,
88
+ find_features : bool ,
89
+ ) -> & ' static mut llvm:: TargetMachine {
90
+ target_machine_factory ( tcx. sess , tcx. backend_optimization_level ( LOCAL_CRATE ) , find_features) ( )
91
+ . unwrap_or_else ( |err| llvm_err ( tcx. sess . diagnostic ( ) , & err) . raise ( ) )
100
92
}
101
93
102
- pub fn create_target_machine (
94
+ pub fn create_informational_target_machine (
103
95
sess : & Session ,
104
96
find_features : bool ,
105
97
) -> & ' static mut llvm:: TargetMachine {
106
- target_machine_factory ( sess, find_features) ( ) . unwrap_or_else ( |err| {
98
+ target_machine_factory ( sess, config :: OptLevel :: No , find_features) ( ) . unwrap_or_else ( |err| {
107
99
llvm_err ( sess. diagnostic ( ) , & err) . raise ( )
108
100
} )
109
101
}
110
102
103
+
104
+ pub fn to_llvm_opt_settings ( cfg : config:: OptLevel ) -> ( llvm:: CodeGenOptLevel , llvm:: CodeGenOptSize )
105
+ {
106
+ use self :: config:: OptLevel :: * ;
107
+ match cfg {
108
+ No => ( llvm:: CodeGenOptLevel :: None , llvm:: CodeGenOptSizeNone ) ,
109
+ Less => ( llvm:: CodeGenOptLevel :: Less , llvm:: CodeGenOptSizeNone ) ,
110
+ Default => ( llvm:: CodeGenOptLevel :: Default , llvm:: CodeGenOptSizeNone ) ,
111
+ Aggressive => ( llvm:: CodeGenOptLevel :: Aggressive , llvm:: CodeGenOptSizeNone ) ,
112
+ Size => ( llvm:: CodeGenOptLevel :: Default , llvm:: CodeGenOptSizeDefault ) ,
113
+ SizeMin => ( llvm:: CodeGenOptLevel :: Default , llvm:: CodeGenOptSizeAggressive ) ,
114
+ }
115
+ }
116
+
111
117
// If find_features is true this won't access `sess.crate_types` by assuming
112
118
// that `is_pie_binary` is false. When we discover LLVM target features
113
119
// `sess.crate_types` is uninitialized so we cannot access it.
114
- pub fn target_machine_factory ( sess : & Session , find_features : bool )
120
+ pub fn target_machine_factory ( sess : & Session , optlvl : config :: OptLevel , find_features : bool )
115
121
-> Arc < dyn Fn ( ) -> Result < & ' static mut llvm:: TargetMachine , String > + Send + Sync >
116
122
{
117
123
let reloc_model = get_reloc_model ( sess) ;
118
124
119
- let opt_level = get_llvm_opt_level ( sess . opts . optimize ) ;
125
+ let ( opt_level, _ ) = to_llvm_opt_settings ( optlvl ) ;
120
126
let use_softfp = sess. opts . cg . soft_float ;
121
127
122
128
let ffunction_sections = sess. target . target . options . function_sections ;
@@ -357,7 +363,7 @@ pub(crate) unsafe fn optimize(cgcx: &CodegenContext<LlvmCodegenBackend>,
357
363
if !config. no_prepopulate_passes {
358
364
llvm:: LLVMRustAddAnalysisPasses ( tm, fpm, llmod) ;
359
365
llvm:: LLVMRustAddAnalysisPasses ( tm, mpm, llmod) ;
360
- let opt_level = config. opt_level . map ( get_llvm_opt_level )
366
+ let opt_level = config. opt_level . map ( |x| to_llvm_opt_settings ( x ) . 0 )
361
367
. unwrap_or ( llvm:: CodeGenOptLevel :: None ) ;
362
368
let prepare_for_thin_lto = cgcx. lto == Lto :: Thin || cgcx. lto == Lto :: ThinLocal ||
363
369
( cgcx. lto != Lto :: Fat && cgcx. opts . debugging_opts . cross_lang_lto . enabled ( ) ) ;
@@ -689,7 +695,8 @@ pub unsafe fn with_llvm_pmb(llmod: &llvm::Module,
689
695
// reasonable defaults and prepare it to actually populate the pass
690
696
// manager.
691
697
let builder = llvm:: LLVMPassManagerBuilderCreate ( ) ;
692
- let opt_size = config. opt_size . map ( get_llvm_opt_size) . unwrap_or ( llvm:: CodeGenOptSizeNone ) ;
698
+ let opt_size = config. opt_size . map ( |x| to_llvm_opt_settings ( x) . 1 )
699
+ . unwrap_or ( llvm:: CodeGenOptSizeNone ) ;
693
700
let inline_threshold = config. inline_threshold ;
694
701
695
702
let pgo_gen_path = config. pgo_gen . as_ref ( ) . map ( |s| {
0 commit comments