Skip to content

Commit c6898c2

Browse files
committed
---
yaml --- r: 277977 b: refs/heads/auto c: 43c5fef h: refs/heads/master i: 277975: 78a6a9b
1 parent 18dde86 commit c6898c2

File tree

7 files changed

+87
-22
lines changed

7 files changed

+87
-22
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
88
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
99
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1010
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
11-
refs/heads/auto: 638cf9f675174316ba5ecfaf2913c9d60da9772c
11+
refs/heads/auto: 43c5fef47dcaebea4c77771cc6f187b2a72b3639
1212
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c
1313
refs/tags/0.1: b19db808c2793fe2976759b85a355c3ad8c8b336
1414
refs/tags/0.2: 1754d02027f2924bed83b0160ee340c7f41d5ea1

branches/auto/src/librustc/session/config.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ pub enum OptLevel {
4848
No, // -O0
4949
Less, // -O1
5050
Default, // -O2
51-
Aggressive // -O3
51+
Aggressive, // -O3
52+
Size, // -Os
53+
SizeMin, // -Oz
5254
}
5355

5456
#[derive(Clone, Copy, PartialEq)]
@@ -567,8 +569,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
567569
debuginfo: Option<usize> = (None, parse_opt_uint,
568570
"debug info emission level, 0 = no debug info, 1 = line tables only, \
569571
2 = full debug info with variable and type information"),
570-
opt_level: Option<usize> = (None, parse_opt_uint,
571-
"optimize with possible levels 0-3"),
572+
opt_level: Option<String> = (None, parse_opt_string,
573+
"optimize with possible levels 0-3, s, or z"),
572574
debug_assertions: Option<bool> = (None, parse_opt_bool,
573575
"explicitly enable the cfg(debug_assertions) directive"),
574576
inline_threshold: Option<usize> = (None, parse_opt_uint,
@@ -1125,13 +1127,20 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
11251127
}
11261128
OptLevel::Default
11271129
} else {
1128-
match cg.opt_level {
1129-
None => OptLevel::No,
1130-
Some(0) => OptLevel::No,
1131-
Some(1) => OptLevel::Less,
1132-
Some(2) => OptLevel::Default,
1133-
Some(3) => OptLevel::Aggressive,
1134-
Some(arg) => {
1130+
match (cg.opt_level.as_ref().map(String::as_ref),
1131+
nightly_options::is_nightly_build()) {
1132+
(None, _) => OptLevel::No,
1133+
(Some("0"), _) => OptLevel::No,
1134+
(Some("1"), _) => OptLevel::Less,
1135+
(Some("2"), _) => OptLevel::Default,
1136+
(Some("3"), _) => OptLevel::Aggressive,
1137+
(Some("s"), true) => OptLevel::Size,
1138+
(Some("z"), true) => OptLevel::SizeMin,
1139+
(Some("s"), false) | (Some("z"), false) => {
1140+
early_error(error_format, &format!("the optimizations s or z are only \
1141+
accepted on the nightly compiler"));
1142+
},
1143+
(Some(arg), _) => {
11351144
early_error(error_format, &format!("optimization level needs to be \
11361145
between 0-3 (instead was `{}`)",
11371146
arg));
@@ -1304,7 +1313,7 @@ pub mod nightly_options {
13041313
is_nightly_build() && matches.opt_strs("Z").iter().any(|x| *x == "unstable-options")
13051314
}
13061315

1307-
fn is_nightly_build() -> bool {
1316+
pub fn is_nightly_build() -> bool {
13081317
match get_unstable_features_setting() {
13091318
UnstableFeatures::Allow | UnstableFeatures::Cheat => true,
13101319
_ => false,

branches/auto/src/librustc_llvm/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ pub use self::FileType::*;
4444
pub use self::MetadataType::*;
4545
pub use self::AsmDialect::*;
4646
pub use self::CodeGenOptLevel::*;
47+
pub use self::CodeGenOptSize::*;
4748
pub use self::RelocMode::*;
4849
pub use self::CodeGenModel::*;
4950
pub use self::DiagnosticKind::*;
@@ -375,6 +376,14 @@ pub enum CodeGenOptLevel {
375376
CodeGenLevelAggressive = 3,
376377
}
377378

379+
#[derive(Copy, Clone, PartialEq)]
380+
#[repr(C)]
381+
pub enum CodeGenOptSize {
382+
CodeGenOptSizeNone = 0,
383+
CodeGenOptSizeDefault = 1,
384+
CodeGenOptSizeAggressive = 2,
385+
}
386+
378387
#[derive(Copy, Clone, PartialEq)]
379388
#[repr(C)]
380389
pub enum RelocMode {

branches/auto/src/librustc_trans/back/write.rs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,15 @@ fn get_llvm_opt_level(optimize: config::OptLevel) -> llvm::CodeGenOptLevel {
139139
config::OptLevel::Less => llvm::CodeGenLevelLess,
140140
config::OptLevel::Default => llvm::CodeGenLevelDefault,
141141
config::OptLevel::Aggressive => llvm::CodeGenLevelAggressive,
142+
_ => llvm::CodeGenLevelDefault,
143+
}
144+
}
145+
146+
fn get_llvm_opt_size(optimize: config::OptLevel) -> llvm::CodeGenOptSize {
147+
match optimize {
148+
config::OptLevel::Size => llvm::CodeGenOptSizeDefault,
149+
config::OptLevel::SizeMin => llvm::CodeGenOptSizeAggressive,
150+
_ => llvm::CodeGenOptSizeNone,
142151
}
143152
}
144153

@@ -236,6 +245,9 @@ pub struct ModuleConfig {
236245
/// absolutely no optimizations (used for the metadata module).
237246
opt_level: Option<llvm::CodeGenOptLevel>,
238247

248+
/// Some(level) to optimize binary size, or None to not affect program size.
249+
opt_size: Option<llvm::CodeGenOptSize>,
250+
239251
// Flags indicating which outputs to produce.
240252
emit_no_opt_bc: bool,
241253
emit_bc: bool,
@@ -267,6 +279,7 @@ impl ModuleConfig {
267279
tm: tm,
268280
passes: passes,
269281
opt_level: None,
282+
opt_size: None,
270283

271284
emit_no_opt_bc: false,
272285
emit_bc: false,
@@ -636,6 +649,7 @@ pub fn run_passes(sess: &Session,
636649
let mut metadata_config = ModuleConfig::new(tm, vec!());
637650

638651
modules_config.opt_level = Some(get_llvm_opt_level(sess.opts.optimize));
652+
modules_config.opt_size = Some(get_llvm_opt_size(sess.opts.optimize));
639653

640654
// Save all versions of the bytecode if we're saving our temporaries.
641655
if sess.opts.cg.save_temps {
@@ -990,36 +1004,48 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
9901004
// reasonable defaults and prepare it to actually populate the pass
9911005
// manager.
9921006
let builder = llvm::LLVMPassManagerBuilderCreate();
993-
let opt = config.opt_level.unwrap_or(llvm::CodeGenLevelNone);
1007+
let opt_level = config.opt_level.unwrap_or(llvm::CodeGenLevelNone);
1008+
let opt_size = config.opt_size.unwrap_or(llvm::CodeGenOptSizeNone);
9941009
let inline_threshold = config.inline_threshold;
9951010

996-
llvm::LLVMRustConfigurePassManagerBuilder(builder, opt,
1011+
llvm::LLVMRustConfigurePassManagerBuilder(builder, opt_level,
9971012
config.merge_functions,
9981013
config.vectorize_slp,
9991014
config.vectorize_loop);
1015+
llvm::LLVMPassManagerBuilderSetSizeLevel(builder, opt_size as u32);
1016+
1017+
if opt_size != llvm::CodeGenOptSizeNone {
1018+
llvm::LLVMPassManagerBuilderSetDisableUnrollLoops(builder, 1);
1019+
}
10001020

10011021
llvm::LLVMRustAddBuilderLibraryInfo(builder, llmod, config.no_builtins);
10021022

10031023
// Here we match what clang does (kinda). For O0 we only inline
10041024
// always-inline functions (but don't add lifetime intrinsics), at O1 we
10051025
// inline with lifetime intrinsics, and O2+ we add an inliner with a
10061026
// thresholds copied from clang.
1007-
match (opt, inline_threshold) {
1008-
(_, Some(t)) => {
1027+
match (opt_level, opt_size, inline_threshold) {
1028+
(_, _, Some(t)) => {
10091029
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, t as u32);
10101030
}
1011-
(llvm::CodeGenLevelNone, _) => {
1031+
(llvm::CodeGenLevelAggressive, _, _) => {
1032+
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 275);
1033+
}
1034+
(_, llvm::CodeGenOptSizeDefault, _) => {
1035+
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 75);
1036+
}
1037+
(_, llvm::CodeGenOptSizeAggressive, _) => {
1038+
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 25);
1039+
}
1040+
(llvm::CodeGenLevelNone, _, _) => {
10121041
llvm::LLVMRustAddAlwaysInlinePass(builder, false);
10131042
}
1014-
(llvm::CodeGenLevelLess, _) => {
1043+
(llvm::CodeGenLevelLess, _, _) => {
10151044
llvm::LLVMRustAddAlwaysInlinePass(builder, true);
10161045
}
1017-
(llvm::CodeGenLevelDefault, _) => {
1046+
(llvm::CodeGenLevelDefault, _, _) => {
10181047
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 225);
10191048
}
1020-
(llvm::CodeGenLevelAggressive, _) => {
1021-
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 275);
1022-
}
10231049
}
10241050

10251051
f(builder);

branches/auto/src/librustc_trans/declare.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@ fn declare_raw_fn(ccx: &CrateContext, name: &str, callconv: llvm::CallConv, ty:
6969
llvm::SetFunctionAttribute(llfn, llvm::Attribute::NoRedZone)
7070
}
7171

72+
match ccx.tcx().sess.opts.cg.opt_level.as_ref().map(String::as_ref) {
73+
Some("s") => {
74+
llvm::SetFunctionAttribute(llfn, llvm::Attribute::OptimizeForSize);
75+
},
76+
Some("z") => {
77+
llvm::SetFunctionAttribute(llfn, llvm::Attribute::MinSize);
78+
llvm::SetFunctionAttribute(llfn, llvm::Attribute::OptimizeForSize);
79+
},
80+
_ => {},
81+
}
82+
7283
llfn
7384
}
7485

branches/auto/src/test/run-make/debug-assertions/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ all:
1111
$(call RUN,debug) good
1212
$(RUSTC) debug.rs -C opt-level=3
1313
$(call RUN,debug) good
14+
$(RUSTC) debug.rs -C opt-level=s
15+
$(call RUN,debug) good
16+
$(RUSTC) debug.rs -C opt-level=z
17+
$(call RUN,debug) good
1418
$(RUSTC) debug.rs -O
1519
$(call RUN,debug) good
1620
$(RUSTC) debug.rs

branches/auto/src/test/run-make/emit/Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ all:
55
$(RUSTC) -Copt-level=1 --emit=llvm-bc,llvm-ir,asm,obj,link test-24876.rs
66
$(RUSTC) -Copt-level=2 --emit=llvm-bc,llvm-ir,asm,obj,link test-24876.rs
77
$(RUSTC) -Copt-level=3 --emit=llvm-bc,llvm-ir,asm,obj,link test-24876.rs
8+
$(RUSTC) -Copt-level=s --emit=llvm-bc,llvm-ir,asm,obj,link test-24876.rs
9+
$(RUSTC) -Copt-level=z --emit=llvm-bc,llvm-ir,asm,obj,link test-24876.rs
810
$(RUSTC) -Copt-level=0 --emit=llvm-bc,llvm-ir,asm,obj,link test-26235.rs
911
$(call RUN,test-26235) || exit 1
1012
$(RUSTC) -Copt-level=1 --emit=llvm-bc,llvm-ir,asm,obj,link test-26235.rs
@@ -13,3 +15,7 @@ all:
1315
$(call RUN,test-26235) || exit 1
1416
$(RUSTC) -Copt-level=3 --emit=llvm-bc,llvm-ir,asm,obj,link test-26235.rs
1517
$(call RUN,test-26235) || exit 1
18+
$(RUSTC) -Copt-level=s --emit=llvm-bc,llvm-ir,asm,obj,link test-26235.rs
19+
$(call RUN,test-26235) || exit 1
20+
$(RUSTC) -Copt-level=z --emit=llvm-bc,llvm-ir,asm,obj,link test-26235.rs
21+
$(call RUN,test-26235) || exit 1

0 commit comments

Comments
 (0)