Skip to content

Commit cff949c

Browse files
committed
Use new LLVM pass manager
1 parent 6114b5b commit cff949c

File tree

2 files changed

+36
-44
lines changed

2 files changed

+36
-44
lines changed

src/linker.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,20 @@ impl Linker {
492492
if !self.options.disable_expand_memcpy_in_order {
493493
args.push("--bpf-expand-memcpy-in-order".into());
494494
}
495+
args.push(
496+
format!(
497+
"--inline-threshold={}",
498+
match self.options.optimize {
499+
OptLevel::No => 0,
500+
OptLevel::Less => 25,
501+
OptLevel::Default => 225,
502+
OptLevel::Aggressive => 275,
503+
OptLevel::Size => 25,
504+
OptLevel::SizeMin => 0,
505+
}
506+
)
507+
.into(),
508+
);
495509
args.extend(self.options.llvm_args.iter().map(Into::into));
496510
info!("LLVM command line: {:?}", args);
497511
unsafe {

src/llvm/mod.rs

Lines changed: 22 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ use llvm_sys::prelude::*;
1919
use llvm_sys::support::LLVMParseCommandLineOptions;
2020
use llvm_sys::target::*;
2121
use llvm_sys::target_machine::*;
22-
use llvm_sys::transforms::ipo::*;
23-
use llvm_sys::transforms::pass_manager_builder::*;
22+
use llvm_sys::transforms::pass_builder::*;
2423
use llvm_sys::LLVMAttributeFunctionIndex;
2524
use llvm_sys::{LLVMLinkage, LLVMVisibility};
2625
use log::*;
@@ -179,65 +178,44 @@ pub unsafe fn optimize(
179178
LLVMSetModuleInlineAsm2(module, ptr::null_mut(), 0);
180179
}
181180

182-
let mpm = LLVMCreatePassManager();
183-
let fpm = LLVMCreateFunctionPassManagerForModule(module);
184-
185-
LLVMAddAnalysisPasses(tm, mpm);
186-
LLVMAddAnalysisPasses(tm, fpm);
187-
188-
// even with -O0 and without LTO we still want to avoid linking in unused code from core etc
189-
LLVMAddGlobalDCEPass(mpm);
190-
191-
let pmb = LLVMPassManagerBuilderCreate();
192-
193-
use OptLevel::*;
194-
let (inline_threshold, opt) = match opt_level {
195-
No | SizeMin => (0, 1), // Pretty much nothing compiles with -O0 s∫o make it an alias for -O1
196-
Less => (25, 1),
197-
Default => (225, 2),
198-
Aggressive => (275, 3),
199-
Size => (25, 0),
200-
};
201-
LLVMPassManagerBuilderSetOptLevel(pmb, opt);
202-
LLVMPassManagerBuilderSetSizeLevel(
203-
pmb,
204-
match opt_level {
205-
Size => 1,
206-
SizeMin => 2,
207-
_ => 0,
208-
},
209-
);
210-
LLVMPassManagerBuilderUseInlinerWithThreshold(pmb, inline_threshold);
211-
212-
// populate the pass managers
213-
LLVMPassManagerBuilderPopulateFunctionPassManager(pmb, fpm);
214-
LLVMPassManagerBuilderPopulateModulePassManager(pmb, mpm);
215-
216181
for sym in module.globals_iter() {
217182
internalize(sym, symbol_name(sym), export_symbols);
218183
}
219184
for sym in module.global_aliases_iter() {
220185
internalize(sym, symbol_name(sym), export_symbols);
221186
}
222187

223-
debug!("running function passes");
224-
LLVMInitializeFunctionPassManager(fpm);
225188
for function in module.functions_iter() {
226189
let name = symbol_name(function);
227190
if !name.starts_with("llvm.") {
228191
if ignore_inline_never {
229192
remove_attribute(function, "noinline");
230193
}
231194
internalize(function, name, export_symbols);
232-
if LLVMIsDeclaration(function) == 0 {
233-
LLVMRunFunctionPassManager(fpm, function);
234-
}
235195
}
236196
}
237-
LLVMFinalizeFunctionPassManager(fpm);
238197

239-
debug!("running module passes");
240-
LLVMRunPassManager(mpm, module);
198+
let options = LLVMCreatePassBuilderOptions();
199+
200+
// even with -O0 and without LTO we still want to avoid linking in unused code from core etc
201+
let dce = CString::new("dce").unwrap();
202+
debug!("running dce passe");
203+
LLVMRunPasses(module, dce.as_ptr(), tm, options);
204+
205+
let opt = CString::new(match opt_level {
206+
// Pretty much nothing compiles with -O0 so make it an alias for -O1
207+
OptLevel::No | OptLevel::Less => "default<O1>",
208+
OptLevel::Default => "default<O2>",
209+
OptLevel::Aggressive => "default<O3>",
210+
OptLevel::Size => "default<Os>",
211+
OptLevel::SizeMin => "default<Oz>",
212+
})
213+
.unwrap();
214+
215+
debug!("running optimization pass");
216+
LLVMRunPasses(module, opt.as_ptr(), tm, options);
217+
218+
LLVMDisposePassBuilderOptions(options);
241219

242220
// Some debug info generated by rustc seems to trigger a segfault in the
243221
// BTF code in llvm, so strip it until that is fixed

0 commit comments

Comments
 (0)