@@ -5,8 +5,10 @@ use rustc_codegen_ssa::back::write::{CodegenContext, ModuleConfig, run_assembler
55use rustc_codegen_ssa:: traits:: * ;
66use base;
77use consts;
8+ use rustc:: hir:: def_id:: LOCAL_CRATE ;
89use rustc:: session:: config:: { self , OutputType , Passes , Lto } ;
910use rustc:: session:: Session ;
11+ use rustc:: ty:: TyCtxt ;
1012use time_graph:: Timeline ;
1113use llvm:: { self , DiagnosticInfo , PassManager , SMDiagnostic } ;
1214use llvm_util;
@@ -81,42 +83,46 @@ pub fn write_output_file(
8183 }
8284}
8385
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 ( ) )
10092}
10193
102- pub fn create_target_machine (
94+ pub fn create_informational_target_machine (
10395 sess : & Session ,
10496 find_features : bool ,
10597) -> & ' 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| {
10799 llvm_err ( sess. diagnostic ( ) , & err) . raise ( )
108100 } )
109101}
110102
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+
111117// If find_features is true this won't access `sess.crate_types` by assuming
112118// that `is_pie_binary` is false. When we discover LLVM target features
113119// `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 )
115121 -> Arc < dyn Fn ( ) -> Result < & ' static mut llvm:: TargetMachine , String > + Send + Sync >
116122{
117123 let reloc_model = get_reloc_model ( sess) ;
118124
119- let opt_level = get_llvm_opt_level ( sess . opts . optimize ) ;
125+ let ( opt_level, _ ) = to_llvm_opt_settings ( optlvl ) ;
120126 let use_softfp = sess. opts . cg . soft_float ;
121127
122128 let ffunction_sections = sess. target . target . options . function_sections ;
@@ -357,7 +363,7 @@ pub(crate) unsafe fn optimize(cgcx: &CodegenContext<LlvmCodegenBackend>,
357363 if !config. no_prepopulate_passes {
358364 llvm:: LLVMRustAddAnalysisPasses ( tm, fpm, llmod) ;
359365 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 )
361367 . unwrap_or ( llvm:: CodeGenOptLevel :: None ) ;
362368 let prepare_for_thin_lto = cgcx. lto == Lto :: Thin || cgcx. lto == Lto :: ThinLocal ||
363369 ( 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,
689695 // reasonable defaults and prepare it to actually populate the pass
690696 // manager.
691697 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 ) ;
693700 let inline_threshold = config. inline_threshold ;
694701
695702 let pgo_gen_path = config. pgo_gen . as_ref ( ) . map ( |s| {
0 commit comments